assert(!(chase_flags & (CHASE_NONEXISTENT|CHASE_STEP)));
+ XOpenFlags xopen_flags = 0;
+ if (FLAGS_SET(chase_flags, CHASE_MUST_BE_DIRECTORY))
+ open_flags |= O_DIRECTORY;
+ if (FLAGS_SET(chase_flags, CHASE_MUST_BE_REGULAR))
+ xopen_flags |= XO_REGULAR;
+
if (empty_or_root(root) && !ret_path && (chase_flags & CHASE_NO_SHORTCUT_MASK) == 0)
/* Shortcut this call if none of the special features of this call are requested */
return xopenat_full(AT_FDCWD, path,
open_flags | (FLAGS_SET(chase_flags, CHASE_NOFOLLOW) ? O_NOFOLLOW : 0),
- /* xopen_flags = */ 0,
+ xopen_flags,
MODE_INVALID);
r = chase(path, root, (CHASE_PARENT|chase_flags)&~CHASE_MUST_BE_REGULAR, &p, &path_fd);
return r;
}
- r = xopenat_full(path_fd, strempty(fname), open_flags|O_NOFOLLOW, /* xopen_flags = */ 0, MODE_INVALID);
+ r = xopenat_full(path_fd, strempty(fname), open_flags|O_NOFOLLOW, xopen_flags, MODE_INVALID);
if (r < 0)
return r;
DIR *d;
int r;
- assert(!(chase_flags & (CHASE_NONEXISTENT|CHASE_STEP)));
+ assert(!(chase_flags & (CHASE_NONEXISTENT|CHASE_STEP|CHASE_MUST_BE_REGULAR)));
assert(ret_dir);
if (empty_or_root(root) && !ret_path && (chase_flags & CHASE_NO_SHORTCUT_MASK) == 0) {
return 0;
}
- r = chase(path, root, chase_flags, ret_path ? &p : NULL, &path_fd);
+ r = chase(path, root, chase_flags|CHASE_MUST_BE_DIRECTORY, ret_path ? &p : NULL, &path_fd);
if (r < 0)
return r;
assert(path_fd >= 0);
int mode_flags, r;
assert(path);
- assert(!(chase_flags & (CHASE_NONEXISTENT|CHASE_STEP|CHASE_PARENT)));
+ assert(!(chase_flags & (CHASE_NONEXISTENT|CHASE_STEP|CHASE_PARENT|CHASE_MUST_BE_DIRECTORY)));
assert(open_flags);
assert(ret_file);
assert(!(chase_flags & (CHASE_NONEXISTENT|CHASE_STEP)));
+ XOpenFlags xopen_flags = 0;
+ if (FLAGS_SET(chase_flags, CHASE_MUST_BE_DIRECTORY))
+ open_flags |= O_DIRECTORY;
+ if (FLAGS_SET(chase_flags, CHASE_MUST_BE_REGULAR))
+ xopen_flags |= XO_REGULAR;
+
if (dir_fd == AT_FDCWD && !ret_path && (chase_flags & CHASE_NO_SHORTCUT_MASK) == 0)
/* Shortcut this call if none of the special features of this call are requested */
return xopenat_full(dir_fd, path,
open_flags | (FLAGS_SET(chase_flags, CHASE_NOFOLLOW) ? O_NOFOLLOW : 0),
- /* xopen_flags = */ 0,
+ xopen_flags,
MODE_INVALID);
r = chaseat(dir_fd, path, (chase_flags|CHASE_PARENT)&~CHASE_MUST_BE_REGULAR, &p, &path_fd);
return r;
}
- r = xopenat_full(path_fd, strempty(fname), open_flags|O_NOFOLLOW, /* xopen_flags= */ 0, MODE_INVALID);
+ r = xopenat_full(
+ path_fd,
+ strempty(fname),
+ open_flags|O_NOFOLLOW,
+ xopen_flags,
+ MODE_INVALID);
if (r < 0)
return r;
DIR *d;
int r;
- assert(!(chase_flags & (CHASE_NONEXISTENT|CHASE_STEP)));
+ assert(!(chase_flags & (CHASE_NONEXISTENT|CHASE_STEP|CHASE_MUST_BE_REGULAR)));
assert(ret_dir);
if (dir_fd == AT_FDCWD && !ret_path && (chase_flags & CHASE_NO_SHORTCUT_MASK) == 0) {