X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;ds=sidebyside;f=src%2Fudev%2Fudevd.c;h=1c510f44ff6728d477373ef4edddc02d5d0e42e5;hb=d42688ef21a695f8a30b0d899dafdc6ff1ee0973;hp=c3678259bcbc1a2050e0e296af6ecd6191793358;hpb=0254e9448f3c645758ed63618a3bbb13c242f5e7;p=elogind.git diff --git a/src/udev/udevd.c b/src/udev/udevd.c index c3678259b..1c510f44f 100644 --- a/src/udev/udevd.c +++ b/src/udev/udevd.c @@ -26,33 +26,28 @@ #include #include #include -#include #include -#include #include -#include #include #include #include #include -#include #include #include #include -#include #include #include #include #include -#include -#include "udev.h" -#include "udev-util.h" -#include "rtnl-util.h" #include "sd-daemon.h" +#include "rtnl-util.h" #include "cgroup-util.h" #include "dev-setup.h" #include "fileio.h" +#include "selinux-util.h" +#include "udev.h" +#include "udev-util.h" static struct udev_rules *rules; static struct udev_ctrl *udev_ctrl; @@ -157,7 +152,7 @@ static void worker_unref(struct worker *worker) { worker->refcount--; if (worker->refcount > 0) return; - log_debug("worker [%u] cleaned up", worker->pid); + log_debug("worker ["PID_FMT"] cleaned up", worker->pid); worker_cleanup(worker); } @@ -413,7 +408,7 @@ out: event->state = EVENT_RUNNING; udev_list_node_append(&worker->node, &worker_list); children++; - log_debug("seq %llu forked new worker [%u]", udev_device_get_seqnum(event->dev), pid); + log_debug("seq %llu forked new worker ["PID_FMT"]", udev_device_get_seqnum(event->dev), pid); break; } } @@ -430,7 +425,8 @@ static void event_run(struct event *event) { count = udev_monitor_send_device(monitor, worker->monitor, event->dev); if (count < 0) { - log_error_errno(errno, "worker [%u] did not accept message %zi (%m), kill it", worker->pid, count); + log_error_errno(errno, "worker ["PID_FMT"] did not accept message %zi (%m), kill it", + worker->pid, count); kill(worker->pid, SIGKILL); worker->state = WORKER_KILLED; continue; @@ -868,26 +864,26 @@ static void handle_signal(struct udev *udev, int signo) { if (worker->pid != pid) continue; - log_debug("worker [%u] exit", pid); + log_debug("worker ["PID_FMT"] exit", pid); if (WIFEXITED(status)) { if (WEXITSTATUS(status) != 0) - log_error("worker [%u] exit with return code %i", + log_error("worker ["PID_FMT"] exit with return code %i", pid, WEXITSTATUS(status)); } else if (WIFSIGNALED(status)) { - log_error("worker [%u] terminated by signal %i (%s)", + log_error("worker ["PID_FMT"] terminated by signal %i (%s)", pid, WTERMSIG(status), strsignal(WTERMSIG(status))); } else if (WIFSTOPPED(status)) { - log_error("worker [%u] stopped", pid); + log_error("worker ["PID_FMT"] stopped", pid); } else if (WIFCONTINUED(status)) { - log_error("worker [%u] continued", pid); + log_error("worker ["PID_FMT"] continued", pid); } else { - log_error("worker [%u] exit with status 0x%04x", pid, status); + log_error("worker ["PID_FMT"] exit with status 0x%04x", pid, status); } if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) { if (worker->event) { - log_error("worker [%u] failed while handling '%s'", + log_error("worker ["PID_FMT"] failed while handling '%s'", pid, worker->event->devpath); worker->event->exitcode = -32; event_queue_delete(worker->event); @@ -907,6 +903,17 @@ static void handle_signal(struct udev *udev, int signo) { } } +static void event_queue_update(void) { + if (!udev_list_node_is_empty(&event_list)) { + int fd; + + fd = open("/run/udev/queue", O_WRONLY|O_CREAT|O_CLOEXEC|O_TRUNC|O_NOFOLLOW, 0444); + if (fd >= 0) + close(fd); + } else + unlink("/run/udev/queue"); +} + static int systemd_fds(struct udev *udev, int *rctrl, int *rnetlink) { int ctrl = -1, netlink = -1; int fd, n; @@ -1003,14 +1010,15 @@ static void kernel_cmdline_options(struct udev *udev) { static void help(void) { printf("%s [OPTIONS...]\n\n" "Manages devices.\n\n" - " --daemon\n" - " --debug\n" - " --children-max=\n" - " --exec-delay=\n" - " --event-timeout=\n" - " --resolve-names=early|late|never\n" - " --version\n" - " --help\n" + " -h --help Print this message\n" + " --version Print version of the program\n" + " --daemon Detach and run in the background\n" + " --debug Enable debug output\n" + " --children-max=INT Set maximum number of workers\n" + " --exec-delay=SECONDS Seconds to wait before executing RUN=\n" + " --event-timeout=SECONDS Seconds to wait before terminating an event\n" + " --resolve-names=early|late|never\n" + " When to resolve users and groups\n" , program_invocation_short_name); } @@ -1366,15 +1374,7 @@ int main(int argc, char *argv[]) { } /* tell settle that we are busy or idle */ - if (!udev_list_node_is_empty(&event_list)) { - int fd; - - fd = open("/run/udev/queue", O_WRONLY|O_CREAT|O_CLOEXEC|O_TRUNC|O_NOFOLLOW, 0444); - if (fd >= 0) - close(fd); - } else { - unlink("/run/udev/queue"); - } + event_queue_update(); fdcount = epoll_wait(fd_ep, ev, ELEMENTSOF(ev), timeout); if (fdcount < 0) @@ -1407,7 +1407,7 @@ int main(int argc, char *argv[]) { if ((ts - worker->event_start_usec) > arg_event_timeout_warn_usec) { if ((ts - worker->event_start_usec) > arg_event_timeout_usec) { - log_error("worker [%u] %s timeout; kill it", worker->pid, worker->event->devpath); + log_error("worker ["PID_FMT"] %s timeout; kill it", worker->pid, worker->event->devpath); kill(worker->pid, SIGKILL); worker->state = WORKER_KILLED; @@ -1418,7 +1418,7 @@ int main(int argc, char *argv[]) { event_queue_delete(worker->event); worker->event = NULL; } else if (!worker->event_warned) { - log_warning("worker [%u] %s is taking a long time", worker->pid, worker->event->devpath); + log_warning("worker ["PID_FMT"] %s is taking a long time", worker->pid, worker->event->devpath); worker->event_warned = true; } } @@ -1499,6 +1499,11 @@ int main(int argc, char *argv[]) { if (is_inotify) handle_inotify(udev); + /* tell settle that we are busy or idle, this needs to be before the + * PING handling + */ + event_queue_update(); + /* * This needs to be after the inotify handling, to make sure, * that the ping is send back after the possibly generated