#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"
#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"
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) {
static int manager_enumerate_records(Manager *m) {
_cleanup_closedir_ DIR *d = NULL;
- struct dirent *de;
assert(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
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);
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)
int manager_enumerate_images(Manager *m) {
_cleanup_closedir_ DIR *d = NULL;
- struct dirent *de;
assert(m);
}
static int manager_connect_bus(Manager *m) {
+ _cleanup_free_ char *b = NULL;
const char *suffix, *busname;
int r;
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);
}
static int manager_bind_varlink(Manager *m) {
+ _cleanup_free_ char *p = NULL;
const char *suffix, *socket_path;
int r;
/* 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);
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;
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) {
}
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",
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);
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;
}
}
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)) {
static int manager_load_public_keys(Manager *m) {
_cleanup_strv_free_ char **files = NULL;
- char **i;
int r;
assert(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);
}
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);
(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;
}
}
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);