summaryrefslogtreecommitdiffstats
path: root/src/gallium/auxiliary
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/auxiliary')
-rw-r--r--src/gallium/auxiliary/os/os_process.c48
-rw-r--r--src/gallium/auxiliary/os/os_process.h4
2 files changed, 52 insertions, 0 deletions
diff --git a/src/gallium/auxiliary/os/os_process.c b/src/gallium/auxiliary/os/os_process.c
index 332e195ef34..6622b9b2bc0 100644
--- a/src/gallium/auxiliary/os/os_process.c
+++ b/src/gallium/auxiliary/os/os_process.c
@@ -43,6 +43,10 @@
#warning unexpected platform in os_process.c
#endif
+#if defined(PIPE_OS_LINUX)
+# include <fcntl.h>
+#endif
+
/**
* Return the name of the current process.
@@ -108,3 +112,47 @@ os_get_process_name(char *procname, size_t size)
return FALSE;
}
}
+
+
+/**
+ * Return the command line for the calling process. This is basically
+ * the argv[] array with the arguments separated by spaces.
+ * \param cmdline returns the command line string
+ * \param size size of the cmdline buffer
+ * \return TRUE or FALSE for success, failure
+ */
+boolean
+os_get_command_line(char *cmdline, size_t size)
+{
+#if defined(PIPE_SUBSYSTEM_WINDOWS_USER)
+ const char *args = GetCommandLine();
+ if (args) {
+ strncpy(cmdline, args, size);
+ // make sure we terminate the string
+ cmdline[size - 1] = 0;
+ return TRUE;
+ }
+#elif defined(PIPE_OS_LINUX)
+ int f = open("/proc/self/cmdline", O_RDONLY);
+ if (f) {
+ const int n = read(f, cmdline, size - 1);
+ int i;
+ assert(n < size);
+ // The arguments are separated by '\0' chars. Convert them to spaces.
+ for (i = 0; i < n; i++) {
+ if (cmdline[i] == 0) {
+ cmdline[i] = ' ';
+ }
+ }
+ // terminate the string
+ cmdline[n] = 0;
+ close(f);
+ return TRUE;
+ }
+#endif
+
+ /* XXX to-do: implement this function for other operating systems */
+
+ cmdline[0] = 0;
+ return FALSE;
+}
diff --git a/src/gallium/auxiliary/os/os_process.h b/src/gallium/auxiliary/os/os_process.h
index 0d50ddc6add..9c5b31dfcc5 100644
--- a/src/gallium/auxiliary/os/os_process.h
+++ b/src/gallium/auxiliary/os/os_process.h
@@ -37,4 +37,8 @@ extern boolean
os_get_process_name(char *str, size_t size);
+extern boolean
+os_get_command_line(char *cmdline, size_t size);
+
+
#endif /* OS_PROCESS_H */