X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=secnet.git;a=blobdiff_plain;f=process.c;h=b75b9c0d6e70159ec60d56738e4e6bfe05a551f7;hp=343be9b58bc59b0eac0330cf5e168e31d7608772;hb=4ac7fd3ff73c98100d8a8546668d0212e4af3ffa;hpb=baab3a63ada033b2b9eed46807b2e88536612bbc diff --git a/process.c b/process.c index 343be9b..b75b9c0 100644 --- a/process.c +++ b/process.c @@ -143,17 +143,8 @@ int sys_cmd(const char *path, const char *arg, ...) fatal("sys_cmd: waitpid for %s returned wrong process ID!", path); if (rv) { - /* If the command failed reporting its exit status */ - if (WIFEXITED(rv)) - Message(M_ERR, "sys_cmd(%s,%s,...) exited with status %d\n", - path, arg, WEXITSTATUS(rv)); - else if(WIFSIGNALED(rv)) - Message(M_ERR, "sys_cmd(%s,%s,...) exited with signal %d (%s)%s\n", - path, arg, WTERMSIG(rv), strsignal(WTERMSIG(rv)), - WCOREDUMP(rv) ? " - core dumped" : ""); - else - Message(M_ERR, "sys_cmd(%s,%s,...) exited with wstat %#x", - path, arg, rv); + /* If the command failed report its exit status */ + lg_exitstatus(0,"sys_cmd",0,M_ERR,rv,path); } } else if (c==0) { char *args[100]; @@ -183,16 +174,15 @@ static beforepoll_fn signal_beforepoll; static int signal_beforepoll(void *st, struct pollfd *fds, int *nfds_io, int *timeout_io) { - if (*nfds_io<1) { - *nfds_io=1; - return ERANGE; - } - *nfds_io=1; + BEFOREPOLL_WANT_FDS(1); fds[0].fd=spr; fds[0].events=POLLIN; return 0; } +/* Bodge to work around Ubuntu's strict header files */ +static void discard(int anything) {} + static afterpoll_fn signal_afterpoll; static void signal_afterpoll(void *st, struct pollfd *fds, int nfds) { @@ -201,7 +191,8 @@ static void signal_afterpoll(void *st, struct pollfd *fds, int nfds) sigset_t todo,old; if (nfds && (fds->revents & POLLIN)) { - read(spr,buf,16); /* We don't actually care what we read; as + discard(read(spr,buf,16)); + /* We don't actually care what we read; as long as there was at least one byte (which there was) we'll pick up the signals in the pending set */ @@ -253,7 +244,8 @@ static void signal_handler(int signum) will be atomic, and it seems to be the lesser of the two evils. */ saved_errno=errno; - write(spw,&thing,1); /* We don't care if this fails (i.e. the pipe + discard(write(spw,&thing,1)); + /* We don't care if this fails (i.e. the pipe is full) because the service routine will spot the pending signal anyway */ errno=saved_errno; @@ -305,16 +297,14 @@ void start_signal_handling(void) sigemptyset(®istered); sigemptyset(&pending); - if (pipe(p)!=0) { - fatal_perror("start_signal_handling: pipe"); - } + pipe_cloexec(p); spw=p[1]; spr=p[0]; if (fcntl(spw, F_SETFL, fcntl(spw, F_GETFL)|O_NONBLOCK)==-1) { fatal_perror("start_signal_handling: fcntl(O_NONBLOCK)"); } - register_for_poll(NULL,signal_beforepoll,signal_afterpoll,1,"signal"); + register_for_poll(NULL,signal_beforepoll,signal_afterpoll,"signal"); signal_handling=True; /* Register signal handlers for all the signals we're interested in */