diff options
Diffstat (limited to 'vendor/rustix/src/backend/libc/io')
| -rw-r--r-- | vendor/rustix/src/backend/libc/io/errno.rs | 1052 | ||||
| -rw-r--r-- | vendor/rustix/src/backend/libc/io/mod.rs | 6 | ||||
| -rw-r--r-- | vendor/rustix/src/backend/libc/io/syscalls.rs | 340 | ||||
| -rw-r--r-- | vendor/rustix/src/backend/libc/io/types.rs | 65 | ||||
| -rw-r--r-- | vendor/rustix/src/backend/libc/io/windows_syscalls.rs | 30 | 
5 files changed, 1493 insertions, 0 deletions
diff --git a/vendor/rustix/src/backend/libc/io/errno.rs b/vendor/rustix/src/backend/libc/io/errno.rs new file mode 100644 index 0000000..805ea67 --- /dev/null +++ b/vendor/rustix/src/backend/libc/io/errno.rs @@ -0,0 +1,1052 @@ +//! The `rustix` `Errno` type. +//! +//! This type holds an OS error code, which conceptually corresponds to an +//! `errno` value. + +use crate::backend::c; +use libc_errno::errno; + +/// `errno`—An error code. +/// +/// The error type for `rustix` APIs. This is similar to [`std::io::Error`], +/// but only holds an OS error code, and no extra error value. +/// +/// # References +///  - [POSIX] +///  - [Linux] +///  - [Winsock] +///  - [FreeBSD] +///  - [NetBSD] +///  - [OpenBSD] +///  - [DragonFly BSD] +///  - [illumos] +///  - [glibc] +/// +/// [POSIX]: https://pubs.opengroup.org/onlinepubs/9699919799/functions/errno.html +/// [Linux]: https://man7.org/linux/man-pages/man3/errno.3.html +/// [Winsock]: https://learn.microsoft.com/en-us/windows/win32/winsock/windows-sockets-error-codes-2 +/// [FreeBSD]: https://man.freebsd.org/cgi/man.cgi?errno +/// [NetBSD]: https://man.netbsd.org/errno.2 +/// [OpenBSD]: https://man.openbsd.org/errno.2 +/// [DragonFly BSD]: https://man.dragonflybsd.org/?command=errno§ion=2 +/// [illumos]: https://illumos.org/man/3C/errno +/// [glibc]: https://www.gnu.org/software/libc/manual/html_node/Error-Codes.html +/// [`std::io::Error`]: Result +#[repr(transparent)] +#[doc(alias = "errno")] +#[derive(Eq, PartialEq, Hash, Copy, Clone)] +pub struct Errno(pub(crate) c::c_int); + +impl Errno { +    /// `EACCES` +    #[doc(alias = "ACCES")] +    pub const ACCESS: Self = Self(c::EACCES); +    /// `EADDRINUSE` +    pub const ADDRINUSE: Self = Self(c::EADDRINUSE); +    /// `EADDRNOTAVAIL` +    pub const ADDRNOTAVAIL: Self = Self(c::EADDRNOTAVAIL); +    /// `EADV` +    #[cfg(not(any( +        bsd, +        windows, +        target_os = "aix", +        target_os = "espidf", +        target_os = "haiku", +        target_os = "hurd", +        target_os = "l4re", +        target_os = "vita", +        target_os = "wasi", +    )))] +    pub const ADV: Self = Self(c::EADV); +    /// `EAFNOSUPPORT` +    #[cfg(not(target_os = "l4re"))] +    pub const AFNOSUPPORT: Self = Self(c::EAFNOSUPPORT); +    /// `EAGAIN` +    pub const AGAIN: Self = Self(c::EAGAIN); +    /// `EALREADY` +    #[cfg(not(target_os = "l4re"))] +    pub const ALREADY: Self = Self(c::EALREADY); +    /// `EAUTH` +    #[cfg(bsd)] +    pub const AUTH: Self = Self(c::EAUTH); +    /// `EBADE` +    #[cfg(not(any( +        bsd, +        windows, +        target_os = "aix", +        target_os = "espidf", +        target_os = "haiku", +        target_os = "hurd", +        target_os = "l4re", +        target_os = "vita", +        target_os = "wasi", +    )))] +    pub const BADE: Self = Self(c::EBADE); +    /// `EBADF` +    pub const BADF: Self = Self(c::EBADF); +    /// `EBADFD` +    #[cfg(not(any( +        bsd, +        windows, +        target_os = "aix", +        target_os = "espidf", +        target_os = "haiku", +        target_os = "hurd", +        target_os = "l4re", +        target_os = "vita", +        target_os = "wasi", +    )))] +    pub const BADFD: Self = Self(c::EBADFD); +    /// `EBADMSG` +    #[cfg(not(any(windows, target_os = "l4re")))] +    pub const BADMSG: Self = Self(c::EBADMSG); +    /// `EBADR` +    #[cfg(not(any( +        bsd, +        windows, +        target_os = "aix", +        target_os = "espidf", +        target_os = "haiku", +        target_os = "hurd", +        target_os = "l4re", +        target_os = "vita", +        target_os = "wasi", +    )))] +    pub const BADR: Self = Self(c::EBADR); +    /// `EBADRPC` +    #[cfg(bsd)] +    pub const BADRPC: Self = Self(c::EBADRPC); +    /// `EBADRQC` +    #[cfg(not(any( +        bsd, +        windows, +        target_os = "aix", +        target_os = "espidf", +        target_os = "haiku", +        target_os = "hurd", +        target_os = "l4re", +        target_os = "vita", +        target_os = "wasi", +    )))] +    pub const BADRQC: Self = Self(c::EBADRQC); +    /// `EBADSLT` +    #[cfg(not(any( +        bsd, +        windows, +        target_os = "aix", +        target_os = "espidf", +        target_os = "haiku", +        target_os = "hurd", +        target_os = "l4re", +        target_os = "vita", +        target_os = "wasi", +    )))] +    pub const BADSLT: Self = Self(c::EBADSLT); +    /// `EBFONT` +    #[cfg(not(any( +        bsd, +        windows, +        target_os = "aix", +        target_os = "espidf", +        target_os = "haiku", +        target_os = "hurd", +        target_os = "l4re", +        target_os = "vita", +        target_os = "wasi", +    )))] +    pub const BFONT: Self = Self(c::EBFONT); +    /// `EBUSY` +    #[cfg(not(windows))] +    pub const BUSY: Self = Self(c::EBUSY); +    /// `ECANCELED` +    #[cfg(not(target_os = "l4re"))] +    pub const CANCELED: Self = Self(c::ECANCELED); +    /// `ECAPMODE` +    #[cfg(target_os = "freebsd")] +    pub const CAPMODE: Self = Self(c::ECAPMODE); +    /// `ECHILD` +    #[cfg(not(windows))] +    pub const CHILD: Self = Self(c::ECHILD); +    /// `ECHRNG` +    #[cfg(not(any( +        bsd, +        windows, +        target_os = "espidf", +        target_os = "haiku", +        target_os = "hurd", +        target_os = "l4re", +        target_os = "vita", +        target_os = "wasi" +    )))] +    pub const CHRNG: Self = Self(c::ECHRNG); +    /// `ECOMM` +    #[cfg(not(any( +        bsd, +        windows, +        target_os = "aix", +        target_os = "espidf", +        target_os = "haiku", +        target_os = "hurd", +        target_os = "l4re", +        target_os = "vita", +        target_os = "wasi", +    )))] +    pub const COMM: Self = Self(c::ECOMM); +    /// `ECONNABORTED` +    pub const CONNABORTED: Self = Self(c::ECONNABORTED); +    /// `ECONNREFUSED` +    pub const CONNREFUSED: Self = Self(c::ECONNREFUSED); +    /// `ECONNRESET` +    pub const CONNRESET: Self = Self(c::ECONNRESET); +    /// `EDEADLK` +    #[cfg(not(windows))] +    pub const DEADLK: Self = Self(c::EDEADLK); +    /// `EDEADLOCK` +    #[cfg(not(any( +        bsd, +        windows, +        target_os = "aix", +        target_os = "android", +        target_os = "espidf", +        target_os = "haiku", +        target_os = "hurd", +        target_os = "vita", +        target_os = "wasi", +    )))] +    pub const DEADLOCK: Self = Self(c::EDEADLOCK); +    /// `EDESTADDRREQ` +    #[cfg(not(target_os = "l4re"))] +    pub const DESTADDRREQ: Self = Self(c::EDESTADDRREQ); +    /// `EDISCON` +    #[cfg(windows)] +    pub const DISCON: Self = Self(c::EDISCON); +    /// `EDOM` +    #[cfg(not(windows))] +    pub const DOM: Self = Self(c::EDOM); +    /// `EDOOFUS` +    #[cfg(freebsdlike)] +    pub const DOOFUS: Self = Self(c::EDOOFUS); +    /// `EDOTDOT` +    #[cfg(not(any( +        bsd, +        solarish, +        windows, +        target_os = "aix", +        target_os = "espidf", +        target_os = "haiku", +        target_os = "hurd", +        target_os = "l4re", +        target_os = "nto", +        target_os = "vita", +        target_os = "wasi", +    )))] +    pub const DOTDOT: Self = Self(c::EDOTDOT); +    /// `EDQUOT` +    pub const DQUOT: Self = Self(c::EDQUOT); +    /// `EEXIST` +    #[cfg(not(windows))] +    pub const EXIST: Self = Self(c::EEXIST); +    /// `EFAULT` +    pub const FAULT: Self = Self(c::EFAULT); +    /// `EFBIG` +    #[cfg(not(windows))] +    pub const FBIG: Self = Self(c::EFBIG); +    /// `EFTYPE` +    #[cfg(any(bsd, target_env = "newlib"))] +    pub const FTYPE: Self = Self(c::EFTYPE); +    /// `EHOSTDOWN` +    #[cfg(not(any(target_os = "l4re", target_os = "wasi")))] +    pub const HOSTDOWN: Self = Self(c::EHOSTDOWN); +    /// `EHOSTUNREACH` +    pub const HOSTUNREACH: Self = Self(c::EHOSTUNREACH); +    /// `EHWPOISON` +    #[cfg(not(any( +        bsd, +        solarish, +        windows, +        target_os = "aix", +        target_os = "android", +        target_os = "espidf", +        target_os = "haiku", +        target_os = "hurd", +        target_os = "l4re", +        target_os = "nto", +        target_os = "redox", +        target_os = "vita", +        target_os = "wasi", +    )))] +    pub const HWPOISON: Self = Self(c::EHWPOISON); +    /// `EIDRM` +    #[cfg(not(any(windows, target_os = "l4re")))] +    pub const IDRM: Self = Self(c::EIDRM); +    /// `EILSEQ` +    #[cfg(not(any(windows, target_os = "l4re")))] +    pub const ILSEQ: Self = Self(c::EILSEQ); +    /// `EINPROGRESS` +    #[cfg(not(target_os = "l4re"))] +    pub const INPROGRESS: Self = Self(c::EINPROGRESS); +    /// `EINTR` +    /// +    /// For a convenient way to retry system calls that exit with `INTR`, use +    /// [`retry_on_intr`]. +    /// +    /// [`retry_on_intr`]: crate::io::retry_on_intr +    pub const INTR: Self = Self(c::EINTR); +    /// `EINVAL` +    pub const INVAL: Self = Self(c::EINVAL); +    /// `EINVALIDPROCTABLE` +    #[cfg(windows)] +    pub const INVALIDPROCTABLE: Self = Self(c::EINVALIDPROCTABLE); +    /// `EINVALIDPROVIDER` +    #[cfg(windows)] +    pub const INVALIDPROVIDER: Self = Self(c::EINVALIDPROVIDER); +    /// `EIO` +    #[cfg(not(windows))] +    pub const IO: Self = Self(c::EIO); +    /// `EISCONN` +    #[cfg(not(target_os = "l4re"))] +    pub const ISCONN: Self = Self(c::EISCONN); +    /// `EISDIR` +    #[cfg(not(windows))] +    pub const ISDIR: Self = Self(c::EISDIR); +    /// `EISNAM` +    #[cfg(not(any( +        bsd, +        solarish, +        windows, +        target_os = "aix", +        target_os = "espidf", +        target_os = "haiku", +        target_os = "hurd", +        target_os = "l4re", +        target_os = "nto", +        target_os = "vita", +        target_os = "wasi", +    )))] +    pub const ISNAM: Self = Self(c::EISNAM); +    /// `EKEYEXPIRED` +    #[cfg(not(any( +        bsd, +        solarish, +        windows, +        target_os = "aix", +        target_os = "espidf", +        target_os = "haiku", +        target_os = "hurd", +        target_os = "l4re", +        target_os = "nto", +        target_os = "vita", +        target_os = "wasi", +    )))] +    pub const KEYEXPIRED: Self = Self(c::EKEYEXPIRED); +    /// `EKEYREJECTED` +    #[cfg(not(any( +        bsd, +        solarish, +        windows, +        target_os = "aix", +        target_os = "espidf", +        target_os = "haiku", +        target_os = "hurd", +        target_os = "l4re", +        target_os = "nto", +        target_os = "vita", +        target_os = "wasi", +    )))] +    pub const KEYREJECTED: Self = Self(c::EKEYREJECTED); +    /// `EKEYREVOKED` +    #[cfg(not(any( +        bsd, +        solarish, +        windows, +        target_os = "aix", +        target_os = "espidf", +        target_os = "haiku", +        target_os = "hurd", +        target_os = "l4re", +        target_os = "nto", +        target_os = "vita", +        target_os = "wasi", +    )))] +    pub const KEYREVOKED: Self = Self(c::EKEYREVOKED); +    /// `EL2HLT` +    #[cfg(not(any( +        bsd, +        windows, +        target_os = "espidf", +        target_os = "haiku", +        target_os = "hurd", +        target_os = "l4re", +        target_os = "vita", +        target_os = "wasi" +    )))] +    pub const L2HLT: Self = Self(c::EL2HLT); +    /// `EL2NSYNC` +    #[cfg(not(any( +        bsd, +        windows, +        target_os = "espidf", +        target_os = "haiku", +        target_os = "hurd", +        target_os = "l4re", +        target_os = "vita", +        target_os = "wasi" +    )))] +    pub const L2NSYNC: Self = Self(c::EL2NSYNC); +    /// `EL3HLT` +    #[cfg(not(any( +        bsd, +        windows, +        target_os = "espidf", +        target_os = "haiku", +        target_os = "hurd", +        target_os = "l4re", +        target_os = "vita", +        target_os = "wasi" +    )))] +    pub const L3HLT: Self = Self(c::EL3HLT); +    /// `EL3RST` +    #[cfg(not(any( +        bsd, +        windows, +        target_os = "espidf", +        target_os = "haiku", +        target_os = "hurd", +        target_os = "l4re", +        target_os = "vita", +        target_os = "wasi" +    )))] +    pub const L3RST: Self = Self(c::EL3RST); +    /// `ELIBACC` +    #[cfg(not(any( +        bsd, +        windows, +        target_os = "aix", +        target_os = "espidf", +        target_os = "haiku", +        target_os = "hurd", +        target_os = "l4re", +        target_os = "vita", +        target_os = "wasi", +    )))] +    pub const LIBACC: Self = Self(c::ELIBACC); +    /// `ELIBBAD` +    #[cfg(not(any( +        bsd, +        windows, +        target_os = "aix", +        target_os = "espidf", +        target_os = "haiku", +        target_os = "hurd", +        target_os = "l4re", +        target_os = "vita", +        target_os = "wasi", +    )))] +    pub const LIBBAD: Self = Self(c::ELIBBAD); +    /// `ELIBEXEC` +    #[cfg(not(any( +        bsd, +        windows, +        target_os = "aix", +        target_os = "espidf", +        target_os = "haiku", +        target_os = "l4re", +        target_os = "vita", +        target_os = "wasi", +    )))] +    pub const LIBEXEC: Self = Self(c::ELIBEXEC); +    /// `ELIBMAX` +    #[cfg(not(any( +        bsd, +        windows, +        target_os = "aix", +        target_os = "espidf", +        target_os = "haiku", +        target_os = "hurd", +        target_os = "l4re", +        target_os = "vita", +        target_os = "wasi", +    )))] +    pub const LIBMAX: Self = Self(c::ELIBMAX); +    /// `ELIBSCN` +    #[cfg(not(any( +        bsd, +        windows, +        target_os = "aix", +        target_os = "espidf", +        target_os = "haiku", +        target_os = "hurd", +        target_os = "l4re", +        target_os = "vita", +        target_os = "wasi", +    )))] +    pub const LIBSCN: Self = Self(c::ELIBSCN); +    /// `ELNRNG` +    #[cfg(not(any( +        bsd, +        windows, +        target_os = "espidf", +        target_os = "haiku", +        target_os = "hurd", +        target_os = "l4re", +        target_os = "vita", +        target_os = "wasi" +    )))] +    pub const LNRNG: Self = Self(c::ELNRNG); +    /// `ELOOP` +    pub const LOOP: Self = Self(c::ELOOP); +    /// `EMEDIUMTYPE` +    #[cfg(not(any( +        bsd, +        solarish, +        windows, +        target_os = "aix", +        target_os = "espidf", +        target_os = "haiku", +        target_os = "hurd", +        target_os = "l4re", +        target_os = "nto", +        target_os = "vita", +        target_os = "wasi", +    )))] +    pub const MEDIUMTYPE: Self = Self(c::EMEDIUMTYPE); +    /// `EMFILE` +    pub const MFILE: Self = Self(c::EMFILE); +    /// `EMLINK` +    #[cfg(not(windows))] +    pub const MLINK: Self = Self(c::EMLINK); +    /// `EMSGSIZE` +    #[cfg(not(target_os = "l4re"))] +    pub const MSGSIZE: Self = Self(c::EMSGSIZE); +    /// `EMULTIHOP` +    #[cfg(not(any(windows, target_os = "l4re", target_os = "openbsd")))] +    pub const MULTIHOP: Self = Self(c::EMULTIHOP); +    /// `ENAMETOOLONG` +    pub const NAMETOOLONG: Self = Self(c::ENAMETOOLONG); +    /// `ENAVAIL` +    #[cfg(not(any( +        bsd, +        solarish, +        windows, +        target_os = "aix", +        target_os = "espidf", +        target_os = "haiku", +        target_os = "hurd", +        target_os = "l4re", +        target_os = "nto", +        target_os = "vita", +        target_os = "wasi", +    )))] +    pub const NAVAIL: Self = Self(c::ENAVAIL); +    /// `ENEEDAUTH` +    #[cfg(bsd)] +    pub const NEEDAUTH: Self = Self(c::ENEEDAUTH); +    /// `ENETDOWN` +    pub const NETDOWN: Self = Self(c::ENETDOWN); +    /// `ENETRESET` +    #[cfg(not(target_os = "l4re"))] +    pub const NETRESET: Self = Self(c::ENETRESET); +    /// `ENETUNREACH` +    pub const NETUNREACH: Self = Self(c::ENETUNREACH); +    /// `ENFILE` +    #[cfg(not(windows))] +    pub const NFILE: Self = Self(c::ENFILE); +    /// `ENOANO` +    #[cfg(not(any( +        bsd, +        windows, +        target_os = "aix", +        target_os = "espidf", +        target_os = "haiku", +        target_os = "hurd", +        target_os = "l4re", +        target_os = "vita", +        target_os = "wasi", +    )))] +    pub const NOANO: Self = Self(c::ENOANO); +    /// `ENOATTR` +    #[cfg(any(bsd, target_os = "haiku"))] +    pub const NOATTR: Self = Self(c::ENOATTR); +    /// `ENOBUFS` +    #[cfg(not(target_os = "l4re"))] +    pub const NOBUFS: Self = Self(c::ENOBUFS); +    /// `ENOCSI` +    #[cfg(not(any( +        bsd, +        windows, +        target_os = "espidf", +        target_os = "haiku", +        target_os = "hurd", +        target_os = "l4re", +        target_os = "vita", +        target_os = "wasi" +    )))] +    pub const NOCSI: Self = Self(c::ENOCSI); +    /// `ENODATA` +    #[cfg(not(any( +        freebsdlike, +        windows, +        target_os = "haiku", +        target_os = "openbsd", +        target_os = "wasi", +    )))] +    pub const NODATA: Self = Self(c::ENODATA); +    /// `ENODEV` +    #[cfg(not(windows))] +    pub const NODEV: Self = Self(c::ENODEV); +    /// `ENOENT` +    #[cfg(not(windows))] +    pub const NOENT: Self = Self(c::ENOENT); +    /// `ENOEXEC` +    #[cfg(not(windows))] +    pub const NOEXEC: Self = Self(c::ENOEXEC); +    /// `ENOKEY` +    #[cfg(not(any( +        solarish, +        bsd, +        windows, +        target_os = "aix", +        target_os = "espidf", +        target_os = "haiku", +        target_os = "hurd", +        target_os = "l4re", +        target_os = "nto", +        target_os = "vita", +        target_os = "wasi", +    )))] +    pub const NOKEY: Self = Self(c::ENOKEY); +    /// `ENOLCK` +    #[cfg(not(any(windows, target_os = "l4re")))] +    pub const NOLCK: Self = Self(c::ENOLCK); +    /// `ENOLINK` +    #[cfg(not(any(windows, target_os = "l4re", target_os = "openbsd")))] +    pub const NOLINK: Self = Self(c::ENOLINK); +    /// `ENOMEDIUM` +    #[cfg(not(any( +        bsd, +        solarish, +        windows, +        target_os = "aix", +        target_os = "espidf", +        target_os = "haiku", +        target_os = "hurd", +        target_os = "l4re", +        target_os = "nto", +        target_os = "vita", +        target_os = "wasi", +    )))] +    pub const NOMEDIUM: Self = Self(c::ENOMEDIUM); +    /// `ENOMEM` +    #[cfg(not(windows))] +    pub const NOMEM: Self = Self(c::ENOMEM); +    /// `ENOMORE` +    #[cfg(windows)] +    pub const NOMORE: Self = Self(c::ENOMORE); +    /// `ENOMSG` +    #[cfg(not(any(windows, target_os = "l4re")))] +    pub const NOMSG: Self = Self(c::ENOMSG); +    /// `ENONET` +    #[cfg(not(any( +        bsd, +        windows, +        target_os = "aix", +        target_os = "espidf", +        target_os = "haiku", +        target_os = "hurd", +        target_os = "l4re", +        target_os = "vita", +        target_os = "wasi", +    )))] +    pub const NONET: Self = Self(c::ENONET); +    /// `ENOPKG` +    #[cfg(not(any( +        bsd, +        windows, +        target_os = "aix", +        target_os = "espidf", +        target_os = "haiku", +        target_os = "hurd", +        target_os = "l4re", +        target_os = "vita", +        target_os = "wasi", +    )))] +    pub const NOPKG: Self = Self(c::ENOPKG); +    /// `ENOPROTOOPT` +    #[cfg(not(target_os = "l4re"))] +    pub const NOPROTOOPT: Self = Self(c::ENOPROTOOPT); +    /// `ENOSPC` +    #[cfg(not(windows))] +    pub const NOSPC: Self = Self(c::ENOSPC); +    /// `ENOSR` +    #[cfg(not(any( +        freebsdlike, +        windows, +        target_os = "haiku", +        target_os = "l4re", +        target_os = "openbsd", +        target_os = "wasi", +    )))] +    pub const NOSR: Self = Self(c::ENOSR); +    /// `ENOSTR` +    #[cfg(not(any( +        freebsdlike, +        windows, +        target_os = "haiku", +        target_os = "l4re", +        target_os = "openbsd", +        target_os = "wasi", +    )))] +    pub const NOSTR: Self = Self(c::ENOSTR); +    /// `ENOSYS` +    #[cfg(not(windows))] +    pub const NOSYS: Self = Self(c::ENOSYS); +    /// `ENOTBLK` +    #[cfg(not(any( +        windows, +        target_os = "espidf", +        target_os = "haiku", +        target_os = "vita", +        target_os = "wasi" +    )))] +    pub const NOTBLK: Self = Self(c::ENOTBLK); +    /// `ENOTCAPABLE` +    #[cfg(any(target_os = "freebsd", target_os = "wasi"))] +    pub const NOTCAPABLE: Self = Self(c::ENOTCAPABLE); +    /// `ENOTCONN` +    pub const NOTCONN: Self = Self(c::ENOTCONN); +    /// `ENOTDIR` +    #[cfg(not(windows))] +    pub const NOTDIR: Self = Self(c::ENOTDIR); +    /// `ENOTEMPTY` +    pub const NOTEMPTY: Self = Self(c::ENOTEMPTY); +    /// `ENOTNAM` +    #[cfg(not(any( +        bsd, +        solarish, +        windows, +        target_os = "aix", +        target_os = "espidf", +        target_os = "haiku", +        target_os = "hurd", +        target_os = "l4re", +        target_os = "nto", +        target_os = "vita", +        target_os = "wasi", +    )))] +    pub const NOTNAM: Self = Self(c::ENOTNAM); +    /// `ENOTRECOVERABLE` +    #[cfg(not(any( +        freebsdlike, +        netbsdlike, +        windows, +        target_os = "haiku", +        target_os = "l4re" +    )))] +    pub const NOTRECOVERABLE: Self = Self(c::ENOTRECOVERABLE); +    /// `ENOTSOCK` +    #[cfg(not(target_os = "l4re"))] +    pub const NOTSOCK: Self = Self(c::ENOTSOCK); +    /// `ENOTSUP` +    #[cfg(not(any(windows, target_os = "haiku", target_os = "redox")))] +    pub const NOTSUP: Self = Self(c::ENOTSUP); +    /// `ENOTTY` +    #[cfg(not(windows))] +    pub const NOTTY: Self = Self(c::ENOTTY); +    /// `ENOTUNIQ` +    #[cfg(not(any( +        bsd, +        windows, +        target_os = "aix", +        target_os = "espidf", +        target_os = "haiku", +        target_os = "hurd", +        target_os = "l4re", +        target_os = "vita", +        target_os = "wasi", +    )))] +    pub const NOTUNIQ: Self = Self(c::ENOTUNIQ); +    /// `ENXIO` +    #[cfg(not(windows))] +    pub const NXIO: Self = Self(c::ENXIO); +    /// `EOPNOTSUPP` +    pub const OPNOTSUPP: Self = Self(c::EOPNOTSUPP); +    /// `EOVERFLOW` +    #[cfg(not(any(windows, target_os = "l4re")))] +    pub const OVERFLOW: Self = Self(c::EOVERFLOW); +    /// `EOWNERDEAD` +    #[cfg(not(any( +        freebsdlike, +        netbsdlike, +        windows, +        target_os = "haiku", +        target_os = "l4re" +    )))] +    pub const OWNERDEAD: Self = Self(c::EOWNERDEAD); +    /// `EPERM` +    #[cfg(not(windows))] +    pub const PERM: Self = Self(c::EPERM); +    /// `EPFNOSUPPORT` +    #[cfg(not(any(target_os = "l4re", target_os = "wasi")))] +    pub const PFNOSUPPORT: Self = Self(c::EPFNOSUPPORT); +    /// `EPIPE` +    #[cfg(not(windows))] +    pub const PIPE: Self = Self(c::EPIPE); +    /// `EPROCLIM` +    #[cfg(bsd)] +    pub const PROCLIM: Self = Self(c::EPROCLIM); +    /// `EPROCUNAVAIL` +    #[cfg(bsd)] +    pub const PROCUNAVAIL: Self = Self(c::EPROCUNAVAIL); +    /// `EPROGMISMATCH` +    #[cfg(bsd)] +    pub const PROGMISMATCH: Self = Self(c::EPROGMISMATCH); +    /// `EPROGUNAVAIL` +    #[cfg(bsd)] +    pub const PROGUNAVAIL: Self = Self(c::EPROGUNAVAIL); +    /// `EPROTO` +    #[cfg(not(any(windows, target_os = "l4re")))] +    pub const PROTO: Self = Self(c::EPROTO); +    /// `EPROTONOSUPPORT` +    #[cfg(not(target_os = "l4re"))] +    pub const PROTONOSUPPORT: Self = Self(c::EPROTONOSUPPORT); +    /// `EPROTOTYPE` +    #[cfg(not(target_os = "l4re"))] +    pub const PROTOTYPE: Self = Self(c::EPROTOTYPE); +    /// `EPROVIDERFAILEDINIT` +    #[cfg(windows)] +    pub const PROVIDERFAILEDINIT: Self = Self(c::EPROVIDERFAILEDINIT); +    /// `ERANGE` +    #[cfg(not(windows))] +    pub const RANGE: Self = Self(c::ERANGE); +    /// `EREFUSED` +    #[cfg(windows)] +    pub const REFUSED: Self = Self(c::EREFUSED); +    /// `EREMCHG` +    #[cfg(not(any( +        bsd, +        windows, +        target_os = "aix", +        target_os = "espidf", +        target_os = "haiku", +        target_os = "hurd", +        target_os = "l4re", +        target_os = "vita", +        target_os = "wasi", +    )))] +    pub const REMCHG: Self = Self(c::EREMCHG); +    /// `EREMOTE` +    #[cfg(not(any( +        target_os = "espidf", +        target_os = "haiku", +        target_os = "l4re", +        target_os = "vita", +        target_os = "wasi" +    )))] +    pub const REMOTE: Self = Self(c::EREMOTE); +    /// `EREMOTEIO` +    #[cfg(not(any( +        bsd, +        solarish, +        windows, +        target_os = "aix", +        target_os = "espidf", +        target_os = "haiku", +        target_os = "hurd", +        target_os = "l4re", +        target_os = "nto", +        target_os = "vita", +        target_os = "wasi", +    )))] +    pub const REMOTEIO: Self = Self(c::EREMOTEIO); +    /// `ERESTART` +    #[cfg(not(any( +        bsd, +        windows, +        target_os = "espidf", +        target_os = "haiku", +        target_os = "hurd", +        target_os = "l4re", +        target_os = "vita", +        target_os = "wasi" +    )))] +    pub const RESTART: Self = Self(c::ERESTART); +    /// `ERFKILL` +    #[cfg(not(any( +        bsd, +        solarish, +        windows, +        target_os = "aix", +        target_os = "android", +        target_os = "espidf", +        target_os = "haiku", +        target_os = "hurd", +        target_os = "l4re", +        target_os = "nto", +        target_os = "redox", +        target_os = "vita", +        target_os = "wasi", +    )))] +    pub const RFKILL: Self = Self(c::ERFKILL); +    /// `EROFS` +    #[cfg(not(windows))] +    pub const ROFS: Self = Self(c::EROFS); +    /// `ERPCMISMATCH` +    #[cfg(bsd)] +    pub const RPCMISMATCH: Self = Self(c::ERPCMISMATCH); +    /// `ESHUTDOWN` +    #[cfg(not(any( +        target_os = "espidf", +        target_os = "l4re", +        target_os = "vita", +        target_os = "wasi" +    )))] +    pub const SHUTDOWN: Self = Self(c::ESHUTDOWN); +    /// `ESOCKTNOSUPPORT` +    #[cfg(not(any( +        target_os = "espidf", +        target_os = "haiku", +        target_os = "l4re", +        target_os = "vita", +        target_os = "wasi" +    )))] +    pub const SOCKTNOSUPPORT: Self = Self(c::ESOCKTNOSUPPORT); +    /// `ESPIPE` +    #[cfg(not(windows))] +    pub const SPIPE: Self = Self(c::ESPIPE); +    /// `ESRCH` +    #[cfg(not(windows))] +    pub const SRCH: Self = Self(c::ESRCH); +    /// `ESRMNT` +    #[cfg(not(any( +        bsd, +        windows, +        target_os = "aix", +        target_os = "espidf", +        target_os = "haiku", +        target_os = "hurd", +        target_os = "l4re", +        target_os = "vita", +        target_os = "wasi", +    )))] +    pub const SRMNT: Self = Self(c::ESRMNT); +    /// `ESTALE` +    pub const STALE: Self = Self(c::ESTALE); +    /// `ESTRPIPE` +    #[cfg(not(any( +        bsd, +        windows, +        target_os = "aix", +        target_os = "espidf", +        target_os = "haiku", +        target_os = "hurd", +        target_os = "l4re", +        target_os = "vita", +        target_os = "wasi", +    )))] +    pub const STRPIPE: Self = Self(c::ESTRPIPE); +    /// `ETIME` +    #[cfg(not(any( +        freebsdlike, +        windows, +        target_os = "l4re", +        target_os = "openbsd", +        target_os = "wasi" +    )))] +    pub const TIME: Self = Self(c::ETIME); +    /// `ETIMEDOUT` +    pub const TIMEDOUT: Self = Self(c::ETIMEDOUT); +    /// `E2BIG` +    #[cfg(not(windows))] +    #[doc(alias = "2BIG")] +    pub const TOOBIG: Self = Self(c::E2BIG); +    /// `ETOOMANYREFS` +    #[cfg(not(any(target_os = "haiku", target_os = "l4re", target_os = "wasi")))] +    pub const TOOMANYREFS: Self = Self(c::ETOOMANYREFS); +    /// `ETXTBSY` +    #[cfg(not(windows))] +    pub const TXTBSY: Self = Self(c::ETXTBSY); +    /// `EUCLEAN` +    #[cfg(not(any( +        bsd, +        solarish, +        windows, +        target_os = "aix", +        target_os = "espidf", +        target_os = "haiku", +        target_os = "hurd", +        target_os = "l4re", +        target_os = "nto", +        target_os = "vita", +        target_os = "wasi", +    )))] +    pub const UCLEAN: Self = Self(c::EUCLEAN); +    /// `EUNATCH` +    #[cfg(not(any( +        bsd, +        windows, +        target_os = "espidf", +        target_os = "haiku", +        target_os = "hurd", +        target_os = "l4re", +        target_os = "vita", +        target_os = "wasi" +    )))] +    pub const UNATCH: Self = Self(c::EUNATCH); +    /// `EUSERS` +    #[cfg(not(any( +        target_os = "espidf", +        target_os = "haiku", +        target_os = "l4re", +        target_os = "vita", +        target_os = "wasi" +    )))] +    pub const USERS: Self = Self(c::EUSERS); +    /// `EWOULDBLOCK` +    pub const WOULDBLOCK: Self = Self(c::EWOULDBLOCK); +    /// `EXDEV` +    #[cfg(not(windows))] +    pub const XDEV: Self = Self(c::EXDEV); +    /// `EXFULL` +    #[cfg(not(any( +        bsd, +        windows, +        target_os = "aix", +        target_os = "espidf", +        target_os = "haiku", +        target_os = "hurd", +        target_os = "l4re", +        target_os = "vita", +        target_os = "wasi", +    )))] +    pub const XFULL: Self = Self(c::EXFULL); +} + +impl Errno { +    /// Extract an `Errno` value from a `std::io::Error`. +    /// +    /// This isn't a `From` conversion because it's expected to be relatively +    /// uncommon. +    #[cfg(feature = "std")] +    #[inline] +    pub fn from_io_error(io_err: &std::io::Error) -> Option<Self> { +        io_err +            .raw_os_error() +            .and_then(|raw| if raw != 0 { Some(Self(raw)) } else { None }) +    } + +    /// Extract the raw OS error number from this error. +    #[inline] +    pub const fn raw_os_error(self) -> i32 { +        self.0 +    } + +    /// Construct an `Errno` from a raw OS error number. +    #[inline] +    pub const fn from_raw_os_error(raw: i32) -> Self { +        Self(raw) +    } + +    pub(crate) fn last_os_error() -> Self { +        Self(errno().0) +    } +} diff --git a/vendor/rustix/src/backend/libc/io/mod.rs b/vendor/rustix/src/backend/libc/io/mod.rs new file mode 100644 index 0000000..4873885 --- /dev/null +++ b/vendor/rustix/src/backend/libc/io/mod.rs @@ -0,0 +1,6 @@ +pub(crate) mod errno; +#[cfg(not(windows))] +pub(crate) mod types; + +#[cfg_attr(windows, path = "windows_syscalls.rs")] +pub(crate) mod syscalls; diff --git a/vendor/rustix/src/backend/libc/io/syscalls.rs b/vendor/rustix/src/backend/libc/io/syscalls.rs new file mode 100644 index 0000000..e28e6be --- /dev/null +++ b/vendor/rustix/src/backend/libc/io/syscalls.rs @@ -0,0 +1,340 @@ +//! libc syscalls supporting `rustix::io`. + +use crate::backend::c; +#[cfg(not(target_os = "wasi"))] +use crate::backend::conv::ret_discarded_fd; +use crate::backend::conv::{borrowed_fd, ret, ret_c_int, ret_owned_fd, ret_usize}; +use crate::fd::{AsFd, BorrowedFd, OwnedFd, RawFd}; +#[cfg(not(any( +    target_os = "aix", +    target_os = "espidf", +    target_os = "nto", +    target_os = "vita", +    target_os = "wasi" +)))] +use crate::io::DupFlags; +#[cfg(linux_kernel)] +use crate::io::ReadWriteFlags; +use crate::io::{self, FdFlags}; +use crate::ioctl::{IoctlOutput, RawOpcode}; +use core::cmp::min; +#[cfg(all(feature = "fs", feature = "net"))] +use libc_errno::errno; +#[cfg(not(target_os = "espidf"))] +use { +    crate::backend::MAX_IOV, +    crate::io::{IoSlice, IoSliceMut}, +}; + +pub(crate) unsafe fn read(fd: BorrowedFd<'_>, buf: *mut u8, len: usize) -> io::Result<usize> { +    ret_usize(c::read(borrowed_fd(fd), buf.cast(), min(len, READ_LIMIT))) +} + +pub(crate) fn write(fd: BorrowedFd<'_>, buf: &[u8]) -> io::Result<usize> { +    unsafe { +        ret_usize(c::write( +            borrowed_fd(fd), +            buf.as_ptr().cast(), +            min(buf.len(), READ_LIMIT), +        )) +    } +} + +pub(crate) unsafe fn pread( +    fd: BorrowedFd<'_>, +    buf: *mut u8, +    len: usize, +    offset: u64, +) -> io::Result<usize> { +    let len = min(len, READ_LIMIT); + +    // Silently cast; we'll get `EINVAL` if the value is negative. +    let offset = offset as i64; + +    // ESP-IDF and Vita don't support 64-bit offsets. +    #[cfg(any(target_os = "espidf", target_os = "vita"))] +    let offset: i32 = offset.try_into().map_err(|_| io::Errno::OVERFLOW)?; + +    ret_usize(c::pread(borrowed_fd(fd), buf.cast(), len, offset)) +} + +pub(crate) fn pwrite(fd: BorrowedFd<'_>, buf: &[u8], offset: u64) -> io::Result<usize> { +    let len = min(buf.len(), READ_LIMIT); + +    // Silently cast; we'll get `EINVAL` if the value is negative. +    let offset = offset as i64; + +    // ESP-IDF and Vita don't support 64-bit offsets. +    #[cfg(any(target_os = "espidf", target_os = "vita"))] +    let offset: i32 = offset.try_into().map_err(|_| io::Errno::OVERFLOW)?; + +    unsafe { ret_usize(c::pwrite(borrowed_fd(fd), buf.as_ptr().cast(), len, offset)) } +} + +#[cfg(not(target_os = "espidf"))] +pub(crate) fn readv(fd: BorrowedFd<'_>, bufs: &mut [IoSliceMut<'_>]) -> io::Result<usize> { +    unsafe { +        ret_usize(c::readv( +            borrowed_fd(fd), +            bufs.as_ptr().cast::<c::iovec>(), +            min(bufs.len(), MAX_IOV) as c::c_int, +        )) +    } +} + +#[cfg(not(target_os = "espidf"))] +pub(crate) fn writev(fd: BorrowedFd<'_>, bufs: &[IoSlice<'_>]) -> io::Result<usize> { +    unsafe { +        ret_usize(c::writev( +            borrowed_fd(fd), +            bufs.as_ptr().cast::<c::iovec>(), +            min(bufs.len(), MAX_IOV) as c::c_int, +        )) +    } +} + +#[cfg(not(any( +    target_os = "espidf", +    target_os = "haiku", +    target_os = "nto", +    target_os = "redox", +    target_os = "solaris", +    target_os = "vita" +)))] +pub(crate) fn preadv( +    fd: BorrowedFd<'_>, +    bufs: &mut [IoSliceMut<'_>], +    offset: u64, +) -> io::Result<usize> { +    // Silently cast; we'll get `EINVAL` if the value is negative. +    let offset = offset as i64; +    unsafe { +        ret_usize(c::preadv( +            borrowed_fd(fd), +            bufs.as_ptr().cast::<c::iovec>(), +            min(bufs.len(), MAX_IOV) as c::c_int, +            offset, +        )) +    } +} + +#[cfg(not(any( +    target_os = "espidf", +    target_os = "haiku", +    target_os = "nto", +    target_os = "redox", +    target_os = "solaris", +    target_os = "vita" +)))] +pub(crate) fn pwritev(fd: BorrowedFd<'_>, bufs: &[IoSlice<'_>], offset: u64) -> io::Result<usize> { +    // Silently cast; we'll get `EINVAL` if the value is negative. +    let offset = offset as i64; +    unsafe { +        ret_usize(c::pwritev( +            borrowed_fd(fd), +            bufs.as_ptr().cast::<c::iovec>(), +            min(bufs.len(), MAX_IOV) as c::c_int, +            offset, +        )) +    } +} + +#[cfg(linux_kernel)] +pub(crate) fn preadv2( +    fd: BorrowedFd<'_>, +    bufs: &mut [IoSliceMut<'_>], +    offset: u64, +    flags: ReadWriteFlags, +) -> io::Result<usize> { +    // Silently cast; we'll get `EINVAL` if the value is negative. +    let offset = offset as i64; +    unsafe { +        ret_usize(c::preadv2( +            borrowed_fd(fd), +            bufs.as_ptr().cast::<c::iovec>(), +            min(bufs.len(), MAX_IOV) as c::c_int, +            offset, +            bitflags_bits!(flags), +        )) +    } +} + +#[cfg(linux_kernel)] +pub(crate) fn pwritev2( +    fd: BorrowedFd<'_>, +    bufs: &[IoSlice<'_>], +    offset: u64, +    flags: ReadWriteFlags, +) -> io::Result<usize> { +    // Silently cast; we'll get `EINVAL` if the value is negative. +    let offset = offset as i64; +    unsafe { +        ret_usize(c::pwritev2( +            borrowed_fd(fd), +            bufs.as_ptr().cast::<c::iovec>(), +            min(bufs.len(), MAX_IOV) as c::c_int, +            offset, +            bitflags_bits!(flags), +        )) +    } +} + +// These functions are derived from Rust's library/std/src/sys/unix/fd.rs at +// revision 326ef470a8b379a180d6dc4bbef08990698a737a. + +// The maximum read limit on most POSIX-like systems is `SSIZE_MAX`, with the +// manual page quoting that if the count of bytes to read is greater than +// `SSIZE_MAX` the result is “unspecified”. +// +// On macOS, however, apparently the 64-bit libc is either buggy or +// intentionally showing odd behavior by rejecting any read with a size larger +// than or equal to `INT_MAX`. To handle both of these the read size is capped +// on both platforms. +#[cfg(target_os = "macos")] +const READ_LIMIT: usize = c::c_int::MAX as usize - 1; +#[cfg(not(target_os = "macos"))] +const READ_LIMIT: usize = c::ssize_t::MAX as usize; + +pub(crate) unsafe fn close(raw_fd: RawFd) { +    let _ = c::close(raw_fd as c::c_int); +} + +#[inline] +pub(crate) unsafe fn ioctl( +    fd: BorrowedFd<'_>, +    request: RawOpcode, +    arg: *mut c::c_void, +) -> io::Result<IoctlOutput> { +    ret_c_int(c::ioctl(borrowed_fd(fd), request, arg)) +} + +#[inline] +pub(crate) unsafe fn ioctl_readonly( +    fd: BorrowedFd<'_>, +    request: RawOpcode, +    arg: *mut c::c_void, +) -> io::Result<IoctlOutput> { +    ioctl(fd, request, arg) +} + +#[cfg(not(any(target_os = "redox", target_os = "wasi")))] +#[cfg(all(feature = "fs", feature = "net"))] +pub(crate) fn is_read_write(fd: BorrowedFd<'_>) -> io::Result<(bool, bool)> { +    use core::mem::MaybeUninit; + +    let (mut read, mut write) = crate::fs::fd::_is_file_read_write(fd)?; +    let mut not_socket = false; +    if read { +        // Do a `recv` with `PEEK` and `DONTWAIT` for 1 byte. A 0 indicates +        // the read side is shut down; an `EWOULDBLOCK` indicates the read +        // side is still open. +        match unsafe { +            c::recv( +                borrowed_fd(fd), +                MaybeUninit::<[u8; 1]>::uninit() +                    .as_mut_ptr() +                    .cast::<c::c_void>(), +                1, +                c::MSG_PEEK | c::MSG_DONTWAIT, +            ) +        } { +            0 => read = false, +            -1 => { +                #[allow(unreachable_patterns)] // `EAGAIN` may equal `EWOULDBLOCK` +                match errno().0 { +                    c::EAGAIN | c::EWOULDBLOCK => (), +                    c::ENOTSOCK => not_socket = true, +                    err => return Err(io::Errno(err)), +                } +            } +            _ => (), +        } +    } +    if write && !not_socket { +        // Do a `send` with `DONTWAIT` for 0 bytes. An `EPIPE` indicates +        // the write side is shut down. +        if unsafe { c::send(borrowed_fd(fd), [].as_ptr(), 0, c::MSG_DONTWAIT) } == -1 { +            #[allow(unreachable_patterns)] // `EAGAIN` may equal `EWOULDBLOCK` +            match errno().0 { +                c::EAGAIN | c::EWOULDBLOCK | c::ENOTSOCK => (), +                c::EPIPE => write = false, +                err => return Err(io::Errno(err)), +            } +        } +    } +    Ok((read, write)) +} + +#[cfg(target_os = "wasi")] +#[cfg(all(feature = "fs", feature = "net"))] +pub(crate) fn is_read_write(_fd: BorrowedFd<'_>) -> io::Result<(bool, bool)> { +    todo!("Implement is_read_write for WASI in terms of fd_fdstat_get"); +} + +pub(crate) fn fcntl_getfd(fd: BorrowedFd<'_>) -> io::Result<FdFlags> { +    let flags = unsafe { ret_c_int(c::fcntl(borrowed_fd(fd), c::F_GETFD))? }; +    Ok(FdFlags::from_bits_retain(bitcast!(flags))) +} + +pub(crate) fn fcntl_setfd(fd: BorrowedFd<'_>, flags: FdFlags) -> io::Result<()> { +    unsafe { ret(c::fcntl(borrowed_fd(fd), c::F_SETFD, flags.bits())) } +} + +#[cfg(not(any(target_os = "espidf", target_os = "wasi")))] +pub(crate) fn fcntl_dupfd_cloexec(fd: BorrowedFd<'_>, min: RawFd) -> io::Result<OwnedFd> { +    unsafe { ret_owned_fd(c::fcntl(borrowed_fd(fd), c::F_DUPFD_CLOEXEC, min)) } +} + +#[cfg(target_os = "espidf")] +pub(crate) fn fcntl_dupfd(fd: BorrowedFd<'_>, min: RawFd) -> io::Result<OwnedFd> { +    unsafe { ret_owned_fd(c::fcntl(borrowed_fd(fd), c::F_DUPFD, min)) } +} + +#[cfg(not(target_os = "wasi"))] +pub(crate) fn dup(fd: BorrowedFd<'_>) -> io::Result<OwnedFd> { +    unsafe { ret_owned_fd(c::dup(borrowed_fd(fd))) } +} + +#[allow(clippy::needless_pass_by_ref_mut)] +#[cfg(not(target_os = "wasi"))] +pub(crate) fn dup2(fd: BorrowedFd<'_>, new: &mut OwnedFd) -> io::Result<()> { +    unsafe { ret_discarded_fd(c::dup2(borrowed_fd(fd), borrowed_fd(new.as_fd()))) } +} + +#[allow(clippy::needless_pass_by_ref_mut)] +#[cfg(not(any( +    apple, +    target_os = "aix", +    target_os = "android", +    target_os = "dragonfly", +    target_os = "espidf", +    target_os = "haiku", +    target_os = "nto", +    target_os = "redox", +    target_os = "vita", +    target_os = "wasi", +)))] +pub(crate) fn dup3(fd: BorrowedFd<'_>, new: &mut OwnedFd, flags: DupFlags) -> io::Result<()> { +    unsafe { +        ret_discarded_fd(c::dup3( +            borrowed_fd(fd), +            borrowed_fd(new.as_fd()), +            bitflags_bits!(flags), +        )) +    } +} + +#[cfg(any( +    apple, +    target_os = "android", +    target_os = "dragonfly", +    target_os = "haiku", +    target_os = "redox", +))] +pub(crate) fn dup3(fd: BorrowedFd<'_>, new: &mut OwnedFd, _flags: DupFlags) -> io::Result<()> { +    // Android 5.0 has `dup3`, but libc doesn't have bindings. Emulate it +    // using `dup2`. We don't need to worry about the difference between +    // `dup2` and `dup3` when the file descriptors are equal because we +    // have an `&mut OwnedFd` which means `fd` doesn't alias it. +    dup2(fd, new) +} diff --git a/vendor/rustix/src/backend/libc/io/types.rs b/vendor/rustix/src/backend/libc/io/types.rs new file mode 100644 index 0000000..510206f --- /dev/null +++ b/vendor/rustix/src/backend/libc/io/types.rs @@ -0,0 +1,65 @@ +use crate::backend::c; +use bitflags::bitflags; + +bitflags! { +    /// `FD_*` constants for use with [`fcntl_getfd`] and [`fcntl_setfd`]. +    /// +    /// [`fcntl_getfd`]: crate::io::fcntl_getfd +    /// [`fcntl_setfd`]: crate::io::fcntl_setfd +    #[repr(transparent)] +    #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] +    pub struct FdFlags: u32 { +        /// `FD_CLOEXEC` +        const CLOEXEC = bitcast!(c::FD_CLOEXEC); + +        /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> +        const _ = !0; +    } +} + +#[cfg(linux_kernel)] +bitflags! { +    /// `RWF_*` constants for use with [`preadv2`] and [`pwritev2`]. +    /// +    /// [`preadv2`]: crate::io::preadv2 +    /// [`pwritev2`]: crate::io::pwritev +    #[repr(transparent)] +    #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] +    pub struct ReadWriteFlags: u32 { +        /// `RWF_DSYNC` (since Linux 4.7) +        const DSYNC = linux_raw_sys::general::RWF_DSYNC; +        /// `RWF_HIPRI` (since Linux 4.6) +        const HIPRI = linux_raw_sys::general::RWF_HIPRI; +        /// `RWF_SYNC` (since Linux 4.7) +        const SYNC = linux_raw_sys::general::RWF_SYNC; +        /// `RWF_NOWAIT` (since Linux 4.14) +        const NOWAIT = linux_raw_sys::general::RWF_NOWAIT; +        /// `RWF_APPEND` (since Linux 4.16) +        const APPEND = linux_raw_sys::general::RWF_APPEND; + +        /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> +        const _ = !0; +    } +} + +#[cfg(not(target_os = "wasi"))] +bitflags! { +    /// `O_*` constants for use with [`dup2`]. +    /// +    /// [`dup2`]: crate::io::dup2 +    #[repr(transparent)] +    #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)] +    pub struct DupFlags: u32 { +        /// `O_CLOEXEC` +        #[cfg(not(any( +            apple, +            target_os = "aix", +            target_os = "android", +            target_os = "redox", +        )))] // Android 5.0 has dup3, but libc doesn't have bindings +        const CLOEXEC = bitcast!(c::O_CLOEXEC); + +        /// <https://docs.rs/bitflags/*/bitflags/#externally-defined-flags> +        const _ = !0; +    } +} diff --git a/vendor/rustix/src/backend/libc/io/windows_syscalls.rs b/vendor/rustix/src/backend/libc/io/windows_syscalls.rs new file mode 100644 index 0000000..049221d --- /dev/null +++ b/vendor/rustix/src/backend/libc/io/windows_syscalls.rs @@ -0,0 +1,30 @@ +//! Windows system calls in the `io` module. + +use crate::backend::c; +use crate::backend::conv::{borrowed_fd, ret_c_int}; +use crate::backend::fd::LibcFd; +use crate::fd::{BorrowedFd, RawFd}; +use crate::io; +use crate::ioctl::{IoctlOutput, RawOpcode}; + +pub(crate) unsafe fn close(raw_fd: RawFd) { +    let _ = c::close(raw_fd as LibcFd); +} + +#[inline] +pub(crate) unsafe fn ioctl( +    fd: BorrowedFd<'_>, +    request: RawOpcode, +    arg: *mut c::c_void, +) -> io::Result<IoctlOutput> { +    ret_c_int(c::ioctl(borrowed_fd(fd), request, arg.cast())) +} + +#[inline] +pub(crate) unsafe fn ioctl_readonly( +    fd: BorrowedFd<'_>, +    request: RawOpcode, +    arg: *mut c::c_void, +) -> io::Result<IoctlOutput> { +    ioctl(fd, request, arg) +}  | 
