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 //! `fcntl` functions which are not specific to files or directories live
7 //! in the [`io`] module instead.
8 //!
9 //! [`io`]: crate::io
10
11 use crate::{backend, io};
12 use backend::fd::{AsFd, OwnedFd, RawFd};
13
14 pub use backend::io::types::FdFlags;
15
16 /// `fcntl(fd, F_GETFD)`—Returns a file descriptor's flags.
17 ///
18 /// # References
19 /// - [POSIX]
20 /// - [Linux]
21 ///
22 /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/fcntl.html
23 /// [Linux]: https://man7.org/linux/man-pages/man2/fcntl.2.html
24 #[inline]
25 #[doc(alias = "F_GETFD")]
fcntl_getfd<Fd: AsFd>(fd: Fd) -> io::Result<FdFlags>26 pub fn fcntl_getfd<Fd: AsFd>(fd: Fd) -> io::Result<FdFlags> {
27 backend::io::syscalls::fcntl_getfd(fd.as_fd())
28 }
29
30 /// `fcntl(fd, F_SETFD, flags)`—Sets a file descriptor's flags.
31 ///
32 /// # References
33 /// - [POSIX]
34 /// - [Linux]
35 ///
36 /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/fcntl.html
37 /// [Linux]: https://man7.org/linux/man-pages/man2/fcntl.2.html
38 #[inline]
39 #[doc(alias = "F_SETFD")]
fcntl_setfd<Fd: AsFd>(fd: Fd, flags: FdFlags) -> io::Result<()>40 pub fn fcntl_setfd<Fd: AsFd>(fd: Fd, flags: FdFlags) -> io::Result<()> {
41 backend::io::syscalls::fcntl_setfd(fd.as_fd(), flags)
42 }
43
44 /// `fcntl(fd, F_DUPFD_CLOEXEC)`—Creates a new `OwnedFd` instance, with value
45 /// at least `min`, that has `O_CLOEXEC` set and that shares the same
46 /// underlying [file description] as `fd`.
47 ///
48 /// POSIX guarantees that `F_DUPFD_CLOEXEC` will use the lowest unused file
49 /// descriptor which is at least `min`, however it is not safe in general to
50 /// rely on this, as file descriptors may be unexpectedly allocated on other
51 /// threads or in libraries.
52 ///
53 /// # References
54 /// - [POSIX]
55 /// - [Linux]
56 ///
57 /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/fcntl.html
58 /// [Linux]: https://man7.org/linux/man-pages/man2/fcntl.2.html
59 #[cfg(not(any(target_os = "wasi", target_os = "espidf")))]
60 #[inline]
61 #[doc(alias = "F_DUPFD_CLOEXEC")]
fcntl_dupfd_cloexec<Fd: AsFd>(fd: Fd, min: RawFd) -> io::Result<OwnedFd>62 pub fn fcntl_dupfd_cloexec<Fd: AsFd>(fd: Fd, min: RawFd) -> io::Result<OwnedFd> {
63 backend::io::syscalls::fcntl_dupfd_cloexec(fd.as_fd(), min)
64 }
65
66 /// `fcntl(fd, F_DUPFD)`—Creates a new `OwnedFd` instance, with value at least
67 /// `min`, that shares the same underlying [file description] as `fd`.
68 ///
69 /// POSIX guarantees that `F_DUPFD` will use the lowest unused file descriptor
70 /// which is at least `min`, however it is not safe in general to rely on this,
71 /// as file descriptors may be unexpectedly allocated on other threads or in
72 /// libraries.
73 ///
74 /// # References
75 /// - [POSIX]
76 /// - [Linux]
77 ///
78 /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/fcntl.html
79 /// [Linux]: https://man7.org/linux/man-pages/man2/fcntl.2.html
80 #[cfg(target_os = "espidf")]
81 #[inline]
82 #[doc(alias = "F_DUPFD")]
fcntl_dupfd<Fd: AsFd>(fd: Fd, min: RawFd) -> io::Result<OwnedFd>83 pub fn fcntl_dupfd<Fd: AsFd>(fd: Fd, min: RawFd) -> io::Result<OwnedFd> {
84 backend::io::syscalls::fcntl_dupfd(fd.as_fd(), min)
85 }
86