--- base/file.cpp.orig 2016-09-28 18:07:09 UTC +++ base/file.cpp @@ -18,6 +18,9 @@ #include #include +#include // PATH_MAX +#include // BUFSIZ +#include // strerror #include #include #include @@ -34,6 +37,9 @@ #if defined(__APPLE__) #include #endif +#if defined(__DragonFly__) || defined(__FreeBSD__) +#include +#endif #if defined(_WIN32) #include #endif @@ -231,6 +237,17 @@ std::string GetExecutablePath() { if (result == 0 || result == sizeof(path) - 1) return ""; path[PATH_MAX - 1] = 0; return path; +#elif defined(KERN_PROC_PATHNAME) + char path[PATH_MAX + 1]; + size_t path_len = sizeof(path); + int mib[] = { + CTL_KERN, + KERN_PROC, + KERN_PROC_PATHNAME, + getpid() + }; + int rc = sysctl(mib, arraysize(mib), path, &path_len, NULL, 0); + return rc ? "" : path; #else #error unknown OS #endif