From 01e6f735a0cb400eedf31c04f4eeb1a6bc6372c4 Mon Sep 17 00:00:00 2001 From: Rodrigo Oliveira Date: Tue, 27 Oct 2020 17:28:38 -0300 Subject: [PATCH] Remove socket sendfile wrong implementation --- extra_tests/snippets/stdlib_socket.py | 8 ++++++++ vm/src/stdlib/os.rs | 17 +++++++++-------- vm/src/stdlib/socket.rs | 26 -------------------------- 3 files changed, 17 insertions(+), 34 deletions(-) diff --git a/extra_tests/snippets/stdlib_socket.py b/extra_tests/snippets/stdlib_socket.py index 6d244e97d..51124537a 100644 --- a/extra_tests/snippets/stdlib_socket.py +++ b/extra_tests/snippets/stdlib_socket.py @@ -23,6 +23,14 @@ recv_b = connector.recv(len(MESSAGE_B)) assert recv_a == MESSAGE_A assert recv_b == MESSAGE_B +fd = open('README.md', 'rb') +connector.sendfile(fd) +recv_readme = connection.recv(os.stat('README.md').st_size) +# need this because sendfile leaves the cursor at the end of the file +fd.seek(0) +assert recv_readme == fd.read() +fd.close() + # fileno if os.name == "posix": connector_fd = connector.fileno() diff --git a/vm/src/stdlib/os.rs b/vm/src/stdlib/os.rs index a961cb625..0e85539e3 100644 --- a/vm/src/stdlib/os.rs +++ b/vm/src/stdlib/os.rs @@ -357,25 +357,26 @@ mod _os { #[cfg(any(target_os = "macos"))] #[pyfunction] pub(crate) fn sendfile( - out_fd: i64, - in_fd: i64, - offset: u64, + out_fd: i32, + in_fd: i32, + offset: i64, count: u64, headers: OptionalArg, trailers: OptionalArg, flags: OptionalArg, vm: &VirtualMachine, ) -> PyResult { - let res = nix::sys::sendfile::sendfile( + let mut _count = count; + let (res, written) = nix::sys::sendfile::sendfile( in_fd, out_fd, offset, - Some(count as usize), - headers, - trailers, + Some(&mut _count), + headers.into_option(), + trailers.into_option(), ) .map_err(|err| err.into_pyexception(vm))?; - Ok(vm.ctx.new_int(res as u64)) + Ok(vm.ctx.new_int(written as u64)) } #[pyfunction] diff --git a/vm/src/stdlib/socket.rs b/vm/src/stdlib/socket.rs index b16cb8ef0..02794251f 100644 --- a/vm/src/stdlib/socket.rs +++ b/vm/src/stdlib/socket.rs @@ -21,7 +21,6 @@ use crate::pyobject::{ BorrowValue, Either, IntoPyObject, PyClassImpl, PyObjectRef, PyRef, PyResult, PyValue, StaticType, TryFromObject, }; -use crate::stdlib::os::rust_file; use crate::vm::VirtualMachine; #[cfg(unix)] @@ -221,31 +220,6 @@ impl PySocket { Ok(()) } - #[pymethod] - fn sendfile(&self, fd: i64, offset: OptionalArg, count: OptionalArg, vm: &VirtualMachine) -> PyResult { - let mut file = rust_file(fd); - let mut bufsize: u64 = 0; - - if let Ok(metadata) = file.metadata() { - bufsize = metadata.len(); - } - - if let OptionalArg::Present(c) = count { - bufsize = c; - } - - let mut buffer = vec![0u8; bufsize as usize]; - - let n = file - .read(&mut buffer) - .map_err(|err| err.into_pyexception(vm))?; - - buffer.truncate(n); - - let bytes = PyBytesLike::try_from_object(vm, vm.ctx.new_bytes(buffer))?; - self.send(bytes, vm) - } - #[pymethod] fn close(&self) { *self.sock_mut() = invalid_sock();