chiark / gitweb /
finally remove the directory event-multiplexer crap
[elogind.git] / udevd.c
diff --git a/udevd.c b/udevd.c
index 79465a1da08afe289f4d3b1ba3c4487ff06f8bde..8f3329ea635ab0f5d542f252a1d4b58e95708ad6 100644 (file)
--- a/udevd.c
+++ b/udevd.c
@@ -124,7 +124,7 @@ static int udev_event_process(struct udevd_uevent_msg *msg)
        for (i = 0; msg->envp[i]; i++)
                putenv(msg->envp[i]);
 
-       udev = udev_device_init();
+       udev = udev_device_init(NULL);
        if (udev == NULL)
                return -1;
        strlcpy(udev->action, msg->action, sizeof(udev->action));
@@ -167,35 +167,23 @@ static void export_event_state(struct udevd_uevent_msg *msg, enum event_state st
 {
        char filename[PATH_SIZE];
        char filename_failed[PATH_SIZE];
-       size_t start, end, i;
+       size_t start;
        struct udevd_uevent_msg *loop_msg;
        int fd;
 
        /* add location of queue files */
        strlcpy(filename, udev_root, sizeof(filename));
        strlcat(filename, "/", sizeof(filename));
-       start = strlcat(filename, EVENT_QUEUE_DIR, sizeof(filename));
-       end = strlcat(filename, msg->devpath, sizeof(filename));
-       if (end > sizeof(filename))
-               end = sizeof(filename);
-
-       /* replace '/' to transform path into a filename */
-       for (i = start+1; i < end; i++)
-               if (filename[i] == '/')
-                       filename[i] = PATH_TO_NAME_CHAR;
+       start = strlcat(filename, EVENT_QUEUE_DIR"/", sizeof(filename));
+       strlcat(filename, msg->devpath, sizeof(filename));
+       path_encode(&filename[start], sizeof(filename) - start);
 
        /* add location of failed files */
        strlcpy(filename_failed, udev_root, sizeof(filename_failed));
        strlcat(filename_failed, "/", sizeof(filename_failed));
-       start = strlcat(filename_failed, EVENT_FAILED_DIR, sizeof(filename_failed));
-       end = strlcat(filename_failed, msg->devpath, sizeof(filename_failed));
-       if (end > sizeof(filename_failed))
-               end = sizeof(filename_failed);
-
-       /* replace '/' to transform path into a filename */
-       for (i = start+1; i < end; i++)
-               if (filename_failed[i] == '/')
-                       filename_failed[i] = PATH_TO_NAME_CHAR;
+       start = strlcat(filename_failed, EVENT_FAILED_DIR"/", sizeof(filename_failed));
+       strlcat(filename_failed, msg->devpath, sizeof(filename_failed));
+       path_encode(&filename_failed[start], sizeof(filename) - start);
 
        switch (state) {
        case EVENT_QUEUED:
@@ -360,7 +348,7 @@ static int mem_size_mb(void)
 static int cpu_count(void)
 {
        int f;
-       char buf[32768];
+       char buf[65536];
        int len;
        const char *pos;
        int count = 0;
@@ -943,6 +931,7 @@ int main(int argc, char *argv[], char *envp[])
                { "debug-trace", 0, NULL, 't' },
                { "verbose", 0, NULL, 'v' },
                { "help", 0, NULL, 'h' },
+               { "version", 0, NULL, 'V' },
                {}
        };
        int rc = 1;
@@ -955,7 +944,7 @@ int main(int argc, char *argv[], char *envp[])
 
        /* parse commandline options */
        while (1) {
-               option = getopt_long(argc, argv, "dtvh", options, NULL);
+               option = getopt_long(argc, argv, "dtvhV", options, NULL);
                if (option == -1)
                        break;
 
@@ -972,7 +961,10 @@ int main(int argc, char *argv[], char *envp[])
                                udev_log_priority = LOG_INFO;
                        break;
                case 'h':
-                       printf("Usage: udevd [--help] [--daemon] [--debug-trace] [--verbose]\n");
+                       printf("Usage: udevd [--help] [--daemon] [--debug-trace] [--verbose] [--version]\n");
+                       goto exit;
+               case 'V':
+                       printf("%s\n", UDEV_VERSION);
                        goto exit;
                default:
                        goto exit;
@@ -985,6 +977,19 @@ int main(int argc, char *argv[], char *envp[])
                goto exit;
        }
 
+       /* make sure std{in,out,err} fd's are in a sane state */
+       fd = open("/dev/null", O_RDWR);
+       if (fd < 0) {
+               fprintf(stderr, "cannot open /dev/null\n");
+               err("cannot open /dev/null");
+       }
+       if (fd > STDIN_FILENO)
+               dup2(fd, STDIN_FILENO);
+       if (write(STDOUT_FILENO, 0, 0) < 0)
+               dup2(fd, STDOUT_FILENO);
+       if (write(STDERR_FILENO, 0, 0) < 0)
+               dup2(fd, STDERR_FILENO);
+
        /* init sockets to receive events */
        if (init_udevd_socket() < 0) {
                if (errno == EADDRINUSE) {
@@ -1006,6 +1011,35 @@ int main(int argc, char *argv[], char *envp[])
                goto exit;
        }
 
+       /* setup signal handler pipe */
+       retval = pipe(signal_pipe);
+       if (retval < 0) {
+               err("error getting pipes: %s", strerror(errno));
+               goto exit;
+       }
+
+       retval = fcntl(signal_pipe[READ_END], F_GETFL, 0);
+       if (retval < 0) {
+               err("error fcntl on read pipe: %s", strerror(errno));
+               goto exit;
+       }
+       retval = fcntl(signal_pipe[READ_END], F_SETFL, retval | O_NONBLOCK);
+       if (retval < 0) {
+               err("error fcntl on read pipe: %s", strerror(errno));
+               goto exit;
+       }
+
+       retval = fcntl(signal_pipe[WRITE_END], F_GETFL, 0);
+       if (retval < 0) {
+               err("error fcntl on write pipe: %s", strerror(errno));
+               goto exit;
+       }
+       retval = fcntl(signal_pipe[WRITE_END], F_SETFL, retval | O_NONBLOCK);
+       if (retval < 0) {
+               err("error fcntl on write pipe: %s", strerror(errno));
+               goto exit;
+       }
+
        /* parse the rules and keep them in memory */
        sysfs_init();
        udev_rules_init(&rules, 1);
@@ -1031,17 +1065,12 @@ int main(int argc, char *argv[], char *envp[])
                }
        }
 
-       /* redirect std fd's */
-       fd = open("/dev/null", O_RDWR);
-       if (fd >= 0) {
-               dup2(fd, STDIN_FILENO);
-               if (!verbose)
-                       dup2(fd, STDOUT_FILENO);
-               dup2(fd, STDERR_FILENO);
-               if (fd > STDERR_FILENO)
-                       close(fd);
-       } else
-               err("error opening /dev/null: %s", strerror(errno));
+       /* redirect std{out,err} fd's */
+       if (!verbose)
+               dup2(fd, STDOUT_FILENO);
+       dup2(fd, STDERR_FILENO);
+       if (fd > STDERR_FILENO)
+               close(fd);
 
        /* set scheduling priority for the daemon */
        setpriority(PRIO_PROCESS, 0, UDEVD_PRIORITY);
@@ -1062,35 +1091,6 @@ int main(int argc, char *argv[], char *envp[])
                close(fd);
        }
 
-       /* setup signal handler pipe */
-       retval = pipe(signal_pipe);
-       if (retval < 0) {
-               err("error getting pipes: %s", strerror(errno));
-               goto exit;
-       }
-
-       retval = fcntl(signal_pipe[READ_END], F_GETFL, 0);
-       if (retval < 0) {
-               err("error fcntl on read pipe: %s", strerror(errno));
-               goto exit;
-       }
-       retval = fcntl(signal_pipe[READ_END], F_SETFL, retval | O_NONBLOCK);
-       if (retval < 0) {
-               err("error fcntl on read pipe: %s", strerror(errno));
-               goto exit;
-       }
-
-       retval = fcntl(signal_pipe[WRITE_END], F_GETFL, 0);
-       if (retval < 0) {
-               err("error fcntl on write pipe: %s", strerror(errno));
-               goto exit;
-       }
-       retval = fcntl(signal_pipe[WRITE_END], F_SETFL, retval | O_NONBLOCK);
-       if (retval < 0) {
-               err("error fcntl on write pipe: %s", strerror(errno));
-               goto exit;
-       }
-
        /* set signal handlers */
        memset(&act, 0x00, sizeof(struct sigaction));
        act.sa_handler = (void (*)(int)) sig_handler;
@@ -1230,6 +1230,7 @@ int main(int argc, char *argv[], char *envp[])
 exit:
        udev_rules_cleanup(&rules);
        sysfs_cleanup();
+       selinux_exit();
 
        if (signal_pipe[READ_END] >= 0)
                close(signal_pipe[READ_END]);