X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=udevd.c;h=c75141f9fa36b6a06f30672c07bb24fff412ffef;hb=d2ecd6a19d147ede317995cce1b21042291a6b19;hp=e4880c981488a1db29112351db15d6bbf2a44d4f;hpb=e7f247503c63764e4ffb255acb3e99faf91f2214;p=elogind.git diff --git a/udevd.c b/udevd.c index e4880c981..c75141f9f 100644 --- a/udevd.c +++ b/udevd.c @@ -55,7 +55,7 @@ static int udevd_sock; static int uevent_netlink_sock; static pid_t sid; -static int pipefds[2] = {-1, -1}; +static int signal_pipe[2] = {-1, -1}; static volatile int sigchilds_waiting; static volatile int run_msg_q; static volatile int sig_flag; @@ -636,8 +636,6 @@ static struct uevent_msg *get_netlink_msg(void) static void asmlinkage sig_handler(int signum) { - int rc; - switch (signum) { case SIGINT: case SIGTERM: @@ -653,14 +651,8 @@ static void asmlinkage sig_handler(int signum) break; } - /* if pipe is empty, write to pipe to force select to return, - * which will wakeup our mainloop - */ - if (!sig_flag) { - rc = write(pipefds[1], &signum, sizeof(signum)); - if (rc >= 0) - sig_flag = 1; - } + /* write to pipe, which will wakeup select() in our mainloop */ + write(signal_pipe[WRITE_END], "", 1); } static void udev_done(int pid) @@ -842,25 +834,25 @@ int main(int argc, char *argv[], char *envp[]) setpriority(PRIO_PROCESS, 0, UDEVD_PRIORITY); /* setup signal handler pipe */ - retval = pipe(pipefds); + retval = pipe(signal_pipe); if (retval < 0) { err("error getting pipes: %s", strerror(errno)); goto exit; } - retval = fcntl(pipefds[0], F_SETFL, O_NONBLOCK); + retval = fcntl(signal_pipe[READ_END], F_SETFL, O_NONBLOCK); if (retval < 0) { err("error fcntl on read pipe: %s", strerror(errno)); goto exit; } - retval = fcntl(pipefds[0], F_SETFD, FD_CLOEXEC); + retval = fcntl(signal_pipe[READ_END], F_SETFD, FD_CLOEXEC); if (retval < 0) err("error fcntl on read pipe: %s", strerror(errno)); - retval = fcntl(pipefds[1], F_SETFL, O_NONBLOCK); + retval = fcntl(signal_pipe[WRITE_END], F_SETFL, O_NONBLOCK); if (retval < 0) { err("error fcntl on write pipe: %s", strerror(errno)); goto exit; } - retval = fcntl(pipefds[1], F_SETFD, FD_CLOEXEC); + retval = fcntl(signal_pipe[WRITE_END], F_SETFD, FD_CLOEXEC); if (retval < 0) err("error fcntl on write pipe: %s", strerror(errno)); @@ -934,7 +926,7 @@ int main(int argc, char *argv[], char *envp[]) int fdcount; FD_ZERO(&readfds); - FD_SET(pipefds[0], &readfds); + FD_SET(signal_pipe[READ_END], &readfds); FD_SET(udevd_sock, &readfds); if (uevent_netlink_sock > 0) FD_SET(uevent_netlink_sock, &readfds); @@ -954,9 +946,8 @@ int main(int argc, char *argv[], char *envp[]) if (uevent_netlink_active && msg->type == UDEVD_UEVENT_UDEVSEND && msg->seqnum != 0) { dbg("skip uevent_helper message, netlink is active"); free(msg); - continue; - } - msg_queue_insert(msg); + } else + msg_queue_insert(msg); } } @@ -974,16 +965,10 @@ int main(int argc, char *argv[], char *envp[]) } /* received a signal, clear our notification pipe */ - if (FD_ISSET(pipefds[0], &readfds)) { - int sig; - ssize_t rlen; - - while(1) { - rlen = read(pipefds[0], &sig, sizeof(sig)); - if (rlen <= 0) - break; - } - sig_flag = 0; + if (FD_ISSET(signal_pipe[READ_END], &readfds)) { + char buf[256]; + + read(signal_pipe[READ_END], &buf, sizeof(buf)); } /* forked child have returned */ @@ -1011,10 +996,10 @@ int main(int argc, char *argv[], char *envp[]) } exit: - if (pipefds[0] > 0) - close(pipefds[0]); - if (pipefds[1] > 0) - close(pipefds[1]); + if (signal_pipe[READ_END] > 0) + close(signal_pipe[READ_END]); + if (signal_pipe[WRITE_END] > 0) + close(signal_pipe[WRITE_END]); if (udevd_sock > 0) close(udevd_sock);