From 6fe3e05ea0903f0206c28fb88faa164b84e20e7b Mon Sep 17 00:00:00 2001
From: jD91mZM2 <me@krake.one>
Date: Sun, 2 Sep 2018 08:17:15 +0200
Subject: [PATCH] Delete duplicate types

Now that we use cbindgen differently :D
---
 src/header/aio/mod.rs               |   2 +-
 src/header/arpa_inet/mod.rs         |   6 +-
 src/header/dirent/mod.rs            |   2 +-
 src/header/netdb/mod.rs             |   7 +-
 src/header/pwd/mod.rs               |   3 +-
 src/header/signal/mod.rs            |   5 +-
 src/header/stdlib/mod.rs            |   1 +
 src/header/sys_ioctl/mod.rs         |  17 +--
 src/header/sys_resource/mod.rs      |   2 +-
 src/header/sys_select/cbindgen.toml |   5 +
 src/header/sys_select/mod.rs        |  11 +-
 src/header/sys_socket/mod.rs        |  19 ++-
 src/header/sys_stat/mod.rs          |  10 +-
 src/header/sys_time/mod.rs          |  12 +-
 src/header/sys_times/mod.rs         |   2 +-
 src/header/sys_utsname/mod.rs       |  31 ++---
 src/header/termios/mod.rs           |   5 +-
 src/header/time/mod.rs              |  19 ++-
 src/header/unistd/mod.rs            |   1 +
 src/header/utime/mod.rs             |   1 +
 src/platform/linux/mod.rs           |  21 +--
 src/platform/linux/signal.rs        |   1 +
 src/platform/linux/socket.rs        |   1 +
 src/platform/pal/mod.rs             |   9 ++
 src/platform/pal/signal.rs          |   1 +
 src/platform/pal/socket.rs          |   1 +
 src/platform/redox/mod.rs           |  19 ++-
 src/platform/redox/signal.rs        |   1 +
 src/platform/redox/socket.rs        |  16 ++-
 src/platform/types.rs               | 195 ----------------------------
 30 files changed, 148 insertions(+), 278 deletions(-)

