diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2017-05-16 19:46:52 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2017-05-16 19:46:52 +0000 |
commit | 6b3f41ed88e8e440e11a4fbf20b6600529f80049 (patch) | |
tree | 928b056f24a634d628c80238dbbf10d41b1a71d5 /lib/Support/Unix | |
parent | c46e6a5940c50058e00c0c5f9123fd82e338d29a (diff) |
Diffstat (limited to 'lib/Support/Unix')
-rw-r--r-- | lib/Support/Unix/Path.inc | 30 | ||||
-rw-r--r-- | lib/Support/Unix/Process.inc | 4 |
2 files changed, 26 insertions, 8 deletions
diff --git a/lib/Support/Unix/Path.inc b/lib/Support/Unix/Path.inc index fa28ba1b6ab6..cdea09be41e0 100644 --- a/lib/Support/Unix/Path.inc +++ b/lib/Support/Unix/Path.inc @@ -103,13 +103,16 @@ #define STATVFS_F_FLAG(vfs) (vfs).f_flags #endif +#if defined(__FreeBSD__) || defined(__NetBSD__) +#include <sys/sysctl.h> +#endif + using namespace llvm; namespace llvm { namespace sys { namespace fs { -#if defined(__FreeBSD__) || defined (__NetBSD__) || defined(__Bitrig__) || \ - defined(__OpenBSD__) || defined(__minix) || defined(__FreeBSD_kernel__) || \ +#if defined(__Bitrig__) || defined(__OpenBSD__) || defined(__minix) || \ defined(__linux__) || defined(__CYGWIN__) || defined(__DragonFly__) || \ defined(_AIX) static int @@ -164,7 +167,7 @@ getprogpath(char ret[PATH_MAX], const char *bin) free(pv); return nullptr; } -#endif // __FreeBSD__ || __NetBSD__ || __FreeBSD_kernel__ +#endif // Bitrig || OpenBSD || minix || linux || CYGWIN || DragonFly || AIX /// GetMainExecutable - Return the path to the main executable, given the /// value of argv[0] from program startup. @@ -180,9 +183,24 @@ std::string getMainExecutable(const char *argv0, void *MainAddr) { if (realpath(exe_path, link_path)) return link_path; } -#elif defined(__FreeBSD__) || defined (__NetBSD__) || defined(__Bitrig__) || \ - defined(__OpenBSD__) || defined(__minix) || defined(__DragonFly__) || \ - defined(__FreeBSD_kernel__) || defined(_AIX) +#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__) + int mib[4]; + mib[0] = CTL_KERN; +#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) + mib[1] = KERN_PROC; + mib[2] = KERN_PROC_PATHNAME; + mib[3] = -1; +#else + mib[1] = KERN_PROC_ARGS; + mib[2] = -1; + mib[3] = KERN_PROC_PATHNAME; +#endif + char exe_path[PATH_MAX]; + size_t cb = sizeof(exe_path); + if (sysctl(mib, 4, exe_path, &cb, NULL, 0) == 0) + return exe_path; +#elif defined(__Bitrig__) || defined(__OpenBSD__) || defined(__minix) || \ + defined(__DragonFly__) || defined(_AIX) char exe_path[PATH_MAX]; if (getprogpath(exe_path, argv0) != NULL) diff --git a/lib/Support/Unix/Process.inc b/lib/Support/Unix/Process.inc index 16f8f5a98e52..1d0143c6716e 100644 --- a/lib/Support/Unix/Process.inc +++ b/lib/Support/Unix/Process.inc @@ -347,7 +347,7 @@ static bool terminalHasColors(int fd) { MutexGuard G(*TermColorMutex); int errret = 0; - if (setupterm((char *)nullptr, fd, &errret) != 0) + if (setupterm(nullptr, fd, &errret) != 0) // Regardless of why, if we can't get terminfo, we shouldn't try to print // colors. return false; @@ -369,7 +369,7 @@ static bool terminalHasColors(int fd) { // Now extract the structure allocated by setupterm and free its memory // through a really silly dance. - struct term *termp = set_curterm((struct term *)nullptr); + struct term *termp = set_curterm(nullptr); (void)del_curterm(termp); // Drop any errors here. // Return true if we found a color capabilities for the current terminal. |