Blame


1 b2cfc4e2 2003-09-30 devnull #include <signal.h>
2 b2cfc4e2 2003-09-30 devnull #include <sys/types.h>
3 a995e477 2003-10-01 devnull #include <sys/time.h>
4 b2cfc4e2 2003-09-30 devnull #include <sys/resource.h>
5 b2cfc4e2 2003-09-30 devnull #include <sys/wait.h>
6 b2cfc4e2 2003-09-30 devnull #include <sys/time.h>
7 b2cfc4e2 2003-09-30 devnull #include <string.h>
8 b2cfc4e2 2003-09-30 devnull #include <errno.h>
9 b2cfc4e2 2003-09-30 devnull #include <lib9.h>
10 b2cfc4e2 2003-09-30 devnull
11 b2cfc4e2 2003-09-30 devnull static struct {
12 b2cfc4e2 2003-09-30 devnull int sig;
13 b2cfc4e2 2003-09-30 devnull char *str;
14 b2cfc4e2 2003-09-30 devnull } tab[] = {
15 b2cfc4e2 2003-09-30 devnull SIGHUP, "hangup",
16 b2cfc4e2 2003-09-30 devnull SIGINT, "interrupt",
17 b2cfc4e2 2003-09-30 devnull SIGQUIT, "quit",
18 b2cfc4e2 2003-09-30 devnull SIGILL, "sys: trap: illegal instruction",
19 b2cfc4e2 2003-09-30 devnull SIGTRAP, "sys: trace trap",
20 b2cfc4e2 2003-09-30 devnull SIGABRT, "sys: abort",
21 b2cfc4e2 2003-09-30 devnull #ifdef SIGEMT
22 b2cfc4e2 2003-09-30 devnull SIGEMT, "sys: emulate instruction executed",
23 b2cfc4e2 2003-09-30 devnull #endif
24 b2cfc4e2 2003-09-30 devnull SIGFPE, "sys: fp: trap",
25 b2cfc4e2 2003-09-30 devnull SIGKILL, "sys: kill",
26 b2cfc4e2 2003-09-30 devnull SIGBUS, "sys: bus error",
27 b2cfc4e2 2003-09-30 devnull SIGSEGV, "sys: segmentation violation",
28 b2cfc4e2 2003-09-30 devnull SIGALRM, "alarm",
29 b2cfc4e2 2003-09-30 devnull SIGTERM, "kill",
30 b2cfc4e2 2003-09-30 devnull SIGURG, "sys: urgent condition on socket",
31 b2cfc4e2 2003-09-30 devnull SIGSTOP, "sys: stop",
32 b2cfc4e2 2003-09-30 devnull SIGTSTP, "sys: tstp",
33 b2cfc4e2 2003-09-30 devnull SIGCONT, "sys: cont",
34 b2cfc4e2 2003-09-30 devnull SIGCHLD, "sys: child",
35 b2cfc4e2 2003-09-30 devnull SIGTTIN, "sys: ttin",
36 b2cfc4e2 2003-09-30 devnull SIGTTOU, "sys: ttou",
37 b2cfc4e2 2003-09-30 devnull SIGIO, "sys: i/o possible on fd",
38 b2cfc4e2 2003-09-30 devnull SIGXCPU, "sys: cpu time limit exceeded",
39 b2cfc4e2 2003-09-30 devnull SIGXFSZ, "sys: file size limit exceeded",
40 b2cfc4e2 2003-09-30 devnull SIGVTALRM, "sys: virtual time alarm",
41 b2cfc4e2 2003-09-30 devnull SIGPROF, "sys: profiling timer alarm",
42 b2cfc4e2 2003-09-30 devnull SIGWINCH, "sys: window size change",
43 b2cfc4e2 2003-09-30 devnull #ifdef SIGINFO
44 b2cfc4e2 2003-09-30 devnull SIGINFO, "sys: status request",
45 b2cfc4e2 2003-09-30 devnull #endif
46 b2cfc4e2 2003-09-30 devnull SIGUSR1, "sys: usr1",
47 b2cfc4e2 2003-09-30 devnull SIGUSR2, "sys: usr2",
48 b2cfc4e2 2003-09-30 devnull };
49 b2cfc4e2 2003-09-30 devnull
50 b2cfc4e2 2003-09-30 devnull static char*
51 b2cfc4e2 2003-09-30 devnull _p9sigstr(int sig, char *tmp)
52 b2cfc4e2 2003-09-30 devnull {
53 b2cfc4e2 2003-09-30 devnull int i;
54 b2cfc4e2 2003-09-30 devnull
55 b2cfc4e2 2003-09-30 devnull for(i=0; i<nelem(tab); i++)
56 b2cfc4e2 2003-09-30 devnull if(tab[i].sig == sig)
57 b2cfc4e2 2003-09-30 devnull return tab[i].str;
58 b2cfc4e2 2003-09-30 devnull sprint(tmp, "sys: signal %d", sig);
59 b2cfc4e2 2003-09-30 devnull return tmp;
60 b2cfc4e2 2003-09-30 devnull }
61 b2cfc4e2 2003-09-30 devnull
62 b2cfc4e2 2003-09-30 devnull /*
63 b2cfc4e2 2003-09-30 devnull static int
64 b2cfc4e2 2003-09-30 devnull _p9strsig(char *s)
65 b2cfc4e2 2003-09-30 devnull {
66 b2cfc4e2 2003-09-30 devnull int i;
67 b2cfc4e2 2003-09-30 devnull
68 b2cfc4e2 2003-09-30 devnull for(i=0; i<nelem(tab); i++)
69 b2cfc4e2 2003-09-30 devnull if(strcmp(s, tab[i].str) == 0)
70 b2cfc4e2 2003-09-30 devnull return tab[i].sig;
71 b2cfc4e2 2003-09-30 devnull return 0;
72 b2cfc4e2 2003-09-30 devnull }
73 b2cfc4e2 2003-09-30 devnull */
74 b2cfc4e2 2003-09-30 devnull
75 b2cfc4e2 2003-09-30 devnull int
76 b2cfc4e2 2003-09-30 devnull await(char *str, int n)
77 b2cfc4e2 2003-09-30 devnull {
78 b2cfc4e2 2003-09-30 devnull int pid, status, cd;
79 b2cfc4e2 2003-09-30 devnull struct rusage ru;
80 b2cfc4e2 2003-09-30 devnull char buf[128], tmp[64];
81 b2cfc4e2 2003-09-30 devnull ulong u, s;
82 b2cfc4e2 2003-09-30 devnull
83 b2cfc4e2 2003-09-30 devnull for(;;){
84 b2cfc4e2 2003-09-30 devnull pid = wait3(&status, 0, &ru);
85 b2cfc4e2 2003-09-30 devnull if(pid < 0)
86 b2cfc4e2 2003-09-30 devnull return -1;
87 b2cfc4e2 2003-09-30 devnull u = ru.ru_utime.tv_sec*1000+((ru.ru_utime.tv_usec+500)/1000);
88 b2cfc4e2 2003-09-30 devnull s = ru.ru_stime.tv_sec*1000+((ru.ru_stime.tv_usec+500)/1000);
89 b2cfc4e2 2003-09-30 devnull if(WIFEXITED(status)){
90 b2cfc4e2 2003-09-30 devnull status = WEXITSTATUS(status);
91 b2cfc4e2 2003-09-30 devnull if(status)
92 b2cfc4e2 2003-09-30 devnull snprint(buf, sizeof buf, "%d %lu %lu %lu %d", pid, u, s, u+s, status);
93 b2cfc4e2 2003-09-30 devnull else
94 b2cfc4e2 2003-09-30 devnull snprint(buf, sizeof buf, "%d %lu %lu %lu ''", pid, u, s, u+s);
95 b2cfc4e2 2003-09-30 devnull strecpy(str, str+n, buf);
96 b2cfc4e2 2003-09-30 devnull return strlen(str);
97 b2cfc4e2 2003-09-30 devnull }
98 b2cfc4e2 2003-09-30 devnull if(WIFSIGNALED(status)){
99 b2cfc4e2 2003-09-30 devnull cd = WCOREDUMP(status);
100 b2cfc4e2 2003-09-30 devnull USED(cd);
101 b2cfc4e2 2003-09-30 devnull snprint(buf, sizeof buf, "%d %lu %lu %lu '%s'", pid, u, s, u+s, _p9sigstr(WTERMSIG(status), tmp));
102 b2cfc4e2 2003-09-30 devnull strecpy(str, str+n, buf);
103 b2cfc4e2 2003-09-30 devnull return strlen(str);
104 b2cfc4e2 2003-09-30 devnull }
105 b2cfc4e2 2003-09-30 devnull }
106 b2cfc4e2 2003-09-30 devnull }