From: Mike Yuan Date: Mon, 9 Feb 2026 01:30:38 +0000 (+0100) Subject: tree-wide: use path_split_prefix_filename() where appropriate X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=cc9a9d6a15a2e18713ca5809e9edd82979dac164;p=thirdparty%2Fsystemd.git tree-wide: use path_split_prefix_filename() where appropriate --- diff --git a/src/basic/lock-util.c b/src/basic/lock-util.c index 85c7dc0562f..bd267eabf99 100644 --- a/src/basic/lock-util.c +++ b/src/basic/lock-util.c @@ -69,15 +69,14 @@ int make_lock_file_for(const char *p, int operation, LockFile *ret) { assert(p); assert(ret); - r = path_extract_filename(p, &fn); + r = path_split_prefix_filename(p, &dn, &fn); if (r < 0) return r; - r = path_extract_directory(p, &dn); - if (r < 0) - return r; - - t = strjoin(dn, "/.#", fn, ".lck"); + if (dn) + t = strjoin(dn, "/.#", fn, ".lck"); + else + t = strjoin(".#", fn, ".lck"); if (!t) return -ENOMEM; diff --git a/src/basic/tmpfile-util.c b/src/basic/tmpfile-util.c index bbfd4f58ab6..2be44dcd777 100644 --- a/src/basic/tmpfile-util.c +++ b/src/basic/tmpfile-util.c @@ -161,17 +161,12 @@ static int tempfn_build(const char *p, const char *pre, const char *post, bool c if (!d) return -ENOMEM; } else { - r = path_extract_directory(p, &d); - if (r < 0 && r != -EDESTADDRREQ) /* EDESTADDRREQ → No directory specified, just a filename */ - return r; - - r = path_extract_filename(p, &fn); + r = path_split_prefix_filename(p, &d, &fn); if (r < 0) return r; - if (strlen(fn) > NAME_MAX - len_add) - /* We cannot simply prepend and append strings to the filename. Let's truncate the filename. */ - fn[NAME_MAX - len_add] = '\0'; + /* Truncate the filename if it would become too long after mangling. */ + strshorten(fn, NAME_MAX - len_add); } nf = strjoin(".#", strempty(pre), strempty(fn), strempty(post)); diff --git a/src/shared/blockdev-util.c b/src/shared/blockdev-util.c index 44feae5ab60..12a4f59c28a 100644 --- a/src/shared/blockdev-util.c +++ b/src/shared/blockdev-util.c @@ -922,6 +922,7 @@ int blockdev_get_root(int level, dev_t *ret) { } int partition_node_of(const char *node, unsigned nr, char **ret) { + _cleanup_free_ char *fn = NULL, *dn = NULL; int r; assert(node); @@ -931,18 +932,12 @@ int partition_node_of(const char *node, unsigned nr, char **ret) { /* Given a device node path to a block device returns the device node path to the partition block * device of the specified partition */ - _cleanup_free_ char *fn = NULL; - r = path_extract_filename(node, &fn); + r = path_split_prefix_filename(node, &dn, &fn); if (r < 0) return r; if (r == O_DIRECTORY) return -EISDIR; - _cleanup_free_ char *dn = NULL; - r = path_extract_directory(node, &dn); - if (r < 0 && r != -EDESTADDRREQ) /* allow if only filename is specified */ - return r; - size_t l = strlen(fn); assert(l > 0); /* underflow check for the subtraction below */ diff --git a/src/shared/creds-util.c b/src/shared/creds-util.c index a54883744fe..2aac4d253bb 100644 --- a/src/shared/creds-util.c +++ b/src/shared/creds-util.c @@ -480,14 +480,13 @@ int get_credential_host_secret(CredentialSecretFlags flags, struct iovec *ret) { if (!path_is_absolute(e)) return -EINVAL; - r = path_extract_directory(e, &_dirname); - if (r < 0) - return r; - - r = path_extract_filename(e, &_filename); + r = path_split_prefix_filename(e, &_dirname, &_filename); if (r < 0) return r; + if (r == O_DIRECTORY) + return -EINVAL; + /* We validate that the path is absolute above, hence dirname must be extractable. */ dirname = _dirname; filename = _filename; } else { @@ -498,7 +497,8 @@ int get_credential_host_secret(CredentialSecretFlags flags, struct iovec *ret) { assert(dirname); assert(filename); - mkdir_parents(dirname, 0755); + (void) mkdir_parents(dirname, 0755); + dfd = open_mkdir(dirname, O_CLOEXEC, 0755); if (dfd < 0) return log_debug_errno(dfd, "Failed to create or open directory '%s': %m", dirname); diff --git a/src/shared/generator.c b/src/shared/generator.c index a419fa4e187..603e969436e 100644 --- a/src/shared/generator.c +++ b/src/shared/generator.c @@ -109,13 +109,9 @@ int generator_add_symlink_full( * * If is specified, then must be a template unit name, and we'll instantiate it. */ - r = path_extract_directory(src, &dn); - if (r < 0 && r != -EDESTADDRREQ) /* EDESTADDRREQ → just a file name was passed */ - return log_error_errno(r, "Failed to extract directory name from '%s': %m", src); - - r = path_extract_filename(src, &fn); + r = path_split_prefix_filename(src, &dn, &fn); if (r < 0) - return log_error_errno(r, "Failed to extract file name from '%s': %m", src); + return log_error_errno(r, "Failed to split '%s' into directory prefix and filename: %m", src); if (r == O_DIRECTORY) return log_error_errno(SYNTHETIC_ERRNO(EISDIR), "Expected path to regular file name, but got '%s', refusing.", src); diff --git a/src/shared/unit-file.c b/src/shared/unit-file.c index c5f35dba169..f056b679a9c 100644 --- a/src/shared/unit-file.c +++ b/src/shared/unit-file.c @@ -291,17 +291,15 @@ int unit_file_resolve_symlink( dir, dir ? "/" : "", filename); if (!dir) { - r = path_extract_directory(filename, &_dir); - if (r < 0) - return r; - dir = _dir; - - r = path_extract_filename(filename, &_filename); + r = path_split_prefix_filename(filename, &_dir, &_filename); if (r < 0) return r; if (r == O_DIRECTORY) return log_warning_errno(SYNTHETIC_ERRNO(EISDIR), "Unexpected path to a directory \"%s\", refusing.", filename); + + /* We validate that the path is absolute above, hence dir must be extractable. */ + dir = ASSERT_PTR(_dir); filename = _filename; }