X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=udevd.c;h=9242acce315ddd7c9ec9a21709f5751ccbf298d6;hp=be401bec308ca48cb8bedaad941399c8f2c872cc;hb=bebbc31b90056f5b0eafb52fc965f0cc713f0d4f;hpb=761e5b476f8e69f41958a62ed787f5d886fa212e diff --git a/udevd.c b/udevd.c index be401bec3..9242acce3 100644 --- a/udevd.c +++ b/udevd.c @@ -49,10 +49,6 @@ #include "udevd.h" #include "logging.h" -#ifndef NETLINK_KOBJECT_UEVENT -#define NETLINK_KOBJECT_UEVENT 15 -#endif - /* global variables*/ static int udevd_sock; static int uevent_netlink_sock; @@ -62,6 +58,7 @@ static int pipefds[2]; static volatile int sigchilds_waiting; static volatile int run_msg_q; static volatile int sig_flag; +static volatile int udev_exit; static int init_phase = 1; static int run_exec_q; static int stop_exec_q; @@ -645,23 +642,20 @@ static void asmlinkage sig_handler(int signum) switch (signum) { case SIGINT: case SIGTERM: - exit(20 + signum); + udev_exit = 1; break; case SIGALRM: /* set flag, then write to pipe if needed */ run_msg_q = 1; - goto do_write; break; case SIGCHLD: /* set flag, then write to pipe if needed */ sigchilds_waiting = 1; - goto do_write; break; } -do_write: - /* if pipe is empty, write to pipe to force select to return - * immediately when it gets called + /* 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)); @@ -843,7 +837,7 @@ int main(int argc, char *argv[], char *envp[]) chdir("/"); umask(umask(077) | 022); - /*set a reasonable scheduling priority for the daemon */ + /* set a reasonable scheduling priority for the daemon */ setpriority(PRIO_PROCESS, 0, UDEVD_PRIORITY); /* Set fds to dev/null */ @@ -891,6 +885,7 @@ int main(int argc, char *argv[], char *envp[]) sigaction(SIGTERM, &act, NULL); sigaction(SIGALRM, &act, NULL); sigaction(SIGCHLD, &act, NULL); + sigaction(SIGHUP, &act, NULL); if (init_uevent_netlink_sock() < 0) { dbg("uevent socket not available"); @@ -945,11 +940,11 @@ int main(int argc, char *argv[], char *envp[]) FD_ZERO(&readfds); FD_SET(udevd_sock, &readfds); - if (uevent_netlink_sock != -1) + if (uevent_netlink_sock > 0) FD_SET(uevent_netlink_sock, &readfds); FD_SET(pipefds[0], &readfds); maxsockplus = udevd_sock+1; - while (1) { + while (!udev_exit) { struct uevent_msg *msg; fd_set workreadfds = readfds; @@ -961,6 +956,7 @@ int main(int argc, char *argv[], char *envp[]) continue; } + /* get user socket message */ if (FD_ISSET(udevd_sock, &workreadfds)) { msg = get_udevd_msg(); if (msg) { @@ -974,6 +970,7 @@ int main(int argc, char *argv[], char *envp[]) } } + /* get kernel netlink message */ if (FD_ISSET(uevent_netlink_sock, &workreadfds)) { msg = get_netlink_msg(); if (msg) { @@ -986,9 +983,11 @@ int main(int argc, char *argv[], char *envp[]) } } + /* received a signal, clear our notification pipe */ if (FD_ISSET(pipefds[0], &workreadfds)) user_sighandler(); + /* forked child have returned */ if (sigchilds_waiting) { sigchilds_waiting = 0; reap_sigchilds(); @@ -1013,6 +1012,13 @@ int main(int argc, char *argv[], char *envp[]) } exit: + if (udevd_sock > 0) + close(udevd_sock); + + if (uevent_netlink_sock > 0) + close(uevent_netlink_sock); + logging_close(); - return 1; + + return 0; }