From e3ef5e1e1e4269e9f9f02f73778db58a83a626fb Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Tue, 24 Apr 2018 18:13:12 +0200 Subject: [PATCH] logind: modernize Manager object allocation and freeing Let's propagate errors correctly, and stick to the usual naming and behaviour of these functions. Or in other words, make this closer to the matching code in machined. --- src/login/logind-core.c | 6 ++-- src/login/logind.c | 61 ++++++++++++++++++++--------------------- 2 files changed, 34 insertions(+), 33 deletions(-) diff --git a/src/login/logind-core.c b/src/login/logind-core.c index 581f4078a..3775c300b 100644 --- a/src/login/logind-core.c +++ b/src/login/logind-core.c @@ -26,6 +26,8 @@ #include "user-util.h" void manager_reset_config(Manager *m) { + assert(m); + m->n_autovts = 6; m->reserve_vt = 6; m->remove_ipc = true; @@ -573,7 +575,7 @@ static bool manager_is_docked(Manager *m) { } static int manager_count_external_displays(Manager *m) { - _cleanup_udev_enumerate_unref_ struct udev_enumerate *e = NULL; + _cleanup_(udev_enumerate_unrefp) struct udev_enumerate *e = NULL; struct udev_list_entry *item = NULL, *first = NULL; int r; int n = 0; @@ -592,7 +594,7 @@ static int manager_count_external_displays(Manager *m) { first = udev_enumerate_get_list_entry(e); udev_list_entry_foreach(item, first) { - _cleanup_udev_device_unref_ struct udev_device *d = NULL; + _cleanup_(udev_device_unrefp) struct udev_device *d = NULL; struct udev_device *p; const char *status, *enabled, *dash, *nn, *i; bool external = false; diff --git a/src/login/logind.c b/src/login/logind.c index c2275968f..537a73908 100644 --- a/src/login/logind.c +++ b/src/login/logind.c @@ -41,17 +41,20 @@ #include "process-util.h" #include "cgroup-util.h" -static void manager_free(Manager *m); +static Manager* manager_unref(Manager *m); +DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_unref); #if 0 /// elogind does not support autospawning of vts #endif // 0 -static Manager *manager_new(void) { - Manager *m; +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->console_active_fd = -1; #if 0 /// UNNEEDED by elogind @@ -71,7 +74,7 @@ static Manager *manager_new(void) { m->session_units = hashmap_new(&string_hash_ops); if (!m->devices || !m->seats || !m->sessions || !m->users || !m->inhibitors || !m->buttons || !m->user_units || !m->session_units) - goto fail; + return -ENOMEM; #if 1 /// elogind needs some more data r = elogind_manager_new(m); @@ -80,24 +83,21 @@ static Manager *manager_new(void) { #endif // 1 m->udev = udev_new(); if (!m->udev) - goto fail; + return -errno; r = sd_event_default(&m->event); if (r < 0) - goto fail; + return r; - sd_event_set_watchdog(m->event, true); + (void) sd_event_set_watchdog(m->event, true); manager_reset_config(m); - return m; - -fail: - manager_free(m); - return NULL; + *ret = TAKE_PTR(m); + return 0; } -static void manager_free(Manager *m) { +static Manager* manager_unref(Manager *m) { Session *session; User *u; Device *d; @@ -106,7 +106,7 @@ static void manager_free(Manager *m) { Button *b; if (!m) - return; + return NULL; while ((session = hashmap_first(m->sessions))) session_free(session); @@ -182,7 +182,8 @@ static void manager_free(Manager *m) { #if 0 /// UNNEEDED by elogind free(m->action_job); #endif // 0 - free(m); + + return mfree(m); } static int manager_enumerate_devices(Manager *m) { @@ -1253,7 +1254,7 @@ static int manager_run(Manager *m) { } int main(int argc, char *argv[]) { - Manager *m = NULL; + _cleanup_(manager_unrefp) Manager *m = NULL; int r; #if 1 /// perform extra checks for elogind startup @@ -1296,6 +1297,10 @@ int main(int argc, char *argv[]) { mkdir_label("/run/systemd/seats", 0755); mkdir_label("/run/systemd/users", 0755); mkdir_label("/run/systemd/sessions", 0755); + + r = manager_new(&m); + if (r < 0) { + log_error_errno(r, "Failed to allocate manager object: %m"); #else r = mkdir_label("/run/systemd", 0755); if ( (r < 0) && (-EEXIST != r) ) @@ -1313,14 +1318,10 @@ int main(int argc, char *argv[]) { if ( r < 0 && (-EEXIST != r) ) return log_error_errno(r, "Failed to create /run/systemd/machines : %m"); #endif // 0 - - m = manager_new(); - if (!m) { - r = log_oom(); goto finish; } - manager_parse_config_file(m); + (void) manager_parse_config_file(m); #if 1 /// elogind needs an Add-On for sleep configuration elogind_manager_reset_config(m); @@ -1333,20 +1334,18 @@ int main(int argc, char *argv[]) { log_debug("elogind running as pid "PID_FMT, getpid_cached()); - sd_notify(false, - "READY=1\n" - "STATUS=Processing requests..."); + (void) sd_notify(false, + "READY=1\n" + "STATUS=Processing requests..."); r = manager_run(m); log_debug("elogind stopped as pid "PID_FMT, getpid_cached()); -finish: - sd_notify(false, - "STOPPING=1\n" - "STATUS=Shutting down..."); - - manager_free(m); + (void) sd_notify(false, + "STOPPING=1\n" + "STATUS=Shutting down..."); +finish: return r < 0 ? EXIT_FAILURE : EXIT_SUCCESS; } -- 2.30.2