1*0a6a1f1dSLionel Sambuc /* Id */
2eda6f593SDavid van Moolenbroek
3eda6f593SDavid van Moolenbroek /*
4eda6f593SDavid van Moolenbroek * Copyright (c) 2009 Joshua Elsasser <josh@elsasser.org>
5eda6f593SDavid van Moolenbroek *
6eda6f593SDavid van Moolenbroek * Permission to use, copy, modify, and distribute this software for any
7eda6f593SDavid van Moolenbroek * purpose with or without fee is hereby granted, provided that the above
8eda6f593SDavid van Moolenbroek * copyright notice and this permission notice appear in all copies.
9eda6f593SDavid van Moolenbroek *
10eda6f593SDavid van Moolenbroek * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11eda6f593SDavid van Moolenbroek * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12eda6f593SDavid van Moolenbroek * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13eda6f593SDavid van Moolenbroek * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14eda6f593SDavid van Moolenbroek * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
15eda6f593SDavid van Moolenbroek * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
16eda6f593SDavid van Moolenbroek * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17eda6f593SDavid van Moolenbroek */
18eda6f593SDavid van Moolenbroek
19eda6f593SDavid van Moolenbroek #include <sys/types.h>
20eda6f593SDavid van Moolenbroek
21eda6f593SDavid van Moolenbroek #include <event.h>
22*0a6a1f1dSLionel Sambuc #include <libproc.h>
23eda6f593SDavid van Moolenbroek #include <stdlib.h>
24eda6f593SDavid van Moolenbroek #include <string.h>
25eda6f593SDavid van Moolenbroek #include <unistd.h>
26eda6f593SDavid van Moolenbroek
27eda6f593SDavid van Moolenbroek char *osdep_get_name(int, char *);
28*0a6a1f1dSLionel Sambuc char *osdep_get_cwd(int);
29eda6f593SDavid van Moolenbroek struct event_base *osdep_event_init(void);
30eda6f593SDavid van Moolenbroek
31eda6f593SDavid van Moolenbroek #define unused __attribute__ ((unused))
32eda6f593SDavid van Moolenbroek
33eda6f593SDavid van Moolenbroek char *
osdep_get_name(int fd,unused char * tty)34eda6f593SDavid van Moolenbroek osdep_get_name(int fd, unused char *tty)
35eda6f593SDavid van Moolenbroek {
36*0a6a1f1dSLionel Sambuc struct proc_bsdinfo bsdinfo;
37*0a6a1f1dSLionel Sambuc pid_t pgrp;
38*0a6a1f1dSLionel Sambuc int ret;
39eda6f593SDavid van Moolenbroek
40*0a6a1f1dSLionel Sambuc if ((pgrp = tcgetpgrp(fd)) == -1)
41eda6f593SDavid van Moolenbroek return (NULL);
42eda6f593SDavid van Moolenbroek
43*0a6a1f1dSLionel Sambuc ret = proc_pidinfo(pgrp, PROC_PIDTBSDINFO, 0,
44*0a6a1f1dSLionel Sambuc &bsdinfo, sizeof bsdinfo);
45*0a6a1f1dSLionel Sambuc if (ret == sizeof bsdinfo && *bsdinfo.pbi_comm != '\0')
46*0a6a1f1dSLionel Sambuc return (strdup(bsdinfo.pbi_comm));
47eda6f593SDavid van Moolenbroek return (NULL);
48*0a6a1f1dSLionel Sambuc }
49*0a6a1f1dSLionel Sambuc
50*0a6a1f1dSLionel Sambuc char *
osdep_get_cwd(int fd)51*0a6a1f1dSLionel Sambuc osdep_get_cwd(int fd)
52*0a6a1f1dSLionel Sambuc {
53*0a6a1f1dSLionel Sambuc static char wd[PATH_MAX];
54*0a6a1f1dSLionel Sambuc struct proc_vnodepathinfo pathinfo;
55*0a6a1f1dSLionel Sambuc pid_t pgrp;
56*0a6a1f1dSLionel Sambuc int ret;
57*0a6a1f1dSLionel Sambuc
58*0a6a1f1dSLionel Sambuc if ((pgrp = tcgetpgrp(fd)) == -1)
59eda6f593SDavid van Moolenbroek return (NULL);
60eda6f593SDavid van Moolenbroek
61*0a6a1f1dSLionel Sambuc ret = proc_pidinfo(pgrp, PROC_PIDVNODEPATHINFO, 0,
62*0a6a1f1dSLionel Sambuc &pathinfo, sizeof pathinfo);
63*0a6a1f1dSLionel Sambuc if (ret == sizeof pathinfo) {
64*0a6a1f1dSLionel Sambuc strlcpy(wd, pathinfo.pvi_cdir.vip_path, sizeof wd);
65*0a6a1f1dSLionel Sambuc return (wd);
66*0a6a1f1dSLionel Sambuc }
67*0a6a1f1dSLionel Sambuc return (NULL);
68eda6f593SDavid van Moolenbroek }
69eda6f593SDavid van Moolenbroek
70eda6f593SDavid van Moolenbroek struct event_base *
osdep_event_init(void)71eda6f593SDavid van Moolenbroek osdep_event_init(void)
72eda6f593SDavid van Moolenbroek {
73eda6f593SDavid van Moolenbroek /*
74eda6f593SDavid van Moolenbroek * On OS X, kqueue and poll are both completely broken and don't
75eda6f593SDavid van Moolenbroek * work on anything except socket file descriptors (yes, really).
76eda6f593SDavid van Moolenbroek */
77eda6f593SDavid van Moolenbroek setenv("EVENT_NOKQUEUE", "1", 1);
78eda6f593SDavid van Moolenbroek setenv("EVENT_NOPOLL", "1", 1);
79eda6f593SDavid van Moolenbroek return (event_init());
80eda6f593SDavid van Moolenbroek }
81