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];
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)
{
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 */
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;
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 */