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);
}
/* allow the main daemon netlink address to send devices to the worker */
udev_monitor_allow_unicast_sender(worker_monitor, monitor);
udev_monitor_enable_receiving(worker_monitor);
+ util_set_fd_cloexec(udev_monitor_get_fd(worker_monitor));
worker = calloc(1, sizeof(struct worker));
if (worker == NULL)
struct udev_device *dev;
udev_queue_export_unref(udev_queue_export);
+ udev_monitor_unref(monitor);
udev_ctrl_unref(udev_ctrl);
close(pfd[FD_SIGNAL].fd);
close(worker_watch[READ_END]);
/* 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);
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;
}
}
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;
}
return 0;
}
-static void handle_signal(int signo)
+static void handle_signal(struct udev *udev, int signo)
{
switch (signo) {
case SIGINT:
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;
/* 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;
}
}
goto exit;
}
pfd[FD_WORKER].fd = worker_watch[READ_END];
+ util_set_fd_cloexec(worker_watch[WRITE_END]);
rules = udev_rules_new(udev, resolve_names);
if (rules == NULL) {
/* 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);
}
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 */