chiark / gitweb /
[PATCH] update the man pages and correct Usage: hints
[elogind.git] / udevd.c
diff --git a/udevd.c b/udevd.c
index 43f3f0324b79cdf309c1be3939042a0dbce4c78d..06b172bc253b98db2b97c9b02f141d734d7ac4ea 100644 (file)
--- a/udevd.c
+++ b/udevd.c
@@ -38,8 +38,8 @@
 
 #include "list.h"
 #include "udev.h"
-#include "udev_lib.h"
 #include "udev_version.h"
+#include "udev_utils.h"
 #include "udevd.h"
 #include "logging.h"
 
@@ -131,6 +131,7 @@ static void udev_run(struct hotplug_msg *msg)
        case 0:
                /* child */
                close(udevsendsock);
+               logging_close();
                execle(udev_bin, "udev", msg->subsystem, NULL, msg->envp);
                dbg("exec of child failed");
                _exit(1);
@@ -153,9 +154,14 @@ static void udev_run(struct hotplug_msg *msg)
 static struct hotplug_msg *running_with_devpath(struct hotplug_msg *msg)
 {
        struct hotplug_msg *loop_msg;
-       list_for_each_entry(loop_msg, &running_list, list)
-               if (strncmp(loop_msg->devpath, msg->devpath, sizeof(loop_msg->devpath)) == 0)
+       list_for_each_entry(loop_msg, &running_list, list) {
+               if (loop_msg->devpath == NULL || msg->devpath == NULL)
+                       continue;
+
+               if (strcmp(loop_msg->devpath, msg->devpath) == 0)
                        return loop_msg;
+       }
+
        return NULL;
 }
 
@@ -285,7 +291,7 @@ static void handle_udevsend_msg(int sock)
        /* copy environment buffer and reconstruct envp */
        memcpy(msg->envbuf, usend_msg.envbuf, envbuf_size);
        bufpos = 0;
-       for (i = 0; (bufpos < envbuf_size) && (i < HOTPLUG_NUM_ENVP-1); i++) {
+       for (i = 0; (bufpos < envbuf_size) && (i < HOTPLUG_NUM_ENVP-2); i++) {
                int keylen;
                char *key;
 
@@ -308,6 +314,7 @@ static void handle_udevsend_msg(int sock)
                if (strncmp(key, "SEQNUM=", 7) == 0)
                        msg->seqnum = strtoull(&key[7], NULL, 10);
        }
+       msg->envp[i++] = "MANAGED_EVENT=1";
        msg->envp[i] = NULL;
 
        /* if no seqnum is given, we move straight to exec queue */
@@ -414,7 +421,7 @@ int main(int argc, char *argv[], char *envp[])
 
        if (getuid() != 0) {
                dbg("need to be root, exit");
-               _exit(1);
+               goto exit;
        }
 
        /* make sure we don't lock any path */
@@ -425,7 +432,7 @@ int main(int argc, char *argv[], char *envp[])
        fd = open( "/dev/null", O_RDWR );
        if ( fd < 0 ) {
                dbg("error opening /dev/null %s", strerror(errno));
-               exit(1);
+               goto exit;
        }
        dup2(fd, 0);
        dup2(fd, 1);
@@ -440,29 +447,29 @@ int main(int argc, char *argv[], char *envp[])
        retval = pipe(pipefds);
        if (retval < 0) {
                dbg("error getting pipes: %s", strerror(errno));
-               exit(1);
+               goto exit;
        }
 
        retval = fcntl(pipefds[0], F_SETFL, O_NONBLOCK);
        if (retval < 0) {
                dbg("error fcntl on read pipe: %s", strerror(errno));
-               exit(1);
+               goto exit;
        }
        retval = fcntl(pipefds[0], F_SETFD, FD_CLOEXEC);
        if (retval < 0) {
                dbg("error fcntl on read pipe: %s", strerror(errno));
-               exit(1);
+               goto exit;
        }
 
        retval = fcntl(pipefds[1], F_SETFL, O_NONBLOCK);
        if (retval < 0) {
                dbg("error fcntl on write pipe: %s", strerror(errno));
-               exit(1);
+               goto exit;
        }
        retval = fcntl(pipefds[1], F_SETFD, FD_CLOEXEC);
        if (retval < 0) {
                dbg("error fcntl on write pipe: %s", strerror(errno));
-               exit(1);
+               goto exit;
        }
 
        /* set signal handlers */
@@ -483,13 +490,14 @@ int main(int argc, char *argv[], char *envp[])
        udevsendsock = socket(AF_LOCAL, SOCK_DGRAM, 0);
        if (udevsendsock == -1) {
                dbg("error getting socket, exit");
-               exit(1);
+               goto exit;
        }
 
        /* the bind takes care of ensuring only one copy running */
        retval = bind(udevsendsock, (struct sockaddr *) &saddr, addrlen);
        if (retval < 0) {
                dbg("bind failed, exit");
+               close(udevsendsock);
                goto exit;
        }
 
@@ -544,8 +552,8 @@ int main(int argc, char *argv[], char *envp[])
                        exec_queue_manager();
                }
        }
+
 exit:
-       close(udevsendsock);
        logging_close();
        return 1;
 }