[Mesa-dev] [PATCH 4/4] util: Get program name based on path when possible
Kazlauskas, Nicholas
nicholas.kazlauskas at amd.com
Wed Sep 12 12:31:14 UTC 2018
On 09/12/2018 12:26 AM, Timothy Arceri wrote:
> On 12/9/18 2:24 am, Nicholas Kazlauskas wrote:
>> Some programs start with the path and command line arguments in
>> argv[0] (program_invocation_name). Chromium is an example of
>> an application using mesa that does this.
>
> This change breaks the detection of Wine applications. Can you give an
> example of the string in program_invocation_name for Chromium? Can we
> not remove the arguments from the string?
The issue shows up with the subprocesses spawned by Chromium or Chome
where program_invocation_name shows up as something like this:
/usr/lib/chromium/chromium --type=gpu-process --field-trial-handle=...
The fix to this patch to avoid breaking Wine programs is probably just
deferring the realpath logic until the inner part of of the '/' path
detection.
I think this is the simplest method of dropping the arguments while
still retaining the exact program name match with strcmp.
>
>>
>> This tries to query the real path for the symbolic link /proc/self/exe
>> to find the program name instead.
>>
>> Signed-off-by: Nicholas Kazlauskas <nicholas.kazlauskas at amd.com>
>> ---
>> src/util/u_process.c | 17 ++++++++++++++---
>> 1 file changed, 14 insertions(+), 3 deletions(-)
>>
>> diff --git a/src/util/u_process.c b/src/util/u_process.c
>> index 5e5927678d..ca4d0770cb 100644
>> --- a/src/util/u_process.c
>> +++ b/src/util/u_process.c
>> @@ -29,6 +29,7 @@
>> #include <string.h>
>> #include <errno.h>
>> #include <stdlib.h>
>> +#include <stdio.h>
>> #undef GET_PROGRAM_NAME
>> @@ -36,22 +37,32 @@
>> # if !defined(__GLIBC__) || (__GLIBC__ < 2)
>> /* These aren't declared in any libc5 header */
>> extern char *program_invocation_name, *program_invocation_short_name;
>> +extern char *__progname;
>> # endif
>> static const char *
>> __getProgramName()
>> {
>> - char * arg = strrchr(program_invocation_name, '/');
>> + static char * actual_path;
>> + char * path = NULL;
>> + char * arg = NULL;
>> +
>> + if (!actual_path)
>> + actual_path = realpath("/proc/self/exe", NULL);
>> +
>> + path = actual_path ? actual_path : program_invocation_name;
>> +
>> + arg = strrchr(path, '/');
>> if (arg)
>> return arg+1;
>> /* If there was no '/' at all we likely have a windows like path
>> from
>> * a wine application.
>> */
>> - arg = strrchr(program_invocation_name, '\\');
>> + arg = strrchr(path, '\\');
>> if (arg)
>> return arg+1;
>> - return program_invocation_name;
>> + return path;
>> }
>> # define GET_PROGRAM_NAME() __getProgramName()
>> #elif defined(__CYGWIN__)
>>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
Nicholas Kazlauskas
More information about the mesa-dev
mailing list