Annotation of embedaddon/tmux/osdep-openbsd.c, revision 1.1.1.1
1.1 misho 1: /* $OpenBSD$ */
2:
3: /*
4: * Copyright (c) 2009 Nicholas Marriott <nicholas.marriott@gmail.com>
5: *
6: * Permission to use, copy, modify, and distribute this software for any
7: * purpose with or without fee is hereby granted, provided that the above
8: * copyright notice and this permission notice appear in all copies.
9: *
10: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14: * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
15: * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
16: * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17: */
18:
19: #include <sys/param.h> /* MAXCOMLEN */
20: #include <sys/types.h>
21: #include <sys/proc.h>
22: #include <sys/sysctl.h>
23: #include <sys/stat.h>
24:
25: #include <errno.h>
26: #include <event.h>
27: #include <stdlib.h>
28: #include <string.h>
29: #include <unistd.h>
30:
31: #ifndef nitems
32: #define nitems(_a) (sizeof((_a)) / sizeof((_a)[0]))
33: #endif
34:
35: #define is_runnable(p) \
36: ((p)->p_stat == SRUN || (p)->p_stat == SIDL || (p)->p_stat == SONPROC)
37: #define is_stopped(p) \
38: ((p)->p_stat == SSTOP || (p)->p_stat == SDEAD)
39:
40: static struct kinfo_proc *cmp_procs(struct kinfo_proc *, struct kinfo_proc *);
41: char *osdep_get_name(int, char *);
42: char *osdep_get_cwd(int);
43: struct event_base *osdep_event_init(void);
44:
45: static struct kinfo_proc *
46: cmp_procs(struct kinfo_proc *p1, struct kinfo_proc *p2)
47: {
48: if (is_runnable(p1) && !is_runnable(p2))
49: return (p1);
50: if (!is_runnable(p1) && is_runnable(p2))
51: return (p2);
52:
53: if (is_stopped(p1) && !is_stopped(p2))
54: return (p1);
55: if (!is_stopped(p1) && is_stopped(p2))
56: return (p2);
57:
58: if (p1->p_estcpu > p2->p_estcpu)
59: return (p1);
60: if (p1->p_estcpu < p2->p_estcpu)
61: return (p2);
62:
63: if (p1->p_slptime < p2->p_slptime)
64: return (p1);
65: if (p1->p_slptime > p2->p_slptime)
66: return (p2);
67:
68: if ((p1->p_flag & P_SINTR) && !(p2->p_flag & P_SINTR))
69: return (p1);
70: if (!(p1->p_flag & P_SINTR) && (p2->p_flag & P_SINTR))
71: return (p2);
72:
73: if (strcmp(p1->p_comm, p2->p_comm) < 0)
74: return (p1);
75: if (strcmp(p1->p_comm, p2->p_comm) > 0)
76: return (p2);
77:
78: if (p1->p_pid > p2->p_pid)
79: return (p1);
80: return (p2);
81: }
82:
83: char *
84: osdep_get_name(int fd, char *tty)
85: {
86: int mib[6] = { CTL_KERN, KERN_PROC, KERN_PROC_PGRP, 0,
87: sizeof(struct kinfo_proc), 0 };
88: struct stat sb;
89: size_t len;
90: struct kinfo_proc *buf, *newbuf, *bestp;
91: u_int i;
92: char *name;
93:
94: buf = NULL;
95:
96: if (stat(tty, &sb) == -1)
97: return (NULL);
98: if ((mib[3] = tcgetpgrp(fd)) == -1)
99: return (NULL);
100:
101: retry:
102: if (sysctl(mib, nitems(mib), NULL, &len, NULL, 0) == -1)
103: goto error;
104: len = (len * 5) / 4;
105:
106: if ((newbuf = realloc(buf, len)) == NULL)
107: goto error;
108: buf = newbuf;
109:
110: mib[5] = (int)(len / sizeof(struct kinfo_proc));
111: if (sysctl(mib, nitems(mib), buf, &len, NULL, 0) == -1) {
112: if (errno == ENOMEM)
113: goto retry;
114: goto error;
115: }
116:
117: bestp = NULL;
118: for (i = 0; i < len / sizeof (struct kinfo_proc); i++) {
119: if ((dev_t)buf[i].p_tdev != sb.st_rdev)
120: continue;
121: if (bestp == NULL)
122: bestp = &buf[i];
123: else
124: bestp = cmp_procs(&buf[i], bestp);
125: }
126:
127: name = NULL;
128: if (bestp != NULL)
129: name = strdup(bestp->p_comm);
130:
131: free(buf);
132: return (name);
133:
134: error:
135: free(buf);
136: return (NULL);
137: }
138:
139: char *
140: osdep_get_cwd(int fd)
141: {
142: int name[] = { CTL_KERN, KERN_PROC_CWD, 0 };
143: static char path[MAXPATHLEN];
144: size_t pathlen = sizeof path;
145:
146: if ((name[2] = tcgetpgrp(fd)) == -1)
147: return (NULL);
148: if (sysctl(name, 3, path, &pathlen, NULL, 0) != 0)
149: return (NULL);
150: return (path);
151: }
152:
153: struct event_base *
154: osdep_event_init(void)
155: {
156: return (event_init());
157: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>