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