From 21559bb503e8963c2a7efe8cf61bda01a9fab73b Mon Sep 17 00:00:00 2001
From: jD91mZM2 <me@krake.one>
Date: Wed, 26 Sep 2018 16:40:23 +0200
Subject: [PATCH] Fix redox compilation

---
 src/platform/linux/mod.rs | 41 +++++++++++++++++------------------
 src/platform/pal/mod.rs   |  2 +-
 src/platform/redox/mod.rs | 45 ++++++++++++++++++++-------------------
 3 files changed, 44 insertions(+), 44 deletions(-)

diff --git a/src/platform/linux/mod.rs b/src/platform/linux/mod.rs
index 08a6f4d1..5b3d8957 100644
--- a/src/platform/linux/mod.rs
+++ b/src/platform/linux/mod.rs
@@ -194,32 +194,31 @@ impl Pal for Sys {
         e(unsafe { syscall!(GETGID) }) as gid_t
     }
 
-    unsafe fn gethostname(mut name: *mut c_char, len: size_t) -> c_int {
-        // len only needs to be mutable on linux
-        let mut len = len;
-
-        let mut uts = mem::uninitialized();
-        let err = Sys::uname(&mut uts);
-        if err < 0 {
-            mem::forget(uts);
-            return err;
-        }
-        for c in uts.nodename.iter() {
-            if len == 0 {
-                break;
+    fn gethostname(mut name: *mut c_char, mut len: size_t) -> c_int {
+        unsafe {
+            let mut uts = mem::uninitialized();
+            let err = Sys::uname(&mut uts);
+            if err < 0 {
+                mem::forget(uts);
+                return err;
             }
-            len -= 1;
+            for c in uts.nodename.iter() {
+                if len == 0 {
+                    break;
+                }
+                len -= 1;
 
-            *name = *c;
+                *name = *c;
 
-            if *name == 0 {
-                // We do want to copy the zero also, so we check this after the copying.
-                break;
-            }
+                if *name == 0 {
+                    // We do want to copy the zero also, so we check this after the copying.
+                    break;
+                }
 
-            name = name.offset(1);
+                name = name.offset(1);
+            }
+            0
         }
-        0
     }
 
     fn getpgid(pid: pid_t) -> pid_t {
diff --git a/src/platform/pal/mod.rs b/src/platform/pal/mod.rs
index 9a3a2030..bd18cbab 100644
--- a/src/platform/pal/mod.rs
+++ b/src/platform/pal/mod.rs
@@ -71,7 +71,7 @@ pub trait Pal {
 
     fn getgid() -> gid_t;
 
-    unsafe fn gethostname(name: *mut c_char, len: size_t) -> c_int;
+    fn gethostname(name: *mut c_char, len: size_t) -> c_int;
 
     fn getpgid(pid: pid_t) -> pid_t;
 
diff --git a/src/platform/redox/mod.rs b/src/platform/redox/mod.rs
index 59a5edce..42cb72b9 100644
--- a/src/platform/redox/mod.rs
+++ b/src/platform/redox/mod.rs
@@ -11,8 +11,10 @@ use syscall::flag::*;
 use syscall::{self, Result};
 
 use c_str::{CStr, CString};
+use fs::File;
+use io;
 use header::dirent::dirent;
-use header::errno::{EINVAL, ENOSYS};
+use header::errno::{EIO, EINVAL, ENOSYS};
 use header::fcntl;
 const MAP_ANON: c_int = 1;
 //use header::sys_mman::MAP_ANON;
@@ -423,31 +425,30 @@ impl Pal for Sys {
         e(syscall::getgid()) as gid_t
     }
 
-    unsafe fn gethostname(mut name: *mut c_char, len: size_t) -> c_int {
-        let fd = match RawFile::open(
-            &CString::new("/etc/hostname").unwrap(),
-            fcntl::O_RDONLY | fcntl::O_CLOEXEC,
-            0,
-        ) {
-            Ok(fd) => fd,
-            Err(_) => return -1,
-        };
+    fn gethostname(name: *mut c_char, len: size_t) -> c_int {
+        fn inner(name: &mut [u8]) -> io::Result<()> {
+            let mut file = File::open(
+                &CString::new("/etc/hostname").unwrap(),
+                fcntl::O_RDONLY | fcntl::O_CLOEXEC
+            )?;
 
-        let mut reader = FileReader(*fd);
-        for _ in 0..len {
-            match reader.read_u8() {
-                Ok(Some(b)) => {
-                    *name = b as c_char;
-                    name = name.offset(1);
-                }
-                Ok(None) => {
-                    *name = 0;
-                    break;
+            let mut read = 0;
+            loop {
+                match file.read(&mut name[read..])? {
+                    0 => break,
+                    n => read += n
                 }
-                Err(()) => return -1,
+            }
+            Ok(())
+        }
+
+        match inner(unsafe { slice::from_raw_parts_mut(name as *mut u8, len as usize) }) {
+            Ok(()) => 0,
+            Err(_) => unsafe {
+                errno = EIO;
+                -1
             }
         }
-        0
     }
 
     fn getpgid(pid: pid_t) -> pid_t {
-- 
GitLab