X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=udev%2Fudevd.c;h=292f4374d7560c4d3d54dcd011bcbd502549acda;hb=9060b066d9e7aaca9795010ac5fff61018947f87;hp=2e7a179cbc083d6a7a3818114c9cf80688a106dd;hpb=9290143d2d8ee9e42459d198b87ad2c35d93819d;p=elogind.git diff --git a/udev/udevd.c b/udev/udevd.c index 2e7a179cb..292f4374d 100644 --- a/udev/udevd.c +++ b/udev/udevd.c @@ -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); @@ -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; }