From 0c550d4a61619ab83f571bba2b38e9f55f9ad573 Mon Sep 17 00:00:00 2001 From: Antoine Jacoutot Date: Mon, 30 Jan 2012 16:17:06 +0100 Subject: [PATCH] goption: implement platform_get_argv0() for OpenBSD https://bugzilla.gnome.org/show_bug.cgi?id=669024 --- glib/goption.c | 31 ++++++++++++++++++++++++++++++- glib/tests/option-argv0.c | 4 ++-- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/glib/goption.c b/glib/goption.c index 799ea0998..07a06b556 100644 --- a/glib/goption.c +++ b/glib/goption.c @@ -139,6 +139,13 @@ #include #include +#if defined __OpenBSD__ +#include +#include +#include +#include +#endif + #include "goption.h" #include "gprintf.h" @@ -1665,7 +1672,7 @@ free_pending_nulls (GOptionContext *context, static char * platform_get_argv0 (void) { -#ifdef __linux +#if defined __linux char *cmdline; char *base_arg0; gsize len; @@ -1685,6 +1692,28 @@ platform_get_argv0 (void) base_arg0 = g_path_get_basename (cmdline); g_free (cmdline); 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 return NULL; diff --git a/glib/tests/option-argv0.c b/glib/tests/option-argv0.c index 31fd83bc9..525f12f42 100644 --- a/glib/tests/option-argv0.c +++ b/glib/tests/option-argv0.c @@ -27,7 +27,7 @@ #include #include -#ifdef __linux +#if defined __linux || defined __OpenBSD__ static 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 * g_get_prgname() which is exactly what we wanted to test =/ */ -#ifdef __linux +#if defined __linux || defined __OpenBSD__ g_print ("/option/argv0: "); test_platform_argv0 (); g_print ("OK\n");