1use num_enum::{IntoPrimitive, TryFromPrimitive};
2
3use crate::{bindings, const_conversions};
4
5bitflags::bitflags! {
6 #[derive(Copy, Clone, Debug, Default, Eq, PartialEq)]
8 pub struct OFlag: i32 {
9 const O_ACCMODE = const_conversions::i32_from_u32(bindings::LINUX_O_ACCMODE);
10 const O_RDONLY = const_conversions::i32_from_u32(bindings::LINUX_O_RDONLY);
11 const O_WRONLY = const_conversions::i32_from_u32(bindings::LINUX_O_WRONLY);
12 const O_RDWR = const_conversions::i32_from_u32(bindings::LINUX_O_RDWR);
13 const O_CREAT = const_conversions::i32_from_u32(bindings::LINUX_O_CREAT);
14 const O_EXCL = const_conversions::i32_from_u32(bindings::LINUX_O_EXCL);
15 const O_NOCTTY = const_conversions::i32_from_u32(bindings::LINUX_O_NOCTTY);
16 const O_TRUNC = const_conversions::i32_from_u32(bindings::LINUX_O_TRUNC);
17 const O_APPEND = const_conversions::i32_from_u32(bindings::LINUX_O_APPEND);
18 const O_NONBLOCK = const_conversions::i32_from_u32(bindings::LINUX_O_NONBLOCK);
19 const O_DSYNC = const_conversions::i32_from_u32(bindings::LINUX_O_DSYNC);
20 const O_DIRECT = const_conversions::i32_from_u32(bindings::LINUX_O_DIRECT);
21 const O_LARGEFILE = const_conversions::i32_from_u32(bindings::LINUX_O_LARGEFILE);
22 const O_DIRECTORY = const_conversions::i32_from_u32(bindings::LINUX_O_DIRECTORY);
23 const O_NOFOLLOW = const_conversions::i32_from_u32(bindings::LINUX_O_NOFOLLOW);
24 const O_NOATIME = const_conversions::i32_from_u32(bindings::LINUX_O_NOATIME);
25 const O_CLOEXEC = const_conversions::i32_from_u32(bindings::LINUX_O_CLOEXEC);
26 const O_SYNC = const_conversions::i32_from_u32(bindings::LINUX_O_SYNC);
27 const O_PATH = const_conversions::i32_from_u32(bindings::LINUX_O_PATH);
28 const O_TMPFILE = const_conversions::i32_from_u32(bindings::LINUX_O_TMPFILE);
29 const O_NDELAY = const_conversions::i32_from_u32(bindings::LINUX_O_NDELAY);
30 const O_ASYNC = const_conversions::i32_from_u32(bindings::LINUX_FASYNC);
31 }
32}
33
34#[derive(Debug, Copy, Clone, Eq, PartialEq, IntoPrimitive, TryFromPrimitive)]
36#[repr(u32)]
37#[allow(non_camel_case_types)]
38pub enum FcntlCommand {
39 F_DUPFD = bindings::LINUX_F_DUPFD,
40 F_GETFD = bindings::LINUX_F_GETFD,
41 F_SETFD = bindings::LINUX_F_SETFD,
42 F_GETFL = bindings::LINUX_F_GETFL,
43 F_SETFL = bindings::LINUX_F_SETFL,
44 F_GETLK = bindings::LINUX_F_GETLK,
45 F_SETLK = bindings::LINUX_F_SETLK,
46 F_SETLKW = bindings::LINUX_F_SETLKW,
47 F_SETOWN = bindings::LINUX_F_SETOWN,
48 F_GETOWN = bindings::LINUX_F_GETOWN,
49 F_SETSIG = bindings::LINUX_F_SETSIG,
50 F_GETSIG = bindings::LINUX_F_GETSIG,
51 F_SETOWN_EX = bindings::LINUX_F_SETOWN_EX,
52 F_GETOWN_EX = bindings::LINUX_F_GETOWN_EX,
53 F_GETOWNER_UIDS = bindings::LINUX_F_GETOWNER_UIDS,
54 F_OFD_GETLK = bindings::LINUX_F_OFD_GETLK,
55 F_OFD_SETLK = bindings::LINUX_F_OFD_SETLK,
56 F_OFD_SETLKW = bindings::LINUX_F_OFD_SETLKW,
57 F_SETLEASE = bindings::LINUX_F_SETLEASE,
58 F_GETLEASE = bindings::LINUX_F_GETLEASE,
59 F_NOTIFY = bindings::LINUX_F_NOTIFY,
60 F_DUPFD_QUERY = bindings::LINUX_F_DUPFD_QUERY,
61 F_CREATED_QUERY = bindings::LINUX_F_CREATED_QUERY,
62 F_DUPFD_CLOEXEC = bindings::LINUX_F_DUPFD_CLOEXEC,
63 F_SETPIPE_SZ = bindings::LINUX_F_SETPIPE_SZ,
64 F_GETPIPE_SZ = bindings::LINUX_F_GETPIPE_SZ,
65 F_ADD_SEALS = bindings::LINUX_F_ADD_SEALS,
66 F_GET_SEALS = bindings::LINUX_F_GET_SEALS,
67 F_CANCELLK = bindings::LINUX_F_CANCELLK,
68 F_GET_RW_HINT = bindings::LINUX_F_GET_RW_HINT,
69 F_SET_RW_HINT = bindings::LINUX_F_SET_RW_HINT,
70 F_GET_FILE_RW_HINT = bindings::LINUX_F_GET_FILE_RW_HINT,
71 F_SET_FILE_RW_HINT = bindings::LINUX_F_SET_FILE_RW_HINT,
72 F_GETDELEG = bindings::LINUX_F_GETDELEG,
73 F_SETDELEG = bindings::LINUX_F_SETDELEG,
74}
75
76#[derive(Debug, Copy, Clone, Eq, PartialEq, IntoPrimitive, TryFromPrimitive)]
78#[repr(u32)]
79#[allow(non_camel_case_types)]
80pub enum FcntlOwner {
81 F_OWNER_TID = bindings::LINUX_F_OWNER_TID,
82 F_OWNER_PID = bindings::LINUX_F_OWNER_PID,
83 F_OWNER_PGRP = bindings::LINUX_F_OWNER_PGRP,
84}
85
86#[derive(Debug, Copy, Clone, Eq, PartialEq, IntoPrimitive, TryFromPrimitive)]
88#[repr(u32)]
89#[allow(non_camel_case_types)]
90pub enum FcntlLeaseType {
91 F_RDLCK = bindings::LINUX_F_RDLCK,
92 F_WRLCK = bindings::LINUX_F_WRLCK,
93 F_UNLCK = bindings::LINUX_F_UNLCK,
94 F_EXLCK = bindings::LINUX_F_EXLCK,
95 F_SHLCK = bindings::LINUX_F_SHLCK,
96}
97
98#[derive(Debug, Copy, Clone, Eq, PartialEq, IntoPrimitive, TryFromPrimitive)]
100#[repr(u32)]
101#[allow(non_camel_case_types)]
102pub enum FcntlSealType {
103 F_SEAL_SEAL = bindings::LINUX_F_SEAL_SEAL,
104 F_SEAL_SHRINK = bindings::LINUX_F_SEAL_SHRINK,
105 F_SEAL_GROW = bindings::LINUX_F_SEAL_GROW,
106 F_SEAL_WRITE = bindings::LINUX_F_SEAL_WRITE,
107 F_SEAL_FUTURE_WRITE = bindings::LINUX_F_SEAL_FUTURE_WRITE,
108 F_SEAL_EXEC = bindings::LINUX_F_SEAL_EXEC,
109}
110
111#[derive(Debug, Copy, Clone, Eq, PartialEq, IntoPrimitive, TryFromPrimitive)]
113#[repr(u32)]
114#[allow(non_camel_case_types)]
115pub enum FcntlRwHint {
116 RWH_WRITE_LIFE_NOT_SET = bindings::LINUX_RWH_WRITE_LIFE_NOT_SET,
117 RWH_WRITE_LIFE_NONE = bindings::LINUX_RWH_WRITE_LIFE_NONE,
118 RWH_WRITE_LIFE_SHORT = bindings::LINUX_RWH_WRITE_LIFE_SHORT,
119 RWH_WRITE_LIFE_MEDIUM = bindings::LINUX_RWH_WRITE_LIFE_MEDIUM,
120 RWH_WRITE_LIFE_LONG = bindings::LINUX_RWH_WRITE_LIFE_LONG,
121 RWH_WRITE_LIFE_EXTREME = bindings::LINUX_RWH_WRITE_LIFE_EXTREME,
122}
123
124bitflags::bitflags! {
125 #[derive(Copy, Clone, Debug, Default, Eq, PartialEq)]
127 pub struct DescriptorFlags: i32 {
128 const FD_CLOEXEC = const_conversions::i32_from_u32(bindings::LINUX_FD_CLOEXEC);
129 }
130}
131
132impl DescriptorFlags {
133 pub fn as_o_flags(&self) -> OFlag {
134 let mut flags = OFlag::empty();
135 if self.contains(Self::FD_CLOEXEC) {
136 flags.insert(OFlag::O_CLOEXEC);
137 }
138 flags
139 }
140
141 pub fn from_o_flags(flags: OFlag) -> (Self, OFlag) {
143 let mut remaining = flags;
144 let mut flags = Self::empty();
145
146 if remaining.contains(OFlag::O_CLOEXEC) {
147 remaining.remove(OFlag::O_CLOEXEC);
148 flags.insert(Self::FD_CLOEXEC);
149 }
150
151 (flags, remaining)
152 }
153}
154
155bitflags::bitflags! {
156 #[derive(Copy, Clone, Debug, Default, Eq, PartialEq)]
158 pub struct ExecveAtFlags: i32 {
159 const AT_EMPTY_PATH = const_conversions::i32_from_u32(bindings::LINUX_AT_EMPTY_PATH);
160 const AT_SYMLINK_NOFOLLOW = const_conversions::i32_from_u32(bindings::LINUX_AT_SYMLINK_NOFOLLOW);
161 const AT_EXECVE_CHECK = const_conversions::i32_from_u32(bindings::LINUX_AT_EXECVE_CHECK);
162 }
163}