Move gethostname to platform
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
@@ -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]
|
||||
|
||||
Reference in New Issue
Block a user