]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
tree-wide: basename -> path_extract_filename
authorA. Wilcox <AWilcox@Wilcox-Tech.com>
Sat, 7 Sep 2024 04:03:06 +0000 (23:03 -0500)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 6 Jun 2025 10:06:48 +0000 (19:06 +0900)
15 files changed:
src/analyze/analyze-verify-util.c
src/core/load-dropin.c
src/libsystemd/sd-bus/test-bus-watch-bind.c
src/network/netdev/netdev.c
src/network/networkd-network.c
src/shared/unit-file.c
src/systemctl/systemctl-show.c
src/systemctl/systemctl-sysv-compat.c
src/test/test-fileio.c
src/test/test-install-root.c
src/test/test-install.c
src/test/test-mountpoint-util.c
src/test/test-parse-argument.c
src/test/test-path-util.c
src/udev/net/link-config.c

index 781b941d11043b86253168a822b4f92f5e10b612..6c668222bdae9fe7173a2ecfdd4fb68c0fcd52e2 100644 (file)
@@ -361,9 +361,16 @@ int verify_units(
          * its direct dependencies. Hence, search for any of the filenames in the set and if found,
          * return a non-zero process exit status. */
         if (recursive_errors == RECURSIVE_ERRORS_ONE)
-                STRV_FOREACH(filename, filenames)
-                        if (set_contains(s, basename(*filename)))
+                STRV_FOREACH(filename, filenames) {
+                        _cleanup_free_ char *unit_file = NULL;
+
+                        r = path_extract_filename(*filename, &unit_file);
+                        if (r < 0)
+                                return log_error_errno(r, "Failed to extract file name from '%s': %m", *filename);
+
+                        if (set_contains(s, unit_file))
                                 return -ENOTRECOVERABLE;
+                }
 
         return 0;
 }
index a295d7f343ba72581824eb2f0cf5ace86e17f26a..c9d7b9338e1dce59a08ce2b11955fc39f59c0623 100644 (file)
@@ -7,6 +7,7 @@
 #include "load-fragment.h"
 #include "log.h"
 #include "manager.h"
+#include "path-util.h"
 #include "stat-util.h"
 #include "strv.h"
 #include "unit.h"
