4 * Copyright (c) 2009 Nicholas Marriott <nicholas.marriott@gmail.com>
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.
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.
19 #include <sys/types.h>
20 #include <sys/signal.h>
22 #include <sys/sysctl.h>
33 #define nitems(_a) (sizeof((_a)) / sizeof((_a)[0]))
36 #define is_runnable(p) \
37 ((p)->p_stat == SRUN || (p)->p_stat == SIDL || (p)->p_stat == SONPROC)
38 #define is_stopped(p) \
39 ((p)->p_stat == SSTOP || (p)->p_stat == SDEAD)
41 static struct kinfo_proc
*cmp_procs(struct kinfo_proc
*, struct kinfo_proc
*);
42 char *osdep_get_name(int, char *);
43 char *osdep_get_cwd(int);
44 struct event_base
*osdep_event_init(void);
46 static struct kinfo_proc
*
47 cmp_procs(struct kinfo_proc
*p1
, struct kinfo_proc
*p2
)
49 if (is_runnable(p1
) && !is_runnable(p2
))
51 if (!is_runnable(p1
) && is_runnable(p2
))
54 if (is_stopped(p1
) && !is_stopped(p2
))
56 if (!is_stopped(p1
) && is_stopped(p2
))
59 if (p1
->p_estcpu
> p2
->p_estcpu
)
61 if (p1
->p_estcpu
< p2
->p_estcpu
)
64 if (p1
->p_slptime
< p2
->p_slptime
)
66 if (p1
->p_slptime
> p2
->p_slptime
)
69 if ((p1
->p_flag
& P_SINTR
) && !(p2
->p_flag
& P_SINTR
))
71 if (!(p1
->p_flag
& P_SINTR
) && (p2
->p_flag
& P_SINTR
))
74 if (strcmp(p1
->p_comm
, p2
->p_comm
) < 0)
76 if (strcmp(p1
->p_comm
, p2
->p_comm
) > 0)
79 if (p1
->p_pid
> p2
->p_pid
)
85 osdep_get_name(int fd
, char *tty
)
87 int mib
[6] = { CTL_KERN
, KERN_PROC
, KERN_PROC_PGRP
, 0,
88 sizeof(struct kinfo_proc
), 0 };
91 struct kinfo_proc
*buf
, *newbuf
, *bestp
;
97 if (stat(tty
, &sb
) == -1)
99 if ((mib
[3] = tcgetpgrp(fd
)) == -1)
103 if (sysctl(mib
, nitems(mib
), NULL
, &len
, NULL
, 0) == -1)
107 if ((newbuf
= realloc(buf
, len
)) == NULL
)
111 mib
[5] = (int)(len
/ sizeof(struct kinfo_proc
));
112 if (sysctl(mib
, nitems(mib
), buf
, &len
, NULL
, 0) == -1) {
119 for (i
= 0; i
< len
/ sizeof (struct kinfo_proc
); i
++) {
120 if ((dev_t
)buf
[i
].p_tdev
!= sb
.st_rdev
)
125 bestp
= cmp_procs(&buf
[i
], bestp
);
130 name
= strdup(bestp
->p_comm
);
141 osdep_get_cwd(int fd
)
143 int name
[] = { CTL_KERN
, KERN_PROC_CWD
, 0 };
144 static char path
[PATH_MAX
];
145 size_t pathlen
= sizeof path
;
147 if ((name
[2] = tcgetpgrp(fd
)) == -1)
149 if (sysctl(name
, 3, path
, &pathlen
, NULL
, 0) != 0)
155 osdep_event_init(void)
157 return (event_init());