From 7ac3dfaa498061082e16db5faaa918b88a1e5306 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Sat, 5 Jan 2019 13:10:20 -0700 Subject: [PATCH] Implement sys_uio, define sockaddr_storage --- include/bits/sys/socket.h | 10 +++++ src/header/mod.rs | 1 + src/header/sys_socket/cbindgen.toml | 1 + src/header/sys_uio/cbindgen.toml | 7 +++ src/header/sys_uio/mod.rs | 70 +++++++++++++++++++++++++++++ 5 files changed, 89 insertions(+) create mode 100644 include/bits/sys/socket.h create mode 100644 src/header/sys_uio/cbindgen.toml create mode 100644 src/header/sys_uio/mod.rs diff --git a/include/bits/sys/socket.h b/include/bits/sys/socket.h new file mode 100644 index 0000000000..454ce03abc --- /dev/null +++ b/include/bits/sys/socket.h @@ -0,0 +1,10 @@ +#ifndef _BITS_SYS_SOCKET_H +#define _BITS_SYS_SOCKET_H + +struct sockaddr_storage { + sa_family_t ss_family; + char __ss_padding[128-sizeof(long)-sizeof(sa_family_t)]; + unsigned long __ss_align; +}; + +#endif // _BITS_SYS_SOCKET_H diff --git a/src/header/mod.rs b/src/header/mod.rs index 63add34aa9..20fe667578 100644 --- a/src/header/mod.rs +++ b/src/header/mod.rs @@ -39,6 +39,7 @@ pub mod sys_statvfs; pub mod sys_time; pub mod sys_timeb; //pub mod sys_times; +pub mod sys_uio; pub mod sys_un; pub mod sys_utsname; pub mod sys_wait; diff --git a/src/header/sys_socket/cbindgen.toml b/src/header/sys_socket/cbindgen.toml index 41c88c45f5..d28e67a4f8 100644 --- a/src/header/sys_socket/cbindgen.toml +++ b/src/header/sys_socket/cbindgen.toml @@ -1,5 +1,6 @@ sys_includes = ["stddef.h", "stdint.h", "sys/types.h"] include_guard = "_SYS_SOCKET_H" +trailer = "#include " language = "C" style = "Tag" diff --git a/src/header/sys_uio/cbindgen.toml b/src/header/sys_uio/cbindgen.toml new file mode 100644 index 0000000000..a97ff44987 --- /dev/null +++ b/src/header/sys_uio/cbindgen.toml @@ -0,0 +1,7 @@ +sys_includes = [] +include_guard = "_SYS_UIO_H" +language = "C" +style = "Tag" + +[enum] +prefix_with_name = true diff --git a/src/header/sys_uio/mod.rs b/src/header/sys_uio/mod.rs new file mode 100644 index 0000000000..140800eb0f --- /dev/null +++ b/src/header/sys_uio/mod.rs @@ -0,0 +1,70 @@ +//! sys/uio implementation for Redox, following http://pubs.opengroup.org/onlinepubs/007904875/basedefs/sys/uio.h.html + +use alloc::vec::Vec; +use core::slice; + +use header::{errno, unistd}; +use platform; +use platform::types::*; + +#[repr(C)] +pub struct iovec { + iov_base: *mut c_void, + iov_len: size_t, +} + +impl iovec { + unsafe fn to_slice(&self) -> &mut [u8] { + slice::from_raw_parts_mut( + self.iov_base as *mut u8, + self.iov_len as usize + ) + } +} + +unsafe fn join(iovs: &[iovec]) -> Vec { + let mut vec = Vec::new(); + for iov in iovs.iter() { + vec.extend_from_slice(iov.to_slice()); + } + vec +} + +unsafe fn split(iovs: &[iovec], vec: Vec) { + let mut i = 0; + for iov in iovs.iter() { + let slice = iov.to_slice(); + slice.copy_from_slice(&vec[i..]); + i += slice.len(); + } +} + +#[no_mangle] +pub unsafe extern "C" fn readv(fd: c_int, iov: *const iovec, iovcnt: c_int) -> ssize_t { + if iovcnt < 0 { + platform::errno = errno::EINVAL; + return -1; + } + + let iovs = slice::from_raw_parts(iov, iovcnt as usize); + let mut vec = join(iovs); + + let ret = unistd::read(fd, vec.as_mut_ptr() as *mut c_void, vec.len()); + + split(iovs, vec); + + ret +} + +#[no_mangle] +pub unsafe extern "C" fn writev(fd: c_int, iov: *const iovec, iovcnt: c_int) -> ssize_t { + if iovcnt < 0 { + platform::errno = errno::EINVAL; + return -1; + } + + let iovs = slice::from_raw_parts(iov, iovcnt as usize); + let vec = join(iovs); + + unistd::write(fd, vec.as_ptr() as *const c_void, vec.len()) +}