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