summaryrefslogtreecommitdiff
path: root/misc/tmux/patches/patch-osdep-dragonfly.c
diff options
context:
space:
mode:
Diffstat (limited to 'misc/tmux/patches/patch-osdep-dragonfly.c')
-rw-r--r--misc/tmux/patches/patch-osdep-dragonfly.c133
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());
++}