XXX push upstream Index: dbus/dbus-sysdeps-util-unix.c --- dbus/dbus-sysdeps-util-unix.c.orig +++ dbus/dbus-sysdeps-util-unix.c @@ -61,6 +61,10 @@ #include #endif +#ifdef __OpenBSD__ +#include +#endif + #ifndef O_BINARY #define O_BINARY 0 #endif @@ -1158,7 +1162,13 @@ _dbus_command_for_pid (unsigned long pid, /* This is all Linux-specific for now */ DBusString path; DBusString cmdline; +#ifndef __OpenBSD__ int fd; +#else + char **argv, **args; + int mib[4]; + size_t len; +#endif if (!_dbus_string_init (&path)) { @@ -1173,6 +1183,7 @@ _dbus_command_for_pid (unsigned long pid, return FALSE; } +#ifndef __OpenBSD__ if (!_dbus_string_append_printf (&path, "/proc/%ld/cmdline", pid)) goto oom; @@ -1200,6 +1211,37 @@ _dbus_command_for_pid (unsigned long pid, if (!_dbus_close (fd, error)) goto fail; +#else /* OpenBSD */ + args = NULL; + mib[0] = CTL_KERN; + mib[1] = KERN_PROC_ARGS; + mib[2] = pid; + mib[3] = KERN_PROC_ARGV; + + if (sysctl (mib, 4, NULL, &len, NULL, 0) == -1) + goto fail; + + args = malloc (len); + if (args == NULL) + goto fail; + + if (sysctl (mib, 4, args, &len, NULL, 0) == -1) + goto fail; + + for (argv = args; *argv != NULL; argv++) { + if (argv != args) + { + if (!_dbus_string_append_printf (&cmdline, " ")) + goto fail; + } + if (!_dbus_string_append_printf (&cmdline, "%s", *argv)) + goto fail; + } + + if (_dbus_string_get_length (&cmdline) > max_len) + _dbus_string_set_length (&cmdline, max_len); + +#endif string_squash_nonprintable (&cmdline); @@ -1208,12 +1250,18 @@ _dbus_command_for_pid (unsigned long pid, _dbus_string_free (&cmdline); _dbus_string_free (&path); +#ifdef __OpenBSD__ + free (args); +#endif return TRUE; oom: _DBUS_SET_OOM (error); fail: _dbus_string_free (&cmdline); _dbus_string_free (&path); +#ifdef __OpenBSD__ + free (args); +#endif return FALSE; }