Browse Source

Implement sys_uio, define sockaddr_storage

Jeremy Soller 6 years ago
parent
commit
7ac3dfaa49

+ 10 - 0
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

+ 1 - 0
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;

+ 1 - 0
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 <bits/sys/socket.h>"
 language = "C"
 style = "Tag"
 

+ 7 - 0
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

+ 70 - 0
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<u8> {
+    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<u8>) {
+    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())
+}