@@ -37,10 +38,7 @@ static int process_deps(Unit *u, UnitDependency dependency, const char *dir_suff
                 return r;
 
         STRV_FOREACH(p, paths) {
-                _cleanup_free_ char *target = NULL;
-                const char *entry;
-
-                entry = basename(*p);
+                _cleanup_free_ char *target = NULL, *target_file = NULL, *entry = NULL;
 
                 if (null_or_empty_path(*p) > 0) {
                         /* an error usually means an invalid symlink, which is not a mask */
@@ -61,6 +59,13 @@ static int process_deps(Unit *u, UnitDependency dependency, const char *dir_suff
                         continue;
                 }
 
+                r = path_extract_filename(*p, &entry);
+                if (r < 0) {
+                        log_unit_warning_errno(u, r, "Failed to extract file name of %s dependency dropin %s, ignoring: %m",
+                                               unit_dependency_to_string(dependency), *p);
+                        continue;
+                }
+
                 if (!unit_name_is_valid(entry, UNIT_NAME_ANY)) {
                         log_unit_warning(u, "%s dependency dropin %s is not a valid unit name, ignoring.",
                                          unit_dependency_to_string(dependency), *p);
@@ -73,12 +78,19 @@ static int process_deps(Unit *u, UnitDependency dependency, const char *dir_suff
                         continue;
                 }
 
+                r = path_extract_filename(target, &target_file);
+                if (r < 0) {
+                        log_unit_warning_errno(u, r, "Failed to extract file name for dropin target %s, ignoring: %m",
+                                               target);
+                        continue;
+                }
+
                 /* We don't treat this as an error, especially because we didn't check this for a
                  * long time. Nevertheless, we warn, because such mismatch can be mighty confusing. */
-                r = unit_symlink_name_compatible(entry, basename(target), u->instance);
+                r = unit_symlink_name_compatible(entry, target_file, u->instance);
                 if (r < 0) {
                         log_unit_warning_errno(u, r, "Can't check if names %s and %s are compatible, ignoring: %m",
-                                               entry, basename(target));
+                                               entry, target_file);
                         continue;
                 }
                 if (r == 0)
index c6c072440ec52cdd691b1cb83c33eeb48e5de142..ff4a2b1fce1358fab8d7a81f203d1ab50838034f 100644 (file)
@@ -44,7 +44,7 @@ static const sd_bus_vtable vtable[] = {
 };
 
 static void* thread_server(void *p) {
-        _cleanup_free_ char *suffixed = NULL, *suffixed2 = NULL, *d = NULL;
+        _cleanup_free_ char *suffixed = NULL, *suffixed_basename = NULL, *suffixed2 = NULL, *d = NULL;
         _cleanup_close_ int fd = -EBADF;
         union sockaddr_union u;
         const char *path = p;
@@ -67,7 +67,8 @@ static void* thread_server(void *p) {
         assert_se(symlink(suffixed2, d) >= 0);
         usleep_safe(100 * USEC_PER_MSEC);
 
-        assert_se(symlink(basename(suffixed), suffixed2) >= 0);
+        assert_se(path_extract_filename(suffixed, &suffixed_basename) >= 0);
+        assert_se(symlink(suffixed_basename, suffixed2) >= 0);
         usleep_safe(100 * USEC_PER_MSEC);
 
         socklen_t sa_len;
index b99f3d31e32545a6471ed50615c5e89a95b6820f..d3e29c0c33e41fec38abc18f0eb235fe8440035e 100644 (file)
@@ -34,6 +34,7 @@
 #include "networkd-sriov.h"
 #include "networkd-state-file.h"
 #include "nlmon.h"
+#include "path-util.h"
 #include "stat-util.h"
 #include "string-table.h"
 #include "string-util.h"
@@ -1000,6 +1001,7 @@ static int netdev_request_to_create(NetDev *netdev) {
 
 int netdev_load_one(Manager *manager, const char *filename, NetDev **ret) {
         _cleanup_(netdev_unrefp) NetDev *netdev_raw = NULL, *netdev = NULL;
+        _cleanup_free_ char *file_basename = NULL;
         const char *dropin_dirname;
         int r;
 
@@ -1023,7 +1025,11 @@ int netdev_load_one(Manager *manager, const char *filename, NetDev **ret) {
                 .state = _NETDEV_STATE_INVALID, /* an invalid state means done() of the implementation won't be called on destruction */
         };
 
-        dropin_dirname = strjoina(basename(filename), ".d");
+        r = path_extract_filename(filename, &file_basename);
+        if (r < 0)
+                return log_warning_errno(r, "Failed to extract file name of '%s': %m", filename);
+
+        dropin_dirname = strjoina(file_basename, ".d");
         r = config_parse_many(
                         STRV_MAKE_CONST(filename), NETWORK_DIRS, dropin_dirname, /* root = */ NULL,
                         NETDEV_COMMON_SECTIONS NETDEV_OTHER_SECTIONS,
index c9805509cc0dfe69d52becb98d0f5a3fe05d154e..69fa1983da4d793c5c180f2cf560a819115fb88a 100644 (file)
@@ -28,6 +28,7 @@
 #include "networkd-routing-policy-rule.h"
 #include "ordered-set.h"
 #include "parse-util.h"
+#include "path-util.h"
 #include "qdisc.h"
 #include "radv-internal.h"
 #include "set.h"
@@ -341,9 +342,9 @@ int network_load_one(Manager *manager, OrderedHashmap **networks, const char *fi
         if (!fname)
                 return log_oom();
 
-        name = strdup(basename(filename));
-        if (!name)
-                return log_oom();
+        r = path_extract_filename(filename, &name);
+        if (r < 0)
+                return log_warning_errno(r, "Failed to extract file name of \"%s\": %m", filename);
 
         d = strrchr(name, '.');
         if (!d)
index 2833b5be68c45b0e7f0c0e0a2d5ec67e0e1490b0..b0d46d388a06d099aa9bc14480b7feef3e13496c 100644 (file)
@@ -572,17 +572,21 @@ int unit_file_build_name_map(
         /* Let's also put the names in the reverse db. */
         const char *dummy, *src;
         HASHMAP_FOREACH_KEY(dummy, src, ids) {
-                _cleanup_free_ char *inst = NULL, *dst_inst = NULL;
-                const char *dst;
+                _cleanup_free_ char *inst = NULL, *dst = NULL;
+                const char *dst_path;
 
-                r = unit_ids_map_get(ids, src, &dst);
+                r = unit_ids_map_get(ids, src, &dst_path);
                 if (r < 0)
                         continue;
 
-                if (null_or_empty_path(dst) != 0)
+                if (null_or_empty_path(dst_path) != 0)
                         continue;
 
-                dst = basename(dst);
+                r = path_extract_filename(dst_path, &dst);
+                if (r < 0) {
+                        log_debug_errno(r, "Failed to extract file name from %s, ignoring: %m", dst_path);
+                        continue;
+                }
 
                 /* If we have an symlink from an instance name to a template name, it is an alias just for
                  * this specific instance, foo@id.service ↔ template@id.service. */
@@ -591,6 +595,8 @@ int unit_file_build_name_map(
                         if (t < 0)
                                 return log_error_errno(t, "Failed to extract instance part from %s: %m", src);
                         if (t == UNIT_NAME_INSTANCE) {
+                                _cleanup_free_ char *dst_inst = NULL;
+
                                 r = unit_name_replace_instance(dst, inst, &dst_inst);
                                 if (r < 0) {
                                         /* This might happen e.g. if the combined length is too large.
@@ -600,7 +606,7 @@ int unit_file_build_name_map(
                                         continue;
                                 }
 
-                                dst = dst_inst;
+                                free_and_replace(dst, dst_inst);
                         }
                 }
 
index 207107c6a386642498ba2a430201f3d316296610..f6eeeb29c9e394f50a146f22ddfded5ac0790af3 100644 (file)
@@ -410,7 +410,7 @@ static void print_status_info(
                 bool last = false;
 
                 STRV_FOREACH(dropin, i->dropin_paths) {
-                        _cleanup_free_ char *dropin_formatted = NULL;
+                        _cleanup_free_ char *dropin_formatted = NULL, *dropin_basename = NULL;
                         const char *df;
 
                         if (!dir || last) {
@@ -432,7 +432,13 @@ static void print_status_info(
 
                         last = ! (*(dropin + 1) && startswith(*(dropin + 1), dir));
 
-                        if (terminal_urlify_path(*dropin, basename(*dropin), &dropin_formatted) >= 0)
+                        r = path_extract_filename(*dropin, &dropin_basename);
+                        if (r < 0) {
+                                log_error_errno(r, "Failed to extract file name of '%s': %m", *dropin);
+                                break;
+                        }
+
+                        if (terminal_urlify_path(*dropin, dropin_basename, &dropin_formatted) >= 0)
                                 df = dropin_formatted;
                         else
                                 df = *dropin;
index a872e94d8d9f9975042e5d408ee6c9f29d1b1604..60e62d82d75e9eca1c60ec8d5f5361bf29d63f81 100644 (file)
@@ -150,7 +150,7 @@ int enable_sysv_units(const char *verb, char **args) {
                         NULL,
                 };
 
-                _cleanup_free_ char *p = NULL, *q = NULL, *l = NULL, *v = NULL;
+                _cleanup_free_ char *p = NULL, *q = NULL, *l = NULL, *v = NULL, *b = NULL;
                 bool found_native = false, found_sysv;
                 const char *name;
                 unsigned c = 1;
@@ -205,8 +205,12 @@ int enable_sysv_units(const char *verb, char **args) {
                 if (!v)
                         return log_oom();
 
+                j = path_extract_filename(p, &b);
+                if (j < 0)
+                        return log_error_errno(j, "Failed to extract file name from '%s': %m", p);
+
                 argv[c++] = v;
-                argv[c++] = basename(p);
+                argv[c++] = b;
                 argv[c] = NULL;
 
                 l = strv_join((char**)argv, " ");
index 744fb4942787d10f4e42f75c2f3558b25d3d5543..aa68155fe68598e2c256b7cf4cabd3262327ef9c 100644 (file)
@@ -534,7 +534,7 @@ TEST(search_and_fopen) {
         };
         char name[] = "/tmp/test-search_and_fopen.XXXXXX";
         _cleanup_fclose_ FILE *f = NULL;
-        _cleanup_free_ char *p = NULL;
+        _cleanup_free_ char *p = NULL, *bn = NULL;
         _cleanup_close_ int fd = -EBADF;
         const char *e;
         int r;
@@ -543,59 +543,48 @@ TEST(search_and_fopen) {
         assert_se(fd >= 0);
         fd = safe_close(fd);
 
-        r = search_and_fopen(basename(name), "re", NULL, (const char**) dirs, &f, &p);
-        assert_se(r >= 0);
+        ASSERT_OK(path_extract_filename(name, &bn));
+        ASSERT_OK(search_and_fopen(bn, "re", NULL, (const char**) dirs, &f, &p));
         assert_se(e = path_startswith(p, "/tmp/"));
-        ASSERT_STREQ(basename(name), e);
+        ASSERT_STREQ(bn, e);
         f = safe_fclose(f);
         p = mfree(p);
 
-        r = search_and_fopen(basename(name), NULL, NULL, (const char**) dirs, NULL, &p);
-        assert_se(r >= 0);
+        ASSERT_OK(search_and_fopen(bn, NULL, NULL, (const char**) dirs, NULL, &p));
         assert_se(e = path_startswith(p, "/tmp/"));
-        ASSERT_STREQ(basename(name), e);
+        ASSERT_STREQ(bn, e);
         p = mfree(p);
 
-        r = search_and_fopen(name, "re", NULL, (const char**) dirs, &f, &p);
-        assert_se(r >= 0);
+        ASSERT_OK(search_and_fopen(name, "re", NULL, (const char**) dirs, &f, &p));
         assert_se(path_equal(name, p));
         f = safe_fclose(f);
         p = mfree(p);
 
-        r = search_and_fopen(name, NULL, NULL, (const char**) dirs, NULL, &p);
-        assert_se(r >= 0);
+        ASSERT_OK(search_and_fopen(name, NULL, NULL, (const char**) dirs, NULL, &p));
         assert_se(path_equal(name, p));
         p = mfree(p);
 
-        r = search_and_fopen(basename(name), "re", "/", (const char**) dirs, &f, &p);
-        assert_se(r >= 0);
+        ASSERT_OK(search_and_fopen(bn, "re", "/", (const char**) dirs, &f, &p));
         assert_se(e = path_startswith(p, "/tmp/"));
-        ASSERT_STREQ(basename(name), e);
+        ASSERT_STREQ(bn, e);
         f = safe_fclose(f);
         p = mfree(p);
 
-        r = search_and_fopen(basename(name), NULL, "/", (const char**) dirs, NULL, &p);
-        assert_se(r >= 0);
+        ASSERT_OK(search_and_fopen(bn, NULL, "/", (const char**) dirs, NULL, &p));
         assert_se(e = path_startswith(p, "/tmp/"));
-        ASSERT_STREQ(basename(name), e);
+        ASSERT_STREQ(bn, e);
         p = mfree(p);
 
-        r = search_and_fopen("/a/file/which/does/not/exist/i/guess", "re", NULL, (const char**) dirs, &f, &p);
-        assert_se(r == -ENOENT);
-        r = search_and_fopen("/a/file/which/does/not/exist/i/guess", NULL, NULL, (const char**) dirs, NULL, &p);
-        assert_se(r == -ENOENT);
-        r = search_and_fopen("afilewhichdoesnotexistiguess", "re", NULL, (const char**) dirs, &f, &p);
-        assert_se(r == -ENOENT);
-        r = search_and_fopen("afilewhichdoesnotexistiguess", NULL, NULL, (const char**) dirs, NULL, &p);
-        assert_se(r == -ENOENT);
+        ASSERT_ERROR(search_and_fopen("/a/file/which/does/not/exist/i/guess", "re", NULL, (const char**) dirs, &f, &p), ENOENT);
+        ASSERT_ERROR(search_and_fopen("/a/file/which/does/not/exist/i/guess", NULL, NULL, (const char**) dirs, NULL, &p), ENOENT);
+        ASSERT_ERROR(search_and_fopen("afilewhichdoesnotexistiguess", "re", NULL, (const char**) dirs, &f, &p), ENOENT);
+        ASSERT_ERROR(search_and_fopen("afilewhichdoesnotexistiguess", NULL, NULL, (const char**) dirs, NULL, &p), ENOENT);
 
         r = unlink(name);
         assert_se(r == 0);
 
-        r = search_and_fopen(basename(name), "re", NULL, (const char**) dirs, &f, &p);
-        assert_se(r == -ENOENT);
-        r = search_and_fopen(basename(name), NULL, NULL, (const char**) dirs, NULL, &p);
-        assert_se(r == -ENOENT);
+        ASSERT_ERROR(search_and_fopen(bn, "re", NULL, (const char**) dirs, &f, &p), ENOENT);
+        ASSERT_ERROR(search_and_fopen(bn, NULL, NULL, (const char**) dirs, NULL, &p), ENOENT);
 }
 
 TEST(search_and_fopen_nulstr) {
@@ -605,7 +594,7 @@ TEST(search_and_fopen_nulstr) {
 
         _cleanup_(unlink_tempfilep) char name[] = "/tmp/test-search_and_fopen.XXXXXX";
         _cleanup_fclose_ FILE *f = NULL;
-        _cleanup_free_ char *p = NULL;
+        _cleanup_free_ char *p = NULL, *bn = NULL;
         _cleanup_close_ int fd = -EBADF;
         const char *e;
         int r;
@@ -614,29 +603,25 @@ TEST(search_and_fopen_nulstr) {
         assert_se(fd >= 0);
         fd = safe_close(fd);
 
-        r = search_and_fopen_nulstr(basename(name), "re", NULL, dirs, &f, &p);
-        assert_se(r >= 0);
+        ASSERT_OK(path_extract_filename(name, &bn));
+        ASSERT_OK(search_and_fopen_nulstr(bn, "re", NULL, dirs, &f, &p));
         assert_se(e = path_startswith(p, "/tmp/"));
-        ASSERT_STREQ(basename(name), e);
+        ASSERT_STREQ(bn, e);
         f = safe_fclose(f);
         p = mfree(p);
 
-        r = search_and_fopen_nulstr(name, "re", NULL, dirs, &f, &p);
-        assert_se(r >= 0);
+        ASSERT_OK(search_and_fopen_nulstr(name, "re", NULL, dirs, &f, &p));
         assert_se(path_equal(name, p));
         f = safe_fclose(f);
         p = mfree(p);
 
-        r = search_and_fopen_nulstr("/a/file/which/does/not/exist/i/guess", "re", NULL, dirs, &f, &p);
-        assert_se(r == -ENOENT);
-        r = search_and_fopen_nulstr("afilewhichdoesnotexistiguess", "re", NULL, dirs, &f, &p);
-        assert_se(r == -ENOENT);
+        ASSERT_ERROR(search_and_fopen_nulstr("/a/file/which/does/not/exist/i/guess", "re", NULL, dirs, &f, &p), ENOENT);
+        ASSERT_ERROR(search_and_fopen_nulstr("afilewhichdoesnotexistiguess", "re", NULL, dirs, &f, &p), ENOENT);
 
         r = unlink(name);
         assert_se(r == 0);
 
-        r = search_and_fopen_nulstr(basename(name), "re", NULL, dirs, &f, &p);
-        assert_se(r == -ENOENT);
+        ASSERT_ERROR(search_and_fopen_nulstr(bn, "re", NULL, dirs, &f, &p), ENOENT);
 }
 
 TEST(writing_tmpfile) {
index 2f38694a05519e17e170a09036e5ad206ce0aff0..a17198b9356ed39432907a81f07e02d9806c92d3 100644 (file)
@@ -7,6 +7,7 @@
 #include "hashmap.h"
 #include "install.h"
 #include "mkdir.h"
+#include "path-util.h"
 #include "rm-rf.h"
 #include "special.h"
 #include "string-util.h"
@@ -706,7 +707,10 @@ TEST(preset_and_list) {
         q = strjoina(root, "/usr/lib/systemd/system/preset-no.service");
 
         HASHMAP_FOREACH(fl, h) {
-                assert_se(unit_file_get_state(RUNTIME_SCOPE_SYSTEM, root, basename(fl->path), &state) >= 0);
+                _cleanup_free_ char *unit_filename = NULL;
+
+                ASSERT_OK(path_extract_filename(fl->path, &unit_filename));
+                ASSERT_OK(unit_file_get_state(RUNTIME_SCOPE_SYSTEM, root, unit_filename, &state));
                 assert_se(fl->state == state);
 
                 if (streq(fl->path, p)) {
index 45704064b206a7fd783a87d254ff9fb350b26d51..9c6e9cba06c8381e8db89ef0fdaa02241bed45d7 100644 (file)
@@ -5,6 +5,7 @@
 
 #include "hashmap.h"
 #include "install.h"
+#include "path-util.h"
 #include "tests.h"
 
 static void dump_changes(InstallChange *c, unsigned n) {
@@ -25,7 +26,9 @@ int main(int argc, char* argv[]) {
         UnitFileList *p;
         int r;
         const char *const files[] = { "avahi-daemon.service", NULL };
+        const char *files_name = "avahi-daemon.service";
         const char *const files2[] = { "/home/lennart/test.service", NULL };
+        const char *files2_name = "test.service";
         InstallChange *changes = NULL;
         size_t n_changes = 0;
         UnitFileState state = 0;
@@ -36,8 +39,10 @@ int main(int argc, char* argv[]) {
 
         HASHMAP_FOREACH(p, h) {
                 UnitFileState s = _UNIT_FILE_STATE_INVALID;
+                _cleanup_free_ char *unit_filename = NULL;
 
-                r = unit_file_get_state(RUNTIME_SCOPE_SYSTEM, NULL, basename(p->path), &s);
+                ASSERT_OK(path_extract_filename(p->path, &unit_filename));
+                r = unit_file_get_state(RUNTIME_SCOPE_SYSTEM, NULL, unit_filename, &s);
 
                 assert_se((r < 0 && p->state == UNIT_FILE_BAD) ||
                           (p->state == s));
@@ -49,220 +54,186 @@ int main(int argc, char* argv[]) {
 
         log_info("/*** enable **/");
 
-        r = unit_file_enable(RUNTIME_SCOPE_SYSTEM, 0, NULL, (char**) files, &changes, &n_changes);
-        assert_se(r >= 0);
+        ASSERT_OK(unit_file_enable(RUNTIME_SCOPE_SYSTEM, 0, NULL, (char**) files, &changes, &n_changes));
 
         log_info("/*** enable2 **/");
 
-        r = unit_file_enable(RUNTIME_SCOPE_SYSTEM, 0, NULL, (char**) files, &changes, &n_changes);
-        assert_se(r >= 0);
+        ASSERT_OK(unit_file_enable(RUNTIME_SCOPE_SYSTEM, 0, NULL, (char**) files, &changes, &n_changes));
 
         dump_changes(changes, n_changes);
         install_changes_free(changes, n_changes);
 
-        r = unit_file_get_state(RUNTIME_SCOPE_SYSTEM, NULL, files[0], &state);
-        assert_se(r >= 0);
+        ASSERT_OK(unit_file_get_state(RUNTIME_SCOPE_SYSTEM, NULL, files[0], &state));
         assert_se(state == UNIT_FILE_ENABLED);
 
         log_info("/*** disable ***/");
         changes = NULL;
         n_changes = 0;
 
-        r = unit_file_disable(RUNTIME_SCOPE_SYSTEM, 0, NULL, (char**) files, &changes, &n_changes);
-        assert_se(r >= 0);
+        ASSERT_OK(unit_file_disable(RUNTIME_SCOPE_SYSTEM, 0, NULL, (char**) files, &changes, &n_changes));
 
         dump_changes(changes, n_changes);
         install_changes_free(changes, n_changes);
 
-        r = unit_file_get_state(RUNTIME_SCOPE_SYSTEM, NULL, files[0], &state);
-        assert_se(r >= 0);
+        ASSERT_OK(unit_file_get_state(RUNTIME_SCOPE_SYSTEM, NULL, files[0], &state));
         assert_se(state == UNIT_FILE_DISABLED);
 
         log_info("/*** mask ***/");
         changes = NULL;
         n_changes = 0;
 
-        r = unit_file_mask(RUNTIME_SCOPE_SYSTEM, 0, NULL, (char**) files, &changes, &n_changes);
-        assert_se(r >= 0);
+        ASSERT_OK(unit_file_mask(RUNTIME_SCOPE_SYSTEM, 0, NULL, (char**) files, &changes, &n_changes));
         log_info("/*** mask2 ***/");
-        r = unit_file_mask(RUNTIME_SCOPE_SYSTEM, 0, NULL, (char**) files, &changes, &n_changes);
-        assert_se(r >= 0);
+        ASSERT_OK(unit_file_mask(RUNTIME_SCOPE_SYSTEM, 0, NULL, (char**) files, &changes, &n_changes));
 
         dump_changes(changes, n_changes);
         install_changes_free(changes, n_changes);
 
-        r = unit_file_get_state(RUNTIME_SCOPE_SYSTEM, NULL, files[0], &state);
-        assert_se(r >= 0);
+        ASSERT_OK(unit_file_get_state(RUNTIME_SCOPE_SYSTEM, NULL, files[0], &state));
         assert_se(state == UNIT_FILE_MASKED);
 
         log_info("/*** unmask ***/");
         changes = NULL;
         n_changes = 0;
 
-        r = unit_file_unmask(RUNTIME_SCOPE_SYSTEM, 0, NULL, (char**) files, &changes, &n_changes);
-        assert_se(r >= 0);
+        ASSERT_OK(unit_file_unmask(RUNTIME_SCOPE_SYSTEM, 0, NULL, (char**) files, &changes, &n_changes));
         log_info("/*** unmask2 ***/");
-        r = unit_file_unmask(RUNTIME_SCOPE_SYSTEM, 0, NULL, (char**) files, &changes, &n_changes);
-        assert_se(r >= 0);
+        ASSERT_OK(unit_file_unmask(RUNTIME_SCOPE_SYSTEM, 0, NULL, (char**) files, &changes, &n_changes));
 
         dump_changes(changes, n_changes);
         install_changes_free(changes, n_changes);
 
-        r = unit_file_get_state(RUNTIME_SCOPE_SYSTEM, NULL, files[0], &state);
-        assert_se(r >= 0);
+        ASSERT_OK(unit_file_get_state(RUNTIME_SCOPE_SYSTEM, NULL, files[0], &state));
         assert_se(state == UNIT_FILE_DISABLED);
 
         log_info("/*** mask ***/");
         changes = NULL;
         n_changes = 0;
 
-        r = unit_file_mask(RUNTIME_SCOPE_SYSTEM, 0, NULL, (char**) files, &changes, &n_changes);
-        assert_se(r >= 0);
+        ASSERT_OK(unit_file_mask(RUNTIME_SCOPE_SYSTEM, 0, NULL, (char**) files, &changes, &n_changes));
 
         dump_changes(changes, n_changes);
         install_changes_free(changes, n_changes);
 
-        r = unit_file_get_state(RUNTIME_SCOPE_SYSTEM, NULL, files[0], &state);
-        assert_se(r >= 0);
+        ASSERT_OK(unit_file_get_state(RUNTIME_SCOPE_SYSTEM, NULL, files[0], &state));
         assert_se(state == UNIT_FILE_MASKED);
 
         log_info("/*** disable ***/");
         changes = NULL;
         n_changes = 0;
 
-        r = unit_file_disable(RUNTIME_SCOPE_SYSTEM, 0, NULL, (char**) files, &changes, &n_changes);
-        assert_se(r >= 0);
+        ASSERT_OK(unit_file_disable(RUNTIME_SCOPE_SYSTEM, 0, NULL, (char**) files, &changes, &n_changes));
         log_info("/*** disable2 ***/");
-        r = unit_file_disable(RUNTIME_SCOPE_SYSTEM, 0, NULL, (char**) files, &changes, &n_changes);
-        assert_se(r >= 0);
+        ASSERT_OK(unit_file_disable(RUNTIME_SCOPE_SYSTEM, 0, NULL, (char**) files, &changes, &n_changes));
 
         dump_changes(changes, n_changes);
         install_changes_free(changes, n_changes);
 
-        r = unit_file_get_state(RUNTIME_SCOPE_SYSTEM, NULL, files[0], &state);
-        assert_se(r >= 0);
+        ASSERT_OK(unit_file_get_state(RUNTIME_SCOPE_SYSTEM, NULL, files[0], &state));
         assert_se(state == UNIT_FILE_MASKED);
 
         log_info("/*** umask ***/");
         changes = NULL;
         n_changes = 0;
 
-        r = unit_file_unmask(RUNTIME_SCOPE_SYSTEM, 0, NULL, (char**) files, &changes, &n_changes);
-        assert_se(r >= 0);
+        ASSERT_OK(unit_file_unmask(RUNTIME_SCOPE_SYSTEM, 0, NULL, (char**) files, &changes, &n_changes));
 
         dump_changes(changes, n_changes);
         install_changes_free(changes, n_changes);
 
-        r = unit_file_get_state(RUNTIME_SCOPE_SYSTEM, NULL, files[0], &state);
-        assert_se(r >= 0);
+        ASSERT_OK(unit_file_get_state(RUNTIME_SCOPE_SYSTEM, NULL, files[0], &state));
         assert_se(state == UNIT_FILE_DISABLED);
 
         log_info("/*** enable files2 ***/");
         changes = NULL;
         n_changes = 0;
 
-        r = unit_file_enable(RUNTIME_SCOPE_SYSTEM, 0, NULL, (char**) files2, &changes, &n_changes);
-        assert_se(r >= 0);
+        ASSERT_OK(unit_file_enable(RUNTIME_SCOPE_SYSTEM, 0, NULL, (char**) files2, &changes, &n_changes));
 
         dump_changes(changes, n_changes);
         install_changes_free(changes, n_changes);
 
-        r = unit_file_get_state(RUNTIME_SCOPE_SYSTEM, NULL, basename(files2[0]), &state);
-        assert_se(r >= 0);
+        ASSERT_OK(unit_file_get_state(RUNTIME_SCOPE_SYSTEM, NULL, files2_name, &state));
         assert_se(state == UNIT_FILE_ENABLED);
 
         log_info("/*** disable files2 ***/");
         changes = NULL;
         n_changes = 0;
 
-        r = unit_file_disable(RUNTIME_SCOPE_SYSTEM, 0, NULL, STRV_MAKE(basename(files2[0])), &changes, &n_changes);
-        assert_se(r >= 0);
+        ASSERT_OK(unit_file_disable(RUNTIME_SCOPE_SYSTEM, 0, NULL, STRV_MAKE(files2_name), &changes, &n_changes));
 
         dump_changes(changes, n_changes);
         install_changes_free(changes, n_changes);
 
-        r = unit_file_get_state(RUNTIME_SCOPE_SYSTEM, NULL, basename(files2[0]), &state);
-        assert_se(r < 0);
+        ASSERT_FAIL(unit_file_get_state(RUNTIME_SCOPE_SYSTEM, NULL, files2_name, &state));
 
         log_info("/*** link files2 ***/");
         changes = NULL;
         n_changes = 0;
 
-        r = unit_file_link(RUNTIME_SCOPE_SYSTEM, 0, NULL, (char**) files2, &changes, &n_changes);
-        assert_se(r >= 0);
+        ASSERT_OK(unit_file_link(RUNTIME_SCOPE_SYSTEM, 0, NULL, (char**) files2, &changes, &n_changes));
 
         dump_changes(changes, n_changes);
         install_changes_free(changes, n_changes);
 
-        r = unit_file_get_state(RUNTIME_SCOPE_SYSTEM, NULL, basename(files2[0]), &state);
-        assert_se(r >= 0);
+        ASSERT_OK(unit_file_get_state(RUNTIME_SCOPE_SYSTEM, NULL, files2_name, &state));
         assert_se(state == UNIT_FILE_LINKED);
 
         log_info("/*** disable files2 ***/");
         changes = NULL;
         n_changes = 0;
 
-        r = unit_file_disable(RUNTIME_SCOPE_SYSTEM, 0, NULL, STRV_MAKE(basename(files2[0])), &changes, &n_changes);
-        assert_se(r >= 0);
+        ASSERT_OK(unit_file_disable(RUNTIME_SCOPE_SYSTEM, 0, NULL, STRV_MAKE(files2_name), &changes, &n_changes));
 
         dump_changes(changes, n_changes);
         install_changes_free(changes, n_changes);
 
-        r = unit_file_get_state(RUNTIME_SCOPE_SYSTEM, NULL, basename(files2[0]), &state);
-        assert_se(r < 0);
+        ASSERT_FAIL(unit_file_get_state(RUNTIME_SCOPE_SYSTEM, NULL, files2_name, &state));
 
         log_info("/*** link files2 ***/");
         changes = NULL;
         n_changes = 0;
 
-        r = unit_file_link(RUNTIME_SCOPE_SYSTEM, 0, NULL, (char**) files2, &changes, &n_changes);
-        assert_se(r >= 0);
+        ASSERT_OK(unit_file_link(RUNTIME_SCOPE_SYSTEM, 0, NULL, (char**) files2, &changes, &n_changes));
 
         dump_changes(changes, n_changes);
         install_changes_free(changes, n_changes);
 
-        r = unit_file_get_state(RUNTIME_SCOPE_SYSTEM, NULL, basename(files2[0]), &state);
-        assert_se(r >= 0);
+        ASSERT_OK(unit_file_get_state(RUNTIME_SCOPE_SYSTEM, NULL, files2_name, &state));
         assert_se(state == UNIT_FILE_LINKED);
 
         log_info("/*** reenable files2 ***/");
         changes = NULL;
         n_changes = 0;
 
-        r = unit_file_reenable(RUNTIME_SCOPE_SYSTEM, 0, NULL, (char**) files2, &changes, &n_changes);
-        assert_se(r >= 0);
+        ASSERT_OK(unit_file_reenable(RUNTIME_SCOPE_SYSTEM, 0, NULL, (char**) files2, &changes, &n_changes));
 
         dump_changes(changes, n_changes);
         install_changes_free(changes, n_changes);
 
-        r = unit_file_get_state(RUNTIME_SCOPE_SYSTEM, NULL, basename(files2[0]), &state);
-        assert_se(r >= 0);
+        ASSERT_OK(unit_file_get_state(RUNTIME_SCOPE_SYSTEM, NULL, files2_name, &state));
         assert_se(state == UNIT_FILE_ENABLED);
 
         log_info("/*** disable files2 ***/");
         changes = NULL;
         n_changes = 0;
 
-        r = unit_file_disable(RUNTIME_SCOPE_SYSTEM, 0, NULL, STRV_MAKE(basename(files2[0])), &changes, &n_changes);
-        assert_se(r >= 0);
+        ASSERT_OK(unit_file_disable(RUNTIME_SCOPE_SYSTEM, 0, NULL, STRV_MAKE(files2_name), &changes, &n_changes));
 
         dump_changes(changes, n_changes);
         install_changes_free(changes, n_changes);
 
-        r = unit_file_get_state(RUNTIME_SCOPE_SYSTEM, NULL, basename(files2[0]), &state);
-        assert_se(r < 0);
+        ASSERT_FAIL(unit_file_get_state(RUNTIME_SCOPE_SYSTEM, NULL, files2_name, &state));
         log_info("/*** preset files ***/");
         changes = NULL;
         n_changes = 0;
 
-        r = unit_file_preset(RUNTIME_SCOPE_SYSTEM, 0, NULL, (char**) files, UNIT_FILE_PRESET_FULL, &changes, &n_changes);
-        assert_se(r >= 0);
+        ASSERT_OK(unit_file_preset(RUNTIME_SCOPE_SYSTEM, 0, NULL, (char**) files, UNIT_FILE_PRESET_FULL, &changes, &n_changes));
 
         dump_changes(changes, n_changes);
         install_changes_free(changes, n_changes);
 
-        r = unit_file_get_state(RUNTIME_SCOPE_SYSTEM, NULL, basename(files[0]), &state);
-        assert_se(r >= 0);
+        ASSERT_OK(unit_file_get_state(RUNTIME_SCOPE_SYSTEM, NULL, files_name, &state));
         assert_se(state == UNIT_FILE_ENABLED);
 
         return 0;
index ee2d21825ad562dbaac8523653a807ca51ee6e96..ceb59ce4555e5250e14df93de43c30cc7f9de34e 100644 (file)
@@ -274,7 +274,7 @@ TEST(path_is_mount_point) {
 
 TEST(is_mount_point_at) {
         _cleanup_(rm_rf_physical_and_freep) char *tmpdir = NULL;
-        _cleanup_free_ char *pwd = NULL;
+        _cleanup_free_ char *pwd = NULL, *tmpdir_basename = NULL;
         _cleanup_close_ int fd = -EBADF;
         int r;
 
@@ -299,8 +299,9 @@ TEST(is_mount_point_at) {
         assert_se(fd >= 0);
 
         assert_se(mkdtemp_malloc("/tmp/not-mounted-XXXXXX", &tmpdir) >= 0);
-        assert_se(is_mount_point_at(fd, basename(tmpdir), 0) == 0);
-        assert_se(is_mount_point_at(fd, strjoina(basename(tmpdir), "/"), 0) == 0);
+        ASSERT_OK(path_extract_filename(tmpdir, &tmpdir_basename));
+        ASSERT_OK_ZERO(is_mount_point_at(fd, tmpdir_basename, 0));
+        ASSERT_OK_ZERO(is_mount_point_at(fd, strjoina(tmpdir_basename, "/"), 0));
 
         safe_close(fd);
         fd = open("/proc", O_RDONLY|O_CLOEXEC|O_DIRECTORY|O_NOCTTY);
index d3d88cf0d1cc72cb5e9412d3b4498823585447b7..843179b666178438b0ea96370eff95543fff5960 100644 (file)
@@ -5,6 +5,7 @@
 #include "sd-json.h"
 
 #include "parse-argument.h"
+#include "path-util.h"
 #include "stdio-util.h"
 #include "tests.h"
 
@@ -19,10 +20,11 @@ TEST(parse_json_argument) {
 }
 
 TEST(parse_path_argument) {
-        _cleanup_free_ char *path = NULL;
+        _cleanup_free_ char *path = NULL, *file = NULL;
 
         assert_se(parse_path_argument("help", false, &path) == 0);
-        ASSERT_STREQ(basename(path), "help");
+        ASSERT_OK(path_extract_filename(path, &file));
+        ASSERT_STREQ(file, "help");
 
         assert_se(parse_path_argument("/", false, &path) == 0);
         ASSERT_STREQ(path, "/");
index 5928b2520da8e252a956545e146c5c8c41ca97ce..ea025cb13541b65d4a014679401a63fc159f596f 100644 (file)
@@ -26,11 +26,6 @@ TEST(path) {
         assert_se( path_is_absolute("/"));
         assert_se(!path_is_absolute("./"));
 
-        ASSERT_STREQ(basename("./aa/bb/../file.da."), "file.da.");
-        ASSERT_STREQ(basename("/aa///.file"), ".file");
-        ASSERT_STREQ(basename("/aa///file..."), "file...");
-        ASSERT_STREQ(basename("file.../"), "");
-
         assert_se( PATH_IN_SET("/bin", "/", "/bin", "/foo"));
         assert_se( PATH_IN_SET("/bin", "/bin"));
         assert_se( PATH_IN_SET("/bin", "/foo/bar", "/bin"));
@@ -372,20 +367,24 @@ TEST(path_equal_root) {
 }
 
 TEST(find_executable_full) {
-        char *p;
-        char* test_file_name;
+        char *p, *bp;
+        _cleanup_free_ char *test_file_name = NULL;
         _cleanup_close_ int fd = -EBADF;
         char fn[] = "/tmp/test-XXXXXX";
 
         assert_se(find_executable_full("sh", NULL, NULL, true, &p, NULL) == 0);
         puts(p);
-        ASSERT_STREQ(basename(p), "sh");
+        ASSERT_OK(path_extract_filename(p, &bp));
+        ASSERT_STREQ(bp, "sh");
         free(p);
+        free(bp);
 
         assert_se(find_executable_full("sh", NULL, NULL, false, &p, NULL) == 0);
         puts(p);
-        ASSERT_STREQ(basename(p), "sh");
+        ASSERT_OK(path_extract_filename(p, &bp));
+        ASSERT_STREQ(bp, "sh");
         free(p);
+        free(bp);
 
         _cleanup_free_ char *oldpath = NULL;
         p = getenv("PATH");
@@ -396,21 +395,25 @@ TEST(find_executable_full) {
 
         assert_se(find_executable_full("sh", NULL, NULL, true, &p, NULL) == 0);
         puts(p);
-        ASSERT_STREQ(basename(p), "sh");
+        ASSERT_OK(path_extract_filename(p, &bp));
+        ASSERT_STREQ(bp, "sh");
         free(p);
+        free(bp);
 
         assert_se(find_executable_full("sh", NULL, NULL, false, &p, NULL) == 0);
         puts(p);
-        ASSERT_STREQ(basename(p), "sh");
+        ASSERT_OK(path_extract_filename(p, &bp));
+        ASSERT_STREQ(bp, "sh");
         free(p);
+        free(bp);
 
         if (oldpath)
-                assert_se(setenv("PATH", oldpath, true) >= 0);
+                ASSERT_OK_ERRNO(setenv("PATH", oldpath, true));
 
-        assert_se((fd = mkostemp_safe(fn)) >= 0);
-        assert_se(fchmod(fd, 0755) >= 0);
+        ASSERT_OK(fd = mkostemp_safe(fn));
+        ASSERT_OK_ERRNO(fchmod(fd, 0755));
 
-        test_file_name = basename(fn);
+        ASSERT_OK(path_extract_filename(fn, &test_file_name));
 
         assert_se(find_executable_full(test_file_name, NULL, STRV_MAKE("/doesnotexist", "/tmp", "/bin"), false, &p, NULL) == 0);
         puts(p);
@@ -423,6 +426,7 @@ TEST(find_executable_full) {
 
 TEST(find_executable) {
         char *p;
+        _cleanup_free_ char *bp = NULL;
 
         assert_se(find_executable("/bin/sh", &p) == 0);
         puts(p);
@@ -447,7 +451,8 @@ TEST(find_executable) {
 
         assert_se(find_executable("touch", &p) == 0);
         assert_se(path_is_absolute(p));
-        ASSERT_STREQ(basename(p), "touch");
+        ASSERT_OK(path_extract_filename(p, &bp));
+        ASSERT_STREQ(bp, "touch");
         free(p);
 
         assert_se(find_executable("xxxx-xxxx", &p) == -ENOENT);
index 7437c9561f3b1838de46874f6de3a4aa6787d0d6..831575666d11c91d92aa745959d384754c39b5b9 100644 (file)
@@ -230,7 +230,7 @@ static int link_adjust_wol_options(LinkConfig *config) {
 int link_load_one(LinkConfigContext *ctx, const char *filename) {
         _cleanup_(link_config_freep) LinkConfig *config = NULL;
         _cleanup_hashmap_free_ Hashmap *stats_by_path = NULL;
-        _cleanup_free_ char *name = NULL;
+        _cleanup_free_ char *name = NULL, *file_basename = NULL;
         const char *dropin_dirname;
         int r;
 
@@ -276,7 +276,11 @@ int link_load_one(LinkConfigContext *ctx, const char *filename) {
         FOREACH_ELEMENT(feature, config->features)
                 *feature = -1;
 
-        dropin_dirname = strjoina(basename(filename), ".d");
+        r = path_extract_filename(filename, &file_basename);
+        if (r < 0)
+                return log_error_errno(r, "Failed to extract file name of '%s': %m", filename);
+
+        dropin_dirname = strjoina(file_basename, ".d");
         r = config_parse_many(
                         STRV_MAKE_CONST(filename),
                         NETWORK_DIRS,