goption: implement platform_get_argv0() for OpenBSD

https://bugzilla.gnome.org/show_bug.cgi?id=669024
This commit is contained in:
Antoine Jacoutot 2012-01-30 16:17:06 +01:00 committed by Matthias Clasen
parent f6a7a70a1f
commit 0c550d4a61
2 changed files with 32 additions and 3 deletions

View File

@ -139,6 +139,13 @@
#include <stdio.h> #include <stdio.h>
#include <errno.h> #include <errno.h>
#if defined __OpenBSD__
#include <sys/types.h>
#include <unistd.h>
#include <sys/param.h>
#include <sys/sysctl.h>
#endif
#include "goption.h" #include "goption.h"
#include "gprintf.h" #include "gprintf.h"
@ -1665,7 +1672,7 @@ free_pending_nulls (GOptionContext *context,
static char * static char *
platform_get_argv0 (void) platform_get_argv0 (void)
{ {
#ifdef __linux #if defined __linux
char *cmdline; char *cmdline;
char *base_arg0; char *base_arg0;
gsize len; gsize len;
@ -1685,6 +1692,28 @@ platform_get_argv0 (void)
base_arg0 = g_path_get_basename (cmdline); base_arg0 = g_path_get_basename (cmdline);
g_free (cmdline); g_free (cmdline);
return base_arg0; return base_arg0;
#elif defined __OpenBSD__
char **cmdline = NULL;
char *base_arg0;
gsize len = PATH_MAX;
int mib[] = { CTL_KERN, KERN_PROC_ARGS, getpid(), KERN_PROC_ARGV };
cmdline = (char **) realloc (cmdline, len);
if (sysctl (mib, nitems (mib), cmdline, &len, NULL, 0) == -1)
{
g_free (cmdline);
return NULL;
}
/* We could just return cmdline, but I think it's better
* to hold on to a smaller malloc block; the arguments
* could be large.
*/
base_arg0 = g_path_get_basename (*cmdline);
g_free (cmdline);
return base_arg0;
#endif #endif
return NULL; return NULL;

View File

@ -27,7 +27,7 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#ifdef __linux #if defined __linux || defined __OpenBSD__
static void static void
test_platform_argv0 (void) test_platform_argv0 (void)
{ {
@ -55,7 +55,7 @@ main (int argc,
/* Note - we can't actually use g_test_* because g_test_init mutates /* Note - we can't actually use g_test_* because g_test_init mutates
* g_get_prgname() which is exactly what we wanted to test =/ * g_get_prgname() which is exactly what we wanted to test =/
*/ */
#ifdef __linux #if defined __linux || defined __OpenBSD__
g_print ("/option/argv0: "); g_print ("/option/argv0: ");
test_platform_argv0 (); test_platform_argv0 ();
g_print ("OK\n"); g_print ("OK\n");