X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fcore%2Fmanager.c;h=9705e64da9e4f2e8604296c22e476face9254381;hb=821d4b6e068b2afaad94d43db22171c34a30400e;hp=a84272c905651995da968b493fef316130dede5b;hpb=895b3a7b44fe7ca2f260986be2a877ff56a72718;p=elogind.git diff --git a/src/core/manager.c b/src/core/manager.c index a84272c90..9705e64da 100644 --- a/src/core/manager.c +++ b/src/core/manager.c @@ -69,7 +69,7 @@ #include "audit-fd.h" #include "boot-timestamps.h" #include "env-util.h" -#include "bus-errors.h" +#include "bus-common-errors.h" #include "bus-error.h" #include "bus-util.h" #include "dbus.h" @@ -262,13 +262,11 @@ static int manager_check_ask_password(Manager *m) { mkdir_p_label("/run/systemd/ask-password", 0755); m->ask_password_inotify_fd = inotify_init1(IN_NONBLOCK|IN_CLOEXEC); - if (m->ask_password_inotify_fd < 0) { - log_error("inotify_init1() failed: %m"); - return -errno; - } + if (m->ask_password_inotify_fd < 0) + return log_error_errno(errno, "inotify_init1() failed: %m"); if (inotify_add_watch(m->ask_password_inotify_fd, "/run/systemd/ask-password", IN_CREATE|IN_DELETE|IN_MOVE) < 0) { - log_error("Failed to add watch on /run/systemd/ask-password: %m"); + log_error_errno(errno, "Failed to add watch on /run/systemd/ask-password: %m"); manager_close_ask_password(m); return -errno; } @@ -277,7 +275,7 @@ static int manager_check_ask_password(Manager *m) { m->ask_password_inotify_fd, EPOLLIN, manager_dispatch_ask_password_fd, m); if (r < 0) { - log_error("Failed to add event source for /run/systemd/ask-password: %m"); + log_error_errno(errno, "Failed to add event source for /run/systemd/ask-password: %m"); manager_close_ask_password(m); return -errno; } @@ -334,13 +332,11 @@ static int manager_setup_time_change(Manager *m) { * CLOCK_REALTIME makes a jump relative to CLOCK_MONOTONIC */ m->time_change_fd = timerfd_create(CLOCK_REALTIME, TFD_NONBLOCK|TFD_CLOEXEC); - if (m->time_change_fd < 0) { - log_error("Failed to create timerfd: %m"); - return -errno; - } + if (m->time_change_fd < 0) + return log_error_errno(errno, "Failed to create timerfd: %m"); if (timerfd_settime(m->time_change_fd, TFD_TIMER_ABSTIME|TFD_TIMER_CANCEL_ON_SET, &its, NULL) < 0) { - log_debug("Failed to set up TFD_TIMER_CANCEL_ON_SET, ignoring: %m"); + log_debug_errno(errno, "Failed to set up TFD_TIMER_CANCEL_ON_SET, ignoring: %m"); m->time_change_fd = safe_close(m->time_change_fd); return 0; } @@ -363,17 +359,17 @@ static int enable_special_signals(Manager *m) { * this will fail with EPERM (older) or EINVAL (newer), so * ignore that. */ if (reboot(RB_DISABLE_CAD) < 0 && errno != EPERM && errno != EINVAL) - log_warning("Failed to enable ctrl-alt-del handling: %m"); + log_warning_errno(errno, "Failed to enable ctrl-alt-del handling: %m"); fd = open_terminal("/dev/tty0", O_RDWR|O_NOCTTY|O_CLOEXEC); if (fd < 0) { /* Support systems without virtual console */ if (fd != -ENOENT) - log_warning("Failed to open /dev/tty0: %m"); + log_warning_errno(errno, "Failed to open /dev/tty0: %m"); } else { /* Enable that we get SIGWINCH on kbrequest */ if (ioctl(fd, KDSIGACCEPT, SIGWINCH) < 0) - log_warning("Failed to enable kbrequest handling: %m"); + log_warning_errno(errno, "Failed to enable kbrequest handling: %m"); } return 0; @@ -444,7 +440,7 @@ static int manager_setup_signals(Manager *m) { SIGRTMIN+26, /* systemd: set log target to journal-or-kmsg */ SIGRTMIN+27, /* systemd: set log target to console */ SIGRTMIN+28, /* systemd: set log target to kmsg */ - SIGRTMIN+29, /* systemd: set log target to syslog-or-kmsg (obsolete)*/ + SIGRTMIN+29, /* systemd: set log target to syslog-or-kmsg (obsolete) */ /* ... one free signal here SIGRTMIN+30 ... */ #endif @@ -544,7 +540,7 @@ int manager_new(SystemdRunningAs running_as, bool test_run, Manager **_m) { m->idle_pipe[0] = m->idle_pipe[1] = m->idle_pipe[2] = m->idle_pipe[3] = -1; - m->pin_cgroupfs_fd = m->notify_fd = m->signal_fd = m->time_change_fd = m->dev_autofs_fd = m->private_listen_fd = m->kdbus_fd = -1; + m->pin_cgroupfs_fd = m->notify_fd = m->signal_fd = m->time_change_fd = m->dev_autofs_fd = m->private_listen_fd = m->kdbus_fd = m->utab_inotify_fd = -1; m->current_job_id = 1; /* start as id #1, so that we can leave #0 around as "null-like" value */ m->ask_password_inotify_fd = -1; @@ -647,10 +643,8 @@ static int manager_setup_notify(Manager *m) { m->notify_event_source = sd_event_source_unref(m->notify_event_source); fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0); - if (fd < 0) { - log_error("Failed to allocate notification socket: %m"); - return -errno; - } + if (fd < 0) + return log_error_errno(errno, "Failed to allocate notification socket: %m"); if (m->running_as == SYSTEMD_SYSTEM) m->notify_socket = strdup("/run/systemd/notify"); @@ -659,7 +653,7 @@ static int manager_setup_notify(Manager *m) { e = getenv("XDG_RUNTIME_DIR"); if (!e) { - log_error("XDG_RUNTIME_DIR is not set: %m"); + log_error_errno(errno, "XDG_RUNTIME_DIR is not set: %m"); return -EINVAL; } @@ -673,16 +667,12 @@ static int manager_setup_notify(Manager *m) { strncpy(sa.un.sun_path, m->notify_socket, sizeof(sa.un.sun_path)-1); r = bind(fd, &sa.sa, offsetof(struct sockaddr_un, sun_path) + strlen(sa.un.sun_path)); - if (r < 0) { - log_error("bind(%s) failed: %m", sa.un.sun_path); - return -errno; - } + if (r < 0) + return log_error_errno(errno, "bind(%s) failed: %m", sa.un.sun_path); r = setsockopt(fd, SOL_SOCKET, SO_PASSCRED, &one, sizeof(one)); - if (r < 0) { - log_error("SO_PASSCRED failed: %m"); - return -errno; - } + if (r < 0) + return log_error_errno(errno, "SO_PASSCRED failed: %m"); m->notify_fd = fd; fd = -1; @@ -956,20 +946,29 @@ Manager* manager_free(Manager *m) { } int manager_enumerate(Manager *m) { - int r = 0, q; + int r = 0; UnitType c; assert(m); /* Let's ask every type to load all units from disk/kernel * that it might know */ - for (c = 0; c < _UNIT_TYPE_MAX; c++) - if (unit_vtable[c]->enumerate) { - q = unit_vtable[c]->enumerate(m); - if (q < 0) - r = q; + for (c = 0; c < _UNIT_TYPE_MAX; c++) { + int q; + + if (unit_vtable[c]->supported && !unit_vtable[c]->supported(m)) { + log_info("Unit type .%s is not supported on this system.", unit_type_to_string(c)); + continue; } + if (!unit_vtable[c]->enumerate) + continue; + + q = unit_vtable[c]->enumerate(m); + if (q < 0) + r = q; + } + manager_dispatch_load_queue(m); return r; } @@ -1022,14 +1021,14 @@ static void manager_build_unit_path_cache(Manager *m) { d = opendir(*i); if (!d) { if (errno != ENOENT) - log_error("Failed to open directory %s: %m", *i); + log_error_errno(errno, "Failed to open directory %s: %m", *i); continue; } while ((de = readdir(d))) { char *p; - if (ignore_file(de->d_name)) + if (hidden_file(de->d_name)) continue; p = strjoin(streq(*i, "/") ? "" : *i, "/", de->d_name, NULL); @@ -2070,7 +2069,7 @@ void manager_send_unit_audit(Manager *m, Unit *u, int type, bool success) { * Then let's not retry again. */ close_audit_fd(); else - log_warning("Failed to send audit message: %m"); + log_warning_errno(errno, "Failed to send audit message: %m"); } #endif @@ -2103,14 +2102,14 @@ void manager_send_unit_plymouth(Manager *m, Unit *u) { * message then wait for plymouth */ fd = socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0); if (fd < 0) { - log_error("socket() failed: %m"); + log_error_errno(errno, "socket() failed: %m"); return; } if (connect(fd, &sa.sa, offsetof(struct sockaddr_un, sun_path) + 1 + strlen(sa.un.sun_path+1)) < 0) { if (!IN_SET(errno, EPIPE, EAGAIN, ENOENT, ECONNREFUSED, ECONNRESET, ECONNABORTED)) - log_error("connect() failed: %m"); + log_error_errno(errno, "connect() failed: %m"); return; } @@ -2122,7 +2121,7 @@ void manager_send_unit_plymouth(Manager *m, Unit *u) { errno = 0; if (write(fd, message, n + 1) != n + 1) if (!IN_SET(errno, EPIPE, EAGAIN, ENOENT, ECONNREFUSED, ECONNRESET, ECONNABORTED)) - log_error("Failed to write Plymouth message: %m"); + log_error_errno(errno, "Failed to write Plymouth message: %m"); } void manager_dispatch_bus_name_owner_changed( @@ -2299,7 +2298,7 @@ int manager_deserialize(Manager *m, FILE *f, FDSet *fds) { uint32_t id; if (safe_atou32(l+15, &id) < 0) - log_warning("Failed to parse current job id value %s", l+15); + log_debug("Failed to parse current job id value %s", l+15); else m->current_job_id = MAX(m->current_job_id, id); @@ -2307,7 +2306,7 @@ int manager_deserialize(Manager *m, FILE *f, FDSet *fds) { uint32_t n; if (safe_atou32(l+17, &n) < 0) - log_warning("Failed to parse installed jobs counter %s", l+17); + log_debug("Failed to parse installed jobs counter %s", l+17); else m->n_installed_jobs += n; @@ -2315,7 +2314,7 @@ int manager_deserialize(Manager *m, FILE *f, FDSet *fds) { uint32_t n; if (safe_atou32(l+14, &n) < 0) - log_warning("Failed to parse failed jobs counter %s", l+14); + log_debug("Failed to parse failed jobs counter %s", l+14); else m->n_failed_jobs += n; @@ -2324,7 +2323,7 @@ int manager_deserialize(Manager *m, FILE *f, FDSet *fds) { b = parse_boolean(l+10); if (b < 0) - log_warning("Failed to parse taint /usr flag %s", l+10); + log_debug("Failed to parse taint /usr flag %s", l+10); else m->taint_usr = m->taint_usr || b; @@ -2375,7 +2374,7 @@ int manager_deserialize(Manager *m, FILE *f, FDSet *fds) { int fd; if (safe_atoi(l + 10, &fd) < 0 || fd < 0 || !fdset_contains(fds, fd)) - log_warning("Failed to parse notify fd: %s", l + 10); + log_debug("Failed to parse notify fd: %s", l + 10); else { m->notify_event_source = sd_event_source_unref(m->notify_event_source); safe_close(m->notify_fd); @@ -2398,14 +2397,21 @@ int manager_deserialize(Manager *m, FILE *f, FDSet *fds) { int fd; if (safe_atoi(l + 9, &fd) < 0 || fd < 0 || !fdset_contains(fds, fd)) - log_warning("Failed to parse kdbus fd: %s", l + 9); + log_debug("Failed to parse kdbus fd: %s", l + 9); else { safe_close(m->kdbus_fd); m->kdbus_fd = fdset_remove(fds, fd); } - } else if (bus_track_deserialize_item(&m->deserialized_subscribed, l) < 0) - log_warning("Unknown serialization item '%s'", l); + } else { + int k; + + k = bus_track_deserialize_item(&m->deserialized_subscribed, l); + if (k < 0) + log_debug_errno(k, "Failed to deserialize bus tracker object: %m"); + else if (k == 0) + log_debug("Unknown serialization item '%s'", l); + } } for (;;) { @@ -2715,7 +2721,7 @@ static int create_generator_dir(Manager *m, char **generator, const char *name) return log_oom(); if (!mkdtemp(p)) { - log_error("Failed to create generator directory %s: %m", + log_error_errno(errno, "Failed to create generator directory %s: %m", p); free(p); return -errno; @@ -2758,7 +2764,7 @@ void manager_run_generators(Manager *m) { if (errno == ENOENT) return; - log_error("Failed to enumerate generator directory %s: %m", + log_error_errno(errno, "Failed to enumerate generator directory %s: %m", generator_path); return; }