diff --git a/Cargo.lock b/Cargo.lock index 140f078ff..481ed44d1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -257,13 +257,11 @@ dependencies = [ [[package]] name = "clipboard-win" -version = "4.5.0" +version = "5.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7191c27c2357d9b7ef96baac1773290d4ca63b24205b82a3fd8a0637afcf0362" +checksum = "c57002a5d9be777c1ef967e33674dac9ebd310d8893e4e3437b14d5f0f6372cc" dependencies = [ "error-code", - "str-buf", - "winapi", ] [[package]] @@ -673,14 +671,14 @@ dependencies = [ [[package]] name = "dns-lookup" -version = "1.0.8" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53ecafc952c4528d9b51a458d1a8904b81783feff9fde08ab6ed2545ff396872" +checksum = "e5766087c2235fec47fafa4cfecc81e494ee679d0fd4a59887ea0919bfb0e4fc" dependencies = [ "cfg-if", "libc", "socket2", - "winapi", + "windows-sys 0.48.0", ] [[package]] @@ -732,34 +730,19 @@ dependencies = [ [[package]] name = "errno" -version = "0.3.1" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" dependencies = [ - "errno-dragonfly", - "libc", - "windows-sys 0.48.0", -] - -[[package]] -name = "errno-dragonfly" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" -dependencies = [ - "cc", "libc", + "windows-sys 0.52.0", ] [[package]] name = "error-code" -version = "2.3.1" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64f18991e7bf11e7ffee451b5318b5c1a73c52d0d0ada6e5a3017c8c1ced6a21" -dependencies = [ - "libc", - "str-buf", -] +checksum = "281e452d3bad4005426416cdba5ccfd4f5c1280e10099e21db27f7c1c28347fc" [[package]] name = "exitcode" @@ -769,13 +752,13 @@ checksum = "de853764b47027c2e862a995c34978ffa63c1501f2e15f987ba11bd4f9bba193" [[package]] name = "fd-lock" -version = "3.0.12" +version = "4.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39ae6b3d9530211fb3b12a95374b8b0823be812f53d09e18c5675c0146b09642" +checksum = "7e5768da2206272c81ef0b5e951a41862938a6070da63bcea197899942d3b947" dependencies = [ "cfg-if", "rustix", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -939,12 +922,6 @@ dependencies = [ "libc", ] -[[package]] -name = "hermit-abi" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" - [[package]] name = "hex" version = "0.4.3" @@ -957,6 +934,15 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" +[[package]] +name = "home" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +dependencies = [ + "windows-sys 0.52.0", +] + [[package]] name = "iana-time-zone" version = "0.1.53" @@ -1004,17 +990,6 @@ dependencies = [ "yaml-rust", ] -[[package]] -name = "io-lifetimes" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220" -dependencies = [ - "hermit-abi 0.3.1", - "libc", - "windows-sys 0.48.0", -] - [[package]] name = "is-macro" version = "0.3.0" @@ -1183,9 +1158,9 @@ checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" [[package]] name = "linux-raw-sys" -version = "0.3.1" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d59d8c75012853d2e872fb56bc8a2e53718e2cafe1a4c823143141c6d90c322f" +checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456" [[package]] name = "lock_api" @@ -1217,9 +1192,9 @@ dependencies = [ [[package]] name = "mac_address" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b238e3235c8382b7653c6408ed1b08dd379bdb9fdf990fb0bbae3db2cc0ae963" +checksum = "4863ee94f19ed315bf3bc00299338d857d4b5bc856af375cc97d237382ad3856" dependencies = [ "nix 0.23.2", "winapi", @@ -1344,6 +1319,15 @@ dependencies = [ "autocfg", ] +[[package]] +name = "memoffset" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +dependencies = [ + "autocfg", +] + [[package]] name = "miniz_oxide" version = "0.6.2" @@ -1386,16 +1370,14 @@ dependencies = [ [[package]] name = "nix" -version = "0.26.2" +version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfdda3d196821d6af13126e40375cdf7da646a96114af134d5f417a9a1dc8e1a" +checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.4.0", "cfg-if", "libc", - "memoffset 0.7.1", - "pin-utils", - "static_assertions", + "memoffset 0.9.0", ] [[package]] @@ -1615,12 +1597,6 @@ dependencies = [ "siphasher", ] -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - [[package]] name = "pkg-config" version = "0.3.26" @@ -1907,16 +1883,15 @@ dependencies = [ [[package]] name = "rustix" -version = "0.37.11" +version = "0.38.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85597d61f83914ddeba6a47b3b8ffe7365107221c2e557ed94426489fefb5f77" +checksum = "72e572a5e8ca657d7366229cdde4bd14c4eb5499a9573d4d366fe1b599daa316" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.4.0", "errno", - "io-lifetimes", "libc", "linux-raw-sys", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -2176,7 +2151,7 @@ dependencies = [ "memchr", "memmap2", "mt19937", - "nix 0.26.2", + "nix 0.27.1", "num-complex", "num-integer", "num-traits", @@ -2245,7 +2220,7 @@ dependencies = [ "malachite-bigint", "memchr", "memoffset 0.6.5", - "nix 0.26.2", + "nix 0.27.1", "num-complex", "num-integer", "num-traits", @@ -2319,21 +2294,20 @@ checksum = "5583e89e108996506031660fe09baa5011b9dd0341b89029313006d1fb508d70" [[package]] name = "rustyline" -version = "11.0.0" +version = "13.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfc8644681285d1fb67a467fb3021bfea306b99b4146b166a1fe3ada965eece" +checksum = "02a2d683a4ac90aeef5b1013933f6d977bd37d51ff3f4dad829d4931a7e6be86" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.4.0", "cfg-if", "clipboard-win", - "dirs-next", "fd-lock", + "home", "libc", "log", "memchr", - "nix 0.26.2", + "nix 0.27.1", "radix_trie", - "scopeguard", "unicode-segmentation", "unicode-width", "utf8parse", @@ -2493,12 +2467,12 @@ checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" [[package]] name = "socket2" -version = "0.4.7" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd" +checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" dependencies = [ "libc", - "winapi", + "windows-sys 0.48.0", ] [[package]] @@ -2518,12 +2492,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" -[[package]] -name = "str-buf" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e08d8363704e6c71fc928674353e6b7c23dcea9d82d7012c8faf2a3a025f8d0" - [[package]] name = "strsim" version = "0.8.0" diff --git a/Cargo.toml b/Cargo.toml index 71e9d221d..b7b3db3dc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -58,7 +58,7 @@ itertools = "0.11.0" is-macro = "0.3.0" libc = "0.2.151" log = "0.4.16" -nix = "0.26" +nix = { version = "0.27", features = ["fs", "user", "process", "term", "time", "signal", "ioctl", "socket", "sched", "zerocopy", "dir", "hostname", "net", "poll"] } malachite-bigint = "0.2.0" malachite-q = "0.4.4" malachite-base = "0.4.4" @@ -70,7 +70,7 @@ once_cell = "1.18" parking_lot = "0.12.1" paste = "1.0.7" rand = "0.8.5" -rustyline = "11" +rustyline = "13" serde = { version = "1.0.133", default-features = false } schannel = "0.1.22" static_assertions = "1.1" @@ -152,5 +152,4 @@ lto = "thin" [patch.crates-io] # REDOX START, Uncomment when you want to compile/check with redoxer -# nix = { git = "https://github.com/coolreader18/nix", branch = "0.26.2-redox" } # REDOX END diff --git a/stdlib/Cargo.toml b/stdlib/Cargo.toml index 7c394804b..d077603c4 100644 --- a/stdlib/Cargo.toml +++ b/stdlib/Cargo.toml @@ -94,8 +94,8 @@ termios = "0.3.3" [target.'cfg(not(target_arch = "wasm32"))'.dependencies] gethostname = "0.2.3" -socket2 = { version = "0.4.4", features = ["all"] } -dns-lookup = "1.0.8" +socket2 = { version = "0.5.4", features = ["all"] } +dns-lookup = "2" openssl = { version = "0.10.62", optional = true } openssl-sys = { version = "0.9.80", optional = true } openssl-probe = { version = "0.1.5", optional = true } @@ -112,7 +112,7 @@ widestring = { workspace = true } [target.'cfg(windows)'.dependencies.winapi] version = "0.3.9" features = [ - "winsock2", "ifdef", "netioapi", + "winsock2", "ifdef", "netioapi", "ws2tcpip", ] [target.'cfg(windows)'.dependencies.windows-sys] diff --git a/stdlib/src/socket.rs b/stdlib/src/socket.rs index c6624df54..12231bac9 100644 --- a/stdlib/src/socket.rs +++ b/stdlib/src/socket.rs @@ -21,7 +21,7 @@ mod _socket { }; use crossbeam_utils::atomic::AtomicCell; use num_traits::ToPrimitive; - use socket2::{Domain, Protocol, Socket, Type as SocketType}; + use socket2::Socket; use std::{ ffi, io::{self, Read, Write}, @@ -1117,11 +1117,7 @@ mod _socket { if proto == -1 { proto = 0 } - sock = Socket::new( - Domain::from(family), - SocketType::from(socket_kind), - Some(Protocol::from(proto)), - )?; + sock = Socket::new(family.into(), socket_kind.into(), Some(proto.into()))?; }; Ok(zelf.init_inner(family, socket_kind, proto, sock)?) } @@ -1195,7 +1191,7 @@ mod _socket { let mut buf = buf.borrow_buf_mut(); let buf = &mut *buf; self.sock_op(vm, SelectKind::Read, || { - sock.recv_with_flags(slice_as_uninit(buf), flags) + sock.recv_with_flags(unsafe { slice_as_uninit(buf) }, flags) }) } @@ -1245,7 +1241,7 @@ mod _socket { let flags = flags.unwrap_or(0); let sock = self.sock()?; let (n, addr) = self.sock_op(vm, SelectKind::Read, || { - sock.recv_from_with_flags(slice_as_uninit(buf), flags) + sock.recv_from_with_flags(unsafe { slice_as_uninit(buf) }, flags) })?; Ok((n, get_addr_tuple(&addr, vm))) } @@ -1581,16 +1577,13 @@ mod _socket { return get_ip_addr_tuple(&addr, vm); } #[cfg(unix)] - use nix::sys::socket::{SockaddrLike, UnixAddr}; - #[cfg(unix)] - if let Some(unix_addr) = unsafe { UnixAddr::from_raw(addr.as_ptr(), Some(addr.len())) } { + if addr.is_unix() { use std::os::unix::ffi::OsStrExt; - #[cfg(any(target_os = "android", target_os = "linux"))] - if let Some(abstractpath) = unix_addr.as_abstract() { + if let Some(abstractpath) = addr.as_abstract_namespace() { return vm.ctx.new_bytes([b"\0", abstractpath].concat()).into(); } // necessary on macos - let path = ffi::OsStr::as_bytes(unix_addr.path().unwrap_or("".as_ref()).as_ref()); + let path = ffi::OsStr::as_bytes(addr.as_pathname().unwrap_or("".as_ref()).as_ref()); let nul_pos = memchr::memchr(b'\0', path).unwrap_or(path.len()); let path = ffi::OsStr::from_bytes(&path[..nul_pos]); return vm.ctx.new_str(path.to_string_lossy()).into(); @@ -1678,8 +1671,8 @@ mod _socket { Ok(s.to_string_lossy().into_owned()) } - fn slice_as_uninit(v: &mut [T]) -> &mut [MaybeUninit] { - unsafe { &mut *(v as *mut [T] as *mut [MaybeUninit]) } + unsafe fn slice_as_uninit(v: &mut [T]) -> &mut [MaybeUninit] { + &mut *(v as *mut [T] as *mut [MaybeUninit]) } enum IoOrPyException { @@ -1733,7 +1726,6 @@ mod _socket { kind: SelectKind, interval: Option, ) -> io::Result { - let fd = sock_fileno(sock); #[cfg(unix)] { use nix::poll::*; @@ -1742,7 +1734,7 @@ mod _socket { SelectKind::Write => PollFlags::POLLOUT, SelectKind::Connect => PollFlags::POLLOUT | PollFlags::POLLERR, }; - let mut pollfd = [PollFd::new(fd, events)]; + let mut pollfd = [PollFd::new(sock, events)]; let timeout = match interval { Some(d) => d.as_millis() as _, None => -1, @@ -1754,6 +1746,8 @@ mod _socket { { use crate::select; + let fd = sock_fileno(sock); + let mut reads = select::FdSet::new(); let mut writes = select::FdSet::new(); let mut errs = select::FdSet::new(); diff --git a/vm/src/stdlib/posix.rs b/vm/src/stdlib/posix.rs index 1adf0006e..4351acf86 100644 --- a/vm/src/stdlib/posix.rs +++ b/vm/src/stdlib/posix.rs @@ -41,7 +41,7 @@ pub mod module { env, ffi::{CStr, CString}, fs, io, - os::unix::io::RawFd, + os::fd::{AsRawFd, BorrowedFd, IntoRawFd, OwnedFd, RawFd}, }; use strum_macros::{EnumIter, EnumString}; @@ -162,6 +162,24 @@ pub mod module { #[pyattr] const _COPYFILE_DATA: u32 = 1 << 3; + impl TryFromObject for BorrowedFd<'_> { + fn try_from_object(vm: &VirtualMachine, obj: PyObjectRef) -> PyResult { + let fd = i32::try_from_object(vm, obj)?; + if fd == -1 { + return Err(io::Error::from_raw_os_error(libc::EBADF).into_pyexception(vm)); + } + // SAFETY: none, really. but, python's os api of passing around file descriptors + // everywhere isn't really io-safe anyway, so, this is passed to the user. + Ok(unsafe { BorrowedFd::borrow_raw(fd) }) + } + } + + impl ToPyObject for OwnedFd { + fn to_pyobject(self, vm: &VirtualMachine) -> PyObjectRef { + self.into_raw_fd().to_pyobject(vm) + } + } + // Flags for os_access bitflags! { #[derive(Copy, Clone, Debug, PartialEq)] @@ -1196,10 +1214,11 @@ pub mod module { #[cfg(not(target_os = "redox"))] #[pyfunction] - fn openpty(vm: &VirtualMachine) -> PyResult<(i32, i32)> { + fn openpty(vm: &VirtualMachine) -> PyResult<(OwnedFd, OwnedFd)> { let r = nix::pty::openpty(None, None).map_err(|err| err.into_pyexception(vm))?; - for fd in &[r.master, r.slave] { - super::raw_set_inheritable(*fd, false).map_err(|e| e.into_pyexception(vm))?; + for fd in [&r.master, &r.slave] { + super::raw_set_inheritable(fd.as_raw_fd(), false) + .map_err(|e| e.into_pyexception(vm))?; } Ok((r.master, r.slave)) } @@ -2013,9 +2032,9 @@ pub mod module { #[cfg(any(target_os = "linux", target_os = "macos"))] #[derive(FromArgs)] - struct SendFileArgs { - out_fd: i32, - in_fd: i32, + struct SendFileArgs<'fd> { + out_fd: BorrowedFd<'fd>, + in_fd: BorrowedFd<'fd>, offset: crate::common::crt_fd::Offset, count: i64, #[cfg(target_os = "macos")] @@ -2033,7 +2052,7 @@ pub mod module { #[cfg(target_os = "linux")] #[pyfunction] - fn sendfile(args: SendFileArgs, vm: &VirtualMachine) -> PyResult { + fn sendfile(args: SendFileArgs<'_>, vm: &VirtualMachine) -> PyResult { let mut file_offset = args.offset; let res = nix::sys::sendfile::sendfile( @@ -2062,7 +2081,7 @@ pub mod module { #[cfg(target_os = "macos")] #[pyfunction] - fn sendfile(args: SendFileArgs, vm: &VirtualMachine) -> PyResult { + fn sendfile(args: SendFileArgs<'_>, vm: &VirtualMachine) -> PyResult { let headers = _extract_vec_bytes(args.headers, vm)?; let count = headers .as_ref()