1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
use crate::{imp, io}; use imp::fs::{FdFlags, OFlags}; use io_lifetimes::{AsFd, OwnedFd}; /// `fcntl(fd, F_GETFD)`—Returns a file descriptor's flags. /// /// # References /// - [POSIX] /// - [Linux] /// /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/fcntl.html /// [Linux]: https://man7.org/linux/man-pages/man2/fcntl.2.html #[inline] pub fn fcntl_getfd<Fd: AsFd>(fd: &Fd) -> io::Result<FdFlags> { let fd = fd.as_fd(); imp::syscalls::fcntl_getfd(fd) } /// `fcntl(fd, F_SETFD, flags)`—Sets a file descriptor's flags. /// /// # References /// - [POSIX] /// - [Linux] /// /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/fcntl.html /// [Linux]: https://man7.org/linux/man-pages/man2/fcntl.2.html #[inline] pub fn fcntl_setfd<Fd: AsFd>(fd: &Fd, flags: FdFlags) -> io::Result<()> { let fd = fd.as_fd(); imp::syscalls::fcntl_setfd(fd, flags) } /// `fcntl(fd, F_GETFL)`—Returns a file descriptor's access mode and status. /// /// # References /// - [POSIX] /// - [Linux] /// /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/fcntl.html /// [Linux]: https://man7.org/linux/man-pages/man2/fcntl.2.html #[inline] pub fn fcntl_getfl<Fd: AsFd>(fd: &Fd) -> io::Result<OFlags> { let fd = fd.as_fd(); imp::syscalls::fcntl_getfl(fd) } /// `fcntl(fd, F_SETFL, flags)`—Sets a file descriptor's status. /// /// # References /// - [POSIX] /// - [Linux] /// /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/fcntl.html /// [Linux]: https://man7.org/linux/man-pages/man2/fcntl.2.html #[inline] pub fn fcntl_setfl<Fd: AsFd>(fd: &Fd, flags: OFlags) -> io::Result<()> { let fd = fd.as_fd(); imp::syscalls::fcntl_setfl(fd, flags) } /// `fcntl(fd, F_GET_SEALS)` /// /// # References /// - [Linux] /// /// [Linux]: https://man7.org/linux/man-pages/man2/fcntl.2.html #[cfg(any( linux_raw, all( libc, not(any( target_os = "freebsd", target_os = "ios", target_os = "macos", target_os = "netbsd", target_os = "openbsd", target_os = "redox", target_os = "wasi", )) ) ))] #[inline] pub fn fcntl_get_seals<Fd: AsFd>(fd: &Fd) -> io::Result<u32> { let fd = fd.as_fd(); imp::syscalls::fcntl_get_seals(fd) } /// `fcntl(fd, F_DUPFD_CLOEXEC)`—Creates a new `OwnedFd` instance that has /// `O_CLOEXEC` set and that shares the same underlying [file description] as /// `fd`. /// /// POSIX guarantees that `F_DUPFD_CLOEXEC` will use the lowest unused file /// descriptor, however it is not safe in general to rely on this, as file /// descriptors may be unexpectedly allocated on other threads or in libraries. /// /// # References /// - [POSIX] /// - [Linux] /// /// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/fcntl.html /// [Linux]: https://man7.org/linux/man-pages/man2/fcntl.2.html #[cfg(not(target_os = "wasi"))] #[inline] pub fn fcntl_dupfd_cloexec<Fd: AsFd>(fd: &Fd) -> io::Result<OwnedFd> { let fd = fd.as_fd(); imp::syscalls::fcntl_dupfd_cloexec(fd) }