chiark / gitweb /
logind: modernize Manager object allocation and freeing
authorLennart Poettering <lennart@poettering.net>
Tue, 24 Apr 2018 16:13:12 +0000 (18:13 +0200)
committerSven Eden <yamakuzure@gmx.net>
Fri, 24 Aug 2018 14:47:08 +0000 (16:47 +0200)
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
src/login/logind.c

index 581f4078a748f4dfedb2ae6093c1399e29c74cef..3775c300b0d4fc77450d5f378149283e36889f6f 100644 (file)
@@ -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;
index c2275968f9291d5e4612e9124acee82e8c6f2576..537a739089e5004bedc40424cda115e8f36ad0bd 100644 (file)
 #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;
 }