Mercurial > minori
comparison dep/animia/src/linux.cpp @ 62:4c6dd5999b39
*: update
1. updated animia
2. use widestrings for filesystem on Windows
| author | Paper <mrpapersonic@gmail.com> |
|---|---|
| date | Sun, 01 Oct 2023 06:16:06 -0400 |
| parents | 6ff7aabeb9d7 |
| children | 1ce00c1c8ddc |
comparison
equal
deleted
inserted
replaced
| 61:327568ad9be9 | 62:4c6dd5999b39 |
|---|---|
| 1 #include <string> | 1 #include <algorithm> |
| 2 #include <vector> | 2 #include <fcntl.h> |
| 3 #include <filesystem> | |
| 3 #include <fstream> | 4 #include <fstream> |
| 4 #include <filesystem> | |
| 5 #include <unordered_map> | |
| 6 #include <iostream> | 5 #include <iostream> |
| 7 #include <sstream> | 6 #include <sstream> |
| 7 #include <string> | |
| 8 #include <sys/stat.h> | |
| 8 #include <unistd.h> | 9 #include <unistd.h> |
| 9 #include <sys/stat.h> | 10 #include <unordered_map> |
| 10 #include <fcntl.h> | 11 #include <vector> |
| 11 #include <algorithm> | |
| 12 | 12 |
| 13 #define PROC_LOCATION "/proc" | 13 #define PROC_LOCATION "/proc" |
| 14 | 14 |
| 15 namespace Animia::Linux { | 15 namespace Animia::Linux { |
| 16 | 16 |
| 31 std::string get_process_name(int pid) { | 31 std::string get_process_name(int pid) { |
| 32 std::string path = PROC_LOCATION "/" + std::to_string(pid) + "/comm"; | 32 std::string path = PROC_LOCATION "/" + std::to_string(pid) + "/comm"; |
| 33 std::ifstream t(path); | 33 std::ifstream t(path); |
| 34 std::stringstream buf; | 34 std::stringstream buf; |
| 35 buf << t.rdbuf(); | 35 buf << t.rdbuf(); |
| 36 | |
| 36 std::string str = buf.str(); | 37 std::string str = buf.str(); |
| 37 str.erase(std::remove(str.begin(), str.end(), '\n'), str.end()); | 38 str.erase(std::remove(str.begin(), str.end(), '\n'), str.end()); |
| 38 return str; | 39 return str; |
| 39 } | 40 } |
| 40 | 41 |
| 77 if (!are_flags_ok(pid, std::stoi(dir.path().stem()))) | 78 if (!are_flags_ok(pid, std::stoi(dir.path().stem()))) |
| 78 continue; | 79 continue; |
| 79 /* get filename size */ | 80 /* get filename size */ |
| 80 int size = get_size_of_link(dir.path().string()); | 81 int size = get_size_of_link(dir.path().string()); |
| 81 /* allocate buffer */ | 82 /* allocate buffer */ |
| 82 char* buf = (char*)calloc(size, sizeof(char)); | 83 std::string buf(size, '\0'); |
| 83 //std::string buf('\0', size); | 84 // std::string buf('\0', size); |
| 84 /* read filename to buffer */ | 85 /* read filename to buffer */ |
| 85 int r = readlink(dir.path().c_str(), buf, size); | 86 int r = readlink(dir.path().c_str(), &buf.front(), buf.length()); |
| 86 | 87 |
| 87 if (r < 0) | 88 if (r < 0) |
| 88 continue; | 89 continue; |
| 89 if (!is_regular_file(buf)) | 90 if (!is_regular_file(buf)) |
| 90 continue; | 91 continue; |
| 91 ret.push_back(buf); | 92 ret.push_back(buf); |
| 92 free(buf); | |
| 93 } | 93 } |
| 94 } catch (std::filesystem::filesystem_error const& ex) { | 94 } catch (std::filesystem::filesystem_error const& ex) { |
| 95 if (ex.code().value() != 13) // 13 == permissions error, common with /proc, ignore | 95 if (ex.code().value() != 13) // 13 == permissions error, common with /proc, ignore |
| 96 throw; | 96 throw; |
| 97 } | 97 } |
| 99 } | 99 } |
| 100 | 100 |
| 101 std::unordered_map<int, std::vector<std::string>> get_all_open_files() { | 101 std::unordered_map<int, std::vector<std::string>> get_all_open_files() { |
| 102 std::unordered_map<int, std::vector<std::string>> map; | 102 std::unordered_map<int, std::vector<std::string>> map; |
| 103 std::vector<int> pids = get_all_pids(); | 103 std::vector<int> pids = get_all_pids(); |
| 104 for (int i: pids) | 104 for (int i : pids) |
| 105 map[i] = get_open_files(i); | 105 map[i] = get_open_files(i); |
| 106 return map; | 106 return map; |
| 107 } | 107 } |
| 108 | 108 |
| 109 } | 109 } // namespace Animia::Linux |
