From 9cde0c24779e8f43b6d122bc62fa22b6022d9ef0 Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Mon, 26 Jan 2009 22:57:20 +0000 Subject: Be more clever about picking window name. --- osdep-freebsd.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 69 insertions(+), 5 deletions(-) (limited to 'osdep-freebsd.c') diff --git a/osdep-freebsd.c b/osdep-freebsd.c index 0e04a4c0..3a495d4a 100644 --- a/osdep-freebsd.c +++ b/osdep-freebsd.c @@ -1,4 +1,4 @@ -/* $Id: osdep-freebsd.c,v 1.2 2009-01-20 22:17:53 nicm Exp $ */ +/* $Id: osdep-freebsd.c,v 1.3 2009-01-26 22:57:19 nicm Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott @@ -19,7 +19,10 @@ #ifdef __FreeBSD__ #include +#include +#include #include +#include #include #include @@ -28,19 +31,80 @@ #include #include -char *get_argv0(pid_t); +char *get_argv0(int, char *); +char *get_proc_argv0(pid_t); + +#define nitems(_a) (sizeof((_a)) / sizeof((_a)[0])) char * -get_argv0(pid_t pgrp) +get_argv0(__attribute__ ((unused)) int fd, char *tty) +{ + int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_TTY, 0 }; + struct stat sb; + size_t len; + struct kinfo_proc *buf, *newbuf, *p, *bestp; + char *procname; + u_int i; + + buf = NULL; + + if (stat(tty, &sb) == -1) + return (NULL); + mib[3] = sb.st_rdev; + +retry: + if (sysctl(mib, nitems(mib), NULL, &len, NULL, 0) == -1) + return (NULL); + len = (len * 5) / 4; + + if ((newbuf = realloc(buf, len)) == NULL) { + free(buf); + return (NULL); + } + buf = newbuf; + + if (sysctl(mib, nitems(mib), buf, &len, NULL, 0) == -1) { + if (errno == ENOMEM) + goto retry; + free(buf); + return (NULL); + } + + bestp = NULL; + for (i = 0; i < len / sizeof (struct kinfo_proc); i++) { + p = &buf[i]; + if (bestp == NULL) + bestp = p; + + if (p->ki_stat != SRUN && p->ki_stat != SIDL) + continue; + if (p->ki_estcpu < bestp->ki_estcpu) + continue; + if (p->ki_slptime > bestp->ki_slptime) + continue; + bestp = p; + } + + procname = get_proc_argv0(bestp->ki_pid); + if (procname == NULL || *procname == '\0') { + free(procname); + procname = strdup(bestp->ki_comm); + } + + free(buf); + return (procname); +} + +char * +get_proc_argv0(pid_t pid) { int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_ARGS, 0 }; size_t size; char *args, *args2, *procname; + mib[3] = pid; procname = NULL; - mib[3] = pgrp; - args = NULL; size = 128; while (size < SIZE_MAX / 2) { -- cgit v1.2.3