summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicholas Kazlauskas <[email protected]>2018-10-23 11:38:48 -0400
committerMichel Dänzer <[email protected]>2018-12-28 15:41:01 +0100
commit759b94038987bb983398cd4b1d2cb1c8f79817a9 (patch)
treea42c4029d185618f3bb956c9b6f11ba85209bfd1
parentbf1dfcc3e8120400c9a78d03dd914a786728b5f7 (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]>
-rw-r--r--src/util/u_process.c23
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.