--- base/file.cpp.orig 2017-06-20 10:50:27 UTC +++ base/file.cpp @@ -19,6 +19,10 @@ #include #include #include +#include // PATH_MAX +#include // BUFSIZ +#include // realpath +#include // strerror #include #include #include @@ -36,6 +39,9 @@ #if defined(__APPLE__) #include #endif +#if defined(__DragonFly__) || defined(__FreeBSD__) || defined(__NetBSD__) +#include +#endif #if defined(_WIN32) #include #define O_CLOEXEC O_NOINHERIT @@ -251,6 +258,23 @@ 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, +#if defined(__NetBSD__) + KERN_PROC_ARGS, + -1, + KERN_PROC_PATHNAME, +#else + KERN_PROC, + KERN_PROC_PATHNAME, + -1, +#endif + }; + int rc = sysctl(mib, arraysize(mib), path, &path_len, NULL, 0); + return rc ? "" : path; #else #error unknown OS #endif