• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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