summaryrefslogtreecommitdiff
path: root/src/login/logind.c
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2018-04-24 18:13:12 +0200
committerLennart Poettering <lennart@poettering.net>2018-04-27 18:11:13 +0200
commit234621685353763ac3bea63a916df757bf06a8a6 (patch)
tree8a91d3bee48ed574aa4e0a3f311081ec3ca0c6a1 /src/login/logind.c
parentd1a1f0aaf0d2f08c60d1e0d32e646439d99f58dc (diff)
downloadsystemd-234621685353763ac3bea63a916df757bf06a8a6.tar.gz
systemd-234621685353763ac3bea63a916df757bf06a8a6.tar.bz2
systemd-234621685353763ac3bea63a916df757bf06a8a6.zip
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.c59
1 files changed, 29 insertions, 30 deletions
diff --git a/src/login/logind.c b/src/login/logind.c
index 3b097e1def..410f6074c6 100644
--- a/src/login/logind.c
+++ b/src/login/logind.c
@@ -30,15 +30,18 @@
#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;
}