From cce03e138b6363036d9b6c3c96925b3a372e421b Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Fri, 13 Feb 2009 00:43:04 +0000 Subject: Looking up argv[0] is expensive, so just use p_comm for the window name which is good enough. Also increase name update time to 500 ms. --- osdep-openbsd.c | 74 +++++++++++---------------------------------------------- 1 file changed, 14 insertions(+), 60 deletions(-) (limited to 'osdep-openbsd.c') diff --git a/osdep-openbsd.c b/osdep-openbsd.c index 2321f5e8..5e06d671 100644 --- a/osdep-openbsd.c +++ b/osdep-openbsd.c @@ -1,4 +1,4 @@ -/* $Id: osdep-openbsd.c,v 1.12 2009-02-09 18:08:01 nicm Exp $ */ +/* $Id: osdep-openbsd.c,v 1.13 2009-02-13 00:43:04 nicm Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott @@ -35,11 +35,10 @@ #define is_stopped(p) \ ((p)->p_stat == SSTOP || (p)->p_stat == SZOMB || (p)->p_stat == SDEAD) -int osdep_get_name(int, char *, pid_t *, char **); -char *osdep_get_argv0(pid_t); +char *osdep_get_name(int, char *); -int -osdep_get_name(int fd, char *tty, pid_t *last_pid, char **name) +char * +osdep_get_name(int fd, char *tty) { int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PGRP, 0 }; struct stat sb; @@ -47,24 +46,23 @@ osdep_get_name(int fd, char *tty, pid_t *last_pid, char **name) struct kinfo_proc *buf, *newbuf; struct proc *p, *bestp; u_int i; - - *name = NULL; + char *name; buf = NULL; if (stat(tty, &sb) == -1) - return (-1); + return (NULL); if ((mib[3] = tcgetpgrp(fd)) == -1) - return (-1); + return (NULL); retry: if (sysctl(mib, nitems(mib), NULL, &len, NULL, 0) == -1) - return (-1); + return (NULL); len = (len * 5) / 4; if ((newbuf = realloc(buf, len)) == NULL) { free(buf); - return (-1); + return (NULL); } buf = newbuf; @@ -72,7 +70,7 @@ retry: if (errno == ENOMEM) goto retry; free(buf); - return (-1); + return (NULL); } bestp = NULL; @@ -126,56 +124,12 @@ retry: bestp = p; } - if (bestp == NULL) { - free(buf); - return (-1); - } + name = NULL; + if (bestp != NULL) + name = strdup(bestp->p_comm); - if (bestp->p_pid == *last_pid) { - free(buf); - return (1); - } - *last_pid = bestp->p_pid; - - *name = osdep_get_argv0(bestp->p_pid); - if (*name == NULL || **name == '\0') { - free(*name); - *name = strdup(bestp->p_comm); - } free(buf); - return (0); -} - -char * -osdep_get_argv0(pid_t pid) -{ - int mib[4] = { CTL_KERN, KERN_PROC_ARGS, 0, KERN_PROC_ARGV }; - size_t size; - char **args, **args2, *procname; - - procname = NULL; - - mib[2] = pid; - - args = NULL; - size = 128; - while (size < SIZE_MAX / 2) { - size *= 2; - if ((args2 = realloc(args, size)) == NULL) - break; - args = args2; - if (sysctl(mib, 4, args, &size, NULL, 0) == -1) { - if (errno == ENOMEM) - continue; - break; - } - if (*args != NULL) - procname = strdup(*args); - break; - } - free(args); - - return (procname); + return (name); } #endif -- cgit