diff --git a/src/header/aio/mod.rs b/src/header/aio/mod.rs
index d1d9ef49..81342b1a 100644
--- a/src/header/aio/mod.rs
+++ b/src/header/aio/mod.rs
@@ -1,4 +1,4 @@
-use header::time::sigevent;
+use header::time::{timespec, sigevent};
 use platform::types::*;
 
 pub struct aiocb {
diff --git a/src/header/arpa_inet/mod.rs b/src/header/arpa_inet/mod.rs
index cca48be4..a5dd627e 100644
--- a/src/header/arpa_inet/mod.rs
+++ b/src/header/arpa_inet/mod.rs
@@ -4,10 +4,12 @@ use core::str::FromStr;
 use core::{ptr, slice, str};
 
 use header::errno::*;
-use header::netinet_in::in_addr;
-use platform;
+use header::netinet_in::{in_addr, in_addr_t};
+use header::sys_socket::constants::*;
+use header::sys_socket::socklen_t;
 use platform::c_str;
 use platform::types::*;
+use platform;
 
 #[no_mangle]
 pub extern "C" fn htonl(hostlong: u32) -> u32 {
diff --git a/src/header/dirent/mod.rs b/src/header/dirent/mod.rs
index 478e9024..7ea6e363 100644
--- a/src/header/dirent/mod.rs
+++ b/src/header/dirent/mod.rs
@@ -68,7 +68,7 @@ pub unsafe extern "C" fn readdir(dir: *mut DIR) -> *mut dirent {
     if (*dir).index >= (*dir).len {
         let read = Sys::getdents(
             (*dir).fd,
-            (*dir).buf.as_mut_ptr() as *mut platform::types::dirent,
+            (*dir).buf.as_mut_ptr() as *mut dirent,
             (*dir).buf.len(),
         );
         if read <= 0 {
diff --git a/src/header/netdb/mod.rs b/src/header/netdb/mod.rs
index f291969b..d01cfb97 100644
--- a/src/header/netdb/mod.rs
+++ b/src/header/netdb/mod.rs
@@ -21,15 +21,16 @@ use platform::c_str;
 
 use self::dns::{Dns, DnsQuery};
 
-use header::arpa_inet::{htons, ntohs, inet_aton};
+use header::arpa_inet::{htons, inet_aton};
 use header::errno::*;
 use header::fcntl::O_RDONLY;
 use header::netinet_in::{in_addr, IPPROTO_UDP, sockaddr_in};
 use header::stdlib::atoi;
 use header::strings::strcasecmp;
-use header::sys_socket;
-use header::sys_socket::{sockaddr, socklen_t};
 use header::sys_socket::constants::{SOCK_DGRAM, AF_INET};
+use header::sys_socket::{sockaddr, socklen_t};
+use header::sys_socket;
+use header::time::timespec;
 use header::time;
 use header::unistd::SEEK_SET;
 
diff --git a/src/header/pwd/mod.rs b/src/header/pwd/mod.rs
index 7abd77bd..6bbdd524 100644
--- a/src/header/pwd/mod.rs
+++ b/src/header/pwd/mod.rs
@@ -1,6 +1,5 @@
 //! pwd implementation for relibc
 
-use alloc::vec::Vec;
 use core::ptr;
 
 use c_str::CStr;
@@ -8,7 +7,7 @@ use header::{errno, fcntl};
 use platform;
 use platform::types::*;
 use platform::{Line, RawFile, RawLineBuffer};
-use platform::{Pal, Sys};
+use platform::Sys;
 
 #[repr(C)]
 pub struct passwd {
diff --git a/src/header/signal/mod.rs b/src/header/signal/mod.rs
index 2aa9862a..7b556044 100644
--- a/src/header/signal/mod.rs
+++ b/src/header/signal/mod.rs
@@ -23,7 +23,6 @@ pub const SIG_BLOCK: c_int = 0;
 pub const SIG_UNBLOCK: c_int = 1;
 pub const SIG_SETMASK: c_int = 2;
 
-// Need both here and in platform because cbindgen :(
 #[repr(C)]
 #[derive(Clone)]
 pub struct sigaction {
@@ -66,11 +65,11 @@ pub unsafe extern "C" fn sigaction(
     let ptr = if !act.is_null() {
         _sigaction = Some((*act).clone());
         _sigaction.as_mut().unwrap().sa_flags |= SA_RESTORER as c_ulong;
-        _sigaction.as_mut().unwrap() as *mut _ as *mut platform::types::sigaction
+        _sigaction.as_mut().unwrap() as *mut _
     } else {
         ptr::null_mut()
     };
-    Sys::sigaction(sig, ptr, oact as *mut platform::types::sigaction)
+    Sys::sigaction(sig, ptr, oact)
 }
 
 #[no_mangle]
diff --git a/src/header/stdlib/mod.rs b/src/header/stdlib/mod.rs
index 9116eb7a..709bfc74 100644
--- a/src/header/stdlib/mod.rs
+++ b/src/header/stdlib/mod.rs
@@ -11,6 +11,7 @@ use header::errno::*;
 use header::fcntl::*;
 use header::string::*;
 use header::time::constants::CLOCK_MONOTONIC;
+use header::time::timespec;
 use header::wchar::*;
 use header::{ctype, errno, unistd};
 use platform;
diff --git a/src/header/sys_ioctl/mod.rs b/src/header/sys_ioctl/mod.rs
index adbdd7f3..fe72041e 100644
--- a/src/header/sys_ioctl/mod.rs
+++ b/src/header/sys_ioctl/mod.rs
@@ -12,19 +12,20 @@ pub struct sgttyb {
     sg_flags: c_ushort,
 }
 
+#[repr(C)]
+#[derive(Default)]
+pub struct winsize {
+    ws_row: c_ushort,
+    ws_col: c_ushort,
+    ws_xpixel: c_ushort,
+    ws_ypixel: c_ushort,
+}
+
 #[cfg(target_os = "linux")]
 pub mod inner {
     use platform::types::*;
     use platform::{Pal, Sys};
 
-    #[repr(C)]
-    pub struct winsize {
-        ws_row: c_ushort,
-        ws_col: c_ushort,
-        ws_xpixel: c_ushort,
-        ws_ypixel: c_ushort,
-    }
-
     #[no_mangle]
     pub extern "C" fn ioctl(fd: c_int, request: c_ulong, out: *mut c_void) -> c_int {
         // TODO: Somehow support varargs to syscall??
diff --git a/src/header/sys_resource/mod.rs b/src/header/sys_resource/mod.rs
index f4b7bc29..a986adf4 100644
--- a/src/header/sys_resource/mod.rs
+++ b/src/header/sys_resource/mod.rs
@@ -52,7 +52,7 @@ pub unsafe extern "C" fn getrlimit(resource: c_int, rlp: *mut rlimit) -> c_int {
 
 #[no_mangle]
 pub unsafe extern "C" fn getrusage(who: c_int, r_usage: *mut rusage) -> c_int {
-    Sys::getrusage(who, r_usage as *mut platform::types::rusage)
+    Sys::getrusage(who, r_usage)
 }
 
 // #[no_mangle]
diff --git a/src/header/sys_select/cbindgen.toml b/src/header/sys_select/cbindgen.toml
index 4aacaa85..a8038e74 100644
--- a/src/header/sys_select/cbindgen.toml
+++ b/src/header/sys_select/cbindgen.toml
@@ -5,3 +5,8 @@ style = "Tag"
 
 [enum]
 prefix_with_name = true
+
+[export]
+# fd_set is also defined in C because cbindgen is incompatible with mem::size_of booo
+
+exclude = ["FD_SETSIZE", "fd_set"]
diff --git a/src/header/sys_select/mod.rs b/src/header/sys_select/mod.rs
index dcb40b6a..17f9e0a7 100644
--- a/src/header/sys_select/mod.rs
+++ b/src/header/sys_select/mod.rs
@@ -1,9 +1,18 @@
 //! sys/select.h implementation
 
+use core::mem;
+use header::sys_time::timeval;
 use platform::types::*;
 use platform::{Pal, Sys};
 
-// fd_set is defined in C because cbindgen is incompatible with mem::size_of booo
+// fd_set is also defined in C because cbindgen is incompatible with mem::size_of booo
+
+pub const FD_SETSIZE: usize = 1024;
+
+#[repr(C)]
+pub struct fd_set {
+    pub fds_bits: [c_ulong; FD_SETSIZE / (8 * mem::size_of::<c_ulong>())],
+}
 
 #[no_mangle]
 pub extern "C" fn select(
diff --git a/src/header/sys_socket/mod.rs b/src/header/sys_socket/mod.rs
index b5d7667b..cb7efb50 100644
--- a/src/header/sys_socket/mod.rs
+++ b/src/header/sys_socket/mod.rs
@@ -2,14 +2,11 @@
 
 use core::ptr;
 
-use platform;
 use platform::types::*;
 use platform::{PalSocket, Sys};
 
 pub mod constants;
 
-pub type in_addr_t = [u8; 4];
-pub type in_port_t = u16;
 pub type sa_family_t = u16;
 pub type socklen_t = u32;
 
@@ -17,7 +14,7 @@ pub type socklen_t = u32;
 #[derive(Default)]
 pub struct sockaddr {
     pub sa_family: sa_family_t,
-    data: [c_char; 14],
+    pub data: [c_char; 14],
 }
 
 #[no_mangle]
@@ -28,7 +25,7 @@ pub unsafe extern "C" fn accept(
 ) -> c_int {
     Sys::accept(
         socket,
-        address as *mut platform::types::sockaddr,
+        address,
         address_len,
     )
 }
@@ -41,7 +38,7 @@ pub unsafe extern "C" fn bind(
 ) -> c_int {
     Sys::bind(
         socket,
-        address as *const platform::types::sockaddr,
+        address,
         address_len,
     )
 }
@@ -54,7 +51,7 @@ pub unsafe extern "C" fn connect(
 ) -> c_int {
     Sys::connect(
         socket,
-        address as *const platform::types::sockaddr,
+        address,
         address_len,
     )
 }
@@ -67,7 +64,7 @@ pub unsafe extern "C" fn getpeername(
 ) -> c_int {
     Sys::getpeername(
         socket,
-        address as *mut platform::types::sockaddr,
+        address,
         address_len,
     )
 }
@@ -80,7 +77,7 @@ pub unsafe extern "C" fn getsockname(
 ) -> c_int {
     Sys::getsockname(
         socket,
-        address as *mut platform::types::sockaddr,
+        address,
         address_len,
     )
 }
@@ -132,7 +129,7 @@ pub unsafe extern "C" fn recvfrom(
         buffer,
         length,
         flags,
-        address as *mut platform::types::sockaddr,
+        address,
         address_len,
     )
 }
@@ -161,7 +158,7 @@ pub unsafe extern "C" fn sendto(
         message,
         length,
         flags,
-        dest_addr as *const platform::types::sockaddr,
+        dest_addr,
         dest_len,
     )
 }
diff --git a/src/header/sys_stat/mod.rs b/src/header/sys_stat/mod.rs
index 1bd6c005..f4f289f9 100644
--- a/src/header/sys_stat/mod.rs
+++ b/src/header/sys_stat/mod.rs
@@ -2,6 +2,7 @@
 
 use c_str::CStr;
 use header::fcntl::{O_NOFOLLOW, O_PATH};
+use header::time::timespec;
 use platform;
 use platform::types::*;
 use platform::{Pal, Sys};
@@ -35,6 +36,7 @@ pub const S_ISGID: c_int = 0o2000;
 pub const S_ISVTX: c_int = 0o1000;
 
 #[repr(C)]
+#[derive(Default)]
 pub struct stat {
     pub st_dev: dev_t,
     pub st_ino: ino_t,
@@ -69,12 +71,12 @@ pub extern "C" fn fchmod(fildes: c_int, mode: mode_t) -> c_int {
 }
 
 #[no_mangle]
-pub extern "C" fn fstat(fildes: c_int, buf: *mut platform::types::stat) -> c_int {
+pub extern "C" fn fstat(fildes: c_int, buf: *mut stat) -> c_int {
     Sys::fstat(fildes, buf)
 }
 
 #[no_mangle]
-pub extern "C" fn __fxstat(_ver: c_int, fildes: c_int, buf: *mut platform::types::stat) -> c_int {
+pub extern "C" fn __fxstat(_ver: c_int, fildes: c_int, buf: *mut stat) -> c_int {
     fstat(fildes, buf)
 }
 
@@ -84,7 +86,7 @@ pub extern "C" fn futimens(fd: c_int, times: *const timespec) -> c_int {
 }
 
 #[no_mangle]
-pub extern "C" fn lstat(path: *const c_char, buf: *mut platform::types::stat) -> c_int {
+pub extern "C" fn lstat(path: *const c_char, buf: *mut stat) -> c_int {
     let path = unsafe { CStr::from_ptr(path) };
     let fd = Sys::open(path, O_PATH | O_NOFOLLOW, 0);
     if fd < 0 {
@@ -116,7 +118,7 @@ pub extern "C" fn mknod(path: *const c_char, mode: mode_t, dev: dev_t) -> c_int
 }
 
 #[no_mangle]
-pub extern "C" fn stat(file: *const c_char, buf: *mut platform::types::stat) -> c_int {
+pub extern "C" fn stat(file: *const c_char, buf: *mut stat) -> c_int {
     let file = unsafe { CStr::from_ptr(file) };
     let fd = Sys::open(file, O_PATH, 0);
     if fd < 0 {
diff --git a/src/header/sys_time/mod.rs b/src/header/sys_time/mod.rs
index dc50a4ce..f0160458 100644
--- a/src/header/sys_time/mod.rs
+++ b/src/header/sys_time/mod.rs
@@ -1,9 +1,9 @@
 //! sys/time implementation for Redox, following http://pubs.opengroup.org/onlinepubs/7908799/xsh/systime.h.html
 
 use c_str::CStr;
-use platform;
 use platform::types::*;
 use platform::{Pal, Sys};
+use header::time::timespec;
 
 pub const ITIMER_REAL: c_int = 0;
 pub const ITIMER_VIRTUAL: c_int = 1;
@@ -35,7 +35,7 @@ pub struct fd_set {
 
 #[no_mangle]
 pub extern "C" fn getitimer(which: c_int, value: *mut itimerval) -> c_int {
-    Sys::getitimer(which, value as *mut platform::types::itimerval)
+    Sys::getitimer(which, value)
 }
 
 #[no_mangle]
@@ -46,16 +46,16 @@ pub extern "C" fn setitimer(
 ) -> c_int {
     Sys::setitimer(
         which,
-        value as *const platform::types::itimerval,
-        ovalue as *mut platform::types::itimerval,
+        value,
+        ovalue,
     )
 }
 
 #[no_mangle]
 pub extern "C" fn gettimeofday(tp: *mut timeval, tzp: *mut timezone) -> c_int {
     Sys::gettimeofday(
-        tp as *mut platform::types::timeval,
-        tzp as *mut platform::types::timezone,
+        tp,
+        tzp,
     )
 }
 
diff --git a/src/header/sys_times/mod.rs b/src/header/sys_times/mod.rs
index 72c0305a..a045bcb6 100644
--- a/src/header/sys_times/mod.rs
+++ b/src/header/sys_times/mod.rs
@@ -14,5 +14,5 @@ pub struct tms {
 
 #[no_mangle]
 pub extern "C" fn times(out: *mut tms) -> clock_t {
-    Sys::times(out as *mut platform::types::tms)
+    Sys::times(out)
 }
diff --git a/src/header/sys_utsname/mod.rs b/src/header/sys_utsname/mod.rs
index fcd6c807..506f0440 100644
--- a/src/header/sys_utsname/mod.rs
+++ b/src/header/sys_utsname/mod.rs
@@ -1,26 +1,27 @@
 //! sys/utsname implementation for linux, following http://pubs.opengroup.org/onlinepubs/7908799/xsh/sysutsname.h.html
 
+use platform::types::*;
+
+pub const UTSLENGTH: usize = 65;
+
+#[repr(C)]
+pub struct utsname {
+    pub sysname: [c_char; UTSLENGTH],
+    pub nodename: [c_char; UTSLENGTH],
+    pub release: [c_char; UTSLENGTH],
+    pub version: [c_char; UTSLENGTH],
+    pub machine: [c_char; UTSLENGTH],
+    pub domainname: [c_char; UTSLENGTH],
+}
+
 #[cfg(target_os = "linux")]
 mod inner {
-    use platform;
-    use platform::types::*;
     use platform::{Pal, Sys};
-
-    const UTSLENGTH: usize = 65;
-
-    #[repr(C)]
-    pub struct utsname {
-        pub sysname: [c_char; UTSLENGTH],
-        pub nodename: [c_char; UTSLENGTH],
-        pub release: [c_char; UTSLENGTH],
-        pub version: [c_char; UTSLENGTH],
-        pub machine: [c_char; UTSLENGTH],
-        pub domainname: [c_char; UTSLENGTH],
-    }
+    use super::*;
 
     #[no_mangle]
     pub unsafe extern "C" fn uname(uts: *mut utsname) -> c_int {
-        Sys::uname(uts as *mut platform::types::utsname)
+        Sys::uname(uts)
     }
 }
 #[cfg(target_os = "linux")]
diff --git a/src/header/termios/mod.rs b/src/header/termios/mod.rs
index c9159ffd..017aed16 100644
--- a/src/header/termios/mod.rs
+++ b/src/header/termios/mod.rs
@@ -1,6 +1,5 @@
 //! termios implementation, following http://pubs.opengroup.org/onlinepubs/7908799/xsh/termios.h.html
 
-use platform;
 use platform::types::*;
 use platform::{Pal, Sys};
 
@@ -24,12 +23,12 @@ pub struct termios {
 
 #[no_mangle]
 pub extern "C" fn tcgetattr(fd: c_int, out: *mut termios) -> c_int {
-    Sys::tcgetattr(fd, out as *mut platform::types::termios)
+    Sys::tcgetattr(fd, out)
 }
 
 #[no_mangle]
 pub extern "C" fn tcsetattr(fd: c_int, act: c_int, value: *mut termios) -> c_int {
-    Sys::tcsetattr(fd, act, value as *mut platform::types::termios)
+    Sys::tcsetattr(fd, act, value)
 }
 
 pub const VINTR: usize = 0;
diff --git a/src/header/time/mod.rs b/src/header/time/mod.rs
index 1819601a..a8316d2f 100644
--- a/src/header/time/mod.rs
+++ b/src/header/time/mod.rs
@@ -15,11 +15,22 @@ mod helpers;
 mod strftime;
 
 #[repr(C)]
+#[derive(Default)]
 pub struct timespec {
     pub tv_sec: time_t,
     pub tv_nsec: c_long,
 }
 
+#[cfg(target_os = "redox")]
+impl<'a> From<&'a timespec> for syscall::TimeSpec {
+    fn from(tp: &timespec) -> Self {
+        Self {
+            tv_sec: tp.tv_sec,
+            tv_nsec: tp.tv_nsec as i32,
+        }
+    }
+}
+
 #[repr(C)]
 pub struct tm {
     pub tm_sec: c_int,
@@ -118,7 +129,7 @@ pub extern "C" fn clock_getres(clock_id: clockid_t, res: *mut timespec) -> c_int
 
 #[no_mangle]
 pub extern "C" fn clock_gettime(clock_id: clockid_t, tp: *mut timespec) -> c_int {
-    Sys::clock_gettime(clock_id, tp as *mut platform::types::timespec)
+    Sys::clock_gettime(clock_id, tp)
 }
 
 // #[no_mangle]
@@ -326,8 +337,8 @@ pub unsafe extern "C" fn mktime(t: *mut tm) -> time_t {
 #[no_mangle]
 pub extern "C" fn nanosleep(rqtp: *const timespec, rmtp: *mut timespec) -> c_int {
     Sys::nanosleep(
-        rqtp as *const platform::types::timespec,
-        rmtp as *mut platform::types::timespec,
+        rqtp,
+        rmtp,
     )
 }
 
@@ -357,7 +368,7 @@ pub extern "C" fn strptime(buf: *const c_char, format: *const c_char, tm: *mut t
 
 #[no_mangle]
 pub extern "C" fn time(tloc: *mut time_t) -> time_t {
-    let mut ts: platform::types::timespec = Default::default();
+    let mut ts = timespec::default();
     Sys::clock_gettime(CLOCK_REALTIME, &mut ts);
     unsafe {
         if !tloc.is_null() {
diff --git a/src/header/unistd/mod.rs b/src/header/unistd/mod.rs
index 5a7e8b1c..cf42919f 100644
--- a/src/header/unistd/mod.rs
+++ b/src/header/unistd/mod.rs
@@ -7,6 +7,7 @@ use header::sys_time;
 use platform;
 use platform::types::*;
 use platform::{Pal, Sys};
+use header::time::timespec;
 
 pub use self::brk::*;
 pub use self::getopt::*;
diff --git a/src/header/utime/mod.rs b/src/header/utime/mod.rs
index 8007744a..6633f0b6 100644
--- a/src/header/utime/mod.rs
+++ b/src/header/utime/mod.rs
@@ -1,6 +1,7 @@
 //! utime implementation for Redox, following http://pubs.opengroup.org/onlinepubs/7908799/xsh/utime.h.html
 
 use c_str::CStr;
+use header::time::timespec;
 use platform::types::*;
 use platform::{Pal, Sys};
 
diff --git a/src/platform/linux/mod.rs b/src/platform/linux/mod.rs
index 7bd671f8..f6f0ffce 100644
--- a/src/platform/linux/mod.rs
+++ b/src/platform/linux/mod.rs
@@ -4,19 +4,22 @@ use core::{mem, ptr};
 use super::types::*;
 use super::{errno, FileWriter, Pal};
 use c_str::CStr;
+use header::dirent::dirent;
+use header::errno::{EINVAL, ENOSYS};
+use header::signal::SIGCHLD;
+use header::sys_resource::rusage;
+use header::sys_select::fd_set;
+use header::sys_stat::stat;
+use header::sys_time::{itimerval, timeval, timezone};
+use header::sys_times::tms;
+use header::sys_utsname::utsname;
+use header::sys_ioctl::{winsize, TCGETS, TCSETS, TIOCGWINSZ};
+use header::termios::termios;
+use header::time::timespec;
 
 mod signal;
 mod socket;
 
-const EINVAL: c_int = 22;
-const ENOSYS: c_int = 38;
-
-const SIGCHLD: usize = 17;
-
-const TCGETS: c_ulong = 0x5401;
-const TCSETS: c_ulong = 0x5402;
-const TIOCGWINSZ: c_ulong = 0x5413;
-
 const AT_FDCWD: c_int = -100;
 const AT_EMPTY_PATH: c_int = 0x1000;
 const AT_REMOVEDIR: c_int = 0x200;
diff --git a/src/platform/linux/signal.rs b/src/platform/linux/signal.rs
index 9ad5cff3..740afa26 100644
--- a/src/platform/linux/signal.rs
+++ b/src/platform/linux/signal.rs
@@ -1,5 +1,6 @@
 use core::mem;
 
+use header::signal::{sigaction, sigset_t};
 use super::super::types::*;
 use super::super::PalSignal;
 use super::{e, Sys};
diff --git a/src/platform/linux/socket.rs b/src/platform/linux/socket.rs
index 7b030b60..086576b8 100644
--- a/src/platform/linux/socket.rs
+++ b/src/platform/linux/socket.rs
@@ -1,3 +1,4 @@
+use header::sys_socket::{sockaddr, socklen_t};
 use super::super::types::*;
 use super::super::PalSocket;
 use super::{e, Sys};
diff --git a/src/platform/pal/mod.rs b/src/platform/pal/mod.rs
index 08981a56..2addeada 100644
--- a/src/platform/pal/mod.rs
+++ b/src/platform/pal/mod.rs
@@ -2,6 +2,15 @@ use core::ptr;
 
 use super::types::*;
 use c_str::CStr;
+use header::dirent::dirent;
+use header::sys_resource::rusage;
+use header::sys_select::fd_set;
+use header::sys_stat::stat;
+use header::sys_time::{itimerval, timeval, timezone};
+use header::sys_times::tms;
+use header::sys_utsname::utsname;
+use header::termios::termios;
+use header::time::timespec;
 
 pub use self::signal::PalSignal;
 mod signal;
diff --git a/src/platform/pal/signal.rs b/src/platform/pal/signal.rs
index f8d69fd2..78b10b66 100644
--- a/src/platform/pal/signal.rs
+++ b/src/platform/pal/signal.rs
@@ -1,3 +1,4 @@
+use header::signal::{sigaction, sigset_t};
 use super::super::types::*;
 use super::super::Pal;
 
diff --git a/src/platform/pal/socket.rs b/src/platform/pal/socket.rs
index aac42056..39e38c3f 100644
--- a/src/platform/pal/socket.rs
+++ b/src/platform/pal/socket.rs
@@ -1,3 +1,4 @@
+use header::sys_socket::{sockaddr, socklen_t};
 use super::super::types::*;
 use super::super::Pal;
 
diff --git a/src/platform/redox/mod.rs b/src/platform/redox/mod.rs
index d1563923..ac28a846 100644
--- a/src/platform/redox/mod.rs
+++ b/src/platform/redox/mod.rs
@@ -9,17 +9,26 @@ use syscall::data::TimeSpec as redox_timespec;
 use syscall::flag::*;
 use syscall::{self, Result};
 
+use c_str::{CStr, CString};
+use header::dirent::dirent;
+use header::errno::{EINVAL, ENOSYS};
+use header::sys_mman::MAP_ANON;
+use header::sys_resource::rusage;
+use header::sys_select::fd_set;
+use header::sys_stat::stat;
+use header::sys_time::{itimerval, timeval, timezone};
+use header::sys_times::tms;
+use header::sys_utsname::utsname;
+use header::termios::termios;
+use header::time::timespec;
+use header::unistd::{F_OK, R_OK, W_OK, X_OK};
+
 use super::types::*;
 use super::{errno, FileReader, FileWriter, Pal, RawFile, Read};
-use c_str::{CStr, CString};
 
 mod signal;
 mod socket;
 
-const EINVAL: c_int = 22;
-const ENOSYS: c_int = 38;
-const MAP_ANON: c_int = 1;
-
 static ANONYMOUS_MAPS: Once<Mutex<BTreeMap<usize, usize>>> = Once::new();
 
 fn anonymous_maps() -> MutexGuard<'static, BTreeMap<usize, usize>> {
diff --git a/src/platform/redox/signal.rs b/src/platform/redox/signal.rs
index abbf8bd0..2acb8c02 100644
--- a/src/platform/redox/signal.rs
+++ b/src/platform/redox/signal.rs
@@ -1,5 +1,6 @@
 use syscall;
 
+use header::signal::{sigaction, sigset_t};
 use super::super::types::*;
 use super::super::{Pal, PalSignal};
 use super::{e, Sys};
diff --git a/src/platform/redox/socket.rs b/src/platform/redox/socket.rs
index 501c4b89..02cc81fd 100644
--- a/src/platform/redox/socket.rs
+++ b/src/platform/redox/socket.rs
@@ -2,6 +2,9 @@ use core::{mem, ptr, slice};
 use syscall::flag::*;
 use syscall::{self, Result};
 
+use header::netinet_in::{in_addr_t, in_port_t, sockaddr_in};
+use header::sys_socket::constants::*;
+use header::sys_socket::{sockaddr, socklen_t};
 use super::super::types::*;
 use super::super::{errno, Pal, PalSocket};
 use super::{e, Sys};
@@ -23,9 +26,16 @@ macro_rules! bind_or_connect {
             return -1;
         }
         let data = &*($address as *const sockaddr_in);
-        let addr = &data.sin_addr.s_addr;
-        let port = in_port_t::from_be(data.sin_port); // This is transmuted from bytes in BigEndian order
-        let path = format!(bind_or_connect!($mode "{}.{}.{}.{}:{}"), addr[0], addr[1], addr[2], addr[3], port);
+        let addr = data.sin_addr.s_addr;
+        let port = data.sin_port;
+        let path = format!(
+            bind_or_connect!($mode "{}.{}.{}.{}:{}"),
+            addr >> 8*3,
+            addr >> 8*2 & 0xFF,
+            addr >> 8   & 0xFF,
+            addr & 0xFF,
+            port
+        );
 
         // Duplicate the socket, and then duplicate the copy back to the original fd
         let fd = e(syscall::dup($socket as usize, path.as_bytes()));
diff --git a/src/platform/types.rs b/src/platform/types.rs
index e25f4b53..39afacf3 100644
--- a/src/platform/types.rs
+++ b/src/platform/types.rs
@@ -1,6 +1,3 @@
-use core::mem;
-#[cfg(target_os = "redox")]
-use syscall::data::TimeSpec as redox_timespec;
 // Use repr(u8) as LLVM expects `void*` to be the same as `i8*` to help enable
 // more optimization opportunities around it recognizing things like
 // malloc/free.
@@ -68,195 +65,3 @@ pub type suseconds_t = c_int;
 pub type clock_t = c_long;
 pub type clockid_t = c_int;
 pub type timer_t = *mut c_void;
-
-#[repr(C)]
-#[derive(Default)]
-pub struct timespec {
-    pub tv_sec: time_t,
-    pub tv_nsec: c_long,
-}
-
-#[repr(C)]
-#[derive(Default)]
-pub struct timeval {
-    pub tv_sec: time_t,
-    pub tv_usec: suseconds_t,
-}
-#[repr(C)]
-#[derive(Default)]
-pub struct timezone {
-    pub tz_minuteswest: c_int,
-    pub tz_dsttime: c_int,
-}
-
-#[repr(C)]
-#[derive(Default)]
-pub struct itimerval {
-    pub it_interval: timeval,
-    pub it_value: timeval,
-}
-
-#[cfg(target_os = "redox")]
-impl<'a> From<&'a timespec> for redox_timespec {
-    fn from(tp: &timespec) -> redox_timespec {
-        redox_timespec {
-            tv_sec: tp.tv_sec,
-            tv_nsec: tp.tv_nsec as i32,
-        }
-    }
-}
-
-#[repr(C)]
-#[derive(Default)]
-pub struct stat {
-    pub st_dev: dev_t,
-    pub st_ino: ino_t,
-    pub st_nlink: nlink_t,
-    pub st_mode: mode_t,
-    pub st_uid: uid_t,
-    pub st_gid: gid_t,
-    pub st_rdev: dev_t,
-    pub st_size: off_t,
-    pub st_blksize: blksize_t,
-    pub st_blocks: blkcnt_t,
-
-    pub st_atim: timespec,
-    pub st_mtim: timespec,
-    pub st_ctim: timespec,
-
-    // Compared to glibc, our struct is for some reason 24 bytes too small.
-    // Accessing atime works, so clearly the struct isn't incorrect...
-    // This works.
-    pub _pad: [c_char; 24],
-}
-
-pub const AF_INET: c_int = 2;
-pub const SOCK_STREAM: c_int = 1;
-pub const SOCK_DGRAM: c_int = 2;
-pub const SOCK_NONBLOCK: c_int = 0o4000;
-pub const SOCK_CLOEXEC: c_int = 0o2000000;
-
-pub const SIG_BLOCK: c_int = 0;
-pub const SIG_UNBLOCK: c_int = 1;
-pub const SIG_SETMASK: c_int = 2;
-
-pub type in_addr_t = [u8; 4];
-pub type in_port_t = u16;
-pub type sa_family_t = u16;
-pub type socklen_t = u32;
-
-#[repr(C)]
-pub struct sockaddr {
-    pub sa_family: sa_family_t,
-    pub data: [c_char; 14],
-}
-
-#[repr(C)]
-#[derive(Debug, Clone, Copy)]
-pub struct in_addr {
-    pub s_addr: in_addr_t,
-}
-
-#[repr(C)]
-pub struct sockaddr_in {
-    pub sin_family: sa_family_t,
-    pub sin_port: in_port_t,
-    pub sin_addr: in_addr,
-}
-
-#[repr(C)]
-pub struct sigaction {
-    pub sa_handler: Option<extern "C" fn(c_int)>,
-    pub sa_flags: c_ulong,
-    pub sa_restorer: Option<unsafe extern "C" fn()>,
-    pub sa_mask: sigset_t,
-}
-
-pub type sigset_t = c_ulong;
-
-const UTSLENGTH: usize = 65;
-
-#[repr(C)]
-pub struct utsname {
-    pub sysname: [c_char; UTSLENGTH],
-    pub nodename: [c_char; UTSLENGTH],
-    pub release: [c_char; UTSLENGTH],
-    pub version: [c_char; UTSLENGTH],
-    pub machine: [c_char; UTSLENGTH],
-    pub domainname: [c_char; UTSLENGTH],
-}
-
-#[repr(C)]
-pub struct dirent {
-    pub d_ino: ino_t,
-    pub d_off: off_t,
-    pub d_reclen: c_ushort,
-    pub d_type: c_uchar,
-    pub d_name: [c_char; 256],
-}
-
-#[repr(C)]
-#[derive(Default)]
-pub struct winsize {
-    ws_row: c_ushort,
-    ws_col: c_ushort,
-    ws_xpixel: c_ushort,
-    ws_ypixel: c_ushort,
-}
-
-#[repr(C)]
-pub struct rusage {
-    pub ru_utime: timeval,
-    pub ru_stime: timeval,
-    pub ru_maxrss: c_long,
-    pub ru_ixrss: c_long,
-    pub ru_idrss: c_long,
-    pub ru_isrss: c_long,
-    pub ru_minflt: c_long,
-    pub ru_majflt: c_long,
-    pub ru_nswap: c_long,
-    pub ru_inblock: c_long,
-    pub ru_oublock: c_long,
-    pub ru_msgsnd: c_long,
-    pub ru_msgrcv: c_long,
-    pub ru_nsignals: c_long,
-    pub ru_nvcsw: c_long,
-    pub ru_nivcsw: c_long,
-}
-
-#[repr(C)]
-pub struct tms {
-    tms_utime: clock_t,
-    tms_stime: clock_t,
-    tms_cutime: clock_t,
-    tms_cstime: clock_t,
-}
-
-pub const FD_SETSIZE: usize = 1024;
-#[repr(C)]
-pub struct fd_set {
-    pub fds_bits: [c_ulong; FD_SETSIZE / (8 * mem::size_of::<c_ulong>())],
-}
-
-pub const F_OK: c_int = 0;
-pub const R_OK: c_int = 4;
-pub const W_OK: c_int = 2;
-pub const X_OK: c_int = 1;
-
-pub type cc_t = u8;
-pub type speed_t = u32;
-pub type tcflag_t = u32;
-
-pub const NCCS: usize = 32;
-
-#[repr(C)]
-pub struct termios {
-    c_iflag: tcflag_t,
-    c_oflag: tcflag_t,
-    c_cflag: tcflag_t,
-    c_lflag: tcflag_t,
-    c_line: cc_t,
-    c_cc: [cc_t; NCCS],
-    __c_ispeed: speed_t,
-    __c_ospeed: speed_t,
-}
-- 
GitLab