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;
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));
}
int partition_node_of(const char *node, unsigned nr, char **ret) {
+ _cleanup_free_ char *fn = NULL, *dn = NULL;
int r;
assert(node);
/* 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 */
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 {
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);
*
* If <instance> is specified, then <src> 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);
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;
}