Blame


1 fd04aace 2003-11-23 devnull #define NOPLAN9DEFINES
2 fd04aace 2003-11-23 devnull #include <u.h>
3 fd04aace 2003-11-23 devnull #include <libc.h>
4 fd04aace 2003-11-23 devnull
5 b2cfc4e2 2003-09-30 devnull #include <signal.h>
6 b2cfc4e2 2003-09-30 devnull #include <sys/types.h>
7 a8ec4910 2005-07-13 devnull #include <sys/wait.h>
8 912fba95 2003-11-24 devnull #include <sys/time.h>
9 b2cfc4e2 2003-09-30 devnull #include <sys/resource.h>
10 b2cfc4e2 2003-09-30 devnull
11 40ce5ba6 2005-05-01 devnull #ifndef WCOREDUMP /* not on Mac OS X Tiger */
12 40ce5ba6 2005-05-01 devnull #define WCOREDUMP(status) 0
13 40ce5ba6 2005-05-01 devnull #endif
14 40ce5ba6 2005-05-01 devnull
15 b2cfc4e2 2003-09-30 devnull static struct {
16 b2cfc4e2 2003-09-30 devnull int sig;
17 b2cfc4e2 2003-09-30 devnull char *str;
18 b2cfc4e2 2003-09-30 devnull } tab[] = {
19 b2cfc4e2 2003-09-30 devnull SIGHUP, "hangup",
20 b2cfc4e2 2003-09-30 devnull SIGINT, "interrupt",
21 b2cfc4e2 2003-09-30 devnull SIGQUIT, "quit",
22 b4223cd6 2005-01-04 devnull SIGILL, "sys: illegal instruction",
23 b4223cd6 2005-01-04 devnull SIGTRAP, "sys: breakpoint",
24 b2cfc4e2 2003-09-30 devnull SIGABRT, "sys: abort",
25 d2c4ee9e 2003-11-24 devnull #ifdef SIGEMT
26 b2cfc4e2 2003-09-30 devnull SIGEMT, "sys: emulate instruction executed",
27 d2c4ee9e 2003-11-24 devnull #endif
28 b2cfc4e2 2003-09-30 devnull SIGFPE, "sys: fp: trap",
29 b2cfc4e2 2003-09-30 devnull SIGKILL, "sys: kill",
30 b2cfc4e2 2003-09-30 devnull SIGBUS, "sys: bus error",
31 b2cfc4e2 2003-09-30 devnull SIGSEGV, "sys: segmentation violation",
32 b2cfc4e2 2003-09-30 devnull SIGALRM, "alarm",
33 b2cfc4e2 2003-09-30 devnull SIGTERM, "kill",
34 b2cfc4e2 2003-09-30 devnull SIGURG, "sys: urgent condition on socket",
35 b2cfc4e2 2003-09-30 devnull SIGSTOP, "sys: stop",
36 b2cfc4e2 2003-09-30 devnull SIGTSTP, "sys: tstp",
37 b2cfc4e2 2003-09-30 devnull SIGCONT, "sys: cont",
38 b2cfc4e2 2003-09-30 devnull SIGCHLD, "sys: child",
39 b2cfc4e2 2003-09-30 devnull SIGTTIN, "sys: ttin",
40 b2cfc4e2 2003-09-30 devnull SIGTTOU, "sys: ttou",
41 40ce5ba6 2005-05-01 devnull #ifdef SIGIO /* not on Mac OS X Tiger */
42 b2cfc4e2 2003-09-30 devnull SIGIO, "sys: i/o possible on fd",
43 40ce5ba6 2005-05-01 devnull #endif
44 b2cfc4e2 2003-09-30 devnull SIGXCPU, "sys: cpu time limit exceeded",
45 b2cfc4e2 2003-09-30 devnull SIGXFSZ, "sys: file size limit exceeded",
46 b2cfc4e2 2003-09-30 devnull SIGVTALRM, "sys: virtual time alarm",
47 b2cfc4e2 2003-09-30 devnull SIGPROF, "sys: profiling timer alarm",
48 40ce5ba6 2005-05-01 devnull #ifdef SIGWINCH /* not on Mac OS X Tiger */
49 b2cfc4e2 2003-09-30 devnull SIGWINCH, "sys: window size change",
50 40ce5ba6 2005-05-01 devnull #endif
51 1c253ceb 2003-11-23 devnull #ifdef SIGINFO
52 b2cfc4e2 2003-09-30 devnull SIGINFO, "sys: status request",
53 1c253ceb 2003-11-23 devnull #endif
54 b2cfc4e2 2003-09-30 devnull SIGUSR1, "sys: usr1",
55 b2cfc4e2 2003-09-30 devnull SIGUSR2, "sys: usr2",
56 32f69c36 2003-12-11 devnull SIGPIPE, "sys: write on closed pipe",
57 b2cfc4e2 2003-09-30 devnull };
58 fa325e9b 2020-01-10 cross
59 fd04aace 2003-11-23 devnull char*
60 b2cfc4e2 2003-09-30 devnull _p9sigstr(int sig, char *tmp)
61 b2cfc4e2 2003-09-30 devnull {
62 b2cfc4e2 2003-09-30 devnull int i;
63 b2cfc4e2 2003-09-30 devnull
64 b2cfc4e2 2003-09-30 devnull for(i=0; i<nelem(tab); i++)
65 b2cfc4e2 2003-09-30 devnull if(tab[i].sig == sig)
66 b2cfc4e2 2003-09-30 devnull return tab[i].str;
67 3a9dccd7 2004-04-02 devnull if(tmp == nil)
68 3a9dccd7 2004-04-02 devnull return nil;
69 b2cfc4e2 2003-09-30 devnull sprint(tmp, "sys: signal %d", sig);
70 b2cfc4e2 2003-09-30 devnull return tmp;
71 b2cfc4e2 2003-09-30 devnull }
72 b2cfc4e2 2003-09-30 devnull
73 fd04aace 2003-11-23 devnull int
74 b2cfc4e2 2003-09-30 devnull _p9strsig(char *s)
75 b2cfc4e2 2003-09-30 devnull {
76 b2cfc4e2 2003-09-30 devnull int i;
77 b2cfc4e2 2003-09-30 devnull
78 b2cfc4e2 2003-09-30 devnull for(i=0; i<nelem(tab); i++)
79 b2cfc4e2 2003-09-30 devnull if(strcmp(s, tab[i].str) == 0)
80 b2cfc4e2 2003-09-30 devnull return tab[i].sig;
81 b2cfc4e2 2003-09-30 devnull return 0;
82 b2cfc4e2 2003-09-30 devnull }
83 b2cfc4e2 2003-09-30 devnull
84 5a8e63b2 2004-02-29 devnull static int
85 03417610 2004-12-27 devnull _await(int pid4, char *str, int n, int opt)
86 b2cfc4e2 2003-09-30 devnull {
87 b2cfc4e2 2003-09-30 devnull int pid, status, cd;
88 b2cfc4e2 2003-09-30 devnull struct rusage ru;
89 b2cfc4e2 2003-09-30 devnull char buf[128], tmp[64];
90 b2cfc4e2 2003-09-30 devnull ulong u, s;
91 b2cfc4e2 2003-09-30 devnull
92 b2cfc4e2 2003-09-30 devnull for(;;){
93 005a85f3 2005-01-07 devnull /* On Linux, pid==-1 means anyone; on SunOS, it's pid==0. */
94 005a85f3 2005-01-07 devnull if(pid4 == -1)
95 005a85f3 2005-01-07 devnull pid = wait3(&status, opt, &ru);
96 005a85f3 2005-01-07 devnull else
97 005a85f3 2005-01-07 devnull pid = wait4(pid4, &status, opt, &ru);
98 5a8e63b2 2004-02-29 devnull if(pid <= 0)
99 b2cfc4e2 2003-09-30 devnull return -1;
100 b2cfc4e2 2003-09-30 devnull u = ru.ru_utime.tv_sec*1000+((ru.ru_utime.tv_usec+500)/1000);
101 b2cfc4e2 2003-09-30 devnull s = ru.ru_stime.tv_sec*1000+((ru.ru_stime.tv_usec+500)/1000);
102 b2cfc4e2 2003-09-30 devnull if(WIFEXITED(status)){
103 b2cfc4e2 2003-09-30 devnull status = WEXITSTATUS(status);
104 b2cfc4e2 2003-09-30 devnull if(status)
105 fd04aace 2003-11-23 devnull snprint(buf, sizeof buf, "%d %lud %lud %lud %d", pid, u, s, u+s, status);
106 b2cfc4e2 2003-09-30 devnull else
107 fd04aace 2003-11-23 devnull snprint(buf, sizeof buf, "%d %lud %lud %lud ''", pid, u, s, u+s, status);
108 b2cfc4e2 2003-09-30 devnull strecpy(str, str+n, buf);
109 b2cfc4e2 2003-09-30 devnull return strlen(str);
110 b2cfc4e2 2003-09-30 devnull }
111 b2cfc4e2 2003-09-30 devnull if(WIFSIGNALED(status)){
112 b2cfc4e2 2003-09-30 devnull cd = WCOREDUMP(status);
113 99834d13 2004-10-22 devnull snprint(buf, sizeof buf, "%d %lud %lud %lud 'signal: %s%s'", pid, u, s, u+s, _p9sigstr(WTERMSIG(status), tmp), cd ? " (core dumped)" : "");
114 b2cfc4e2 2003-09-30 devnull strecpy(str, str+n, buf);
115 b2cfc4e2 2003-09-30 devnull return strlen(str);
116 b2cfc4e2 2003-09-30 devnull }
117 b2cfc4e2 2003-09-30 devnull }
118 b2cfc4e2 2003-09-30 devnull }
119 5a8e63b2 2004-02-29 devnull
120 5a8e63b2 2004-02-29 devnull int
121 5a8e63b2 2004-02-29 devnull await(char *str, int n)
122 5a8e63b2 2004-02-29 devnull {
123 03417610 2004-12-27 devnull return _await(-1, str, n, 0);
124 5a8e63b2 2004-02-29 devnull }
125 5a8e63b2 2004-02-29 devnull
126 5a8e63b2 2004-02-29 devnull int
127 5a8e63b2 2004-02-29 devnull awaitnohang(char *str, int n)
128 5a8e63b2 2004-02-29 devnull {
129 03417610 2004-12-27 devnull return _await(-1, str, n, WNOHANG);
130 5a8e63b2 2004-02-29 devnull }
131 5a8e63b2 2004-02-29 devnull
132 03417610 2004-12-27 devnull int
133 03417610 2004-12-27 devnull awaitfor(int pid, char *str, int n)
134 03417610 2004-12-27 devnull {
135 03417610 2004-12-27 devnull return _await(pid, str, n, 0);
136 03417610 2004-12-27 devnull }