X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=udevd.c;h=015083714389aaa65e2036a51b4216dc5cfa8bf6;hb=f8c1ccde6aaf08c858616c9a8a83c06d609f52f5;hp=81f4474a89b6bc7df5ddd834cff3180d0cb12bdf;hpb=6e3e3c3416864eca74cb885f64c453eb531eed63;p=elogind.git diff --git a/udevd.c b/udevd.c index 81f4474a8..015083714 100644 --- a/udevd.c +++ b/udevd.c @@ -33,8 +33,8 @@ #include #include #include -#include "klibc_fixups.h" #include +#include #include "list.h" #include "udev.h" @@ -45,7 +45,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; @@ -57,7 +57,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 @@ -149,7 +149,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"); @@ -176,7 +176,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; @@ -206,7 +206,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; @@ -240,7 +240,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); } } @@ -308,7 +308,7 @@ skip: return; } -asmlinkage static void sig_handler(int signum) +static void asmlinkage sig_handler(int signum) { int rc; @@ -324,7 +324,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: @@ -365,11 +365,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); @@ -377,13 +376,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; @@ -391,27 +390,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 ) { @@ -423,7 +423,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 */ @@ -455,9 +456,8 @@ int main(int argc, char *argv[]) exit(1); } - /* set signal handlers */ - act.sa_handler = sig_handler; + act.sa_handler = (void (*) (int))sig_handler; sigemptyset(&act.sa_mask); act.sa_flags = SA_RESTART; sigaction(SIGINT, &act, NULL); @@ -492,7 +492,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"); @@ -521,9 +521,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) { @@ -532,14 +532,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; @@ -548,5 +544,6 @@ int main(int argc, char *argv[]) } exit: close(ssock); - exit(1); + logging_close(); + return 1; }