diff --git a/glib/goption.c b/glib/goption.c index c65e84caa..475589b00 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" @@ -1664,7 +1671,7 @@ free_pending_nulls (GOptionContext *context, static char * platform_get_argv0 (void) { -#ifdef __linux +#if defined __linux char *cmdline; char *base_arg0; gsize len; @@ -1684,6 +1691,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 10fee281a..c7bbc7c53 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) { @@ -57,7 +57,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");