summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Paul <[email protected]>2016-06-29 16:30:54 -0600
committerBrian Paul <[email protected]>2016-08-01 12:20:19 -0600
commit13fa0513569d0145487e12f3bc3aa10bc51088f7 (patch)
treec1d5efb9b7436d0a985dcaeef4e3adaab6fbfed4
parentc2b4942afcc7389ba99e230ec34eab03d9863205 (diff)
auxiliary/os: add new os_get_command_line() function
This can be used by the driver to get the command line which started the process. Will be used by the VMware driver for extra logging. For now, this is only implemented for Linux via /proc/self/cmdline and Windows via GetCommandLine(). Reviewed-by: Charmaine Lee <[email protected]> Reviewed-by: Marek Olšák <[email protected]>
-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 */