From 2e1e6511f76370870b5cde10caa9ca3b6d0dc65f Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Tue, 3 Jul 2018 14:07:05 -0400 Subject: [PATCH] util: extract get_process_name from xmlconfig.c Reviewed-by: Timothy Arceri Reviewed-by: Eric Engestrom --- src/util/Makefile.sources | 2 + src/util/meson.build | 2 + src/util/process.c | 116 ++++++++++++++++++++++++++++++++++++++ src/util/process.h | 34 +++++++++++ src/util/xmlconfig.c | 86 +--------------------------- 5 files changed, 156 insertions(+), 84 deletions(-) create mode 100644 src/util/process.c create mode 100644 src/util/process.h diff --git a/src/util/Makefile.sources b/src/util/Makefile.sources index 534520ce763..e8933666726 100644 --- a/src/util/Makefile.sources +++ b/src/util/Makefile.sources @@ -24,6 +24,8 @@ MESA_UTIL_FILES := \ mesa-sha1.h \ os_time.c \ os_time.h \ + process.c \ + process.h \ sha1/sha1.c \ sha1/sha1.h \ ralloc.c \ diff --git a/src/util/meson.build b/src/util/meson.build index c777984e28d..1713864b4f7 100644 --- a/src/util/meson.build +++ b/src/util/meson.build @@ -48,6 +48,8 @@ files_mesa_util = files( 'mesa-sha1.h', 'os_time.c', 'os_time.h', + 'process.c', + 'process.h', 'sha1/sha1.c', 'sha1/sha1.h', 'ralloc.c', diff --git a/src/util/process.c b/src/util/process.c new file mode 100644 index 00000000000..992ba7f734a --- /dev/null +++ b/src/util/process.c @@ -0,0 +1,116 @@ +/* + * Copyright © 2003 Felix Kuehling + * Copyright © 2018 Advanced Micro Devices, Inc. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sub license, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS, AUTHORS + * AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + * USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + */ + +#include "process.h" +#include +#include +#include + +#undef GET_PROGRAM_NAME + +#if (defined(__GNU_LIBRARY__) || defined(__GLIBC__)) && !defined(__UCLIBC__) +# if !defined(__GLIBC__) || (__GLIBC__ < 2) +/* These aren't declared in any libc5 header */ +extern char *program_invocation_name, *program_invocation_short_name; +# endif +static const char * +__getProgramName() +{ + char * arg = strrchr(program_invocation_name, '/'); + if (arg) + return arg+1; + else + return program_invocation_name; +} +# define GET_PROGRAM_NAME() __getProgramName() +#elif defined(__CYGWIN__) +# define GET_PROGRAM_NAME() program_invocation_short_name +#elif defined(__FreeBSD__) && (__FreeBSD__ >= 2) +# include +# 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(__DragonFly__) +# define GET_PROGRAM_NAME() getprogname() +#elif defined(__APPLE__) +# define GET_PROGRAM_NAME() getprogname() +#elif defined(__sun) +/* Solaris has getexecname() which returns the full path - return just + the basename to match BSD getprogname() */ +# include + +static const char * +__getProgramName() +{ + static const char *progname; + + if (progname == NULL) { + const char *e = getexecname(); + if (e != NULL) { + /* Have to make a copy since getexecname can return a readonly + string, but basename expects to be able to modify its arg. */ + char *n = strdup(e); + if (n != NULL) { + progname = basename(n); + } + } + } + return progname; +} + +# define GET_PROGRAM_NAME() __getProgramName() +#endif + +#if !defined(GET_PROGRAM_NAME) +# 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. */ +static const char * +__getProgramName() +{ + extern const char *__progname; + char * arg = strrchr(__progname, '/'); + if (arg) + return arg+1; + else + return __progname; +} +# define GET_PROGRAM_NAME() __getProgramName() +# else +# define GET_PROGRAM_NAME() "" +# warning "Per application configuration won't work with your OS version." +# endif +#endif + +const char * +util_get_process_name(void) +{ + return GET_PROGRAM_NAME(); +} diff --git a/src/util/process.h b/src/util/process.h new file mode 100644 index 00000000000..77f7cb1cbef --- /dev/null +++ b/src/util/process.h @@ -0,0 +1,34 @@ +/* + * Copyright © 2003 Felix Kuehling + * Copyright © 2018 Advanced Micro Devices, Inc. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sub license, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS, AUTHORS + * AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + * USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + */ + +#ifndef PROCESS_H +#define PROCESS_H + +const char * +util_get_process_name(void); + +#endif diff --git a/src/util/xmlconfig.c b/src/util/xmlconfig.c index ad943e2ce48..d3847911baa 100644 --- a/src/util/xmlconfig.c +++ b/src/util/xmlconfig.c @@ -37,90 +37,8 @@ #include #include #include "xmlconfig.h" +#include "process.h" -#undef GET_PROGRAM_NAME - -#if (defined(__GNU_LIBRARY__) || defined(__GLIBC__)) && !defined(__UCLIBC__) -# if !defined(__GLIBC__) || (__GLIBC__ < 2) -/* These aren't declared in any libc5 header */ -extern char *program_invocation_name, *program_invocation_short_name; -# endif -static const char * -__getProgramName() -{ - char * arg = strrchr(program_invocation_name, '/'); - if (arg) - return arg+1; - else - return program_invocation_name; -} -# define GET_PROGRAM_NAME() __getProgramName() -#elif defined(__CYGWIN__) -# define GET_PROGRAM_NAME() program_invocation_short_name -#elif defined(__FreeBSD__) && (__FreeBSD__ >= 2) -# include -# if (__FreeBSD_version >= 440000) -# include -# define GET_PROGRAM_NAME() getprogname() -# endif -#elif defined(__NetBSD__) && defined(__NetBSD_Version__) && (__NetBSD_Version__ >= 106000100) -# include -# define GET_PROGRAM_NAME() getprogname() -#elif defined(__DragonFly__) -# include -# define GET_PROGRAM_NAME() getprogname() -#elif defined(__APPLE__) -# include -# define GET_PROGRAM_NAME() getprogname() -#elif defined(__sun) -/* Solaris has getexecname() which returns the full path - return just - the basename to match BSD getprogname() */ -# include -# include - -static const char * -__getProgramName() -{ - static const char *progname; - - if (progname == NULL) { - const char *e = getexecname(); - if (e != NULL) { - /* Have to make a copy since getexecname can return a readonly - string, but basename expects to be able to modify its arg. */ - char *n = strdup(e); - if (n != NULL) { - progname = basename(n); - } - } - } - return progname; -} - -# define GET_PROGRAM_NAME() __getProgramName() -#endif - -#if !defined(GET_PROGRAM_NAME) -# 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. */ -static const char * -__getProgramName() -{ - extern const char *__progname; - char * arg = strrchr(__progname, '/'); - if (arg) - return arg+1; - else - return __progname; -} -# define GET_PROGRAM_NAME() __getProgramName() -# else -# define GET_PROGRAM_NAME() "" -# warning "Per application configuration won't work with your OS version." -# endif -#endif /** \brief Find an option in an option cache with the name as key */ static uint32_t @@ -1007,7 +925,7 @@ driParseConfigFiles(driOptionCache *cache, const driOptionCache *info, userData.cache = cache; userData.screenNum = screenNum; userData.driverName = driverName; - userData.execName = GET_PROGRAM_NAME(); + userData.execName = util_get_process_name(); if ((home = getenv ("HOME"))) { uint32_t len = strlen (home); -- 2.30.2