chiark / gitweb /
rules: make ata_id properties the default for all ATA block devices
[elogind.git] / udev / udevd.c
index 2e7a179cbc083d6a7a3818114c9cf80688a106dd..b2e4a022c5c0e9ece1807a198410470e8d00cdae 100644 (file)
@@ -159,6 +159,7 @@ static void event_queue_delete(struct event *event)
        else
                udev_queue_export_device_finished(udev_queue_export, event->dev);
 
+       info(event->udev, "seq %llu done with %i\n", udev_device_get_seqnum(event->dev), event->exitcode);
        udev_device_unref(event->dev);
        free(event);
 }
@@ -212,8 +213,8 @@ static void worker_new(struct event *event)
                udev_ctrl_unref(udev_ctrl);
                close(pfd[FD_SIGNAL].fd);
                close(worker_watch[READ_END]);
-               logging_close();
-               logging_init("udevd-work");
+               udev_log_close();
+               udev_log_init("udevd-work");
                setpriority(PRIO_PROCESS, 0, UDEV_PRIORITY);
 
                /* set signal handlers */
@@ -271,7 +272,7 @@ static void worker_new(struct event *event)
                        /* send processed event back to libudev listeners */
                        udev_monitor_send_device(worker_monitor, NULL, dev);
 
-                       info(event->udev, "seq %llu finished with %i\n", udev_device_get_seqnum(dev), err);
+                       info(event->udev, "seq %llu processed with %i\n", udev_device_get_seqnum(dev), err);
                        udev_device_unref(dev);
                        udev_event_unref(udev_event);
 
@@ -287,7 +288,7 @@ static void worker_new(struct event *event)
                }
 
                udev_monitor_unref(worker_monitor);
-               logging_close();
+               udev_log_close();
                exit(0);
        }
        case -1:
@@ -306,6 +307,7 @@ static void worker_new(struct event *event)
                event->state = EVENT_RUNNING;
                udev_list_node_append(&worker->node, &worker_list);
                childs++;
+               info(event->udev, "seq %llu forked new worker [%u]\n", udev_device_get_seqnum(event->dev), pid);
                break;
        }
 }
@@ -617,7 +619,7 @@ static int handle_inotify(struct udev *udev)
 
        buf = malloc(nbytes);
        if (buf == NULL) {
-               err(udev, "error getting buffer for inotify, disable watching\n");
+               err(udev, "error getting buffer for inotify\n");
                return -1;
        }
 
@@ -659,7 +661,7 @@ static int handle_inotify(struct udev *udev)
        return 0;
 }
 
-static void handle_signal(int signo)
+static void handle_signal(struct udev *udev, int signo)
 {
        switch (signo) {
        case SIGINT:
@@ -669,9 +671,10 @@ static void handle_signal(int signo)
        case SIGCHLD:
                while (1) {
                        pid_t pid;
+                       int status;
                        struct udev_list_node *loop, *tmp;
 
-                       pid = waitpid(-1, NULL, WNOHANG);
+                       pid = waitpid(-1, &status, WNOHANG);
                        if (pid <= 0)
                                break;
 
@@ -683,13 +686,23 @@ static void handle_signal(int signo)
 
                                /* fail event, if worker died unexpectedly */
                                if (worker->event != NULL) {
-                                       worker->event->exitcode = 127;
+                                       int exitcode;
+
+                                       if (WIFEXITED(status))
+                                               exitcode = WEXITSTATUS(status);
+                                       else if (WIFSIGNALED(status))
+                                               exitcode = WTERMSIG(status) + 128;
+                                       else
+                                               exitcode = 0;
+                                       worker->event->exitcode = exitcode;
+                                       err(udev, "worker [%u] unexpectedly returned with %i\n", pid, exitcode);
                                        event_queue_delete(worker->event);
                                }
 
                                udev_list_node_remove(&worker->node);
                                worker_unref(worker);
                                childs--;
+                               info(udev, "worker [%u] exit\n", pid);
                                break;
                        }
                }
@@ -750,7 +763,7 @@ int main(int argc, char *argv[])
        if (udev == NULL)
                goto exit;
 
-       logging_init("udevd");
+       udev_log_init("udevd");
        udev_set_log_fn(udev, log_fn);
        info(udev, "version %s\n", VERSION);
        udev_selinux_init(udev);
@@ -856,7 +869,7 @@ int main(int argc, char *argv[])
        } else {
                char filename[UTIL_PATH_SIZE];
 
-               inotify_add_watch(pfd[FD_INOTIFY].fd, UDEV_PREFIX "/lib/udev/rules.d",
+               inotify_add_watch(pfd[FD_INOTIFY].fd, LIBEXECDIR "/rules.d",
                                  IN_CREATE | IN_DELETE | IN_MOVE | IN_CLOSE_WRITE);
                inotify_add_watch(pfd[FD_INOTIFY].fd, SYSCONFDIR "/udev/rules.d",
                                  IN_CREATE | IN_DELETE | IN_MOVE | IN_CLOSE_WRITE);
@@ -938,9 +951,9 @@ int main(int argc, char *argv[])
 
        /* OOM_DISABLE == -17 */
        fd = open("/proc/self/oom_adj", O_RDWR);
-       if (fd < 0)
+       if (fd < 0) {
                err(udev, "error disabling OOM: %m\n");
-       else {
+       else {
                write(fd, "-17", 3);
                close(fd);
        }
@@ -1010,7 +1023,7 @@ int main(int argc, char *argv[])
 
                        size = read(pfd[FD_SIGNAL].fd, &fdsi, sizeof(struct signalfd_siginfo));
                        if (size == sizeof(struct signalfd_siginfo))
-                               handle_signal(fdsi.ssi_signo);
+                               handle_signal(udev, fdsi.ssi_signo);
                }
 
                /* device node and rules directory inotify watch */
@@ -1056,6 +1069,6 @@ exit:
        udev_monitor_unref(monitor);
        udev_selinux_exit(udev);
        udev_unref(udev);
-       logging_close();
+       udev_log_close();
        return rc;
 }