Browse Source

Move gethostname to platform

jD91mZM2 6 years ago
parent
commit
ff9ef98f47
4 changed files with 62 additions and 52 deletions
  1. 43 2
      src/platform/src/linux/mod.rs
  2. 16 0
      src/platform/src/redox/mod.rs
  3. 1 1
      src/sys_utsname/src/lib.rs
  4. 2 49
      src/unistd/src/lib.rs

+ 43 - 2
src/platform/src/linux/mod.rs

@@ -1,4 +1,4 @@
-use core::ptr;
+use core::{mem, ptr};
 
 use types::*;
 use *;
@@ -8,6 +8,19 @@ const AT_EMPTY_PATH: c_int = 0x1000;
 const AT_REMOVEDIR: c_int = 0x200;
 const AT_SYMLINK_NOFOLLOW: c_int = 0x100;
 
+// Also in sys_utsname. Has to be both because cbindgen
+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],
+}
+
 pub fn e(sys: usize) -> usize {
     if (sys as isize) < 0 && (sys as isize) >= -256 {
         unsafe {
@@ -123,6 +136,34 @@ pub fn getgid() -> gid_t {
     e(unsafe { syscall!(GETGID) })
 }
 
+pub 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 = uname(&mut uts);
+    if err < 0 {
+        mem::forget(uts);
+        return err;
+    }
+    for c in uts.nodename.iter() {
+        if len == 0 {
+            break;
+        }
+        len -= 1;
+
+        *name = *c;
+
+        if *name == 0 {
+            // We do want to copy the zero also, so we check this after the copying.
+            break;
+        }
+
+        name = name.offset(1);
+    }
+    0
+}
+
 pub unsafe fn getpeername(
     socket: c_int,
     address: *mut sockaddr,
@@ -309,7 +350,7 @@ pub fn socketpair(domain: c_int, kind: c_int, protocol: c_int, socket_vector: *m
     e(unsafe { syscall!(SOCKETPAIR, domain, kind, protocol, socket_vector) }) as c_int
 }
 
-pub fn uname(utsname: usize) -> c_int {
+pub fn uname(utsname: *mut utsname) -> c_int {
     e(unsafe { syscall!(UNAME, utsname, 0) }) as c_int
 }
 

+ 16 - 0
src/platform/src/redox/mod.rs

@@ -284,6 +284,22 @@ pub fn getgid() -> gid_t {
     e(syscall::getgid()) as gid_t
 }
 
+pub unsafe fn gethostname(mut name: *mut c_char, len: size_t) -> c_int {
+    let fd = e(syscall::open("/etc/hostname", O_RDONLY)) as i32;
+    if fd < 0 {
+        return fd;
+    }
+    let mut reader = FileReader(fd);
+    for _ in 0..len {
+        if !reader.read_u8(&mut *(name as *mut u8)) {
+            *name = 0;
+            break;
+        }
+        name = name.offset(1);
+    }
+    0
+}
+
 unsafe fn inner_get_name(
     local: bool,
     socket: c_int,

+ 1 - 1
src/sys_utsname/src/lib.rs

@@ -23,7 +23,7 @@ mod inner {
 
     #[no_mangle]
     pub unsafe extern "C" fn uname(uts: *mut utsname) -> c_int {
-        platform::uname(uts as usize)
+        platform::uname(uts as *mut platform::utsname)
     }
 }
 #[cfg(target_os = "linux")]

+ 2 - 49
src/unistd/src/lib.rs

@@ -205,55 +205,8 @@ pub extern "C" fn gethostid() -> c_long {
 }
 
 #[no_mangle]
-pub unsafe extern "C" fn gethostname(mut name: *mut c_char, len: size_t) -> c_int {
-    #[cfg(target_os = "linux")]
-    {
-        use core::mem;
-
-        // len only needs to be mutable on linux
-        let mut len = len;
-
-        let mut uts: sys_utsname::utsname = mem::uninitialized();
-        let err = sys_utsname::uname(&mut uts);
-        if err < 0 {
-            mem::forget(uts);
-            return err;
-        }
-        for c in uts.nodename.iter() {
-            if len == 0 {
-                break;
-            }
-            len -= 1;
-
-            *name = *c;
-
-            if *name == 0 {
-                // We do want to copy the zero also, so we check this after the copying.
-                break;
-            }
-
-            name = name.offset(1);
-        }
-    }
-    #[cfg(target_os = "redox")]
-    {
-        use platform::syscall::flag::*;
-        use platform::{e, FileReader, Read};
-
-        let fd = e(platform::syscall::open("/etc/hostname", O_RDONLY)) as i32;
-        if fd < 0 {
-            return fd;
-        }
-        let mut reader = FileReader(fd);
-        for _ in 0..len {
-            if !reader.read_u8(&mut *(name as *mut u8)) {
-                *name = 0;
-                break;
-            }
-            name = name.offset(1);
-        }
-    }
-    0
+pub unsafe extern "C" fn gethostname(name: *mut c_char, len: size_t) -> c_int {
+    platform::gethostname(name, len)
 }
 
 // #[no_mangle]