linux_api/
fcntl.rs

1use num_enum::{IntoPrimitive, TryFromPrimitive};
2
3use crate::{bindings, const_conversions};
4
5bitflags::bitflags! {
6    /// Open flags, as used e.g. with `open`.
7    #[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/// fcntl commands, as used with `fcntl`.
35#[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/// Owner, as used with [`FcntlCommand::F_SETOWN_EX`] and [`FcntlCommand::F_GETOWN_EX`]
75#[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/// Lease type, as used with [`FcntlCommand::F_SETLEASE`]
85#[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/// Seal type, as used with [`FcntlCommand::F_ADD_SEALS`] and [`FcntlCommand::F_GET_SEALS`].
97#[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/// Read-write hint, as used with [`FcntlCommand::F_GET_RW_HINT`] and [`FcntlCommand::F_SET_RW_HINT`].
110#[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    /// Descriptor flags, as used with [`FcntlCommand::F_GETFL`] and [`FcntlCommand::F_SETFL`].
124    #[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    /// Returns a tuple of the `DescriptorFlags` and any remaining flags.
140    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    /// flags for execveat.
155    #[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}