chiark / gitweb /
[PATCH] Exit, if udevtest cannot open the device (segfault).
[elogind.git] / udevd.c
diff --git a/udevd.c b/udevd.c
index 81f4474a89b6bc7df5ddd834cff3180d0cb12bdf..015083714389aaa65e2036a51b4216dc5cfa8bf6 100644 (file)
--- a/udevd.c
+++ b/udevd.c
@@ -33,8 +33,8 @@
 #include <sys/socket.h>
 #include <sys/un.h>
 #include <fcntl.h>
-#include "klibc_fixups.h"
 #include <sys/sysinfo.h>
+#include <sys/stat.h>
 
 #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;
 }