X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Futil%2Fu_process.c;h=b9328d58da401e98d397d3e21746f6af3fa89e9e;hb=aee004a7c8900938d1c17f0ac299d40001b383b0;hp=cbccf48ed016ce6bed794240126d3fcb4142471a;hpb=c9b86cf52692f1d76314dce345080af8ce786792;p=mesa.git diff --git a/src/util/u_process.c b/src/util/u_process.c index cbccf48ed01..b9328d58da4 100644 --- a/src/util/u_process.c +++ b/src/util/u_process.c @@ -33,6 +33,15 @@ #undef GET_PROGRAM_NAME #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 +54,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 +87,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 +126,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. */