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}
73
74#[derive(Debug, Copy, Clone, Eq, PartialEq, IntoPrimitive, TryFromPrimitive)]
76#[repr(u32)]
77#[allow(non_camel_case_types)]
78pub enum FcntlOwner {
79 F_OWNER_TID = bindings::LINUX_F_OWNER_TID,
80 F_OWNER_PID = bindings::LINUX_F_OWNER_PID,
81 F_OWNER_PGRP = bindings::LINUX_F_OWNER_PGRP,
82}
83
84#[derive(Debug, Copy, Clone, Eq, PartialEq, IntoPrimitive, TryFromPrimitive)]
86#[repr(u32)]
87#[allow(non_camel_case_types)]
88pub enum FcntlLeaseType {
89 F_RDLCK = bindings::LINUX_F_RDLCK,
90 F_WRLCK = bindings::LINUX_F_WRLCK,
91 F_UNLCK = bindings::LINUX_F_UNLCK,
92 F_EXLCK = bindings::LINUX_F_EXLCK,
93 F_SHLCK = bindings::LINUX_F_SHLCK,
94}
95
96#[derive(Debug, Copy, Clone, Eq, PartialEq, IntoPrimitive, TryFromPrimitive)]
98#[repr(u32)]
99#[allow(non_camel_case_types)]
100pub enum FcntlSealType {
101 F_SEAL_SEAL = bindings::LINUX_F_SEAL_SEAL,
102 F_SEAL_SHRINK = bindings::LINUX_F_SEAL_SHRINK,
103 F_SEAL_GROW = bindings::LINUX_F_SEAL_GROW,
104 F_SEAL_WRITE = bindings::LINUX_F_SEAL_WRITE,
105 F_SEAL_FUTURE_WRITE = bindings::LINUX_F_SEAL_FUTURE_WRITE,
106 F_SEAL_EXEC = bindings::LINUX_F_SEAL_EXEC,
107}
108
109#[derive(Debug, Copy, Clone, Eq, PartialEq, IntoPrimitive, TryFromPrimitive)]
111#[repr(u32)]
112#[allow(non_camel_case_types)]
113pub enum FcntlRwHint {
114 RWH_WRITE_LIFE_NOT_SET = bindings::LINUX_RWH_WRITE_LIFE_NOT_SET,
115 RWH_WRITE_LIFE_NONE = bindings::LINUX_RWH_WRITE_LIFE_NONE,
116 RWH_WRITE_LIFE_SHORT = bindings::LINUX_RWH_WRITE_LIFE_SHORT,
117 RWH_WRITE_LIFE_MEDIUM = bindings::LINUX_RWH_WRITE_LIFE_MEDIUM,
118 RWH_WRITE_LIFE_LONG = bindings::LINUX_RWH_WRITE_LIFE_LONG,
119 RWH_WRITE_LIFE_EXTREME = bindings::LINUX_RWH_WRITE_LIFE_EXTREME,
120}
121
122bitflags::bitflags! {
123 #[derive(Copy, Clone, Debug, Default, Eq, PartialEq)]
125 pub struct DescriptorFlags: i32 {
126 const FD_CLOEXEC = const_conversions::i32_from_u32(bindings::LINUX_FD_CLOEXEC);
127 }
128}
129
130impl DescriptorFlags {
131 pub fn as_o_flags(&self) -> OFlag {
132 let mut flags = OFlag::empty();
133 if self.contains(Self::FD_CLOEXEC) {
134 flags.insert(OFlag::O_CLOEXEC);
135 }
136 flags
137 }
138
139 pub fn from_o_flags(flags: OFlag) -> (Self, OFlag) {
141 let mut remaining = flags;
142 let mut flags = Self::empty();
143
144 if remaining.contains(OFlag::O_CLOEXEC) {
145 remaining.remove(OFlag::O_CLOEXEC);
146 flags.insert(Self::FD_CLOEXEC);
147 }
148
149 (flags, remaining)
150 }
151}
152
153bitflags::bitflags! {
154 #[derive(Copy, Clone, Debug, Default, Eq, PartialEq)]
156 pub struct ExecveAtFlags: i32 {
157 const AT_EMPTY_PATH = const_conversions::i32_from_u32(bindings::LINUX_AT_EMPTY_PATH);
158 const AT_SYMLINK_NOFOLLOW = const_conversions::i32_from_u32(bindings::LINUX_AT_SYMLINK_NOFOLLOW);
159 }
160}