162d8286bSchristos /* $OpenBSD$ */
27123b0aaSjmmv
37123b0aaSjmmv /*
47123b0aaSjmmv * Copyright (c) 2009 Joshua Elsasser <josh@elsasser.org>
57123b0aaSjmmv *
67123b0aaSjmmv * Permission to use, copy, modify, and distribute this software for any
77123b0aaSjmmv * purpose with or without fee is hereby granted, provided that the above
87123b0aaSjmmv * copyright notice and this permission notice appear in all copies.
97123b0aaSjmmv *
107123b0aaSjmmv * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
117123b0aaSjmmv * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
127123b0aaSjmmv * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
137123b0aaSjmmv * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
147123b0aaSjmmv * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
157123b0aaSjmmv * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
167123b0aaSjmmv * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
177123b0aaSjmmv */
187123b0aaSjmmv
197123b0aaSjmmv #include <sys/types.h>
20cc6bd9f9Schristos #include <sys/sysctl.h>
217123b0aaSjmmv
22cc6bd9f9Schristos #include <Availability.h>
2318742abeSchristos #include <libproc.h>
247123b0aaSjmmv #include <stdlib.h>
257123b0aaSjmmv #include <string.h>
267123b0aaSjmmv #include <unistd.h>
277123b0aaSjmmv
28*5b2b32f5Schristos #include "compat.h"
29*5b2b32f5Schristos
307123b0aaSjmmv char *osdep_get_name(int, char *);
3118742abeSchristos char *osdep_get_cwd(int);
32c8402fe5Sjmmv struct event_base *osdep_event_init(void);
337123b0aaSjmmv
34fc4f6883Schristos #ifndef __unused
35307877e5Schristos #define __unused __attribute__ ((__unused__))
36fc4f6883Schristos #endif
377123b0aaSjmmv
387123b0aaSjmmv char *
osdep_get_name(int fd,__unused char * tty)39307877e5Schristos osdep_get_name(int fd, __unused char *tty)
407123b0aaSjmmv {
41cc6bd9f9Schristos #ifdef __MAC_10_7
42cc6bd9f9Schristos struct proc_bsdshortinfo bsdinfo;
4318742abeSchristos pid_t pgrp;
4418742abeSchristos int ret;
457123b0aaSjmmv
4618742abeSchristos if ((pgrp = tcgetpgrp(fd)) == -1)
477123b0aaSjmmv return (NULL);
487123b0aaSjmmv
49cc6bd9f9Schristos ret = proc_pidinfo(pgrp, PROC_PIDT_SHORTBSDINFO, 0,
5018742abeSchristos &bsdinfo, sizeof bsdinfo);
51cc6bd9f9Schristos if (ret == sizeof bsdinfo && *bsdinfo.pbsi_comm != '\0')
52cc6bd9f9Schristos return (strdup(bsdinfo.pbsi_comm));
53fc4f6883Schristos return (NULL);
54cc6bd9f9Schristos #else
55cc6bd9f9Schristos int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_PID, 0 };
56cc6bd9f9Schristos size_t size;
57cc6bd9f9Schristos struct kinfo_proc kp;
58cc6bd9f9Schristos
59cc6bd9f9Schristos if ((mib[3] = tcgetpgrp(fd)) == -1)
607123b0aaSjmmv return (NULL);
61cc6bd9f9Schristos
62cc6bd9f9Schristos size = sizeof kp;
63cc6bd9f9Schristos if (sysctl(mib, 4, &kp, &size, NULL, 0) == -1)
64cc6bd9f9Schristos return (NULL);
65*5b2b32f5Schristos if (size != (sizeof kp) || *kp.kp_proc.p_comm == '\0')
66cc6bd9f9Schristos return (NULL);
67cc6bd9f9Schristos
68cc6bd9f9Schristos return (strdup(kp.kp_proc.p_comm));
69cc6bd9f9Schristos #endif
7018742abeSchristos }
7118742abeSchristos
7218742abeSchristos char *
osdep_get_cwd(int fd)7318742abeSchristos osdep_get_cwd(int fd)
7418742abeSchristos {
7518742abeSchristos static char wd[PATH_MAX];
7618742abeSchristos struct proc_vnodepathinfo pathinfo;
7718742abeSchristos pid_t pgrp;
7818742abeSchristos int ret;
7918742abeSchristos
8018742abeSchristos if ((pgrp = tcgetpgrp(fd)) == -1)
817123b0aaSjmmv return (NULL);
827123b0aaSjmmv
8318742abeSchristos ret = proc_pidinfo(pgrp, PROC_PIDVNODEPATHINFO, 0,
8418742abeSchristos &pathinfo, sizeof pathinfo);
8518742abeSchristos if (ret == sizeof pathinfo) {
8618742abeSchristos strlcpy(wd, pathinfo.pvi_cdir.vip_path, sizeof wd);
8718742abeSchristos return (wd);
8818742abeSchristos }
8918742abeSchristos return (NULL);
907123b0aaSjmmv }
91c8402fe5Sjmmv
92c8402fe5Sjmmv struct event_base *
osdep_event_init(void)93c8402fe5Sjmmv osdep_event_init(void)
94c8402fe5Sjmmv {
9500493aeaSchristos struct event_base *base;
9600493aeaSchristos
97c8402fe5Sjmmv /*
98c8402fe5Sjmmv * On OS X, kqueue and poll are both completely broken and don't
99c8402fe5Sjmmv * work on anything except socket file descriptors (yes, really).
100c8402fe5Sjmmv */
101c8402fe5Sjmmv setenv("EVENT_NOKQUEUE", "1", 1);
102c8402fe5Sjmmv setenv("EVENT_NOPOLL", "1", 1);
10300493aeaSchristos
10400493aeaSchristos base = event_init();
10500493aeaSchristos unsetenv("EVENT_NOKQUEUE");
10600493aeaSchristos unsetenv("EVENT_NOPOLL");
10700493aeaSchristos return (base);
108c8402fe5Sjmmv }
109