X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Futil%2Fu_process.c;h=74c4d10192ef34eb7a388ff9b7e583ef66d1038e;hb=aeb95fda541719d5fe9b8fdb531f3370228228d7;hp=b9328d58da401e98d397d3e21746f6af3fa89e9e;hpb=1ee42583830facd9f903f431891d0400cee963cf;p=mesa.git diff --git a/src/util/u_process.c b/src/util/u_process.c index b9328d58da4..74c4d10192e 100644 --- a/src/util/u_process.c +++ b/src/util/u_process.c @@ -26,12 +26,24 @@ */ #include "u_process.h" +#include "detect_os.h" +#include "macros.h" #include #include #include #undef GET_PROGRAM_NAME +#if DETECT_OS_WINDOWS +#include +#else +#include +#endif + +#if DETECT_OS_APPLE +#include +#endif + #if defined(__linux__) && defined(HAVE_PROGRAM_INVOCATION_NAME) static char *path = NULL; @@ -152,3 +164,32 @@ util_get_process_name(void) { return GET_PROGRAM_NAME(); } + +size_t +util_get_process_exec_path(char* process_path, size_t len) +{ +#if DETECT_OS_WINDOWS + return GetModuleFileNameA(NULL, process_path, len); +#elif DETECT_OS_APPLE + uint32_t bufSize = len; + int result = _NSGetExecutablePath(process_path, &bufSize); + + return (result == 0) ? strlen(process_path) : 0; +#elif DETECT_OS_UNIX + ssize_t r; + + if ((r = readlink("/proc/self/exe", process_path, len)) > 0) + goto success; + if ((r = readlink("/proc/curproc/exe", process_path, len)) > 0) + goto success; + if ((r = readlink("/proc/curproc/file", process_path, len)) > 0) + goto success; + + return 0; +success: + process_path[r] = '\0'; + return r; + +#endif + return 0; +}