chase-symlinks: new chase_symlinks_and_unlink()

This commit is contained in:
Ludwig Nussel
2023-01-19 14:11:12 +01:00
parent 48e582d7fe
commit 1132fd73b3
3 changed files with 47 additions and 0 deletions
+39
View File
@@ -689,3 +689,42 @@ int chase_symlinks_and_fopen_unlocked(
return 0;
}
int chase_symlinks_and_unlink(
const char *path,
const char *root,
ChaseSymlinksFlags chase_flags,
int unlink_flags,
char **ret_path) {
_cleanup_free_ char *p = NULL, *rp = NULL, *dir = NULL, *fname = NULL;
_cleanup_close_ int fd = -1;
int r;
assert(path);
r = path_extract_directory(path, &dir);
if (r < 0)
return r;
r = path_extract_filename(path, &fname);
if (r < 0)
return r;
fd = chase_symlinks_and_open(dir, root, chase_flags, O_PATH|O_DIRECTORY|O_CLOEXEC, ret_path ? &p : NULL);
if (fd < 0)
return fd;
if (p) {
rp = path_join(p, fname);
if (!rp)
return -ENOMEM;
}
if (unlinkat(fd, fname, unlink_flags) < 0)
return -errno;
if (ret_path)
*ret_path = TAKE_PTR(rp);
return 0;
}
+1
View File
@@ -34,5 +34,6 @@ int chase_symlinks_and_opendir(const char *path, const char *root, ChaseSymlinks
int chase_symlinks_and_stat(const char *path, const char *root, ChaseSymlinksFlags chase_flags, char **ret_path, struct stat *ret_stat, int *ret_fd);
int chase_symlinks_and_access(const char *path, const char *root, ChaseSymlinksFlags chase_flags, int access_mode, char **ret_path, int *ret_fd);
int chase_symlinks_and_fopen_unlocked(const char *path, const char *root, ChaseSymlinksFlags chase_flags, const char *open_flags, char **ret_path, FILE **ret_file);
int chase_symlinks_and_unlink(const char *path, const char *root, ChaseSymlinksFlags chase_flags, int unlink_flags, char **ret_path);
int chase_symlinks_at(int dir_fd, const char *path, ChaseSymlinksFlags flags, char **ret_path, int *ret_fd);