util: Get program name based on path when possible

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 tries to query the real path for the symbolic link /proc/self/exe
to find the program name instead. It only uses the realpath if it
was a prefix of the invocation to avoid breaking wine programs.

Cc: Timothy Arceri <tarceri@itsqueeze.com>
Signed-off-by: Nicholas Kazlauskas <nicholas.kazlauskas@amd.com>
Reviewed-by: Eric Engestrom <eric.engestrom@intel.com>
This commit is contained in:
Nicholas Kazlauskas 2018-10-23 11:38:48 -04:00 committed by Michel Dänzer
parent bf1dfcc3e8
commit 759b940389

View file

@ -41,8 +41,29 @@ static const char *
__getProgramName()
{
char * arg = strrchr(program_invocation_name, '/');
if (arg)
if (arg) {
/* If the / character was found this is likely a linux path or
* an invocation path for a 64-bit wine program.
*
* However, some programs pass command line arguments into argv[0].
* Strip these arguments out by using the realpath only if it was
* a prefix of the invocation name.
*/
static char *path;
if (!path)
path = realpath("/proc/self/exe", NULL);
if (path && strncmp(path, program_invocation_name, strlen(path)) == 0) {
/* This shouldn't be null because path is a a prefix,
* but check it anyway since path is static. */
char * name = strrchr(path, '/');
if (name)
return name + 1;
}
return arg+1;
}
/* If there was no '/' at all we likely have a windows like path from
* a wine application.