]> git.ipfire.org Git - thirdparty/systemd.git/blobdiff - src/home/homed-manager.c
tree-wide: use -EBADF for fd initialization
[thirdparty/systemd.git] / src / home / homed-manager.c
index 2595e96016340b8b7a3203001860f395e53cb316..2fd1d67eff219237f07f5f7f6264889d7abd1e11 100644 (file)
@@ -10,6 +10,8 @@
 #include <sys/quota.h>
 #include <sys/stat.h>
 
+#include "sd-id128.h"
+
 #include "btrfs-util.h"
 #include "bus-common-errors.h"
 #include "bus-error.h"
@@ -23,6 +25,7 @@
 #include "fileio.h"
 #include "format-util.h"
 #include "fs-util.h"
+#include "glyph-util.h"
 #include "gpt.h"
 #include "home-util.h"
 #include "homed-conf.h"
@@ -118,10 +121,9 @@ static void manager_watch_home(Manager *m) {
 
 static int on_home_inotify(sd_event_source *s, const struct inotify_event *event, void *userdata) {
         _cleanup_free_ char *j = NULL;
-        Manager *m = userdata;
+        Manager *m = ASSERT_PTR(userdata);
         const char *e, *n;
 
-        assert(m);
         assert(event);
 
         if ((event->mask & (IN_Q_OVERFLOW|IN_MOVE_SELF|IN_DELETE_SELF|IN_IGNORED|IN_UNMOUNT)) != 0) {
@@ -447,7 +449,6 @@ unlink_this_file:
 
 static int manager_enumerate_records(Manager *m) {
         _cleanup_closedir_ DIR *d = NULL;
-        struct dirent *de;
 
         assert(m);
 
@@ -483,7 +484,6 @@ static int manager_enumerate_records(Manager *m) {
 static int search_quota(uid_t uid, const char *exclude_quota_path) {
         struct stat exclude_st = {};
         dev_t previous_devno = 0;
-        const char *where;
         int r;
 
         /* Checks whether the specified UID owns any files on the files system, but ignore any file system
@@ -529,7 +529,7 @@ static int search_quota(uid_t uid, const char *exclude_quota_path) {
 
                 previous_devno = st.st_dev;
 
-                r = quotactl_devno(QCMD_FIXED(Q_GETQUOTA, USRQUOTA), st.st_dev, uid, &req);
+                r = quotactl_devnum(QCMD_FIXED(Q_GETQUOTA, USRQUOTA), st.st_dev, uid, &req);
                 if (r < 0) {
                         if (ERRNO_IS_NOT_SUPPORTED(r))
                                 log_debug_errno(r, "No UID quota support on %s, ignoring.", where);
@@ -860,7 +860,7 @@ static int manager_assess_image(
 
         if (S_ISDIR(st.st_mode)) {
                 _cleanup_free_ char *n = NULL, *user_name = NULL, *realm = NULL;
-                _cleanup_close_ int fd = -1;
+                _cleanup_close_ int fd = -EBADF;
                 UserStorage storage;
 
                 if (!directory_suffix)
@@ -919,7 +919,6 @@ static int manager_assess_image(
 
 int manager_enumerate_images(Manager *m) {
         _cleanup_closedir_ DIR *d = NULL;
-        struct dirent *de;
 
         assert(m);
 
@@ -938,6 +937,7 @@ int manager_enumerate_images(Manager *m) {
 }
 
 static int manager_connect_bus(Manager *m) {
+        _cleanup_free_ char *b = NULL;
         const char *suffix, *busname;
         int r;
 
@@ -957,9 +957,12 @@ static int manager_connect_bus(Manager *m) {
                 return r;
 
         suffix = getenv("SYSTEMD_HOME_DEBUG_SUFFIX");
-        if (suffix)
-                busname = strjoina("org.freedesktop.home1.", suffix);
-        else
+        if (suffix) {
+                b = strjoin("org.freedesktop.home1.", suffix);
+                if (!b)
+                        return log_oom();
+                busname = b;
+        } else
                 busname = "org.freedesktop.home1";
 
         r = sd_bus_request_name_async(m->bus, NULL, busname, 0, NULL, NULL);
@@ -976,6 +979,7 @@ static int manager_connect_bus(Manager *m) {
 }
 
 static int manager_bind_varlink(Manager *m) {
+        _cleanup_free_ char *p = NULL;
         const char *suffix, *socket_path;
         int r;
 
@@ -1001,9 +1005,12 @@ static int manager_bind_varlink(Manager *m) {
         /* To make things easier to debug, when working from a homed managed home directory, let's optionally
          * use a different varlink socket name */
         suffix = getenv("SYSTEMD_HOME_DEBUG_SUFFIX");
-        if (suffix)
-                socket_path = strjoina("/run/systemd/userdb/io.systemd.Home.", suffix);
-        else
+        if (suffix) {
+                p = strjoin("/run/systemd/userdb/io.systemd.Home.", suffix);
+                if (!p)
+                        return log_oom();
+                socket_path = p;
+        } else
                 socket_path = "/run/systemd/userdb/io.systemd.Home";
 
         r = varlink_server_listen_address(m->varlink_server, socket_path, 0666);
@@ -1034,7 +1041,7 @@ static ssize_t read_datagram(
 
         CMSG_BUFFER_TYPE(CMSG_SPACE(sizeof(struct ucred)) + CMSG_SPACE(sizeof(int))) control;
         _cleanup_free_ void *buffer = NULL;
-        _cleanup_close_ int passed_fd = -1;
+        _cleanup_close_ int passed_fd = -EBADF;
         struct ucred *sender = NULL;
         struct cmsghdr *cmsg;
         struct msghdr mh;
@@ -1112,14 +1119,13 @@ static ssize_t read_datagram(
 static int on_notify_socket(sd_event_source *s, int fd, uint32_t revents, void *userdata) {
         _cleanup_strv_free_ char **l = NULL;
         _cleanup_free_ void *datagram = NULL;
-        _cleanup_close_ int passed_fd = -1;
+        _cleanup_close_ int passed_fd = -EBADF;
         struct ucred sender = UCRED_INVALID;
-        Manager *m = userdata;
+        Manager *m = ASSERT_PTR(userdata);
         ssize_t n;
         Home *h;
 
         assert(s);
-        assert(m);
 
         n = read_datagram(fd, &sender, &datagram, &passed_fd);
         if (n < 0) {
@@ -1148,7 +1154,7 @@ static int on_notify_socket(sd_event_source *s, int fd, uint32_t revents, void *
 }
 
 static int manager_listen_notify(Manager *m) {
-        _cleanup_close_ int fd = -1;
+        _cleanup_close_ int fd = -EBADF;
         union sockaddr_union sa = {
                 .un.sun_family = AF_UNIX,
                 .un.sun_path = "/run/systemd/home/notify",
@@ -1161,9 +1167,11 @@ static int manager_listen_notify(Manager *m) {
 
         suffix = getenv("SYSTEMD_HOME_DEBUG_SUFFIX");
         if (suffix) {
-                const char *unix_path;
+                _cleanup_free_ char *unix_path = NULL;
 
-                unix_path = strjoina("/run/systemd/home/notify.", suffix);
+                unix_path = strjoin("/run/systemd/home/notify.", suffix);
+                if (!unix_path)
+                        return log_oom();
                 r = sockaddr_un_set_path(&sa.un, unix_path);
                 if (r < 0)
                         return log_error_errno(r, "Socket path %s does not fit in sockaddr_un: %m", unix_path);
@@ -1231,10 +1239,7 @@ static int manager_add_device(Manager *m, sd_device *d) {
                 return 0;
         if (r < 0)
                 return log_error_errno(r, "Failed to acquire ID_PART_ENTRY_TYPE device property, ignoring: %m");
-        r = sd_id128_from_string(parttype, &id);
-        if (r < 0)
-                return log_debug_errno(r, "Failed to parse ID_PART_ENTRY_TYPE field '%s', ignoring: %m", parttype);
-        if (!sd_id128_equal(id, GPT_USER_HOME)) {
+        if (sd_id128_string_equal(parttype, SD_GPT_USER_HOME) <= 0) {
                 log_debug("Found partition (%s) we don't care about, ignoring.", sysfs);
                 return 0;
         }
@@ -1264,10 +1269,9 @@ static int manager_add_device(Manager *m, sd_device *d) {
 }
 
 static int manager_on_device(sd_device_monitor *monitor, sd_device *d, void *userdata) {
-        Manager *m = userdata;
+        Manager *m = ASSERT_PTR(userdata);
         int r;
 
-        assert(m);
         assert(d);
 
         if (device_for_action(d, SD_DEVICE_REMOVE)) {
@@ -1546,7 +1550,6 @@ static int manager_load_public_key_one(Manager *m, const char *path) {
 
 static int manager_load_public_keys(Manager *m) {
         _cleanup_strv_free_ char **files = NULL;
-        char **i;
         int r;
 
         assert(m);
@@ -1692,9 +1695,7 @@ int manager_gc_images(Manager *m) {
 }
 
 static int on_deferred_rescan(sd_event_source *s, void *userdata) {
-        Manager *m = userdata;
-
-        assert(m);
+        Manager *m = ASSERT_PTR(userdata);
 
         m->deferred_rescan_event_source = sd_event_source_disable_unref(m->deferred_rescan_event_source);
 
@@ -1730,9 +1731,7 @@ int manager_enqueue_rescan(Manager *m) {
 }
 
 static int on_deferred_gc(sd_event_source *s, void *userdata) {
-        Manager *m = userdata;
-
-        assert(m);
+        Manager *m = ASSERT_PTR(userdata);
 
         m->deferred_gc_event_source = sd_event_source_disable_unref(m->deferred_gc_event_source);
 
@@ -1933,8 +1932,10 @@ static int manager_rebalance_calculate(Manager *m) {
                     (m->rebalance_state == REBALANCE_GROWING && h->rebalance_goal < h->rebalance_size))
                         h->rebalance_pending = false;
                 else {
-                        log_debug("Rebalancing home directory '%s' %s → %s.", h->user_name,
-                                  FORMAT_BYTES(h->rebalance_size), FORMAT_BYTES(h->rebalance_goal));
+                        log_debug("Rebalancing home directory '%s' %s %s %s.", h->user_name,
+                                  FORMAT_BYTES(h->rebalance_size),
+                                  special_glyph(SPECIAL_GLYPH_ARROW_RIGHT),
+                                  FORMAT_BYTES(h->rebalance_goal));
                         h->rebalance_pending = true;
                 }
 
@@ -2087,10 +2088,9 @@ finish:
 }
 
 static int on_rebalance_timer(sd_event_source *s, usec_t t, void *userdata) {
-        Manager *m = userdata;
+        Manager *m = ASSERT_PTR(userdata);
 
         assert(s);
-        assert(m);
         assert(IN_SET(m->rebalance_state, REBALANCE_WAITING, REBALANCE_PENDING, REBALANCE_SHRINKING, REBALANCE_GROWING));
 
         (void) manager_rebalance_now(m);