X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;ds=sidebyside;f=udevd.c;h=c5267d6d9f3cefaa42fa1437f9c4d9971dd32571;hb=5cab7caa2a767b16211c15f0051a2e21a96ebfd9;hp=380511d47eb24380d12812a141fe1cf2fc4c5345;hpb=dc117daa28c87c6be5846a23f06e16c2b6ff6bc1;p=elogind.git diff --git a/udevd.c b/udevd.c index 380511d47..c5267d6d9 100644 --- a/udevd.c +++ b/udevd.c @@ -46,7 +46,7 @@ static int pipefds[2]; static unsigned long long expected_seqnum = 0; -static volatile int children_waiting; +static volatile int sigchilds_waiting; static volatile int run_msg_q; static volatile int sig_flag; static int run_exec_q; @@ -58,7 +58,7 @@ static LIST_HEAD(running_list); static void exec_queue_manager(void); static void msg_queue_manager(void); static void user_sighandler(void); -static void reap_kids(void); +static void reap_sigchilds(void); char *udev_bin; #ifdef LOG @@ -150,7 +150,7 @@ static void udev_run(struct hotplug_msg *msg) /* child */ execle(udev_bin, "udev", msg->subsystem, NULL, env); dbg("exec of child failed"); - exit(1); + _exit(1); break; case -1: dbg("fork of child failed"); @@ -177,7 +177,7 @@ static struct hotplug_msg *running_with_devpath(struct hotplug_msg *msg) } /* exec queue management routine executes the events and delays events for the same devpath */ -static void exec_queue_manager() +static void exec_queue_manager(void) { struct hotplug_msg *loop_msg; struct hotplug_msg *tmp_msg; @@ -207,7 +207,7 @@ static void msg_move_exec(struct hotplug_msg *msg) } /* msg queue management routine handles the timeouts and dispatches the events */ -static void msg_queue_manager() +static void msg_queue_manager(void) { struct hotplug_msg *loop_msg; struct hotplug_msg *tmp_msg; @@ -241,7 +241,7 @@ recheck: if (list_empty(&msg_list) == 0) { struct itimerval itv = {{0, 0}, {EVENT_TIMEOUT_SEC - msg_age, 0}}; dbg("next event expires in %li seconds", EVENT_TIMEOUT_SEC - msg_age); - setitimer(ITIMER_REAL, &itv, 0); + setitimer(ITIMER_REAL, &itv, NULL); } } @@ -309,7 +309,7 @@ skip: return; } -asmlinkage static void sig_handler(int signum) +static void asmlinkage sig_handler(int signum) { int rc; @@ -325,7 +325,7 @@ asmlinkage static void sig_handler(int signum) break; case SIGCHLD: /* set flag, then write to pipe if needed */ - children_waiting = 1; + sigchilds_waiting = 1; goto do_write; break; default: @@ -366,11 +366,10 @@ static void udev_done(int pid) } } -static void reap_kids() +static void reap_sigchilds(void) { - /* reap all dead children */ while(1) { - int pid = waitpid(-1, 0, WNOHANG); + int pid = waitpid(-1, NULL, WNOHANG); if ((pid == -1) || (pid == 0)) break; udev_done(pid); @@ -378,13 +377,13 @@ static void reap_kids() } /* just read everything from the pipe and clear the flag, - * the useful flags were set in the signal handler + * the flags was set in the signal handler */ -static void user_sighandler() +static void user_sighandler(void) { int sig; while(1) { - int rc = read(pipefds[0],&sig,sizeof(sig)); + int rc = read(pipefds[0], &sig, sizeof(sig)); if (rc < 0) break; @@ -392,27 +391,28 @@ static void user_sighandler() } } - -int main(int argc, char *argv[]) +int main(int argc, char *argv[], char *envp[]) { int ssock, maxsockplus; struct sockaddr_un saddr; socklen_t addrlen; int retval, fd; - const int on = 1; + const int feature_on = 1; struct sigaction act; fd_set readfds; - init_logging("udevd"); + logging_init("udevd"); dbg("version %s", UDEV_VERSION); if (getuid() != 0) { dbg("need to be root, exit"); - exit(1); + _exit(1); } - /* make sure we are at top of dir */ + + /* make sure we don't lock any path */ chdir("/"); - umask( umask( 077 ) | 022 ); + umask(umask(077) | 022); + /* Set fds to dev/null */ fd = open( "/dev/null", O_RDWR ); if ( fd < 0 ) { @@ -424,7 +424,8 @@ int main(int argc, char *argv[]) dup2(fd, 2); if (fd > 2) close(fd); - /* Get new session id so stray signals don't come our way. */ + + /* become session leader */ setsid(); /* setup signal handler pipe */ @@ -456,7 +457,6 @@ int main(int argc, char *argv[]) exit(1); } - /* set signal handlers */ act.sa_handler = (void (*) (int))sig_handler; sigemptyset(&act.sa_mask); @@ -493,7 +493,7 @@ int main(int argc, char *argv[]) } /* enable receiving of the sender credentials */ - setsockopt(ssock, SOL_SOCKET, SO_PASSCRED, &on, sizeof(on)); + setsockopt(ssock, SOL_SOCKET, SO_PASSCRED, &feature_on, sizeof(feature_on)); /* possible override of udev binary, used for testing */ udev_bin = getenv("UDEV_BIN"); @@ -522,9 +522,9 @@ int main(int argc, char *argv[]) if (FD_ISSET(pipefds[0], &workreadfds)) user_sighandler(); - if (children_waiting) { - children_waiting = 0; - reap_kids(); + if (sigchilds_waiting) { + sigchilds_waiting = 0; + reap_sigchilds(); } if (run_msg_q) { @@ -533,14 +533,10 @@ int main(int argc, char *argv[]) } if (run_exec_q) { - /* this is tricky. exec_queue_manager() loops over exec_list, and - * calls running_with_devpath(), which loops over running_list. This gives - * O(N*M), which can get *nasty*. Clean up running_list before - * calling exec_queue_manager(). - */ - if (children_waiting) { - children_waiting = 0; - reap_kids(); + /* clean up running_list before calling exec_queue_manager() */ + if (sigchilds_waiting) { + sigchilds_waiting = 0; + reap_sigchilds(); } run_exec_q = 0; @@ -549,5 +545,6 @@ int main(int argc, char *argv[]) } exit: close(ssock); - exit(1); + logging_close(); + return 1; }