X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Futil%2Fu_process.c;h=68fda93a53bb22515fb5c04f64d85534d8640df7;hb=a1c2bd6ce8981b34c0cf9333699b0ce75be6cb55;hp=cbccf48ed016ce6bed794240126d3fcb4142471a;hpb=c9b86cf52692f1d76314dce345080af8ce786792;p=mesa.git diff --git a/src/util/u_process.c b/src/util/u_process.c index cbccf48ed01..68fda93a53b 100644 --- a/src/util/u_process.c +++ b/src/util/u_process.c @@ -26,13 +26,34 @@ */ #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; + +static void __freeProgramPath() +{ + free(path); + path = NULL; +} + static const char * __getProgramName() { @@ -45,14 +66,10 @@ __getProgramName() * Strip these arguments out by using the realpath only if it was * a prefix of the invocation name. */ - static char *path; - - if (!path) - /* Note: realpath() allocates memory that we will keep around for - * the lifetime of the app, and then leak as the app closes. - * FIXME: we should find a way to clean this properly - */ + if (!path) { path = realpath("/proc/self/exe", NULL); + atexit(__freeProgramPath); + } if (path && strncmp(path, program_invocation_name, strlen(path)) == 0) { /* This shouldn't be null because path is a a prefix, @@ -82,8 +99,11 @@ __getProgramName() # if (__FreeBSD_version >= 440000) # define GET_PROGRAM_NAME() getprogname() # endif -#elif defined(__NetBSD__) && defined(__NetBSD_Version__) && (__NetBSD_Version__ >= 106000100) -# define GET_PROGRAM_NAME() getprogname() +#elif defined(__NetBSD__) +# include +# if defined(__NetBSD_Version__) && (__NetBSD_Version__ >= 106000100) +# define GET_PROGRAM_NAME() getprogname() +# endif #elif defined(__DragonFly__) # define GET_PROGRAM_NAME() getprogname() #elif defined(__APPLE__) @@ -118,7 +138,7 @@ __getProgramName() #endif #if !defined(GET_PROGRAM_NAME) -# if defined(__OpenBSD__) || defined(NetBSD) || defined(__UCLIBC__) || defined(ANDROID) +# if defined(__OpenBSD__) || defined(__NetBSD__) || defined(__UCLIBC__) || defined(ANDROID) /* This is a hack. It's said to work on OpenBSD, NetBSD and GNU. * Rogelio M.Serrano Jr. reported it's also working with UCLIBC. It's * used as a last resort, if there is no documented facility available. */ @@ -144,3 +164,35 @@ 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: + if (r == len) + return 0; + + process_path[r] = '\0'; + return r; + +#endif + return 0; +}