Merge pull request #26961 from DaanDeMeyer/chase-and-pin

chase-symlinks: Add chase_and_open_parent() + at() variant
This commit is contained in:
Daan De Meyer
2023-03-27 10:41:08 +02:00
committed by GitHub
3 changed files with 61 additions and 8 deletions

View File

@@ -100,9 +100,6 @@ int chaseat(
if ((flags & CHASE_STEP))
assert(!ret_fd);
if ((flags & CHASE_EXTRACT_FILENAME))
assert(ret_path);
if (isempty(path))
path = ".";
@@ -787,6 +784,18 @@ int chase_and_unlink(
return 0;
}
int chase_and_open_parent(const char *path, const char *root, ChaseFlags chase_flags, char **ret_filename) {
int pfd, r;
assert(!(chase_flags & (CHASE_NONEXISTENT|CHASE_STEP)));
r = chase(path, root, CHASE_PARENT|CHASE_EXTRACT_FILENAME|chase_flags, ret_filename, &pfd);
if (r < 0)
return r;
return pfd;
}
int chase_and_openat(
int dir_fd,
const char *path,
@@ -1006,3 +1015,20 @@ int chase_and_unlinkat(
return 0;
}
int chase_and_open_parent_at(
int dir_fd,
const char *path,
ChaseFlags chase_flags,
char **ret_filename) {
int pfd, r;
assert(!(chase_flags & (CHASE_NONEXISTENT|CHASE_STEP)));
r = chaseat(dir_fd, path, CHASE_PARENT|CHASE_EXTRACT_FILENAME|chase_flags, ret_filename, &pfd);
if (r < 0)
return r;
return pfd;
}

View File

@@ -40,6 +40,7 @@ int chase_and_stat(const char *path, const char *root, ChaseFlags chase_flags, c
int chase_and_access(const char *path, const char *root, ChaseFlags chase_flags, int access_mode, char **ret_path);
int chase_and_fopen_unlocked(const char *path, const char *root, ChaseFlags chase_flags, const char *open_flags, char **ret_path, FILE **ret_file);
int chase_and_unlink(const char *path, const char *root, ChaseFlags chase_flags, int unlink_flags, char **ret_path);
int chase_and_open_parent(const char *path, const char *root, ChaseFlags chase_flags, char **ret_filename);
int chaseat(int dir_fd, const char *path, ChaseFlags flags, char **ret_path, int *ret_fd);
@@ -49,3 +50,5 @@ int chase_and_statat(int dir_fd, const char *path, ChaseFlags chase_flags, char
int chase_and_accessat(int dir_fd, const char *path, ChaseFlags chase_flags, int access_mode, char **ret_path);
int chase_and_fopenat_unlocked(int dir_fd, const char *path, ChaseFlags chase_flags, const char *open_flags, char **ret_path, FILE **ret_file);
int chase_and_unlinkat(int dir_fd, const char *path, ChaseFlags chase_flags, int unlink_flags, char **ret_path);
int chase_and_open_parent_at(int dir_fd, const char *path, ChaseFlags chase_flags, char **ret_filename);