| 50 | namespace util { |
| 51 | |
| 52 | fs::path |
| 53 | get_executable_path() |
| 54 | { |
| 55 | #ifdef _WIN32 |
| 56 | std::vector<wchar_t> buf(MAX_PATH); |
| 57 | while (true) { |
| 58 | DWORD len = |
| 59 | GetModuleFileNameW(nullptr, buf.data(), static_cast<DWORD>(buf.size())); |
| 60 | if (len == 0) { |
| 61 | return {}; |
| 62 | } |
| 63 | if (len < static_cast<DWORD>(buf.size())) { |
| 64 | return fs::path(std::wstring(buf.data(), len)); |
| 65 | } |
| 66 | buf.resize(buf.size() * 2); |
| 67 | } |
| 68 | #elif defined(__APPLE__) |
| 69 | uint32_t size = PATH_MAX; |
| 70 | std::vector<char> buf(size); |
| 71 | if (_NSGetExecutablePath(buf.data(), &size) != 0) { |
| 72 | buf.resize(size); |
| 73 | if (_NSGetExecutablePath(buf.data(), &size) != 0) { |
| 74 | return {}; |
| 75 | } |
| 76 | } |
| 77 | return fs::path(buf.data()); |
| 78 | #else |
| 79 | char buf[PATH_MAX]; |
| 80 | ssize_t len = readlink("/proc/self/exe", buf, PATH_MAX - 1); |
| 81 | if (len < 0) { |
| 82 | return {}; |
| 83 | } |
| 84 | buf[len] = '\0'; |
| 85 | return fs::path(buf); |
| 86 | #endif |
| 87 | } |
| 88 | |
| 89 | const char* |
| 90 | get_hostname() |
no test coverage detected