diff options
Diffstat (limited to 'misc/tmux/patches/patch-osdep-dragonfly.c')
-rw-r--r-- | misc/tmux/patches/patch-osdep-dragonfly.c | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/misc/tmux/patches/patch-osdep-dragonfly.c b/misc/tmux/patches/patch-osdep-dragonfly.c new file mode 100644 index 00000000000..3ac0aa3064e --- /dev/null +++ b/misc/tmux/patches/patch-osdep-dragonfly.c @@ -0,0 +1,133 @@ +$NetBSD: patch-osdep-dragonfly.c,v 1.1 2011/10/04 11:55:34 ryoon Exp $ + +Add DragonFly support, SVN 2600 + +--- osdep-dragonfly.c.orig 2011-10-04 09:36:43.000000000 +0000 ++++ osdep-dragonfly.c +@@ -0,0 +1,126 @@ ++/* $: osdep-dragonfly.c 2600 2011-09-29 08:43:01Z nicm $ */ ++ ++/* ++ * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net> ++ * ++ * Permission to use, copy, modify, and distribute this software for any ++ * purpose with or without fee is hereby granted, provided that the above ++ * copyright notice and this permission notice appear in all copies. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES ++ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF ++ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ++ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES ++ * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER ++ * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING ++ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ++ */ ++ ++#include <sys/param.h> ++#include <sys/stat.h> ++#include <sys/sysctl.h> ++#include <sys/user.h> ++ ++#include <err.h> ++#include <errno.h> ++#include <event.h> ++#include <stdint.h> ++#include <stdlib.h> ++#include <string.h> ++#include <unistd.h> ++ ++struct kinfo_proc *cmp_procs(struct kinfo_proc *, struct kinfo_proc *); ++char *osdep_get_name(int, char *); ++struct event_base *osdep_event_init(void); ++ ++#ifndef nitems ++#define nitems(_a) (sizeof((_a)) / sizeof((_a)[0])) ++#endif ++ ++#define is_runnable(p) \ ++ ((p)->kp_stat == SACTIVE || (p)->kp_stat == SIDL) ++#define is_stopped(p) \ ++ ((p)->kp_stat == SSTOP || (p)->kp_stat == SZOMB) ++ ++struct kinfo_proc * ++cmp_procs(struct kinfo_proc *p1, struct kinfo_proc *p2) ++{ ++ if (is_runnable(p1) && !is_runnable(p2)) ++ return (p1); ++ if (!is_runnable(p1) && is_runnable(p2)) ++ return (p2); ++ ++ if (is_stopped(p1) && !is_stopped(p2)) ++ return (p1); ++ if (!is_stopped(p1) && is_stopped(p2)) ++ return (p2); ++ ++ if (strcmp(p1->kp_comm, p2->kp_comm) < 0) ++ return (p1); ++ if (strcmp(p1->kp_comm, p2->kp_comm) > 0) ++ return (p2); ++ ++ if (p1->kp_pid > p2->kp_pid) ++ return (p1); ++ return (p2); ++} ++ ++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, *bestp; ++ u_int i; ++ char *name; ++ ++ buf = NULL; ++ ++ if (stat(tty, &sb) == -1) ++ return (NULL); ++ if ((mib[3] = tcgetpgrp(fd)) == -1) ++ return (NULL); ++ ++retry: ++ if (sysctl(mib, nitems(mib), NULL, &len, NULL, 0) == -1) ++ return (NULL); ++ len = (len * 5) / 4; ++ ++ if ((newbuf = realloc(buf, len)) == NULL) ++ goto error; ++ buf = newbuf; ++ ++ if (sysctl(mib, nitems(mib), buf, &len, NULL, 0) == -1) { ++ if (errno == ENOMEM) ++ goto retry; ++ goto error; ++ } ++ ++ bestp = NULL; ++ for (i = 0; i < len / sizeof (struct kinfo_proc); i++) { ++ if (buf[i].kp_tdev != sb.st_rdev) ++ continue; ++ if (bestp == NULL) ++ bestp = &buf[i]; ++ else ++ bestp = cmp_procs(&buf[i], bestp); ++ } ++ ++ name = NULL; ++ if (bestp != NULL) ++ name = strdup(bestp->kp_comm); ++ ++ free(buf); ++ return (name); ++ ++error: ++ free(buf); ++ return (NULL); ++} ++ ++struct event_base * ++osdep_event_init(void) ++{ ++ return (event_init()); ++} |