xref: /minix3/external/bsd/tmux/dist/osdep-darwin.c (revision 0a6a1f1d05b60e214de2f05a7310ddd1f0e590e7)
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