1 module during.openat2;
2 
3 /**
4  * Arguments for how `openat2(2)` should open the target path. If only `flags` and `mode` are
5  * non-zero, then `openat2(2)`` operates very similarly to openat(2).
6  *
7  * However, unlike openat(2), unknown or invalid bits in @flags result in `-EINVAL` rather than
8  * being silently ignored. @mode must be zero unless one of `O_CREAT`, `O_TMPFILE` are set.
9  */
10 struct OpenHow
11 {
12     ulong flags;        /// O_* flags
13     ulong mode;         /// O_CREAT/O_TMPFILE file mode
14     Resolve resolve;    /// Resolve flags
15 }
16 
17 /// Resolve flags
18 enum Resolve : ulong
19 {
20     /// Block mount-point crossings (includes bind-mounts).
21     RESOLVE_NO_XDEV = 0x01,
22     /// Block traversal through procfs-style "magic-links".
23     RESOLVE_NO_MAGICLINKS = 0x02,
24     /// Block traversal through all symlinks (implies OEXT_NO_MAGICLINKS)
25     RESOLVE_NO_SYMLINKS = 0x04,
26     /// Block "lexical" trickery like "..", symlinks, and absolute paths which escape the dirfd.
27     RESOLVE_BENEATH = 0x08,
28     /// Make all jumps to "/" and ".." be scoped inside the dirfd (similar to chroot(2)).
29     RESOLVE_IN_ROOT = 0x10
30 }