auxiliary/os: add new os_get_command_line() function
authorBrian Paul <brianp@vmware.com>
Wed, 29 Jun 2016 22:30:54 +0000 (16:30 -0600)
committerBrian Paul <brianp@vmware.com>
Mon, 1 Aug 2016 18:20:19 +0000 (12:20 -0600)
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 <charmainel@vmware.com>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/gallium/auxiliary/os/os_process.c
src/gallium/auxiliary/os/os_process.h

index 332e195ef349d89850d6f3ee693c5db78f8dc490..6622b9b2bc07534ed5bcf91e62f7c22a58d0c235 100644 (file)
 #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;
+}
index 0d50ddc6add501542aaa0cdce07f6279f5d7940f..9c5b31dfcc533a4b083ea0430541761085f15046 100644 (file)
@@ -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 */