From: Lennart Poettering Date: Thu, 5 Apr 2018 10:38:25 +0000 (+0200) Subject: machined: some modernizations X-Git-Tag: v239~398^2~3 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=730fa7ce1fc811a82c2425c3eb1ef09fdda03347;p=thirdparty%2Fsystemd.git machined: some modernizations A couple of minor modernizations: 1. Don't unnecessarily export functions we don't call outside of machined.c 2. Use cleanup logic for the manager object. 3. Propagate errors properly from manager_new(). So far if sd_event_new() returns EMFILE/ENFILE for some reason we would have logged that as log_oom(), which isn#t right, really. 4. Handle SIGTERM/SIGINT cleanly. It's easy, and prettier then letting the kernel just abort us. It also makes it possible to valgrind machined properly. --- diff --git a/src/machine/machinectl.c b/src/machine/machinectl.c index 1ed0f9e6578..f79617ee06f 100644 --- a/src/machine/machinectl.c +++ b/src/machine/machinectl.c @@ -2638,12 +2638,14 @@ static int set_limit(int argc, char *argv[], void *userdata) { uint64_t limit; int r; + polkit_agent_open_if_enabled(arg_transport, arg_ask_password); + if (STR_IN_SET(argv[argc-1], "-", "none", "infinity")) limit = (uint64_t) -1; else { r = parse_size(argv[argc-1], 1024, &limit); if (r < 0) - return log_error("Failed to parse size: %s", argv[argc-1]); + return log_error_errno(r, "Failed to parse size: %s", argv[argc-1]); } if (argc > 2) @@ -2670,10 +2672,8 @@ static int set_limit(int argc, char *argv[], void *userdata) { NULL, "t", limit); - if (r < 0) { - log_error("Could not set limit: %s", bus_error_message(&error, -r)); - return r; - } + if (r < 0) + return log_error_errno(r, "Could not set limit: %s", bus_error_message(&error, r)); return 0; } @@ -2688,6 +2688,8 @@ static int clean_images(int argc, char *argv[], void *userdata) { unsigned c = 0; int r; + polkit_agent_open_if_enabled(arg_transport, arg_ask_password); + r = sd_bus_message_new_method_call( bus, &m, @@ -3139,7 +3141,7 @@ int main(int argc, char*argv[]) { goto finish; } - sd_bus_set_allow_interactive_authorization(bus, arg_ask_password); + (void) sd_bus_set_allow_interactive_authorization(bus, arg_ask_password); r = machinectl_main(argc, argv, bus); diff --git a/src/machine/machined.c b/src/machine/machined.c index 8fb6db77467..3577c809a4b 100644 --- a/src/machine/machined.c +++ b/src/machine/machined.c @@ -26,35 +26,45 @@ #include "signal-util.h" #include "special.h" -Manager *manager_new(void) { - Manager *m; +static Manager* manager_unref(Manager *m); +DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_unref); + +static int manager_new(Manager **ret) { + _cleanup_(manager_unrefp) Manager *m = NULL; int r; + assert(ret); + m = new0(Manager, 1); if (!m) - return NULL; + return -ENOMEM; m->machines = hashmap_new(&string_hash_ops); m->machine_units = hashmap_new(&string_hash_ops); m->machine_leaders = hashmap_new(NULL); - if (!m->machines || !m->machine_units || !m->machine_leaders) { - manager_free(m); - return NULL; - } + if (!m->machines || !m->machine_units || !m->machine_leaders) + return -ENOMEM; r = sd_event_default(&m->event); - if (r < 0) { - manager_free(m); - return NULL; - } + if (r < 0) + return r; + + r = sd_event_add_signal(m->event, NULL, SIGINT, NULL, NULL); + if (r < 0) + return r; + + r = sd_event_add_signal(m->event, NULL, SIGTERM, NULL, NULL); + if (r < 0) + return r; - sd_event_set_watchdog(m->event, true); + (void) sd_event_set_watchdog(m->event, true); - return m; + *ret = TAKE_PTR(m); + return 0; } -void manager_free(Manager *m) { +static Manager* manager_unref(Manager *m) { Machine *machine; assert(m); @@ -80,7 +90,7 @@ void manager_free(Manager *m) { sd_bus_unref(m->bus); sd_event_unref(m->event); - free(m); + return mfree(m); } static int manager_add_host_machine(Manager *m) { @@ -121,7 +131,7 @@ static int manager_add_host_machine(Manager *m) { return 0; } -int manager_enumerate_machines(Manager *m) { +static int manager_enumerate_machines(Manager *m) { _cleanup_closedir_ DIR *d = NULL; struct dirent *de; int r = 0; @@ -268,7 +278,7 @@ static int manager_connect_bus(Manager *m) { return 0; } -void manager_gc(Manager *m, bool drop_not_started) { +static void manager_gc(Manager *m, bool drop_not_started) { Machine *machine; assert(m); @@ -292,7 +302,7 @@ void manager_gc(Manager *m, bool drop_not_started) { } } -int manager_startup(Manager *m) { +static int manager_startup(Manager *m) { Machine *machine; Iterator i; int r; @@ -328,7 +338,7 @@ static bool check_idle(void *userdata) { return hashmap_isempty(m->machines); } -int manager_run(Manager *m) { +static int manager_run(Manager *m) { assert(m); return bus_event_loop_with_idle( @@ -340,7 +350,7 @@ int manager_run(Manager *m) { } int main(int argc, char *argv[]) { - Manager *m = NULL; + _cleanup_(manager_unrefp) Manager *m = NULL; int r; log_set_target(LOG_TARGET_AUTO); @@ -356,18 +366,16 @@ int main(int argc, char *argv[]) { goto finish; } - /* Always create the directories people can create inotify - * watches in. Note that some applications might check for the - * existence of /run/systemd/machines/ to determine whether - * machined is available, so please always make sure this - * check stays in. */ - mkdir_label("/run/systemd/machines", 0755); + /* Always create the directories people can create inotify watches in. Note that some applications might check + * for the existence of /run/systemd/machines/ to determine whether machined is available, so please always + * make sure this check stays in. */ + (void) mkdir_label("/run/systemd/machines", 0755); - assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGCHLD, -1) >= 0); + assert_se(sigprocmask_many(SIG_BLOCK, NULL, SIGCHLD, SIGTERM, SIGINT, -1) >= 0); - m = manager_new(); - if (!m) { - r = log_oom(); + r = manager_new(&m); + if (r < 0) { + log_error_errno(r, "Failed to allocate manager object: %m"); goto finish; } @@ -388,7 +396,5 @@ int main(int argc, char *argv[]) { log_debug("systemd-machined stopped as pid "PID_FMT, getpid_cached()); finish: - manager_free(m); - return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; } diff --git a/src/machine/machined.h b/src/machine/machined.h index 2e6fe4c1877..2f204f05490 100644 --- a/src/machine/machined.h +++ b/src/machine/machined.h @@ -43,17 +43,7 @@ struct Manager { unsigned n_operations; }; -Manager *manager_new(void); -void manager_free(Manager *m); - int manager_add_machine(Manager *m, const char *name, Machine **_machine); -int manager_enumerate_machines(Manager *m); - -int manager_startup(Manager *m); -int manager_run(Manager *m); - -void manager_gc(Manager *m, bool drop_not_started); - int manager_get_machine_by_pid(Manager *m, pid_t pid, Machine **machine); extern const sd_bus_vtable manager_vtable[];