X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=udev%2Fudevd.c;h=299f5d3f590224bbe7194f3f61c3a17963f878f1;hb=57f4ef67aa4e517e4ee1b79360169f5544f72379;hp=325ad034c2b2bc05554824acde20beadd39f7fca;hpb=a20a57a7bfbc6edd7602c135ca78f3e56878badb;p=elogind.git diff --git a/udev/udevd.c b/udev/udevd.c index 325ad034c..299f5d3f5 100644 --- a/udev/udevd.c +++ b/udev/udevd.c @@ -76,7 +76,7 @@ static int fd_signal = -1; static int fd_ep = -1; static int fd_inotify = -1; static bool stop_exec_queue; -static bool reload_config; +static bool reload; static int children; static int children_max; static int exec_delay; @@ -155,11 +155,7 @@ static void event_queue_delete(struct event *event, bool export) udev_list_node_remove(&event->node); if (export) { - /* mark as failed, if "add" event returns non-zero */ - if (event->exitcode != 0 && strcmp(udev_device_get_action(event->dev), "remove") != 0) - udev_queue_export_device_failed(udev_queue_export, event->dev); - else - udev_queue_export_device_finished(udev_queue_export, event->dev); + 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); @@ -284,7 +280,6 @@ static void worker_new(struct event *event) for (;;) { struct udev_event *udev_event; struct worker_message msg; - int failed = 0; int err; info(udev, "seq %llu running\n", udev_device_get_seqnum(dev)); @@ -304,7 +299,7 @@ static void worker_new(struct event *event) err = udev_event_execute_rules(udev_event, rules, &sigmask_orig); if (err == 0) - failed = udev_event_execute_run(udev_event, &sigmask_orig); + udev_event_execute_run(udev_event, &sigmask_orig); /* apply/restore inotify watch */ if (err == 0 && udev_event->inotify_watch) { @@ -319,8 +314,6 @@ static void worker_new(struct event *event) memset(&msg, 0, sizeof(struct worker_message)); if (err != 0) msg.exitcode = err; - else if (failed != 0) - msg.exitcode = failed; msg.pid = getpid(); send(worker_watch[WRITE_END], &msg, sizeof(struct worker_message), 0); @@ -354,6 +347,7 @@ static void worker_new(struct event *event) for (i = 0; i < fdcount; i++) { if (ev[i].data.fd == fd_monitor && ev[i].events & EPOLLIN) { dev = udev_monitor_receive_device(worker_monitor); + break; } else if (ev[i].data.fd == fd_signal && ev[i].events & EPOLLIN) { struct signalfd_siginfo fdsi; ssize_t size; @@ -668,9 +662,9 @@ static struct udev_ctrl_connection *handle_ctrl_msg(struct udev_ctrl *uctrl) stop_exec_queue = false; } - if (udev_ctrl_get_reload_rules(ctrl_msg) > 0) { - info(udev, "udevd message (RELOAD_RULES) received\n"); - reload_config = true; + if (udev_ctrl_get_reload(ctrl_msg) > 0) { + info(udev, "udevd message (RELOAD) received\n"); + reload = true; } str = udev_ctrl_get_set_env(ctrl_msg); @@ -751,7 +745,7 @@ static int handle_inotify(struct udev *udev) continue; if (strlen(s) != strlen(".rules")) continue; - reload_config = true; + reload = true; continue; } @@ -837,7 +831,7 @@ static void handle_signal(struct udev *udev, int signo) } break; case SIGHUP: - reload_config = true; + reload = true; break; } } @@ -1355,7 +1349,7 @@ int main(int argc, char *argv[]) if (systemd_fds(udev, &fd_ctrl, &fd_netlink) >= 0) { /* get control and netlink socket from from systemd */ - udev_ctrl = udev_ctrl_new_from_socket_fd(udev, UDEV_CTRL_SOCK_PATH, fd_ctrl); + udev_ctrl = udev_ctrl_new_from_fd(udev, fd_ctrl); if (udev_ctrl == NULL) { err(udev, "error taking over udev control socket"); rc = 1; @@ -1370,7 +1364,7 @@ int main(int argc, char *argv[]) } } else { /* open control and netlink socket */ - udev_ctrl = udev_ctrl_new_from_socket(udev, UDEV_CTRL_SOCK_PATH); + udev_ctrl = udev_ctrl_new(udev); if (udev_ctrl == NULL) { fprintf(stderr, "error initializing udev control socket"); err(udev, "error initializing udev control socket"); @@ -1426,7 +1420,7 @@ int main(int argc, char *argv[]) goto exit; default: rc = EXIT_SUCCESS; - goto exit_keep_queue; + goto exit_daemonize; } setsid(); @@ -1519,6 +1513,8 @@ int main(int argc, char *argv[]) } fd_worker = worker_watch[READ_END]; + udev_builtin_init(udev); + rules = udev_rules_new(udev, resolve_names); if (rules == NULL) { err(udev, "error reading rules\n"); @@ -1654,15 +1650,20 @@ int main(int argc, char *argv[]) struct udev_device *dev; dev = udev_monitor_receive_device(monitor); - if (dev != NULL) + if (dev != NULL) { udev_device_set_usec_initialized(dev, now_usec()); if (event_queue_insert(dev) < 0) udev_device_unref(dev); + } } /* start new events */ - if (!udev_list_node_is_empty(&event_list) && !udev_exit && !stop_exec_queue) - event_queue_start(udev); + if (!udev_list_node_is_empty(&event_list) && !udev_exit && !stop_exec_queue) { + if (rules == NULL) + rules = udev_rules_new(udev, resolve_names); + if (rules != NULL) + event_queue_start(udev); + } if (is_signal) { struct signalfd_siginfo fdsi; @@ -1694,28 +1695,25 @@ int main(int argc, char *argv[]) ctrl_conn = handle_ctrl_msg(udev_ctrl); /* rules changed, set by inotify or a HUP signal */ - if (reload_config) { - struct udev_rules *rules_new; - + if (reload) { worker_kill(udev, 0); - rules_new = udev_rules_new(udev, resolve_names); - if (rules_new != NULL) { - udev_rules_unref(rules); - rules = rules_new; - } - reload_config = 0; + rules = udev_rules_unref(rules); + udev_builtin_exit(udev); + reload = 0; } } rc = EXIT_SUCCESS; exit: udev_queue_export_cleanup(udev_queue_export); -exit_keep_queue: + udev_ctrl_cleanup(udev_ctrl); +exit_daemonize: if (fd_ep >= 0) close(fd_ep); worker_list_cleanup(udev); event_queue_cleanup(udev, EVENT_UNDEF); udev_rules_unref(rules); + udev_builtin_exit(udev); if (fd_signal >= 0) close(fd_signal); if (worker_watch[READ_END] >= 0)