diff --git a/src/header/unistd/mod.rs b/src/header/unistd/mod.rs index 58b194489e4b411e03c97ada0c575856df4210f4..7b764b4ba9b48dae1764d37a97032fd70a26fbfc 100644 --- a/src/header/unistd/mod.rs +++ b/src/header/unistd/mod.rs @@ -1,6 +1,6 @@ //! unistd implementation for Redox, following http://pubs.opengroup.org/onlinepubs/7908799/xsh/unistd.h.html -use core::{ptr, slice}; +use core::{mem, ptr, slice}; use c_str::CStr; use header::errno; @@ -286,8 +286,29 @@ pub extern "C" fn gethostid() -> c_long { } #[no_mangle] -pub unsafe extern "C" fn gethostname(name: *mut c_char, len: size_t) -> c_int { - Sys::gethostname(name, len) +pub unsafe extern "C" fn gethostname(mut name: *mut c_char, mut len: size_t) -> c_int { + 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; + } + 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 } // #[no_mangle] diff --git a/src/platform/linux/mod.rs b/src/platform/linux/mod.rs index 079b10f64532a19e19033e20e363f5be2a1c7278..1bf3c83901e75702b4cfd036d5a4f54aaccd034a 100644 --- a/src/platform/linux/mod.rs +++ b/src/platform/linux/mod.rs @@ -1,4 +1,4 @@ -use core::{mem, ptr}; +use core::ptr; use core_io::Write; use super::types::*; @@ -193,33 +193,6 @@ impl Pal for Sys { e(unsafe { syscall!(GETGID) }) as gid_t } - 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; - } - 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 - } - } - fn getpgid(pid: pid_t) -> pid_t { e(unsafe { syscall!(GETPGID, pid) }) as pid_t } diff --git a/src/platform/pal/mod.rs b/src/platform/pal/mod.rs index 547a9cd41f8e37a9e2fefed09cb1606cbca8256c..bd832ddb63495595991adf1f24fe4744e613c71f 100644 --- a/src/platform/pal/mod.rs +++ b/src/platform/pal/mod.rs @@ -72,8 +72,6 @@ pub trait Pal { fn getgid() -> gid_t; - fn gethostname(name: *mut c_char, len: size_t) -> c_int; - fn getpgid(pid: pid_t) -> pid_t; fn getpid() -> pid_t; diff --git a/src/platform/redox/mod.rs b/src/platform/redox/mod.rs index 599c2d650eada42fd451f21ab24d7364c39422c7..324da886e09fab73c52a8b689b218a2bb26e3f28 100644 --- a/src/platform/redox/mod.rs +++ b/src/platform/redox/mod.rs @@ -513,32 +513,6 @@ impl Pal for Sys { e(syscall::getgid()) as gid_t } - 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 read = 0; - loop { - match file.read(&mut name[read..])? { - 0 => break, - n => read += n, - } - } - Ok(()) - } - - match inner(unsafe { slice::from_raw_parts_mut(name as *mut u8, len as usize) }) { - Ok(()) => 0, - Err(_) => unsafe { - errno = EIO; - -1 - }, - } - } - fn getpgid(pid: pid_t) -> pid_t { e(syscall::getpgid(pid as usize)) as pid_t } @@ -1070,7 +1044,39 @@ impl Pal for Sys { } fn uname(utsname: *mut utsname) -> c_int { + fn gethostname(name: &mut [u8]) -> io::Result<()> { + if name.is_empty() { + return Ok(()) + } + + let mut file = File::open( + &CString::new("/etc/hostname").unwrap(), + fcntl::O_RDONLY | fcntl::O_CLOEXEC, + )?; + + let mut read = 0; + let name_len = name.len(); + loop { + match file.read(&mut name[read..name_len - 1])? { + 0 => break, + n => read += n, + } + } + name[read] = 0; + Ok(()) + } + fn inner(utsname: *mut utsname) -> CoreResult<(), i32> { + match gethostname(unsafe { + slice::from_raw_parts_mut( + (*utsname).nodename.as_mut_ptr() as *mut u8, + (*utsname).nodename.len() + ) + }) { + Ok(_) => (), + Err(_) => return Err(EIO), + } + let file_path = c_str!("sys:uname"); let mut file = match File::open(file_path, fcntl::O_RDONLY | fcntl::O_CLOEXEC) { Ok(ok) => ok, @@ -1099,15 +1105,17 @@ impl Pal for Sys { unsafe { read_line(&mut (*utsname).sysname)?; - read_line(&mut (*utsname).nodename)?; read_line(&mut (*utsname).release)?; - read_line(&mut (*utsname).version)?; read_line(&mut (*utsname).machine)?; + // Version is not provided + ptr::write_bytes((*utsname).version.as_mut_ptr(), 0, UTSLENGTH); + // Redox doesn't provide domainname in sys:uname //read_line(&mut (*utsname).domainname)?; ptr::write_bytes((*utsname).domainname.as_mut_ptr(), 0, UTSLENGTH); } + Ok(()) }