summaryrefslogtreecommitdiffstats
path: root/osdep-freebsd.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-freebsd.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-freebsd.c')
-rw-r--r--osdep-freebsd.c74
1 files changed, 14 insertions, 60 deletions
diff --git a/osdep-freebsd.c b/osdep-freebsd.c
index bad06132..33bd606c 100644
--- a/osdep-freebsd.c
+++ b/osdep-freebsd.c
@@ -1,4 +1,4 @@
-/* $Id: osdep-freebsd.c,v 1.13 2009-02-09 18:09:58 nicm Exp $ */
+/* $Id: osdep-freebsd.c,v 1.14 2009-02-13 00:43:04 nicm Exp $ */
/*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -31,8 +31,7 @@
#include <string.h>
#include <unistd.h>
-int osdep_get_name(int, char *, pid_t *, char **);
-char *osdep_get_argv0(pid_t);
+char *osdep_get_name(int, char *);
#define nitems(_a) (sizeof((_a)) / sizeof((_a)[0]))
@@ -41,32 +40,31 @@ char *osdep_get_argv0(pid_t);
#define is_stopped(p) \
((p)->ki_stat == SSTOP || (p)->ki_stat == SZOMB)
-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;
size_t len;
struct kinfo_proc *buf, *newbuf, *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;
@@ -74,7 +72,7 @@ retry:
if (errno == ENOMEM)
goto retry;
free(buf);
- return (-1);
+ return (NULL);
}
bestp = NULL;
@@ -116,56 +114,12 @@ retry:
bestp = p;
}
- if (bestp == NULL) {
- free(buf);
- return (-1);
- }
+ name = NULL;
+ if (bestp != NULL)
+ name = strdup(bestp->ki_comm);
- if (bestp->ki_pid == *last_pid) {
- free(buf);
- return (1);
- }
- *last_pid = bestp->ki_pid;
-
- *name = osdep_get_argv0(bestp->ki_pid);
- if (*name == NULL || **name == '\0') {
- free(*name);
- *name = strdup(bestp->ki_comm);
- }
free(buf);
- return (0);
-}
-
-char *
-osdep_get_argv0(pid_t pid)
-{
- int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_ARGS, 0 };
- size_t size, size2;
- char *args, *args2, *procname;
-
- mib[3] = pid;
- procname = NULL;
-
- args = NULL;
- size = 128;
- while (size < SIZE_MAX / 2) {
- size *= 2;
- if ((args2 = realloc(args, size)) == NULL)
- break;
- args = args2;
- size2 = size;
- if (sysctl(mib, 4, args, &size2, NULL, 0) == -1) {
- if (errno == ENOMEM)
- continue;
- break;
- }
- if (size2 > 0 && *args != '\0')
- procname = strdup(args);
- break;
- }
- free(args);
-
- return (procname);
+ return (name);
}
#endif