Uses kvm_getargv() from libkvm.

Signed-off-by: Matthieu Herrb <[email protected]>
---
 configure.ac |    7 +++++++
 os/client.c  |   43 ++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 49 insertions(+), 1 deletions(-)

diff --git a/configure.ac b/configure.ac
index 57bbcf4..46c3d61 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1057,6 +1057,13 @@ if test "x$RES" = xyes && test "x$CLIENTIDS" = xyes; then
 else
        CLIENTIDS=no
 fi
+if test "x$CLIENTIDS" = xyes; then
+       case $host_os in
+       openbsd*)
+               SYS_LIBS="$SYS_LIBS -lkvm"
+       ;;
+       esac
+fi
 AC_MSG_RESULT([$CLIENTIDS])
 AM_CONDITIONAL(CLIENTIDS, [test "x$CLIENTIDS" = xyes])
 
diff --git a/os/client.c b/os/client.c
index 8f4707b..fbccf22 100644
--- a/os/client.c
+++ b/os/client.c
@@ -64,6 +64,15 @@
 #include <procfs.h>
 #endif
 
+#ifdef __OpenBSD__
+#include <sys/param.h>
+#include <sys/sysctl.h>
+#include <sys/types.h>
+
+#include <kvm.h>
+#include <limits.h>
+#endif
+
 /**
  * Try to determine a PID for a client from its connection
  * information. This should be called only once when new client has
@@ -172,7 +181,39 @@ void DetermineClientCmd(pid_t pid, const char **cmdname, 
const char **cmdargs)
         if (cmdargs && sp)
             *cmdargs = strdup(sp);
     }
-#else /* not Solaris */
+#elif defined(__OpenBSD__)
+    /* on OpenBSD use kvm_getargv() */
+    {
+       kvm_t *kd;
+       char errbuf[_POSIX2_LINE_MAX];
+       char **argv;
+       struct kinfo_proc *kp;
+       size_t len = 0;
+       int i, n;
+
+       kd = kvm_open(NULL, NULL, NULL, KVM_NO_FILES, errbuf);
+       if (kd == NULL)
+               return;
+       kp = kvm_getprocs(kd, KERN_PROC_PID, pid, sizeof(struct kinfo_proc), 
&n);
+       if (n != 1)
+               return;
+       argv = kvm_getargv(kd, kp, 0);
+       *cmdname = strdup(argv[0]);
+       i = 1;
+       while (argv[i] != NULL) {
+               len += strlen(argv[i]) + 1;
+               i++;
+       }
+       *cmdargs = calloc(1, len);
+       i = 1;
+       while (argv[i] != NULL) {
+               strlcat(*cmdargs, argv[i], len);
+               strlcat(*cmdargs, " ", len);
+               i++;
+       }
+       kvm_close(kd);
+    }
+#else /* Linux using /proc/pid/cmdline */
 
     /* Check if /proc/pid/cmdline exists. It's not supported on all
      * operating systems. */
-- 
1.7.6

_______________________________________________
[email protected]: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to