diff options
author | Lennart Poettering <lennart@poettering.net> | 2018-04-24 18:13:12 +0200 |
---|---|---|
committer | Sven Eden <yamakuzure@gmx.net> | 2018-08-24 16:47:08 +0200 |
commit | e3ef5e1e1e4269e9f9f02f73778db58a83a626fb (patch) | |
tree | 2080dd85ab3343f7f1a4e6a1898e41dcd62c4614 /src/login/logind.c | |
parent | cbb9e59083da8cedd08a059008f8ef2b1bac25a2 (diff) |
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.
Diffstat (limited to 'src/login/logind.c')
-rw-r--r-- | src/login/logind.c | 61 |
1 files changed, 30 insertions, 31 deletions
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; } |