From 53059edcb443825603494b4129aa9db6a120f033 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Sat, 31 May 2025 13:43:32 +0200 Subject: [PATCH 1/7] random-seed: do not include file name directly in error messages The path is fairly long and by embedding it in the message, we get a longer data section in our binary. By using %s, we can make the template strings shorter, deduplicating bytes in our binary. Those are error messages, i.e. by definition they are only used very rarely, so it's completely fine if printf does a bit more work when generating the message. $ strings build/systemd-random-seed.0 | rg '/var/lib/systemd/random-seed' /var/lib/systemd/random-seed Failed to open /var/lib/systemd/random-seed for writing: %m Failed to open /var/lib/systemd/random-seed for reading: %m Failed to open /var/lib/systemd/random-seed: %m Failed to stat() seed file /var/lib/systemd/random-seed: %m Failed to read seed from /var/lib/systemd/random-seed: %m Seed file /var/lib/systemd/random-seed not yet initialized, proceeding. $ strings build/systemd-random-seed | rg '/var/lib/systemd/random-seed' /var/lib/systemd/random-seed $ ls -l build/systemd-random-seed{,.0} -rwxr-xr-x 1 zbyszek zbyszek 68872 May 31 13:39 build/systemd-random-seed.0 -rwxr-xr-x 1 zbyszek zbyszek 64912 May 31 13:45 build/systemd-random-seed That's a ~6% smaller binary! --- src/random-seed/random-seed-tool.c | 32 ++++++++++++++++-------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/src/random-seed/random-seed-tool.c b/src/random-seed/random-seed-tool.c index 536d1b037d..a99df0e08e 100644 --- a/src/random-seed/random-seed-tool.c +++ b/src/random-seed/random-seed-tool.c @@ -102,12 +102,14 @@ static CreditEntropy may_credit(int seed_fd) { static int random_seed_size(int seed_fd, size_t *ret_size) { struct stat st; + int r; assert(ret_size); assert(seed_fd >= 0); - if (fstat(seed_fd, &st) < 0) - return log_error_errno(errno, "Failed to stat() seed file " RANDOM_SEED ": %m"); + r = RET_NERRNO(fstat(seed_fd, &st)); + if (r < 0) + return log_error_errno(r, "Failed to stat seed file %s: %m", RANDOM_SEED); /* If the seed file is larger than what the kernel expects, then honour the existing size and * save/restore as much as it says */ @@ -157,11 +159,11 @@ static int load_seed_file( k = loop_read(seed_fd, buf, seed_size, false); if (k < 0) { - log_warning_errno(k, "Failed to read seed from " RANDOM_SEED ": %m"); + log_warning_errno(k, "Failed to read seed from %s: %m", RANDOM_SEED); return 0; } if (k == 0) { - log_debug("Seed file " RANDOM_SEED " not yet initialized, proceeding."); + log_debug("Seed file %s not yet initialized, proceeding.", RANDOM_SEED); return 0; } @@ -384,11 +386,11 @@ static int run(int argc, char *argv[]) { r = mkdir_parents(RANDOM_SEED, 0755); if (r < 0) - return log_error_errno(r, "Failed to create directory " RANDOM_SEED_DIR ": %m"); + return log_error_errno(r, "Failed to create directory %s: %m", RANDOM_SEED); random_fd = open("/dev/urandom", O_RDWR|O_CLOEXEC|O_NOCTTY); if (random_fd < 0) - return log_error_errno(errno, "Failed to open /dev/urandom: %m"); + return log_error_errno(errno, "Failed to open %s: %m", "/dev/urandom"); /* When we load the seed we read it and write it to the device and then immediately update the saved * seed with new data, to make sure the next boot gets seeded differently. */ @@ -399,20 +401,20 @@ static int run(int argc, char *argv[]) { * load_machine_id() for an explanation why. */ load_machine_id(random_fd); - seed_fd = open(RANDOM_SEED, O_RDWR|O_CLOEXEC|O_NOCTTY|O_CREAT, 0600); + seed_fd = RET_NERRNO(open(RANDOM_SEED, O_RDWR|O_CLOEXEC|O_NOCTTY|O_CREAT, 0600)); if (seed_fd < 0) { - int open_rw_error = -errno; + int open_rw_error = seed_fd; write_seed_file = false; - seed_fd = open(RANDOM_SEED, O_RDONLY|O_CLOEXEC|O_NOCTTY); + seed_fd = RET_NERRNO(open(RANDOM_SEED, O_RDONLY|O_CLOEXEC|O_NOCTTY)); if (seed_fd < 0) { - bool missing = errno == ENOENT; + bool missing = seed_fd == -ENOENT; int level = missing ? LOG_DEBUG : LOG_ERR; - log_full_errno(level, open_rw_error, "Failed to open " RANDOM_SEED " for writing: %m"); - log_full_errno(level, errno, "Failed to open " RANDOM_SEED " for reading: %m"); - return missing ? 0 : -errno; + log_full_errno(level, open_rw_error, "Failed to open %s for writing: %m", RANDOM_SEED); + log_full_errno(level, seed_fd, "Failed to open %s for reading: %m", RANDOM_SEED); + return missing ? 0 : seed_fd; } } else write_seed_file = true; @@ -422,9 +424,9 @@ static int run(int argc, char *argv[]) { break; case ACTION_SAVE: - seed_fd = open(RANDOM_SEED, O_WRONLY|O_CLOEXEC|O_NOCTTY|O_CREAT, 0600); + seed_fd = RET_NERRNO(open(RANDOM_SEED, O_WRONLY|O_CLOEXEC|O_NOCTTY|O_CREAT, 0600)); if (seed_fd < 0) - return log_error_errno(errno, "Failed to open " RANDOM_SEED ": %m"); + return log_error_errno(seed_fd, "Failed to open %s: %m", RANDOM_SEED); read_seed_file = false; write_seed_file = true; From 4df8fc99cefbe363c8e235c15c8930d732bc653f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Sat, 31 May 2025 15:14:36 +0200 Subject: [PATCH 2/7] sleep: do not include file name directly in error messages Here the .text section becomes smaller, but the file size doesn't change (I guess some alignment issue). But is seems to be reasonable change to anyway, we might get some savings in different compilations anyway. Also improve two messages. --- src/sleep/battery-capacity.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/sleep/battery-capacity.c b/src/sleep/battery-capacity.c index 2985223a94..f6a1ed25ac 100644 --- a/src/sleep/battery-capacity.c +++ b/src/sleep/battery-capacity.c @@ -108,7 +108,7 @@ static int get_battery_discharge_rate(sd_device *dev, int *ret) { f = fopen(DISCHARGE_RATE_FILEPATH, "re"); if (!f) - return log_debug_errno(errno, "Failed to read discharge rate from " DISCHARGE_RATE_FILEPATH ": %m"); + return log_debug_errno(errno, "Failed to read discharge rate from %s: %m", DISCHARGE_RATE_FILEPATH); current_hash_id = system_battery_identifier_hash(dev); @@ -119,20 +119,22 @@ static int get_battery_discharge_rate(sd_device *dev, int *ret) { r = read_line(f, LONG_LINE_MAX, &line); if (r < 0) - return log_debug_errno(r, "Failed to read discharge rate from " DISCHARGE_RATE_FILEPATH ": %m"); + return log_debug_errno(r, "Failed to read discharge rate from %s: %m", DISCHARGE_RATE_FILEPATH); if (r == 0) break; p = line; r = extract_many_words(&p, NULL, 0, &stored_hash_id, &stored_discharge_rate); if (r < 0) - return log_debug_errno(r, "Failed to parse hash_id and discharge_rate read from " DISCHARGE_RATE_FILEPATH ": %m"); + return log_debug_errno(r, "Failed to parse hash_id and discharge_rate read from %s: %m", + DISCHARGE_RATE_FILEPATH); if (r != 2) - return log_debug_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid number of items fetched from " DISCHARGE_RATE_FILEPATH); + return log_debug_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid number of items fetched from %s.", + DISCHARGE_RATE_FILEPATH); r = safe_atou64(stored_hash_id, &hash_id); if (r < 0) - return log_debug_errno(r, "Failed to parse hash ID read from " DISCHARGE_RATE_FILEPATH " location: %m"); + return log_debug_errno(r, "Failed to parse hash ID read from %s: %m", DISCHARGE_RATE_FILEPATH); if (current_hash_id != hash_id) /* matching device not found, move to next line */ @@ -140,10 +142,13 @@ static int get_battery_discharge_rate(sd_device *dev, int *ret) { r = safe_atoi(stored_discharge_rate, &discharge_rate); if (r < 0) - return log_device_debug_errno(dev, r, "Failed to parse discharge rate read from " DISCHARGE_RATE_FILEPATH ": %m"); + return log_device_debug_errno(dev, r, "Failed to parse discharge rate read from %s: %m", + DISCHARGE_RATE_FILEPATH); if (!battery_discharge_rate_is_valid(discharge_rate)) - return log_device_debug_errno(dev, SYNTHETIC_ERRNO(ERANGE), "Invalid battery discharge percentage rate per hour."); + return log_device_debug_errno(dev, SYNTHETIC_ERRNO(ERANGE), + "Invalid battery discharge percentage rate per hour read from %s.", + DISCHARGE_RATE_FILEPATH); *ret = discharge_rate; return 0; /* matching device found, exit iteration */ From 9e2befbf4be0311778b039d31f2ca2bf9a73d854 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Sat, 31 May 2025 15:18:37 +0200 Subject: [PATCH 3/7] sd-device: do not include file name directly in error messages $ diff -u <(strings -n 10 build/libsystemd.so.0.40.0.0 | sort) <(strings -n 10 build/libsystemd.so.0.40.0 | sort) --- /proc/self/fd/11 2025-05-31 15:17:16.968761963 +0200 +++ /proc/self/fd/12 2025-05-31 15:17:16.970159823 +0200 @@ -3860,11 +3860,6 @@ Failed to fstat() journal file '%s', ignoring: %m Failed to fstat %s: %m Failed to get basic: %m -Failed to get device "ACTION" property, ignoring: %m -Failed to get device "DEVNUM" property, ignoring: %m -Failed to get device "DISKSEQ" property, ignoring: %m -Failed to get device "IFINDEX" property, ignoring: %m -Failed to get device "SEQNUM" property, ignoring: %m Failed to get device "%s" property, ignoring: %m Failed to get inode number of pidfd for pid %i: %m Failed to get peer's socket address, ignoring: %m $ ls -l build/libsystemd.so.0.40.0{,.0} -rwxr-xr-x 1 zbyszek zbyszek 7631640 May 31 15:16 build/libsystemd.so.0.40.0 -rwxr-xr-x 1 zbyszek zbyszek 7635736 May 31 15:16 build/libsystemd.so.0.40.0.0 $ size build/libsystemd.so.0.40.0{,.0} text data bss dec hex filename 1241382 56185 3554 1301121 13da81 build/libsystemd.so.0.40.0 1241606 56185 3554 1301345 13db61 build/libsystemd.so.0.40.0.0 So the savings are ~4kB, which is more than I expected. --- src/libsystemd/sd-device/device-util.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/libsystemd/sd-device/device-util.c b/src/libsystemd/sd-device/device-util.c index 718b703066..b3778f9966 100644 --- a/src/libsystemd/sd-device/device-util.c +++ b/src/libsystemd/sd-device/device-util.c @@ -105,31 +105,31 @@ char** device_make_log_fields(sd_device *device) { r = sd_device_get_devnum(device, &devnum); if (r < 0 && r != -ENOENT) - log_device_debug_errno(device, r, "Failed to get device \"DEVNUM\" property, ignoring: %m"); + log_device_debug_errno(device, r, "Failed to get device \"%s\" property, ignoring: %m", "DEVNUM"); if (r >= 0) (void) strv_extendf(&strv, "DEVNUM="DEVNUM_FORMAT_STR, DEVNUM_FORMAT_VAL(devnum)); r = sd_device_get_ifindex(device, &ifindex); if (r < 0 && r != -ENOENT) - log_device_debug_errno(device, r, "Failed to get device \"IFINDEX\" property, ignoring: %m"); + log_device_debug_errno(device, r, "Failed to get device \"%s\" property, ignoring: %m", "IFINDEX"); if (r >= 0) (void) strv_extendf(&strv, "IFINDEX=%i", ifindex); r = sd_device_get_action(device, &action); if (r < 0 && r != -ENOENT) - log_device_debug_errno(device, r, "Failed to get device \"ACTION\" property, ignoring: %m"); + log_device_debug_errno(device, r, "Failed to get device \"%s\" property, ignoring: %m", "ACTION"); if (r >= 0) (void) strv_extendf(&strv, "ACTION=%s", device_action_to_string(action)); r = sd_device_get_seqnum(device, &seqnum); if (r < 0 && r != -ENOENT) - log_device_debug_errno(device, r, "Failed to get device \"SEQNUM\" property, ignoring: %m"); + log_device_debug_errno(device, r, "Failed to get device \"%s\" property, ignoring: %m", "SEQNUM"); if (r >= 0) (void) strv_extendf(&strv, "SEQNUM=%"PRIu64, seqnum); r = sd_device_get_diskseq(device, &diskseq); if (r < 0 && r != -ENOENT) - log_device_debug_errno(device, r, "Failed to get device \"DISKSEQ\" property, ignoring: %m"); + log_device_debug_errno(device, r, "Failed to get device \"%s\" property, ignoring: %m", "DISKSEQ"); if (r >= 0) (void) strv_extendf(&strv, "DISKSEQ=%"PRIu64, diskseq); From 2b2ca7ff2a46fce6f12cb71c586018060fab09d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Sat, 31 May 2025 15:28:35 +0200 Subject: [PATCH 4/7] core: do not include names directly in error messages This allows some strings constants to be deduplicated. libsystemd-core.so + systemd are about 2k smaller. Also tweak some messages for consistency. We used 'exec' in one place and 'execute' in all other messages. --- src/core/main.c | 6 +++--- src/core/mount.c | 7 +++---- src/core/scope.c | 7 +++---- src/core/service.c | 4 ++-- 4 files changed, 11 insertions(+), 13 deletions(-) diff --git a/src/core/main.c b/src/core/main.c index b1f7cc941b..330c42482f 100644 --- a/src/core/main.c +++ b/src/core/main.c @@ -1619,7 +1619,7 @@ static void redirect_telinit(int argc, char *argv[]) { return; execv(SYSTEMCTL_BINARY_PATH, argv); - log_error_errno(errno, "Failed to exec " SYSTEMCTL_BINARY_PATH ": %m"); + log_error_errno(errno, "Failed to execute %s: %m", SYSTEMCTL_BINARY_PATH); exit(EXIT_FAILURE); #endif } @@ -2604,12 +2604,12 @@ static int do_queue_default_job( /* Fall back to default.target, which we used to always use by default. Only do this if no * explicit configuration was given. */ - log_info("Falling back to " SPECIAL_DEFAULT_TARGET "."); + log_info("Falling back to %s.", SPECIAL_DEFAULT_TARGET); r = manager_load_startable_unit_or_warn(m, SPECIAL_DEFAULT_TARGET, NULL, &target); } if (r < 0) { - log_info("Falling back to " SPECIAL_RESCUE_TARGET "."); + log_info("Falling back to %s.", SPECIAL_RESCUE_TARGET); r = manager_load_startable_unit_or_warn(m, SPECIAL_RESCUE_TARGET, NULL, &target); if (r < 0) { diff --git a/src/core/mount.c b/src/core/mount.c index 8797dcce18..94105d9db5 100644 --- a/src/core/mount.c +++ b/src/core/mount.c @@ -2034,10 +2034,9 @@ static void mount_enumerate_perpetual(Manager *m) { u = manager_get_unit(m, SPECIAL_ROOT_MOUNT); if (!u) { r = unit_new_for_name(m, sizeof(Mount), SPECIAL_ROOT_MOUNT, &u); - if (r < 0) { - log_error_errno(r, "Failed to allocate the special " SPECIAL_ROOT_MOUNT " unit: %m"); - return; - } + if (r < 0) + return (void) log_error_errno(r, "Failed to allocate the special %s unit: %m", + SPECIAL_ROOT_MOUNT); } u->perpetual = true; diff --git a/src/core/scope.c b/src/core/scope.c index cf70de573c..def2039e1a 100644 --- a/src/core/scope.c +++ b/src/core/scope.c @@ -705,10 +705,9 @@ static void scope_enumerate_perpetual(Manager *m) { u = manager_get_unit(m, SPECIAL_INIT_SCOPE); if (!u) { r = unit_new_for_name(m, sizeof(Scope), SPECIAL_INIT_SCOPE, &u); - if (r < 0) { - log_error_errno(r, "Failed to allocate the special " SPECIAL_INIT_SCOPE " unit: %m"); - return; - } + if (r < 0) + return (void) log_error_errno(r, "Failed to allocate the special %s unit: %m", + SPECIAL_INIT_SCOPE); } u->transient = true; diff --git a/src/core/service.c b/src/core/service.c index c976ee63e4..295691fd0d 100644 --- a/src/core/service.c +++ b/src/core/service.c @@ -819,12 +819,12 @@ static int service_setup_bus_name(Service *s) { if (s->type == SERVICE_DBUS) { r = unit_add_dependency_by_name(UNIT(s), UNIT_REQUIRES, SPECIAL_DBUS_SOCKET, true, UNIT_DEPENDENCY_FILE); if (r < 0) - return log_unit_error_errno(UNIT(s), r, "Failed to add dependency on " SPECIAL_DBUS_SOCKET ": %m"); + return log_unit_error_errno(UNIT(s), r, "Failed to add dependency on %s: %m", SPECIAL_DBUS_SOCKET); /* We always want to be ordered against dbus.socket if both are in the transaction. */ r = unit_add_dependency_by_name(UNIT(s), UNIT_AFTER, SPECIAL_DBUS_SOCKET, true, UNIT_DEPENDENCY_FILE); if (r < 0) - return log_unit_error_errno(UNIT(s), r, "Failed to add dependency on " SPECIAL_DBUS_SOCKET ": %m"); + return log_unit_error_errno(UNIT(s), r, "Failed to add dependency on %s: %m", SPECIAL_DBUS_SOCKET); } r = unit_watch_bus_name(UNIT(s), s->bus_name); From 5890a77540bd265520eae17592bbea9aa27c74f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Sat, 31 May 2025 16:03:55 +0200 Subject: [PATCH 5/7] core/smack-setup: rework message to include full paths to files We'd print the filename, but not the full path. Error messages without the full path are annoying to users since they might not know where the file is located, esp. if the name is fairly generic, and it is harder to search for the error message too. Use a trailing slash to indicate when we're trying to open a directory. Drop quotes from around paths which are static and known to contain no whitespace. --- src/core/smack-setup.c | 54 +++++++++++++++++++++++------------------- 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/src/core/smack-setup.c b/src/core/smack-setup.c index 72927eb941..a37479d98a 100644 --- a/src/core/smack-setup.c +++ b/src/core/smack-setup.c @@ -54,14 +54,14 @@ static int write_access2_rules(const char *srcdir) { load2_fd = open("/sys/fs/smackfs/load2", O_RDWR|O_CLOEXEC|O_NONBLOCK|O_NOCTTY); if (load2_fd < 0) { if (errno != ENOENT) - log_warning_errno(errno, "Failed to open '/sys/fs/smackfs/load2': %m"); + log_warning_errno(errno, "Failed to open %s: %m", "/sys/fs/smackfs/load2"); return -errno; /* negative error */ } change_fd = open("/sys/fs/smackfs/change-rule", O_RDWR|O_CLOEXEC|O_NONBLOCK|O_NOCTTY); if (change_fd < 0) { if (errno != ENOENT) - log_warning_errno(errno, "Failed to open '/sys/fs/smackfs/change-rule': %m"); + log_warning_errno(errno, "Failed to open %s: %m", "/sys/fs/smackfs/change-rule"); return -errno; /* negative error */ } @@ -69,7 +69,7 @@ static int write_access2_rules(const char *srcdir) { dir = opendir(srcdir); if (!dir) { if (errno != ENOENT) - log_warning_errno(errno, "Failed to opendir '%s': %m", srcdir); + log_warning_errno(errno, "Failed to open %s/: %m", srcdir); return errno; /* positive on purpose */ } @@ -92,7 +92,7 @@ static int write_access2_rules(const char *srcdir) { q = read_line(policy, NAME_MAX, &buf); if (q < 0) - return log_error_errno(q, "Failed to read line from '%s': %m", entry->d_name); + return log_error_errno(q, "%s/%s: failed to read line: %m", srcdir, entry->d_name); if (q == 0) break; @@ -102,15 +102,17 @@ static int write_access2_rules(const char *srcdir) { /* if 3 args -> load rule : subject object access1 */ /* if 4 args -> change rule : subject object access1 access2 */ if (sscanf(buf, "%ms %ms %ms %ms", &sbj, &obj, &acc1, &acc2) < 3) { - log_error_errno(errno, "Failed to parse rule '%s' in '%s', ignoring.", buf, entry->d_name); + log_error_errno(errno, "%s/%s: failed to parse rule '%s', ignoring.", + srcdir, entry->d_name, buf); continue; } if (write(isempty(acc2) ? load2_fd : change_fd, buf, strlen(buf)) < 0) { if (r == 0) r = -errno; - log_error_errno(errno, "Failed to write '%s' to '%s' in '%s': %m", - buf, isempty(acc2) ? "/sys/fs/smackfs/load2" : "/sys/fs/smackfs/change-rule", entry->d_name); + log_error_errno(errno, "%s/%s: failed to write '%s' to '%s': %m", + srcdir, entry->d_name, + buf, isempty(acc2) ? "/sys/fs/smackfs/load2" : "/sys/fs/smackfs/change-rule"); } } } @@ -126,7 +128,7 @@ static int write_cipso2_rules(const char *srcdir) { cipso2_fd = open("/sys/fs/smackfs/cipso2", O_RDWR|O_CLOEXEC|O_NONBLOCK|O_NOCTTY); if (cipso2_fd < 0) { if (errno != ENOENT) - log_warning_errno(errno, "Failed to open '/sys/fs/smackfs/cipso2': %m"); + log_warning_errno(errno, "Failed to open %s: %m", "/sys/fs/smackfs/cipso2"); return -errno; /* negative error */ } @@ -134,7 +136,7 @@ static int write_cipso2_rules(const char *srcdir) { dir = opendir(srcdir); if (!dir) { if (errno != ENOENT) - log_warning_errno(errno, "Failed to opendir '%s': %m", srcdir); + log_warning_errno(errno, "Failed to open %s/: %m", srcdir); return errno; /* positive on purpose */ } @@ -157,7 +159,8 @@ static int write_cipso2_rules(const char *srcdir) { q = read_line(policy, NAME_MAX, &buf); if (q < 0) - return log_error_errno(q, "Failed to read line from '%s': %m", entry->d_name); + return log_error_errno(q, "%s/%s: failed to read line: %m", + srcdir, entry->d_name); if (q == 0) break; @@ -167,8 +170,9 @@ static int write_cipso2_rules(const char *srcdir) { if (write(cipso2_fd, buf, strlen(buf)) < 0) { if (r == 0) r = -errno; - log_error_errno(errno, "Failed to write '%s' to '/sys/fs/smackfs/cipso2' in '%s': %m", - buf, entry->d_name); + log_error_errno(errno, "%s/%s: failed to write '%s' to %s: %m", + srcdir, entry->d_name, + buf, "/sys/fs/smackfs/cipso2"); break; } } @@ -185,7 +189,7 @@ static int write_netlabel_rules(const char *srcdir) { dst = fopen("/sys/fs/smackfs/netlabel", "we"); if (!dst) { if (errno != ENOENT) - log_warning_errno(errno, "Failed to open /sys/fs/smackfs/netlabel: %m"); + log_warning_errno(errno, "Failed to open %s/: %m", "/sys/fs/smackfs/netlabel"); return -errno; /* negative error */ } @@ -193,7 +197,7 @@ static int write_netlabel_rules(const char *srcdir) { dir = opendir(srcdir); if (!dir) { if (errno != ENOENT) - log_warning_errno(errno, "Failed to opendir %s: %m", srcdir); + log_warning_errno(errno, "Failed to open %s/: %m", srcdir); return errno; /* positive on purpose */ } @@ -213,21 +217,22 @@ static int write_netlabel_rules(const char *srcdir) { q = read_line(policy, NAME_MAX, &buf); if (q < 0) - return log_error_errno(q, "Failed to read line from %s: %m", entry->d_name); + return log_error_errno(q, "%s/%s: failed to read line: %m", + srcdir, entry->d_name); if (q == 0) break; if (!fputs(buf, dst)) { if (r == 0) r = -EINVAL; - log_error_errno(errno, "Failed to write line to /sys/fs/smackfs/netlabel: %m"); + log_error_errno(errno, "Failed to write line to %s: %m", "/sys/fs/smackfs/netlabel"); break; } q = fflush_and_check(dst); if (q < 0) { if (r == 0) r = q; - log_error_errno(q, "Failed to flush writes to /sys/fs/smackfs/netlabel: %m"); + log_error_errno(q, "Failed to flush %s: %m", "/sys/fs/smackfs/netlabel"); break; } } @@ -246,7 +251,7 @@ static int write_onlycap_list(void) { f = fopen("/etc/smack/onlycap", "re"); if (!f) { if (errno != ENOENT) - log_warning_errno(errno, "Failed to read '/etc/smack/onlycap': %m"); + log_warning_errno(errno, "Failed to open %s: %m", "/etc/smack/onlycap"); return errno == ENOENT ? ENOENT : -errno; } @@ -257,7 +262,7 @@ static int write_onlycap_list(void) { r = read_line(f, LONG_LINE_MAX, &buf); if (r < 0) - return log_error_errno(r, "Failed to read line from /etc/smack/onlycap: %m"); + return log_error_errno(r, "%s: failed to read line: %m", "/etc/smack/onlycap"); if (r == 0) break; @@ -280,13 +285,14 @@ static int write_onlycap_list(void) { onlycap_fd = open("/sys/fs/smackfs/onlycap", O_WRONLY|O_CLOEXEC|O_NONBLOCK|O_NOCTTY); if (onlycap_fd < 0) { if (errno != ENOENT) - log_warning_errno(errno, "Failed to open '/sys/fs/smackfs/onlycap': %m"); + log_warning_errno(errno, "Failed to open %s: %m", "/sys/fs/smackfs/onlycap"); return -errno; /* negative error */ } r = write(onlycap_fd, list, len); if (r < 0) - return log_error_errno(errno, "Failed to write onlycap list(%s) to '/sys/fs/smackfs/onlycap': %m", list); + return log_error_errno(errno, "%s: failed to write onlycap list(%s): %m", + "/sys/fs/smackfs/onlycap", list); return 0; } @@ -301,7 +307,7 @@ int mac_smack_setup(bool *loaded_policy) { assert(loaded_policy); - r = write_access2_rules("/etc/smack/accesses.d/"); + r = write_access2_rules("/etc/smack/accesses.d"); switch (r) { case -ENOENT: log_debug("Smack is not enabled in the kernel."); @@ -333,7 +339,7 @@ int mac_smack_setup(bool *loaded_policy) { log_warning_errno(r, "Failed to set SMACK netlabel rule \"127.0.0.1 -CIPSO\": %m"); #endif - r = write_cipso2_rules("/etc/smack/cipso.d/"); + r = write_cipso2_rules("/etc/smack/cipso.d"); switch (r) { case -ENOENT: log_debug("Smack/CIPSO is not enabled in the kernel."); @@ -348,7 +354,7 @@ int mac_smack_setup(bool *loaded_policy) { log_warning_errno(r, "Failed to load Smack/CIPSO access rules, ignoring: %m"); } - r = write_netlabel_rules("/etc/smack/netlabel.d/"); + r = write_netlabel_rules("/etc/smack/netlabel.d"); switch (r) { case -ENOENT: log_debug("Smack/CIPSO is not enabled in the kernel."); From 3f1812180b67d8d34e8b019f71598c918714a43d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Sat, 31 May 2025 16:36:43 +0200 Subject: [PATCH 6/7] core/smack-setup: use RET_NERRNO and RET_GATHER --- src/core/smack-setup.c | 77 +++++++++++++++++++++--------------------- 1 file changed, 39 insertions(+), 38 deletions(-) diff --git a/src/core/smack-setup.c b/src/core/smack-setup.c index a37479d98a..1e8e2b54e5 100644 --- a/src/core/smack-setup.c +++ b/src/core/smack-setup.c @@ -13,6 +13,7 @@ #include "alloc-util.h" #include "dirent-util.h" +#include "errno-util.h" #include "fd-util.h" #include "fileio.h" #include "log.h" @@ -49,20 +50,20 @@ static int fdopen_unlocked_at(int dfd, const char *dir, const char *name, int *s static int write_access2_rules(const char *srcdir) { _cleanup_close_ int load2_fd = -EBADF, change_fd = -EBADF; _cleanup_closedir_ DIR *dir = NULL; - int dfd = -EBADF, r = 0; + int dfd, r; - load2_fd = open("/sys/fs/smackfs/load2", O_RDWR|O_CLOEXEC|O_NONBLOCK|O_NOCTTY); - if (load2_fd < 0) { - if (errno != ENOENT) - log_warning_errno(errno, "Failed to open %s: %m", "/sys/fs/smackfs/load2"); - return -errno; /* negative error */ + load2_fd = r = RET_NERRNO(open("/sys/fs/smackfs/load2", O_RDWR|O_CLOEXEC|O_NONBLOCK|O_NOCTTY)); + if (r < 0) { + if (r != -ENOENT) + log_warning_errno(r, "Failed to open %s: %m", "/sys/fs/smackfs/load2"); + return r; } - change_fd = open("/sys/fs/smackfs/change-rule", O_RDWR|O_CLOEXEC|O_NONBLOCK|O_NOCTTY); - if (change_fd < 0) { - if (errno != ENOENT) - log_warning_errno(errno, "Failed to open %s: %m", "/sys/fs/smackfs/change-rule"); - return -errno; /* negative error */ + change_fd = r = RET_NERRNO(open("/sys/fs/smackfs/change-rule", O_RDWR|O_CLOEXEC|O_NONBLOCK|O_NOCTTY)); + if (r < 0) { + if (r != -ENOENT) + log_warning_errno(r, "Failed to open %s: %m", "/sys/fs/smackfs/change-rule"); + return r; } /* write rules to load2 or change-rule from every file in the directory */ @@ -76,6 +77,7 @@ static int write_access2_rules(const char *srcdir) { dfd = dirfd(dir); assert(dfd >= 0); + r = 0; FOREACH_DIRENT(entry, dir, return 0) { _cleanup_fclose_ FILE *policy = NULL; @@ -107,12 +109,12 @@ static int write_access2_rules(const char *srcdir) { continue; } - if (write(isempty(acc2) ? load2_fd : change_fd, buf, strlen(buf)) < 0) { - if (r == 0) - r = -errno; - log_error_errno(errno, "%s/%s: failed to write '%s' to '%s': %m", + q = RET_NERRNO(write(isempty(acc2) ? load2_fd : change_fd, buf, strlen(buf))); + if (q < 0) { + log_error_errno(q, "%s/%s: failed to write '%s' to '%s': %m", srcdir, entry->d_name, buf, isempty(acc2) ? "/sys/fs/smackfs/load2" : "/sys/fs/smackfs/change-rule"); + RET_GATHER(r, q); } } } @@ -123,13 +125,13 @@ static int write_access2_rules(const char *srcdir) { static int write_cipso2_rules(const char *srcdir) { _cleanup_close_ int cipso2_fd = -EBADF; _cleanup_closedir_ DIR *dir = NULL; - int dfd = -EBADF, r = 0; + int dfd, r; - cipso2_fd = open("/sys/fs/smackfs/cipso2", O_RDWR|O_CLOEXEC|O_NONBLOCK|O_NOCTTY); - if (cipso2_fd < 0) { - if (errno != ENOENT) - log_warning_errno(errno, "Failed to open %s: %m", "/sys/fs/smackfs/cipso2"); - return -errno; /* negative error */ + cipso2_fd = r = RET_NERRNO(open("/sys/fs/smackfs/cipso2", O_RDWR|O_CLOEXEC|O_NONBLOCK|O_NOCTTY)); + if (r < 0) { + if (r != -ENOENT) + log_warning_errno(r, "Failed to open %s: %m", "/sys/fs/smackfs/cipso2"); + return r; } /* write rules to cipso2 from every file in the directory */ @@ -143,6 +145,7 @@ static int write_cipso2_rules(const char *srcdir) { dfd = dirfd(dir); assert(dfd >= 0); + r = 0; FOREACH_DIRENT(entry, dir, return 0) { _cleanup_fclose_ FILE *policy = NULL; @@ -167,12 +170,12 @@ static int write_cipso2_rules(const char *srcdir) { if (isempty(buf) || strchr(COMMENTS, buf[0])) continue; - if (write(cipso2_fd, buf, strlen(buf)) < 0) { - if (r == 0) - r = -errno; - log_error_errno(errno, "%s/%s: failed to write '%s' to %s: %m", + q = RET_NERRNO(write(cipso2_fd, buf, strlen(buf))); + if (q < 0) { + log_error_errno(q, "%s/%s: failed to write '%s' to %s: %m", srcdir, entry->d_name, buf, "/sys/fs/smackfs/cipso2"); + RET_GATHER(r, q); break; } } @@ -184,7 +187,7 @@ static int write_cipso2_rules(const char *srcdir) { static int write_netlabel_rules(const char *srcdir) { _cleanup_fclose_ FILE *dst = NULL; _cleanup_closedir_ DIR *dir = NULL; - int dfd = -EBADF, r = 0; + int dfd, r; dst = fopen("/sys/fs/smackfs/netlabel", "we"); if (!dst) { @@ -204,6 +207,7 @@ static int write_netlabel_rules(const char *srcdir) { dfd = dirfd(dir); assert(dfd >= 0); + r = 0; FOREACH_DIRENT(entry, dir, return 0) { _cleanup_fclose_ FILE *policy = NULL; @@ -223,16 +227,14 @@ static int write_netlabel_rules(const char *srcdir) { break; if (!fputs(buf, dst)) { - if (r == 0) - r = -EINVAL; log_error_errno(errno, "Failed to write line to %s: %m", "/sys/fs/smackfs/netlabel"); + RET_GATHER(r, -errno); break; } q = fflush_and_check(dst); if (q < 0) { - if (r == 0) - r = q; log_error_errno(q, "Failed to flush %s: %m", "/sys/fs/smackfs/netlabel"); + RET_GATHER(r, q); break; } } @@ -282,16 +284,16 @@ static int write_onlycap_list(void) { list[len - 1] = 0; - onlycap_fd = open("/sys/fs/smackfs/onlycap", O_WRONLY|O_CLOEXEC|O_NONBLOCK|O_NOCTTY); - if (onlycap_fd < 0) { - if (errno != ENOENT) - log_warning_errno(errno, "Failed to open %s: %m", "/sys/fs/smackfs/onlycap"); - return -errno; /* negative error */ + onlycap_fd = r = RET_NERRNO(open("/sys/fs/smackfs/onlycap", O_WRONLY|O_CLOEXEC|O_NONBLOCK|O_NOCTTY)); + if (r < 0) { + if (r != -ENOENT) + log_warning_errno(r, "Failed to open %s: %m", "/sys/fs/smackfs/onlycap"); + return r; } - r = write(onlycap_fd, list, len); + r = RET_NERRNO(write(onlycap_fd, list, len)); if (r < 0) - return log_error_errno(errno, "%s: failed to write onlycap list(%s): %m", + return log_error_errno(r, "%s: failed to write onlycap list(%s): %m", "/sys/fs/smackfs/onlycap", list); return 0; @@ -302,7 +304,6 @@ static int write_onlycap_list(void) { int mac_smack_setup(bool *loaded_policy) { #if ENABLE_SMACK - int r; assert(loaded_policy); From 42ba99748df4f12c0d855dd583fa89df1e2fbaa2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Mon, 2 Jun 2025 10:30:34 +0200 Subject: [PATCH 7/7] various: do not include file names directly in error messages git grep -l 'Failed to open /'|xargs sed -r -i 's|"Failed to open (/[^ ]+): %m"|"Failed to open %s: %m", "\1"|g' git grep -l $'Failed to open \'/'|xargs sed -r -i $'s|"Failed to open \'(/[^ ]+)\': %m"|"Failed to open %s: %m", "\\1"|g' git grep -l "Failed to open /"|xargs sed -r -i $'s|"Failed to open (/[^ ]+), ignoring: %m"|"Failed to open %s, ignoring: %m", "\\1"|g' + some manual fixups. --- src/basic/socket-util.c | 2 +- src/core/automount.c | 2 +- src/core/import-creds.c | 2 +- src/core/main.c | 2 +- src/core/manager.c | 2 +- src/core/namespace.c | 2 +- src/core/swap.c | 2 +- src/journal/bsod.c | 2 +- src/journal/journald-manager.c | 2 +- src/login/logind-dbus.c | 2 +- src/login/logind.c | 12 ++++++------ src/machine/machined.c | 2 +- src/network/networkctl-misc.c | 2 +- src/network/networkd-manager.c | 2 +- src/nsresourced/nsresourcework.c | 2 +- src/resolve/resolved-etc-hosts.c | 2 +- src/resolve/resolved-resolv-conf.c | 2 +- src/rfkill/rfkill.c | 2 +- src/shared/clean-ipc.c | 10 +++++----- src/shared/condition.c | 2 +- src/shared/exec-util.c | 2 +- src/shared/hibernate-util.c | 2 +- src/shared/killall.c | 2 +- src/shared/locale-setup.c | 2 +- src/shared/machine-id-setup.c | 10 +++++----- src/shared/mount-util.c | 4 ++-- src/shared/tpm2-util.c | 4 ++-- src/shutdown/detach-dm.c | 2 +- src/shutdown/shutdown.c | 2 +- src/shutdown/umount.c | 2 +- src/sleep/sleep.c | 2 +- src/storagetm/storagetm.c | 4 ++-- src/test/test-mount-util.c | 2 +- src/tmpfiles/tmpfiles.c | 2 +- src/udev/udev-builtin-btrfs.c | 2 +- src/udev/udev-watch.c | 4 ++-- src/userdb/userdbctl.c | 4 ++-- 37 files changed, 55 insertions(+), 55 deletions(-) diff --git a/src/basic/socket-util.c b/src/basic/socket-util.c index 194f8e22e8..d93d75e7c0 100644 --- a/src/basic/socket-util.c +++ b/src/basic/socket-util.c @@ -1930,7 +1930,7 @@ int vsock_get_local_cid(unsigned *ret) { vsock_fd = open("/dev/vsock", O_RDONLY|O_CLOEXEC); if (vsock_fd < 0) - return log_debug_errno(errno, "Failed to open /dev/vsock: %m"); + return log_debug_errno(errno, "Failed to open %s: %m", "/dev/vsock"); unsigned tmp; if (ioctl(vsock_fd, IOCTL_VM_SOCKETS_GET_LOCAL_CID, ret ?: &tmp) < 0) diff --git a/src/core/automount.c b/src/core/automount.c index e6b3dd09db..b85177d04a 100644 --- a/src/core/automount.c +++ b/src/core/automount.c @@ -344,7 +344,7 @@ static int open_dev_autofs(Manager *m) { m->dev_autofs_fd = open("/dev/autofs", O_CLOEXEC|O_RDONLY); if (m->dev_autofs_fd < 0) - return log_error_errno(errno, "Failed to open /dev/autofs: %m"); + return log_error_errno(errno, "Failed to open %s: %m", "/dev/autofs"); init_autofs_dev_ioctl(¶m); r = RET_NERRNO(ioctl(m->dev_autofs_fd, AUTOFS_DEV_IOCTL_VERSION, ¶m)); diff --git a/src/core/import-creds.c b/src/core/import-creds.c index e146faab91..9a54196300 100644 --- a/src/core/import-creds.c +++ b/src/core/import-creds.c @@ -626,7 +626,7 @@ static int import_credentials_initrd(ImportCredentialContext *c) { if (errno == ENOENT) log_debug_errno(errno, "No credentials passed from initrd."); else - log_warning_errno(errno, "Failed to open '/run/credentials/@initrd', ignoring: %m"); + log_warning_errno(errno, "Failed to open '%s', ignoring: %m", "/run/credentials/@initrd"); return 0; } diff --git a/src/core/main.c b/src/core/main.c index 330c42482f..caff74cb34 100644 --- a/src/core/main.c +++ b/src/core/main.c @@ -245,7 +245,7 @@ static int console_setup(void) { tty_fd = open_terminal("/dev/console", O_RDWR|O_NOCTTY|O_CLOEXEC); if (tty_fd < 0) - return log_error_errno(tty_fd, "Failed to open /dev/console: %m"); + return log_error_errno(tty_fd, "Failed to open %s: %m", "/dev/console"); /* We don't want to force text mode. Plymouth may be showing pictures already from initrd. */ reset_dev_console_fd(tty_fd, /* switch_to_text= */ false); diff --git a/src/core/manager.c b/src/core/manager.c index 981c2dc147..818321702e 100644 --- a/src/core/manager.c +++ b/src/core/manager.c @@ -497,7 +497,7 @@ static int manager_enable_special_signals(Manager *m) { fd = open_terminal("/dev/tty0", O_RDWR|O_NOCTTY|O_CLOEXEC); if (fd < 0) /* Support systems without virtual console (ENOENT) gracefully */ - log_full_errno(fd == -ENOENT ? LOG_DEBUG : LOG_WARNING, fd, "Failed to open /dev/tty0, ignoring: %m"); + log_full_errno(fd == -ENOENT ? LOG_DEBUG : LOG_WARNING, fd, "Failed to open %s, ignoring: %m", "/dev/tty0"); else { /* Enable that we get SIGWINCH on kbrequest */ if (ioctl(fd, KDSIGACCEPT, SIGWINCH) < 0) diff --git a/src/core/namespace.c b/src/core/namespace.c index 8226f89493..faa84ced20 100644 --- a/src/core/namespace.c +++ b/src/core/namespace.c @@ -2264,7 +2264,7 @@ static int apply_mounts( if (reterr_path) *reterr_path = strdup("/proc/self/mountinfo"); - return log_debug_errno(r, "Failed to open /proc/self/mountinfo: %m"); + return log_debug_errno(r, "Failed to open %s: %m", "/proc/self/mountinfo"); } /* First round, establish all mounts we need */ diff --git a/src/core/swap.c b/src/core/swap.c index 27ac10e36d..9146ae9106 100644 --- a/src/core/swap.c +++ b/src/core/swap.c @@ -1317,7 +1317,7 @@ static void swap_enumerate(Manager *m) { if (errno == ENOENT) log_debug_errno(errno, "Not swap enabled, skipping enumeration."); else - log_warning_errno(errno, "Failed to open /proc/swaps, ignoring: %m"); + log_warning_errno(errno, "Failed to open %s, ignoring: %m", "/proc/swaps"); return; } diff --git a/src/journal/bsod.c b/src/journal/bsod.c index 12a032efe7..9a370af390 100644 --- a/src/journal/bsod.c +++ b/src/journal/bsod.c @@ -156,7 +156,7 @@ static int display_emergency_message_fullscreen(const char *message) { else { fd = open_terminal("/dev/tty1", O_RDWR|O_NOCTTY|O_CLOEXEC); if (fd < 0) - return log_error_errno(fd, "Failed to open /dev/tty1: %m"); + return log_error_errno(fd, "Failed to open %s: %m", "/dev/tty1"); r = find_next_free_vt(fd, &free_vt, &original_vt); if (r < 0) diff --git a/src/journal/journald-manager.c b/src/journal/journald-manager.c index bf3befee48..f6159fb2b6 100644 --- a/src/journal/journald-manager.c +++ b/src/journal/journald-manager.c @@ -2059,7 +2059,7 @@ static int manager_open_hostname(Manager *m) { m->hostname_fd = open("/proc/sys/kernel/hostname", O_RDONLY|O_CLOEXEC|O_NONBLOCK|O_NOCTTY); if (m->hostname_fd < 0) - return log_error_errno(errno, "Failed to open /proc/sys/kernel/hostname: %m"); + return log_error_errno(errno, "Failed to open %s: %m", "/proc/sys/kernel/hostname"); r = sd_event_add_io(m->event, &m->hostname_event_source, m->hostname_fd, 0, dispatch_hostname_change, m); if (r < 0) diff --git a/src/login/logind-dbus.c b/src/login/logind-dbus.c index a0aa555ee0..a6d0bb189b 100644 --- a/src/login/logind-dbus.c +++ b/src/login/logind-dbus.c @@ -1761,7 +1761,7 @@ static int flush_devices(Manager *m) { d = opendir("/etc/udev/rules.d"); if (!d) { if (errno != ENOENT) - log_warning_errno(errno, "Failed to open /etc/udev/rules.d: %m"); + log_warning_errno(errno, "Failed to open %s: %m", "/etc/udev/rules.d"); } else FOREACH_DIRENT_ALL(de, d, break) { if (!dirent_is_file(de)) diff --git a/src/login/logind.c b/src/login/logind.c index 93a1b66c3c..adcf306509 100644 --- a/src/login/logind.c +++ b/src/login/logind.c @@ -256,7 +256,7 @@ static int manager_enumerate_seats(Manager *m) { if (errno == ENOENT) return 0; - return log_error_errno(errno, "Failed to open /run/systemd/seats/: %m"); + return log_error_errno(errno, "Failed to open %s: %m", "/run/systemd/seats/"); } FOREACH_DIRENT(de, d, return -errno) { @@ -290,7 +290,7 @@ static int manager_enumerate_linger_users(Manager *m) { if (errno == ENOENT) return 0; - return log_error_errno(errno, "Failed to open /var/lib/systemd/linger/: %m"); + return log_error_errno(errno, "Failed to open %s: %m", "/var/lib/systemd/linger/"); } FOREACH_DIRENT(de, d, return -errno) { @@ -329,7 +329,7 @@ static int manager_enumerate_users(Manager *m) { if (errno == ENOENT) return 0; - return log_error_errno(errno, "Failed to open /run/systemd/users/: %m"); + return log_error_errno(errno, "Failed to open %s: %m", "/run/systemd/users/"); } FOREACH_DIRENT(de, d, return -errno) { @@ -537,7 +537,7 @@ static int manager_enumerate_sessions(Manager *m) { if (errno == ENOENT) return 0; - return log_error_errno(errno, "Failed to open /run/systemd/sessions/: %m"); + return log_error_errno(errno, "Failed to open %s: %m", "/run/systemd/sessions/"); } FOREACH_DIRENT(de, d, return -errno) { @@ -584,7 +584,7 @@ static int manager_enumerate_inhibitors(Manager *m) { if (errno == ENOENT) return 0; - return log_error_errno(errno, "Failed to open /run/systemd/inhibit/: %m"); + return log_error_errno(errno, "Failed to open %s: %m", "/run/systemd/inhibit/"); } FOREACH_DIRENT(de, d, return -errno) { @@ -889,7 +889,7 @@ static int manager_connect_console(Manager *m) { return 0; } - return log_error_errno(errno, "Failed to open /sys/class/tty/tty0/active: %m"); + return log_error_errno(errno, "Failed to open %s: %m", "/sys/class/tty/tty0/active"); } r = sd_event_add_io(m->event, &m->console_active_event_source, m->console_active_fd, 0, manager_dispatch_console, m); diff --git a/src/machine/machined.c b/src/machine/machined.c index 7f463f174b..52fd69c6da 100644 --- a/src/machine/machined.c +++ b/src/machine/machined.c @@ -179,7 +179,7 @@ static int manager_enumerate_machines(Manager *m) { if (errno == ENOENT) return 0; - return log_error_errno(errno, "Failed to open /run/systemd/machines: %m"); + return log_error_errno(errno, "Failed to open %s: %m", "/run/systemd/machines"); } FOREACH_DIRENT(de, d, return -errno) { diff --git a/src/network/networkctl-misc.c b/src/network/networkctl-misc.c index 6f658fdc94..e4021ee30d 100644 --- a/src/network/networkctl-misc.c +++ b/src/network/networkctl-misc.c @@ -292,7 +292,7 @@ int verb_persistent_storage(int argc, char *argv[], void *userdata) { fd = open("/var/lib/systemd/network/", O_CLOEXEC | O_DIRECTORY); if (fd < 0) - return log_error_errno(errno, "Failed to open /var/lib/systemd/network/: %m"); + return log_error_errno(errno, "Failed to open %s: %m", "/var/lib/systemd/network/"); r = sd_varlink_push_fd(vl, fd); if (r < 0) diff --git a/src/network/networkd-manager.c b/src/network/networkd-manager.c index c40d7fbff3..fad4d82183 100644 --- a/src/network/networkd-manager.c +++ b/src/network/networkd-manager.c @@ -599,7 +599,7 @@ static int persistent_storage_open(void) { fd = open("/var/lib/systemd/network/", O_CLOEXEC | O_DIRECTORY); if (fd < 0) - return log_debug_errno(errno, "Failed to open /var/lib/systemd/network/, ignoring: %m"); + return log_debug_errno(errno, "Failed to open %s, ignoring: %m", "/var/lib/systemd/network/"); r = fd_is_read_only_fs(fd); if (r < 0) diff --git a/src/nsresourced/nsresourcework.c b/src/nsresourced/nsresourcework.c index 5196a338de..ebace9e22f 100644 --- a/src/nsresourced/nsresourcework.c +++ b/src/nsresourced/nsresourcework.c @@ -1634,7 +1634,7 @@ static int create_tap( if (errno == ENOENT) /* Turn ENOENT → EOPNOTSUPP */ return log_error_errno(SYNTHETIC_ERRNO(EOPNOTSUPP), "Network tap device node /dev/net/tun not found, cannot create network interface."); - return log_error_errno(errno, "Failed to open /dev/net/tun: %m"); + return log_error_errno(errno, "Failed to open %s: %m", "/dev/net/tun"); } if (ioctl(fd, TUNSETIFF, &ifr) < 0) diff --git a/src/resolve/resolved-etc-hosts.c b/src/resolve/resolved-etc-hosts.c index 1b5d061e4c..0ef33651f1 100644 --- a/src/resolve/resolved-etc-hosts.c +++ b/src/resolve/resolved-etc-hosts.c @@ -365,7 +365,7 @@ static int manager_etc_hosts_read(Manager *m) { f = fopen("/etc/hosts", "re"); if (!f) { if (errno != ENOENT) - return log_error_errno(errno, "Failed to open /etc/hosts: %m"); + return log_error_errno(errno, "Failed to open %s: %m", "/etc/hosts"); manager_etc_hosts_flush(m); return 0; diff --git a/src/resolve/resolved-resolv-conf.c b/src/resolve/resolved-resolv-conf.c index c85d68c984..0064adb948 100644 --- a/src/resolve/resolved-resolv-conf.c +++ b/src/resolve/resolved-resolv-conf.c @@ -106,7 +106,7 @@ int manager_read_resolv_conf(Manager *m) { if (errno == ENOENT) return 0; - r = log_warning_errno(errno, "Failed to open /etc/resolv.conf: %m"); + r = log_warning_errno(errno, "Failed to open %s: %m", "/etc/resolv.conf"); goto clear; } diff --git a/src/rfkill/rfkill.c b/src/rfkill/rfkill.c index 3e3c20d617..f5b67e5f01 100644 --- a/src/rfkill/rfkill.c +++ b/src/rfkill/rfkill.c @@ -291,7 +291,7 @@ static int run(int argc, char *argv[]) { return 0; } - return log_error_errno(errno, "Failed to open /dev/rfkill: %m"); + return log_error_errno(errno, "Failed to open %s: %m", "/dev/rfkill"); } } else { c.rfkill_fd = SD_LISTEN_FDS_START; diff --git a/src/shared/clean-ipc.c b/src/shared/clean-ipc.c index 28ee195e0d..c9950d4d8a 100644 --- a/src/shared/clean-ipc.c +++ b/src/shared/clean-ipc.c @@ -41,7 +41,7 @@ static int clean_sysvipc_shm(uid_t delete_uid, gid_t delete_gid, bool rm) { if (errno == ENOENT) return 0; - return log_warning_errno(errno, "Failed to open /proc/sysvipc/shm: %m"); + return log_warning_errno(errno, "Failed to open %s: %m", "/proc/sysvipc/shm"); } for (;;) { @@ -105,7 +105,7 @@ static int clean_sysvipc_sem(uid_t delete_uid, gid_t delete_gid, bool rm) { if (errno == ENOENT) return 0; - return log_warning_errno(errno, "Failed to open /proc/sysvipc/sem: %m"); + return log_warning_errno(errno, "Failed to open %s: %m", "/proc/sysvipc/sem"); } for (;;) { @@ -164,7 +164,7 @@ static int clean_sysvipc_msg(uid_t delete_uid, gid_t delete_gid, bool rm) { if (errno == ENOENT) return 0; - return log_warning_errno(errno, "Failed to open /proc/sysvipc/msg: %m"); + return log_warning_errno(errno, "Failed to open %s: %m", "/proc/sysvipc/msg"); } for (;;) { @@ -302,7 +302,7 @@ static int clean_posix_shm(uid_t uid, gid_t gid, bool rm) { if (errno == ENOENT) return 0; - return log_warning_errno(errno, "Failed to open /dev/shm: %m"); + return log_warning_errno(errno, "Failed to open %s: %m", "/dev/shm"); } return clean_posix_shm_internal("/dev/shm", dir, uid, gid, rm); @@ -317,7 +317,7 @@ static int clean_posix_mq(uid_t uid, gid_t gid, bool rm) { if (errno == ENOENT) return 0; - return log_warning_errno(errno, "Failed to open /dev/mqueue: %m"); + return log_warning_errno(errno, "Failed to open %s: %m", "/dev/mqueue"); } FOREACH_DIRENT_ALL(de, dir, goto fail) { diff --git a/src/shared/condition.c b/src/shared/condition.c index 61f900c59d..14318667ec 100644 --- a/src/shared/condition.c +++ b/src/shared/condition.c @@ -519,7 +519,7 @@ static int condition_test_firmware_devicetree_compatible(const char *dtcarg) { if (r < 0) { /* if the path doesn't exist it is incompatible */ if (r != -ENOENT) - log_debug_errno(r, "Failed to open() '%s', assuming machine is incompatible: %m", DTCOMPAT_FILE); + log_debug_errno(r, "Failed to open '%s', assuming machine is incompatible: %m", DTCOMPAT_FILE); return false; } diff --git a/src/shared/exec-util.c b/src/shared/exec-util.c index 83dbc6cbab..771bbb762e 100644 --- a/src/shared/exec-util.c +++ b/src/shared/exec-util.c @@ -590,7 +590,7 @@ int _fork_agent(const char *name, char * const *argv, const int except[], size_t * stdin around. */ fd = open_terminal("/dev/tty", stdin_is_tty ? O_WRONLY : (stdout_is_tty && stderr_is_tty) ? O_RDONLY : O_RDWR); if (fd < 0) { - log_error_errno(fd, "Failed to open /dev/tty: %m"); + log_error_errno(fd, "Failed to open %s: %m", "/dev/tty"); _exit(EXIT_FAILURE); } diff --git a/src/shared/hibernate-util.c b/src/shared/hibernate-util.c index de1fdfe9b5..dca08599fb 100644 --- a/src/shared/hibernate-util.c +++ b/src/shared/hibernate-util.c @@ -257,7 +257,7 @@ static int read_swap_entries(SwapEntries *ret) { f = fopen("/proc/swaps", "re"); if (!f) - return log_debug_errno(errno, "Failed to open /proc/swaps: %m"); + return log_debug_errno(errno, "Failed to open %s: %m", "/proc/swaps"); /* Remove header */ (void) fscanf(f, "%*s %*s %*s %*s %*s\n"); diff --git a/src/shared/killall.c b/src/shared/killall.c index 8735b4feda..0a41d251ef 100644 --- a/src/shared/killall.c +++ b/src/shared/killall.c @@ -235,7 +235,7 @@ static int killall(int sig, Set *pids, bool send_sighup) { r = proc_dir_open(&dir); if (r < 0) - return log_warning_errno(r, "Failed to open /proc/: %m"); + return log_warning_errno(r, "Failed to open %s: %m", "/proc/"); for (;;) { _cleanup_(pidref_done) PidRef pidref = PIDREF_NULL; diff --git a/src/shared/locale-setup.c b/src/shared/locale-setup.c index 4a2f21e4e1..c23f1c4078 100644 --- a/src/shared/locale-setup.c +++ b/src/shared/locale-setup.c @@ -72,7 +72,7 @@ static int locale_context_load_conf(LocaleContext *c, LocaleLoadFlag flag) { if (fd == -ENOENT) return 0; if (fd < 0) - return log_debug_errno(errno, "Failed to open /etc/locale.conf: %m"); + return log_debug_errno(errno, "Failed to open %s: %m", "/etc/locale.conf"); if (fstat(fd, &st) < 0) return log_debug_errno(errno, "Failed to stat /etc/locale.conf: %m"); diff --git a/src/shared/machine-id-setup.c b/src/shared/machine-id-setup.c index d4f12e4179..3fe8cc7402 100644 --- a/src/shared/machine-id-setup.c +++ b/src/shared/machine-id-setup.c @@ -146,7 +146,7 @@ int machine_id_setup(const char *root, sd_id128_t machine_id, MachineIdSetupFlag r = chase("/etc/", root, CHASE_PREFIX_ROOT|CHASE_MKDIR_0755|CHASE_MUST_BE_DIRECTORY, &etc, &etc_fd); if (r < 0) - return log_error_errno(r, "Failed to open '/etc/': %m"); + return log_error_errno(r, "Failed to open %s: %m", "/etc/"); etc_machine_id = path_join(etc, "machine-id"); if (!etc_machine_id) @@ -251,7 +251,7 @@ int machine_id_setup(const char *root, sd_id128_t machine_id, MachineIdSetupFlag r = chase("/run/", root, CHASE_PREFIX_ROOT|CHASE_MKDIR_0755|CHASE_MUST_BE_DIRECTORY, &run, &run_fd); if (r < 0) - return log_error_errno(r, "Failed to open '/run/': %m"); + return log_error_errno(r, "Failed to open %s: %m", "/run/"); run_machine_id = path_join(run, "machine-id"); if (!run_machine_id) @@ -269,7 +269,7 @@ int machine_id_setup(const char *root, sd_id128_t machine_id, MachineIdSetupFlag } else { r = chase("/run/machine-id", root, CHASE_PREFIX_ROOT|CHASE_MUST_BE_REGULAR, &run_machine_id, /* ret_fd= */ NULL); if (r < 0) - return log_error_errno(r, "Failed to open '/run/machine-id': %m"); + return log_error_errno(r, "Failed to open %s: %m", "/run/machine-id"); } /* And now, let's mount it over */ @@ -322,7 +322,7 @@ int machine_id_commit(const char *root) { _cleanup_free_ char *etc = NULL; r = chase("/etc/", root, CHASE_PREFIX_ROOT|CHASE_MUST_BE_DIRECTORY, &etc, &etc_fd); if (r < 0) - return log_error_errno(r, "Failed to open /etc/: %m"); + return log_error_errno(r, "Failed to open %s: %m", "/etc/"); _cleanup_free_ char *etc_machine_id = path_join(etc, "machine-id"); if (!etc_machine_id) @@ -370,7 +370,7 @@ int machine_id_commit(const char *root) { _cleanup_close_ int etc_fd_again = -EBADF; r = chase("/etc/", root, CHASE_PREFIX_ROOT|CHASE_MUST_BE_DIRECTORY, /* ret_path= */ NULL, &etc_fd_again); if (r < 0) - return log_error_errno(r, "Failed to open /etc/: %m"); + return log_error_errno(r, "Failed to open %s: %m", "/etc/"); r = umountat_detach_verbose(LOG_ERR, etc_fd_again, "machine-id"); if (r < 0) diff --git a/src/shared/mount-util.c b/src/shared/mount-util.c index 9a1cc31fac..a29c8d78db 100644 --- a/src/shared/mount-util.c +++ b/src/shared/mount-util.c @@ -45,7 +45,7 @@ int umount_recursive_full(const char *prefix, int flags, char **keep) { f = fopen("/proc/self/mountinfo", "re"); /* Pin the file, in case we unmount /proc/ as part of the logic here */ if (!f) - return log_debug_errno(errno, "Failed to open /proc/self/mountinfo: %m"); + return log_debug_errno(errno, "Failed to open %s: %m", "/proc/self/mountinfo"); for (;;) { _cleanup_(mnt_free_tablep) struct libmnt_table *table = NULL; @@ -454,7 +454,7 @@ int bind_remount_one(const char *path, unsigned long new_flags, unsigned long fl proc_self_mountinfo = fopen("/proc/self/mountinfo", "re"); if (!proc_self_mountinfo) - return log_debug_errno(errno, "Failed to open /proc/self/mountinfo: %m"); + return log_debug_errno(errno, "Failed to open %s: %m", "/proc/self/mountinfo"); return bind_remount_one_with_mountinfo(path, new_flags, flags_mask, proc_self_mountinfo); } diff --git a/src/shared/tpm2-util.c b/src/shared/tpm2-util.c index 18d2801515..710ed4e81b 100644 --- a/src/shared/tpm2-util.c +++ b/src/shared/tpm2-util.c @@ -6029,7 +6029,7 @@ int tpm2_list_devices(bool legend, bool quiet) { d = opendir("/sys/class/tpmrm"); if (!d) { - log_full_errno(errno == ENOENT ? LOG_DEBUG : LOG_ERR, errno, "Failed to open /sys/class/tpmrm: %m"); + log_full_errno(errno == ENOENT ? LOG_DEBUG : LOG_ERR, errno, "Failed to open %s: %m", "/sys/class/tpmrm"); if (errno != ENOENT) return -errno; } else { @@ -6099,7 +6099,7 @@ int tpm2_find_device_auto(char **ret) { d = opendir("/sys/class/tpmrm"); if (!d) { - log_debug_errno(errno, "Failed to open /sys/class/tpmrm: %m"); + log_debug_errno(errno, "Failed to open %s: %m", "/sys/class/tpmrm"); if (errno != ENOENT) return -errno; } else { diff --git a/src/shutdown/detach-dm.c b/src/shutdown/detach-dm.c index e6b3e808d3..ab75c3294f 100644 --- a/src/shutdown/detach-dm.c +++ b/src/shutdown/detach-dm.c @@ -109,7 +109,7 @@ static int delete_dm(DeviceMapper *m) { fd = open("/dev/mapper/control", O_RDWR|O_CLOEXEC); if (fd < 0) - return log_debug_errno(errno, "Failed to open /dev/mapper/control: %m"); + return log_debug_errno(errno, "Failed to open %s: %m", "/dev/mapper/control"); return RET_NERRNO(ioctl(fd, DM_DEV_REMOVE, &(struct dm_ioctl) { .version = { diff --git a/src/shutdown/shutdown.c b/src/shutdown/shutdown.c index 7ab4deac5e..dccfff9ffe 100644 --- a/src/shutdown/shutdown.c +++ b/src/shutdown/shutdown.c @@ -197,7 +197,7 @@ static int sync_making_progress(unsigned long long *prev_dirty) { f = fopen("/proc/meminfo", "re"); if (!f) - return log_warning_errno(errno, "Failed to open /proc/meminfo: %m"); + return log_warning_errno(errno, "Failed to open %s: %m", "/proc/meminfo"); for (;;) { _cleanup_free_ char *line = NULL; diff --git a/src/shutdown/umount.c b/src/shutdown/umount.c index 5f8f9d5754..45c6db9245 100644 --- a/src/shutdown/umount.c +++ b/src/shutdown/umount.c @@ -188,7 +188,7 @@ static void log_umount_blockers(const char *mnt) { _cleanup_closedir_ DIR *dir = opendir("/proc"); if (!dir) - return (void) log_warning_errno(errno, "Failed to open /proc/: %m"); + return (void) log_warning_errno(errno, "Failed to open %s: %m", "/proc/"); FOREACH_DIRENT_ALL(de, dir, break) { if (!IN_SET(de->d_type, DT_DIR, DT_UNKNOWN)) diff --git a/src/sleep/sleep.c b/src/sleep/sleep.c index 3f09d2272d..3390ebe0c0 100644 --- a/src/sleep/sleep.c +++ b/src/sleep/sleep.c @@ -266,7 +266,7 @@ static int execute( /* This file is opened first, so that if we hit an error, we can abort before modifying any state. */ state_fd = open("/sys/power/state", O_WRONLY|O_CLOEXEC); if (state_fd < 0) - return log_error_errno(errno, "Failed to open /sys/power/state: %m"); + return log_error_errno(errno, "Failed to open %s: %m", "/sys/power/state"); if (sleep_needs_mem_sleep(sleep_config, operation)) { r = write_mode("/sys/power/mem_sleep", sleep_config->mem_modes); diff --git a/src/storagetm/storagetm.c b/src/storagetm/storagetm.c index 71c87a4606..0a4f8541e9 100644 --- a/src/storagetm/storagetm.c +++ b/src/storagetm/storagetm.c @@ -420,7 +420,7 @@ static int nvme_subsystem_add(const char *node, int consumed_fd, sd_device *devi _cleanup_close_ int subsystems_fd = -EBADF; subsystems_fd = RET_NERRNO(open("/sys/kernel/config/nvmet/subsystems", O_DIRECTORY|O_CLOEXEC|O_RDONLY)); if (subsystems_fd < 0) - return log_error_errno(subsystems_fd, "Failed to open /sys/kernel/config/nvmet/subsystems: %m"); + return log_error_errno(subsystems_fd, "Failed to open %s: %m", "/sys/kernel/config/nvmet/subsystems"); _cleanup_close_ int subsystem_fd = -EBADF; subsystem_fd = open_mkdir_at(subsystems_fd, j, O_EXCL|O_RDONLY|O_CLOEXEC, 0777); @@ -635,7 +635,7 @@ static int nvme_port_add(const char *name, int ip_family, NvmePort **ret) { _cleanup_close_ int ports_fd = -EBADF; ports_fd = RET_NERRNO(open("/sys/kernel/config/nvmet/ports", O_DIRECTORY|O_RDONLY|O_CLOEXEC)); if (ports_fd < 0) - return log_error_errno(ports_fd, "Failed to open /sys/kernel/config/nvmet/ports: %m"); + return log_error_errno(ports_fd, "Failed to open %s: %m", "/sys/kernel/config/nvmet/ports"); _cleanup_close_ int port_fd = -EBADF; uint16_t portnr = calculate_start_port(name, ip_family); diff --git a/src/test/test-mount-util.c b/src/test/test-mount-util.c index a7fc06bbe1..fb2cab3da8 100644 --- a/src/test/test-mount-util.c +++ b/src/test/test-mount-util.c @@ -382,7 +382,7 @@ TEST(umount_recursive) { /* Open /p/s/m file before we unmount everything (which might include /proc/) */ f = fopen("/proc/self/mountinfo", "re"); if (!f) { - log_error_errno(errno, "Failed to open /proc/self/mountinfo: %m"); + log_error_errno(errno, "Failed to open %s: %m", "/proc/self/mountinfo"); _exit(EXIT_FAILURE); } diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c index 5d51d9ae4f..a11a90b93b 100644 --- a/src/tmpfiles/tmpfiles.c +++ b/src/tmpfiles/tmpfiles.c @@ -466,7 +466,7 @@ static int load_unix_sockets(Context *c) { f = fopen("/proc/net/unix", "re"); if (!f) return log_full_errno(errno == ENOENT ? LOG_DEBUG : LOG_WARNING, errno, - "Failed to open /proc/net/unix, ignoring: %m"); + "Failed to open %s, ignoring: %m", "/proc/net/unix"); /* Skip header */ r = read_line(f, LONG_LINE_MAX, NULL); diff --git a/src/udev/udev-builtin-btrfs.c b/src/udev/udev-builtin-btrfs.c index 7a9dc7747c..4b5a5fc610 100644 --- a/src/udev/udev-builtin-btrfs.c +++ b/src/udev/udev-builtin-btrfs.c @@ -43,7 +43,7 @@ static int builtin_btrfs(UdevEvent *event, int argc, char *argv[]) { return 0; } - return log_device_debug_errno(dev, errno, "Failed to open /dev/btrfs-control: %m"); + return log_device_debug_errno(dev, errno, "Failed to open %s: %m", "/dev/btrfs-control"); } struct btrfs_ioctl_vol_args args = {}; diff --git a/src/udev/udev-watch.c b/src/udev/udev-watch.c index 5f77b4e708..49cae65725 100644 --- a/src/udev/udev-watch.c +++ b/src/udev/udev-watch.c @@ -415,7 +415,7 @@ static int udev_watch_clear_by_wd(sd_device *dev, int dirfd, int wd) { if (dirfd < 0) { dirfd_close = RET_NERRNO(open("/run/udev/watch/", O_CLOEXEC | O_DIRECTORY | O_NOFOLLOW | O_RDONLY)); if (dirfd_close < 0) - return log_device_debug_errno(dev, dirfd_close, "Failed to open '/run/udev/watch/': %m"); + return log_device_debug_errno(dev, dirfd_close, "Failed to open %s: %m", "/run/udev/watch/"); dirfd = dirfd_close; } @@ -595,7 +595,7 @@ int manager_remove_watch(Manager *manager, sd_device *dev) { if (dirfd == -ENOENT) return 0; if (dirfd < 0) - return log_device_debug_errno(dev, dirfd, "Failed to open '/run/udev/watch/': %m"); + return log_device_debug_errno(dev, dirfd, "Failed to open %s: %m", "/run/udev/watch/"); /* First, clear symlinks. */ r = udev_watch_clear(dev, dirfd, &wd); diff --git a/src/userdb/userdbctl.c b/src/userdb/userdbctl.c index 2d405197dc..47e6f24ece 100644 --- a/src/userdb/userdbctl.c +++ b/src/userdb/userdbctl.c @@ -1040,7 +1040,7 @@ static int display_services(int argc, char *argv[], void *userdata) { return 0; } - return log_error_errno(errno, "Failed to open /run/systemd/userdb/: %m"); + return log_error_errno(errno, "Failed to open %s: %m", "/run/systemd/userdb/"); } t = table_new("service", "listening"); @@ -1461,7 +1461,7 @@ static int load_credentials(int argc, char *argv[], void *userdata) { /* xopen_flags= */ XO_LABEL, /* mode= */ 0755); if (userdb_dir_fd < 0) - return log_error_errno(userdb_dir_fd, "Failed to open '/etc/userdb/': %m"); + return log_error_errno(userdb_dir_fd, "Failed to open %s: %m", "/etc/userdb/"); FOREACH_ARRAY(i, des->entries, des->n_entries) { struct dirent *de = *i;