1 //! The Unix `fcntl` function is effectively lots of different functions
2 //! hidden behind a single dynamic dispatch interface. In order to provide
3 //! a type-safe API, rustix makes them all separate functions so that they
4 //! can have dedicated static type signatures.
5
6 use crate::{backend, io};
7 use backend::fd::AsFd;
8 use backend::fs::types::OFlags;
9
10 // These `fcntl` functions like in the `io` module because they're not specific
11 // to files, directories, or memfd objects. We re-export them here in the `fs`
12 // module because the other the `fcntl` functions are here.
13 #[cfg(not(target_os = "wasi"))]
14 pub use crate::io::fcntl_dupfd_cloexec;
15 pub use crate::io::{fcntl_getfd, fcntl_setfd};
16
17 /// `fcntl(fd, F_GETFL)`—Returns a file descriptor's access mode and status.
18 ///
19 /// # References
20 /// - [POSIX]
21 /// - [Linux]
22 ///
23 /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/fcntl.html
24 /// [Linux]: https://man7.org/linux/man-pages/man2/fcntl.2.html
25 #[inline]
26 #[doc(alias = "F_GETFL")]
fcntl_getfl<Fd: AsFd>(fd: Fd) -> io::Result<OFlags>27 pub fn fcntl_getfl<Fd: AsFd>(fd: Fd) -> io::Result<OFlags> {
28 backend::fs::syscalls::fcntl_getfl(fd.as_fd())
29 }
30
31 /// `fcntl(fd, F_SETFL, flags)`—Sets a file descriptor's status.
32 ///
33 /// # References
34 /// - [POSIX]
35 /// - [Linux]
36 ///
37 /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/fcntl.html
38 /// [Linux]: https://man7.org/linux/man-pages/man2/fcntl.2.html
39 #[inline]
40 #[doc(alias = "F_SETFL")]
fcntl_setfl<Fd: AsFd>(fd: Fd, flags: OFlags) -> io::Result<()>41 pub fn fcntl_setfl<Fd: AsFd>(fd: Fd, flags: OFlags) -> io::Result<()> {
42 backend::fs::syscalls::fcntl_setfl(fd.as_fd(), flags)
43 }
44
45 /// `fcntl(fd, F_GET_SEALS)`
46 ///
47 /// # References
48 /// - [Linux]
49 ///
50 /// [Linux]: https://man7.org/linux/man-pages/man2/fcntl.2.html
51 #[cfg(any(
52 target_os = "android",
53 target_os = "freebsd",
54 target_os = "fuchsia",
55 target_os = "linux",
56 ))]
57 #[inline]
58 #[doc(alias = "F_GET_SEALS")]
fcntl_get_seals<Fd: AsFd>(fd: Fd) -> io::Result<SealFlags>59 pub fn fcntl_get_seals<Fd: AsFd>(fd: Fd) -> io::Result<SealFlags> {
60 backend::fs::syscalls::fcntl_get_seals(fd.as_fd())
61 }
62
63 #[cfg(any(
64 target_os = "android",
65 target_os = "freebsd",
66 target_os = "fuchsia",
67 target_os = "linux",
68 ))]
69 pub use backend::fs::types::SealFlags;
70
71 /// `fcntl(fd, F_ADD_SEALS)`
72 ///
73 /// # References
74 /// - [Linux]
75 ///
76 /// [Linux]: https://man7.org/linux/man-pages/man2/fcntl.2.html
77 #[cfg(any(
78 target_os = "android",
79 target_os = "freebsd",
80 target_os = "fuchsia",
81 target_os = "linux",
82 ))]
83 #[inline]
84 #[doc(alias = "F_ADD_SEALS")]
fcntl_add_seals<Fd: AsFd>(fd: Fd, seals: SealFlags) -> io::Result<()>85 pub fn fcntl_add_seals<Fd: AsFd>(fd: Fd, seals: SealFlags) -> io::Result<()> {
86 backend::fs::syscalls::fcntl_add_seals(fd.as_fd(), seals)
87 }
88