1 //! The Unix `fcntl` function is effectively lots of different functions hidden 2 //! behind a single dynamic dispatch interface. In order to provide a type-safe 3 //! API, rustix makes them all separate functions so that they can have 4 //! dedicated static type signatures. 5 //! 6 //! `fcntl` functions which are not specific to files or directories live in 7 //! 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 /// - [Apple] 22 /// - [FreeBSD] 23 /// - [NetBSD] 24 /// - [OpenBSD] 25 /// - [DragonFly BSD] 26 /// - [illumos] 27 /// - [glibc] 28 /// 29 /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/fcntl.html 30 /// [Linux]: https://man7.org/linux/man-pages/man2/fcntl.2.html 31 /// [Apple]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/fcntl.2.html 32 /// [FreeBSD]: https://man.freebsd.org/cgi/man.cgi?query=fcntl&sektion=2 33 /// [NetBSD]: https://man.netbsd.org/fcntl.2 34 /// [OpenBSD]: https://man.openbsd.org/fcntl.2 35 /// [DragonFly BSD]: https://man.dragonflybsd.org/?command=fcntl§ion=2 36 /// [illumos]: https://illumos.org/man/2/fcntl 37 /// [glibc]: https://www.gnu.org/software/libc/manual/html_node/Control-Operations.html#index-fcntl-function 38 #[inline] 39 #[doc(alias = "F_GETFD")] fcntl_getfd<Fd: AsFd>(fd: Fd) -> io::Result<FdFlags>40 pub fn fcntl_getfd<Fd: AsFd>(fd: Fd) -> io::Result<FdFlags> { 41 backend::io::syscalls::fcntl_getfd(fd.as_fd()) 42 } 43 44 /// `fcntl(fd, F_SETFD, flags)`—Sets a file descriptor's flags. 45 /// 46 /// # References 47 /// - [POSIX] 48 /// - [Linux] 49 /// - [Apple] 50 /// - [FreeBSD] 51 /// - [NetBSD] 52 /// - [OpenBSD] 53 /// - [DragonFly BSD] 54 /// - [illumos] 55 /// - [glibc] 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 /// [Apple]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/fcntl.2.html 60 /// [FreeBSD]: https://man.freebsd.org/cgi/man.cgi?query=fcntl&sektion=2 61 /// [NetBSD]: https://man.netbsd.org/fcntl.2 62 /// [OpenBSD]: https://man.openbsd.org/fcntl.2 63 /// [DragonFly BSD]: https://man.dragonflybsd.org/?command=fcntl§ion=2 64 /// [illumos]: https://illumos.org/man/2/fcntl 65 /// [glibc]: https://www.gnu.org/software/libc/manual/html_node/Control-Operations.html#index-fcntl-function 66 #[inline] 67 #[doc(alias = "F_SETFD")] fcntl_setfd<Fd: AsFd>(fd: Fd, flags: FdFlags) -> io::Result<()>68 pub fn fcntl_setfd<Fd: AsFd>(fd: Fd, flags: FdFlags) -> io::Result<()> { 69 backend::io::syscalls::fcntl_setfd(fd.as_fd(), flags) 70 } 71 72 /// `fcntl(fd, F_DUPFD_CLOEXEC)`—Creates a new `OwnedFd` instance, with value 73 /// at least `min`, that has `O_CLOEXEC` set and that shares the same 74 /// underlying [file description] as `fd`. 75 /// 76 /// POSIX guarantees that `F_DUPFD_CLOEXEC` will use the lowest unused file 77 /// descriptor which is at least `min`, however it is not safe in general to 78 /// rely on this, as file descriptors may be unexpectedly allocated on other 79 /// threads or in libraries. 80 /// 81 /// # References 82 /// - [POSIX] 83 /// - [Linux] 84 /// - [Apple] 85 /// - [FreeBSD] 86 /// - [NetBSD] 87 /// - [OpenBSD] 88 /// - [DragonFly BSD] 89 /// - [illumos] 90 /// - [glibc] 91 /// 92 /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/fcntl.html 93 /// [Linux]: https://man7.org/linux/man-pages/man2/fcntl.2.html 94 /// [Apple]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/fcntl.2.html 95 /// [FreeBSD]: https://man.freebsd.org/cgi/man.cgi?query=fcntl&sektion=2 96 /// [NetBSD]: https://man.netbsd.org/fcntl.2 97 /// [OpenBSD]: https://man.openbsd.org/fcntl.2 98 /// [DragonFly BSD]: https://man.dragonflybsd.org/?command=fcntl§ion=2 99 /// [illumos]: https://illumos.org/man/2/fcntl 100 /// [glibc]: https://www.gnu.org/software/libc/manual/html_node/Control-Operations.html#index-fcntl-function 101 #[cfg(not(any(target_os = "espidf", target_os = "wasi")))] 102 #[inline] 103 #[doc(alias = "F_DUPFD_CLOEXEC")] fcntl_dupfd_cloexec<Fd: AsFd>(fd: Fd, min: RawFd) -> io::Result<OwnedFd>104 pub fn fcntl_dupfd_cloexec<Fd: AsFd>(fd: Fd, min: RawFd) -> io::Result<OwnedFd> { 105 backend::io::syscalls::fcntl_dupfd_cloexec(fd.as_fd(), min) 106 } 107 108 /// `fcntl(fd, F_DUPFD)`—Creates a new `OwnedFd` instance, with value at 109 /// least `min`, that shares the same underlying [file description] as `fd`. 110 /// 111 /// POSIX guarantees that `F_DUPFD` will use the lowest unused file descriptor 112 /// which is at least `min`, however it is not safe in general to rely on this, 113 /// as file descriptors may be unexpectedly allocated on other threads or in 114 /// libraries. 115 /// 116 /// # References 117 /// - [POSIX] 118 /// - [Linux] 119 /// - [Apple] 120 /// - [FreeBSD] 121 /// - [NetBSD] 122 /// - [OpenBSD] 123 /// - [DragonFly BSD] 124 /// - [illumos] 125 /// - [glibc] 126 /// 127 /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/fcntl.html 128 /// [Linux]: https://man7.org/linux/man-pages/man2/fcntl.2.html 129 /// [Apple]: https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/fcntl.2.html 130 /// [FreeBSD]: https://man.freebsd.org/cgi/man.cgi?query=fcntl&sektion=2 131 /// [NetBSD]: https://man.netbsd.org/fcntl.2 132 /// [OpenBSD]: https://man.openbsd.org/fcntl.2 133 /// [DragonFly BSD]: https://man.dragonflybsd.org/?command=fcntl§ion=2 134 /// [illumos]: https://illumos.org/man/2/fcntl 135 /// [glibc]: https://www.gnu.org/software/libc/manual/html_node/Control-Operations.html#index-fcntl-function 136 #[cfg(target_os = "espidf")] 137 #[inline] 138 #[doc(alias = "F_DUPFD")] fcntl_dupfd<Fd: AsFd>(fd: Fd, min: RawFd) -> io::Result<OwnedFd>139 pub fn fcntl_dupfd<Fd: AsFd>(fd: Fd, min: RawFd) -> io::Result<OwnedFd> { 140 backend::io::syscalls::fcntl_dupfd(fd.as_fd(), min) 141 } 142