summaryrefslogtreecommitdiffstats
path: root/osdep-openbsd.c
diff options
context:
space:
mode:
authorNicholas Marriott <nicholas.marriott@gmail.com>2009-02-13 00:43:04 +0000
committerNicholas Marriott <nicholas.marriott@gmail.com>2009-02-13 00:43:04 +0000
commitcce03e138b6363036d9b6c3c96925b3a372e421b (patch)
tree0a35dd6ae5cc69dc77423576d203f9b24a59b147 /osdep-openbsd.c
parentb1e911aff02d8381018fca067e7783c6a72da593 (diff)
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.
Diffstat (limited to 'osdep-openbsd.c')
-rw-r--r--osdep-openbsd.c74
1 files changed, 14 insertions, 60 deletions
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 <nicm@users.sourceforge.net>
@@ -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