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 <charmainel@vmware.com>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
This commit is contained in:
Brian Paul 2016-06-29 16:30:54 -06:00
parent c2b4942afc
commit 13fa051356
2 changed files with 52 additions and 0 deletions

View file

@ -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;
}

View 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 */