xref: /netbsd/external/bsd/tmux/dist/osdep-darwin.c (revision 5b2b32f5)
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