diff options
author | Nicholas Kazlauskas <[email protected]> | 2018-10-23 11:38:48 -0400 |
---|---|---|
committer | Michel Dänzer <[email protected]> | 2018-12-28 15:41:01 +0100 |
commit | 759b94038987bb983398cd4b1d2cb1c8f79817a9 (patch) | |
tree | a42c4029d185618f3bb956c9b6f11ba85209bfd1 /src/util/u_process.c | |
parent | bf1dfcc3e8120400c9a78d03dd914a786728b5f7 (diff) |
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 <[email protected]>
Signed-off-by: Nicholas Kazlauskas <[email protected]>
Reviewed-by: Eric Engestrom <[email protected]>
Diffstat (limited to 'src/util/u_process.c')
-rw-r--r-- | src/util/u_process.c | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/src/util/u_process.c b/src/util/u_process.c index 5e5927678d8..a1667e78074 100644 --- a/src/util/u_process.c +++ b/src/util/u_process.c @@ -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. |