]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
login: make user_new() and user_free() follow coding-style
authorDavid Herrmann <dh.herrmann@gmail.com>
Tue, 29 Sep 2015 09:10:01 +0000 (11:10 +0200)
committerDavid Herrmann <dh.herrmann@gmail.com>
Mon, 16 Nov 2015 14:34:41 +0000 (15:34 +0100)
Few changes to user_new() and user_free():
 - Use _cleanup_(user_freep) in constructor
 - return 'int' from user_new()
 - make user_free() deal with partially initialized objects
 - keep reverse-order in user_free() compared to user_new()
 - make user_free() return NULL
 - make user_free() accept NULL as no-op

src/login/logind-core.c
src/login/logind-user.c
src/login/logind-user.h

index b3f30c8dc9369b61a820e06bfed7606a5d789989..38c426c1aae090b4b9a413366d37899c2a22f842 100644 (file)
@@ -98,15 +98,16 @@ int manager_add_session(Manager *m, const char *id, Session **_session) {
 
 int manager_add_user(Manager *m, uid_t uid, gid_t gid, const char *name, User **_user) {
         User *u;
+        int r;
 
         assert(m);
         assert(name);
 
         u = hashmap_get(m->users, UID_TO_PTR(uid));
         if (!u) {
-                u = user_new(m, uid, gid, name);
-                if (!u)
-                        return -ENOMEM;
+                r = user_new(&u, m, uid, gid, name);
+                if (r < 0)
+                        return r;
         }
 
         if (_user)
index d985d19c466686eb7de52a8fcedac77b2f02c4b1..292a583103145bc5f179a791708f6df0a4115b2b 100644 (file)
 #include "user-util.h"
 #include "util.h"
 
-User* user_new(Manager *m, uid_t uid, gid_t gid, const char *name) {
+int user_new(User **out, Manager *m, uid_t uid, gid_t gid, const char *name) {
+        _cleanup_(user_freep) User *u = NULL;
         char lu[DECIMAL_STR_MAX(uid_t) + 1];
-        User *u;
         int r;
 
+        assert(out);
         assert(m);
         assert(name);
 
         u = new0(User, 1);
         if (!u)
-                return NULL;
+                return -ENOMEM;
+
+        u->manager = m;
+        u->uid = uid;
+        u->gid = gid;
 
         u->name = strdup(name);
         if (!u->name)
-                goto fail;
+                return -ENOMEM;
 
         if (asprintf(&u->state_file, "/run/systemd/users/"UID_FMT, uid) < 0)
-                goto fail;
+                return -ENOMEM;
 
         if (asprintf(&u->runtime_path, "/run/user/"UID_FMT, uid) < 0)
-                goto fail;
+                return -ENOMEM;
 
-        sprintf(lu, UID_FMT, uid);
+        xsprintf(lu, UID_FMT, uid);
         r = slice_build_subslice(SPECIAL_USER_SLICE, lu, &u->slice);
         if (r < 0)
-                goto fail;
-
-        if (hashmap_put(m->users, UID_TO_PTR(uid), u) < 0)
-                goto fail;
-
-        if (hashmap_put(m->user_units, u->slice, u) < 0)
-                goto fail;
+                return r;
 
-        u->manager = m;
-        u->uid = uid;
-        u->gid = gid;
+        r = hashmap_put(m->users, UID_TO_PTR(uid), u);
+        if (r < 0)
+                return r;
 
-        return u;
+        r = hashmap_put(m->user_units, u->slice, u);
+        if (r < 0)
+                return r;
 
-fail:
-        if (u->slice)
-                hashmap_remove(m->user_units, u->slice);
-        hashmap_remove(m->users, UID_TO_PTR(uid));
-        free(u->slice);
-        free(u->runtime_path);
-        free(u->state_file);
-        free(u->name);
-        free(u);
-
-        return NULL;
+        *out = u;
+        u = NULL;
+        return 0;
 }
 
-void user_free(User *u) {
-        assert(u);
+User *user_free(User *u) {
+        if (!u)
+                return NULL;
 
         if (u->in_gc_queue)
                 LIST_REMOVE(gc_queue, u->manager->user_gc_queue, u);
@@ -112,23 +106,24 @@ void user_free(User *u) {
         while (u->sessions)
                 session_free(u->sessions);
 
-        if (u->service) {
-                hashmap_remove(u->manager->user_units, u->service);
-                free(u->service);
-        }
+        if (u->service)
+                hashmap_remove_value(u->manager->user_units, u->service, u);
 
-        hashmap_remove(u->manager->user_units, u->slice);
-        hashmap_remove(u->manager->users, UID_TO_PTR(u->uid));
+        if (u->slice)
+                hashmap_remove_value(u->manager->user_units, u->slice, u);
 
-        free(u->slice_job);
-        free(u->service_job);
+        hashmap_remove_value(u->manager->users, UID_TO_PTR(u->uid), u);
+
+        u->slice_job = mfree(u->slice_job);
+        u->service_job = mfree(u->service_job);
 
-        free(u->slice);
-        free(u->runtime_path);
+        u->service = mfree(u->service);
+        u->slice = mfree(u->slice);
+        u->runtime_path = mfree(u->runtime_path);
+        u->state_file = mfree(u->state_file);
+        u->name = mfree(u->name);
 
-        free(u->name);
-        free(u->state_file);
-        free(u);
+        return mfree(u);
 }
 
 static int user_save_internal(User *u) {
index 722247806bbb5592fa67e4d3c42e770b208bc7e8..11d28d299766761998ab4f82702b8f91aa143432 100644 (file)
@@ -65,8 +65,11 @@ struct User {
         LIST_FIELDS(User, gc_queue);
 };
 
-User* user_new(Manager *m, uid_t uid, gid_t gid, const char *name);
-void user_free(User *u);
+int user_new(User **out, Manager *m, uid_t uid, gid_t gid, const char *name);
+User *user_free(User *u);
+
+DEFINE_TRIVIAL_CLEANUP_FUNC(User *, user_free);
+
 bool user_check_gc(User *u, bool drop_not_started);
 void user_add_to_gc_queue(User *u);
 int user_start(User *u);