summaryrefslogtreecommitdiff
path: root/src/login/logind.c
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2018-04-24 18:13:12 +0200
committerSven Eden <yamakuzure@gmx.net>2018-08-24 16:47:08 +0200
commite3ef5e1e1e4269e9f9f02f73778db58a83a626fb (patch)
tree2080dd85ab3343f7f1a4e6a1898e41dcd62c4614 /src/login/logind.c
parentcbb9e59083da8cedd08a059008f8ef2b1bac25a2 (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.c61
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;
}