X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fcore%2Fmanager.c;h=e488aba5f8be8a5cbc5cc8755a8df447bf23921d;hp=3dffbe259bd863f5c77afa66f0b341d2bf9431c5;hb=55836941ff642d42403921fa9d5fd2f8376ae722;hpb=e26807239bd65bc17535a53cd540f38600e7ef24 diff --git a/src/core/manager.c b/src/core/manager.c index 3dffbe259..e488aba5f 100644 --- a/src/core/manager.c +++ b/src/core/manager.c @@ -241,6 +241,9 @@ static int manager_setup_time_change(Manager *m) { assert(m); assert_cc(sizeof(time_t) == sizeof(TIME_T_MAX)); + if (m->test_run) + return 0; + /* Uses TFD_TIMER_CANCEL_ON_SET to get notifications whenever * CLOCK_REALTIME makes a jump relative to CLOCK_MONOTONIC */ @@ -302,6 +305,9 @@ static int manager_setup_signals(Manager *m) { assert(m); + if (m->test_run) + return 0; + /* We are not interested in SIGSTOP and friends. */ assert_se(sigaction(SIGCHLD, &sa, NULL) == 0); @@ -335,7 +341,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 */ + SIGRTMIN+29, /* systemd: set log target to syslog-or-kmsg (obsolete)*/ -1); assert_se(sigprocmask(SIG_SETMASK, &mask, NULL) == 0); @@ -409,7 +415,7 @@ static int manager_default_environment(Manager *m) { return 0; } -int manager_new(SystemdRunningAs running_as, Manager **_m) { +int manager_new(SystemdRunningAs running_as, bool test_run, Manager **_m) { Manager *m; int r; @@ -435,6 +441,8 @@ int manager_new(SystemdRunningAs running_as, Manager **_m) { 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->current_job_id = 1; /* start as id #1, so that we can leave #0 around as "null-like" value */ + m->test_run = test_run; + r = manager_default_environment(m); if (r < 0) goto fail; @@ -514,15 +522,15 @@ fail: static int manager_setup_notify(Manager *m) { int r; + if (m->test_run) + return 0; + if (m->notify_fd < 0) { _cleanup_close_ int fd = -1; - union { - struct sockaddr sa; - struct sockaddr_un un; - } sa = { + union sockaddr_union sa = { .sa.sa_family = AF_UNIX, }; - int one = 1; + static const int one = 1; /* First free all secondary fields */ free(m->notify_socket); @@ -554,7 +562,7 @@ 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() failed: %m"); + log_error("bind(@%s) failed: %m", sa.un.sun_path+1); return -errno; } @@ -592,12 +600,10 @@ static int manager_setup_notify(Manager *m) { static int manager_setup_kdbus(Manager *m) { #ifdef ENABLE_KDBUS _cleanup_free_ char *p = NULL; -#endif -#ifdef ENABLE_KDBUS assert(m); - if (m->kdbus_fd >= 0) + if (m->test_run || m->kdbus_fd >= 0) return 0; m->kdbus_fd = bus_kernel_create_bus(m->running_as == SYSTEMD_SYSTEM ? "system" : "user", m->running_as == SYSTEMD_SYSTEM, &p); @@ -624,6 +630,9 @@ static int manager_connect_bus(Manager *m, bool reexecuting) { assert(m); + if (m->test_run) + return 0; + try_bus_connect = m->kdbus_fd >= 0 || reexecuting || @@ -993,11 +1002,8 @@ int manager_startup(Manager *m, FILE *serialization, FDSet *fds) { dual_timestamp_get(&m->units_load_finish_timestamp); /* Second, deserialize if there is something to deserialize */ - if (serialization) { - q = manager_deserialize(m, serialization, fds); - if (q < 0) - r = q; - } + if (serialization) + r = manager_deserialize(m, serialization, fds); /* Any fds left? Find some unit which wants them. This is * useful to allow container managers to pass some file @@ -1005,13 +1011,15 @@ int manager_startup(Manager *m, FILE *serialization, FDSet *fds) { * socket-based activation of entire containers. */ if (fdset_size(fds) > 0) { q = manager_distribute_fds(m, fds); - if (q < 0) + if (q < 0 && r == 0) r = q; } /* We might have deserialized the notify fd, but if we didn't * then let's create the bus now */ - manager_setup_notify(m); + q = manager_setup_notify(m); + if (q < 0 && r == 0) + r = q; /* We might have deserialized the kdbus control fd, but if we * didn't, then let's create the bus now. */ @@ -1021,7 +1029,7 @@ int manager_startup(Manager *m, FILE *serialization, FDSet *fds) { /* Third, fire things up! */ q = manager_coldplug(m); - if (q < 0) + if (q < 0 && r == 0) r = q; if (serialization) { @@ -1720,6 +1728,7 @@ static int manager_dispatch_signal_fd(sd_event_source *source, int fd, uint32_t break; case 26: + case 29: /* compatibility: used to be mapped to LOG_TARGET_SYSLOG_OR_KMSG */ log_set_target(LOG_TARGET_JOURNAL_OR_KMSG); log_notice("Setting log target to journal-or-kmsg."); break; @@ -1734,11 +1743,6 @@ static int manager_dispatch_signal_fd(sd_event_source *source, int fd, uint32_t log_notice("Setting log target to kmsg."); break; - case 29: - log_set_target(LOG_TARGET_SYSLOG_OR_KMSG); - log_notice("Setting log target to syslog-or-kmsg."); - break; - default: log_warning("Got unhandled signal <%s>.", signal_to_string(sfsi.ssi_signo)); } @@ -1864,7 +1868,7 @@ int manager_loop(Manager *m) { if (wait_usec <= 0) wait_usec = 1; } else - wait_usec = (usec_t) -1; + wait_usec = USEC_INFINITY; r = sd_event_run(m->event, wait_usec); if (r < 0) { @@ -1966,10 +1970,7 @@ void manager_send_unit_audit(Manager *m, Unit *u, int type, bool success) { } void manager_send_unit_plymouth(Manager *m, Unit *u) { - union sockaddr_union sa = { - .un.sun_family = AF_UNIX, - .un.sun_path = "\0/org/freedesktop/plymouthd", - }; + union sockaddr_union sa = PLYMOUTH_SOCKET; int n = 0; _cleanup_free_ char *message = NULL; @@ -2542,7 +2543,8 @@ void manager_check_finished(Manager *m) { } SET_FOREACH(u, m->startup_units, i) - cgroup_context_apply(unit_get_cgroup_context(u), unit_get_cgroup_mask(u), u->cgroup_path, manager_state(m)); + if (u->cgroup_path) + cgroup_context_apply(unit_get_cgroup_context(u), unit_get_cgroup_mask(u), u->cgroup_path, manager_state(m)); bus_manager_send_finished(m, firmware_usec, loader_usec, kernel_usec, initrd_usec, userspace_usec, total_usec); @@ -2635,6 +2637,9 @@ void manager_run_generators(Manager *m) { assert(m); + if (m->test_run) + return; + generator_path = m->running_as == SYSTEMD_SYSTEM ? SYSTEM_GENERATOR_PATH : USER_GENERATOR_PATH; d = opendir(generator_path); if (!d) {