xref: /minix3/external/bsd/tmux/dist/osdep-netbsd.c (revision 0a6a1f1d05b60e214de2f05a7310ddd1f0e590e7)
1*0a6a1f1dSLionel Sambuc /* Id */
2eda6f593SDavid van Moolenbroek 
3eda6f593SDavid van Moolenbroek /*
4eda6f593SDavid van Moolenbroek  * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
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/param.h>
20eda6f593SDavid van Moolenbroek #include <sys/proc.h>
21eda6f593SDavid van Moolenbroek #include <sys/stat.h>
22eda6f593SDavid van Moolenbroek #include <sys/sysctl.h>
23eda6f593SDavid van Moolenbroek 
24eda6f593SDavid van Moolenbroek #include <errno.h>
25eda6f593SDavid van Moolenbroek #include <event.h>
26eda6f593SDavid van Moolenbroek #include <stdlib.h>
27eda6f593SDavid van Moolenbroek #include <string.h>
28eda6f593SDavid van Moolenbroek #include <unistd.h>
29eda6f593SDavid van Moolenbroek 
30eda6f593SDavid van Moolenbroek #define is_runnable(p) \
31eda6f593SDavid van Moolenbroek         ((p)->p_stat == LSRUN || (p)->p_stat == SIDL)
32eda6f593SDavid van Moolenbroek #define is_stopped(p) \
33eda6f593SDavid van Moolenbroek         ((p)->p_stat == SSTOP || (p)->p_stat == SZOMB)
34eda6f593SDavid van Moolenbroek 
35eda6f593SDavid van Moolenbroek struct kinfo_proc2	*cmp_procs(struct kinfo_proc2 *, struct kinfo_proc2 *);
36eda6f593SDavid van Moolenbroek char			*osdep_get_name(int, char *);
37*0a6a1f1dSLionel Sambuc char			*osdep_get_cwd(int);
38eda6f593SDavid van Moolenbroek struct event_base	*osdep_event_init(void);
39eda6f593SDavid van Moolenbroek 
40eda6f593SDavid van Moolenbroek struct kinfo_proc2 *
cmp_procs(struct kinfo_proc2 * p1,struct kinfo_proc2 * p2)41eda6f593SDavid van Moolenbroek cmp_procs(struct kinfo_proc2 *p1, struct kinfo_proc2 *p2)
42eda6f593SDavid van Moolenbroek {
43eda6f593SDavid van Moolenbroek 	if (is_runnable(p1) && !is_runnable(p2))
44eda6f593SDavid van Moolenbroek 		return (p1);
45eda6f593SDavid van Moolenbroek 	if (!is_runnable(p1) && is_runnable(p2))
46eda6f593SDavid van Moolenbroek 		return (p2);
47eda6f593SDavid van Moolenbroek 
48eda6f593SDavid van Moolenbroek 	if (is_stopped(p1) && !is_stopped(p2))
49eda6f593SDavid van Moolenbroek 		return (p1);
50eda6f593SDavid van Moolenbroek 	if (!is_stopped(p1) && is_stopped(p2))
51eda6f593SDavid van Moolenbroek 		return (p2);
52eda6f593SDavid van Moolenbroek 
53eda6f593SDavid van Moolenbroek 	if (p1->p_estcpu > p2->p_estcpu)
54eda6f593SDavid van Moolenbroek 		return (p1);
55eda6f593SDavid van Moolenbroek 	if (p1->p_estcpu < p2->p_estcpu)
56eda6f593SDavid van Moolenbroek 		return (p2);
57eda6f593SDavid van Moolenbroek 
58eda6f593SDavid van Moolenbroek 	if (p1->p_slptime < p2->p_slptime)
59eda6f593SDavid van Moolenbroek 		return (p1);
60eda6f593SDavid van Moolenbroek 	if (p1->p_slptime > p2->p_slptime)
61eda6f593SDavid van Moolenbroek 		return (p2);
62eda6f593SDavid van Moolenbroek 
63eda6f593SDavid van Moolenbroek 	if (p1->p_pid > p2->p_pid)
64eda6f593SDavid van Moolenbroek 		return (p1);
65eda6f593SDavid van Moolenbroek 	return (p2);
66eda6f593SDavid van Moolenbroek }
67eda6f593SDavid van Moolenbroek 
68eda6f593SDavid van Moolenbroek char *
osdep_get_name(int fd,__unused char * tty)69eda6f593SDavid van Moolenbroek osdep_get_name(int fd, __unused char *tty)
70eda6f593SDavid van Moolenbroek {
71eda6f593SDavid van Moolenbroek 	int		 mib[6];
72eda6f593SDavid van Moolenbroek 	struct stat	 sb;
73eda6f593SDavid van Moolenbroek 	size_t		 len, i;
74eda6f593SDavid van Moolenbroek 	struct kinfo_proc2 *buf, *newbuf, *bestp;
75eda6f593SDavid van Moolenbroek 	char		*name;
76eda6f593SDavid van Moolenbroek 
77eda6f593SDavid van Moolenbroek 	if (stat(tty, &sb) == -1)
78eda6f593SDavid van Moolenbroek 		return (NULL);
79eda6f593SDavid van Moolenbroek 	if ((mib[3] = tcgetpgrp(fd)) == -1)
80eda6f593SDavid van Moolenbroek 		return (NULL);
81eda6f593SDavid van Moolenbroek 
82eda6f593SDavid van Moolenbroek 	buf = NULL;
83eda6f593SDavid van Moolenbroek 	len = sizeof(bestp);
84eda6f593SDavid van Moolenbroek 	mib[0] = CTL_KERN;
85eda6f593SDavid van Moolenbroek 	mib[1] = KERN_PROC2;
86eda6f593SDavid van Moolenbroek 	mib[2] = KERN_PROC_PGRP;
87eda6f593SDavid van Moolenbroek 	mib[4] = sizeof (*buf);
88eda6f593SDavid van Moolenbroek 	mib[5] = 0;
89eda6f593SDavid van Moolenbroek 
90eda6f593SDavid van Moolenbroek retry:
91eda6f593SDavid van Moolenbroek 	if (sysctl(mib, __arraycount(mib), NULL, &len, NULL, 0) == -1)
92eda6f593SDavid van Moolenbroek 		return (NULL);
93eda6f593SDavid van Moolenbroek 
94eda6f593SDavid van Moolenbroek 	if ((newbuf = realloc(buf, len * sizeof (*buf))) == NULL)
95eda6f593SDavid van Moolenbroek 		goto error;
96eda6f593SDavid van Moolenbroek 	buf = newbuf;
97eda6f593SDavid van Moolenbroek 
98eda6f593SDavid van Moolenbroek 	mib[5] = len / sizeof(*buf);
99eda6f593SDavid van Moolenbroek 	if (sysctl(mib, __arraycount(mib), buf, &len, NULL, 0) == -1) {
100eda6f593SDavid van Moolenbroek 		if (errno == ENOMEM)
101eda6f593SDavid van Moolenbroek 			goto retry; /* possible infinite loop? */
102eda6f593SDavid van Moolenbroek 		goto error;
103eda6f593SDavid van Moolenbroek 	}
104eda6f593SDavid van Moolenbroek 
105eda6f593SDavid van Moolenbroek 	bestp = NULL;
106eda6f593SDavid van Moolenbroek 	for (i = 0; i < len / sizeof (*buf); i++) {
107eda6f593SDavid van Moolenbroek 		if (buf[i].p_tdev != sb.st_rdev)
108eda6f593SDavid van Moolenbroek 			continue;
109eda6f593SDavid van Moolenbroek 		if (bestp == NULL)
110eda6f593SDavid van Moolenbroek 			bestp = &buf[i];
111eda6f593SDavid van Moolenbroek 		else
112eda6f593SDavid van Moolenbroek 			bestp = cmp_procs(&buf[i], bestp);
113eda6f593SDavid van Moolenbroek 	}
114eda6f593SDavid van Moolenbroek 
115eda6f593SDavid van Moolenbroek 	name = NULL;
116eda6f593SDavid van Moolenbroek 	if (bestp != NULL)
117eda6f593SDavid van Moolenbroek 		name = strdup(bestp->p_comm);
118eda6f593SDavid van Moolenbroek 
119eda6f593SDavid van Moolenbroek 	free(buf);
120eda6f593SDavid van Moolenbroek 	return (name);
121eda6f593SDavid van Moolenbroek 
122eda6f593SDavid van Moolenbroek error:
123eda6f593SDavid van Moolenbroek 	free(buf);
124eda6f593SDavid van Moolenbroek 	return (NULL);
125eda6f593SDavid van Moolenbroek }
126eda6f593SDavid van Moolenbroek 
127*0a6a1f1dSLionel Sambuc char *
osdep_get_cwd(int fd)128*0a6a1f1dSLionel Sambuc osdep_get_cwd(int fd)
129*0a6a1f1dSLionel Sambuc {
130*0a6a1f1dSLionel Sambuc 	return (NULL);
131*0a6a1f1dSLionel Sambuc }
132*0a6a1f1dSLionel Sambuc 
133eda6f593SDavid van Moolenbroek struct event_base *
osdep_event_init(void)134eda6f593SDavid van Moolenbroek osdep_event_init(void)
135eda6f593SDavid van Moolenbroek {
136eda6f593SDavid van Moolenbroek 	return (event_init());
137eda6f593SDavid van Moolenbroek }
138