]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
logind: modernize Manager object allocation and freeing
authorLennart Poettering <lennart@poettering.net>
Tue, 24 Apr 2018 16:13:12 +0000 (18:13 +0200)
committerLennart Poettering <lennart@poettering.net>
Fri, 27 Apr 2018 16:11:13 +0000 (18:11 +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 d21fa10b488ecbd78ac8f36ad611d5f2c724e0f4..66c0796e97592c3553f9fb3d7863761c239047f0 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;
index 3b097e1defb640113e962ba3f282968d86403146..410f6074c6eea8abb50f8bd8f39660d3829374a3 100644 (file)
 #include "strv.h"
 #include "udev-util.h"
 
-static void manager_free(Manager *m);
+static Manager* manager_unref(Manager *m);
+DEFINE_TRIVIAL_CLEANUP_FUNC(Manager*, manager_unref);
 
-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;
         m->reserve_vt_fd = -1;
@@ -56,28 +59,25 @@ 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;
 
         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;
@@ -86,7 +86,7 @@ static void manager_free(Manager *m) {
         Button *b;
 
         if (!m)
-                return;
+                return NULL;
 
         while ((session = hashmap_first(m->sessions)))
                 session_free(session);
@@ -155,7 +155,8 @@ static void manager_free(Manager *m) {
         free(m->scheduled_shutdown_tty);
         free(m->wall_message);
         free(m->action_job);
-        free(m);
+
+        return mfree(m);
 }
 
 static int manager_enumerate_devices(Manager *m) {
@@ -1192,7 +1193,7 @@ static 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);
@@ -1223,13 +1224,13 @@ int main(int argc, char *argv[]) {
         mkdir_label("/run/systemd/users", 0755);
         mkdir_label("/run/systemd/sessions", 0755);
 
-        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;
         }
 
-        manager_parse_config_file(m);
+        (void) manager_parse_config_file(m);
 
         r = manager_startup(m);
         if (r < 0) {
@@ -1239,20 +1240,18 @@ int main(int argc, char *argv[]) {
 
         log_debug("systemd-logind 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("systemd-logind 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;
 }