Fix getcwd on Redox
This commit is contained in:
@@ -11,7 +11,7 @@ use syscall::{self, Result};
|
||||
use c_str::{CStr, CString};
|
||||
use fs::File;
|
||||
use header::dirent::dirent;
|
||||
use header::errno::{EINVAL, EIO, EPERM};
|
||||
use header::errno::{EINVAL, EIO, EPERM, ERANGE};
|
||||
use header::fcntl;
|
||||
use header::sys_mman::MAP_ANON;
|
||||
use header::sys_stat::stat;
|
||||
@@ -413,15 +413,28 @@ impl Pal for Sys {
|
||||
}
|
||||
|
||||
fn getcwd(buf: *mut c_char, size: size_t) -> *mut c_char {
|
||||
let buf_slice = unsafe { slice::from_raw_parts_mut(buf as *mut u8, size as usize - 1) };
|
||||
let read = e(syscall::getcwd(buf_slice));
|
||||
if read == !0 {
|
||||
ptr::null_mut()
|
||||
let buf_slice = unsafe { slice::from_raw_parts_mut(buf as *mut u8, size as usize) };
|
||||
if ! buf_slice.is_empty() {
|
||||
let nonnull_size = buf_slice.len() - 1;
|
||||
let read = e(syscall::getcwd(&mut buf_slice[..nonnull_size]));
|
||||
if read == !0 {
|
||||
ptr::null_mut()
|
||||
} else if read == nonnull_size {
|
||||
unsafe {
|
||||
errno = ERANGE;
|
||||
}
|
||||
ptr::null_mut()
|
||||
} else {
|
||||
for b in &mut buf_slice[read..] {
|
||||
*b = 0;
|
||||
}
|
||||
buf
|
||||
}
|
||||
} else {
|
||||
unsafe {
|
||||
*buf.offset(read as isize + 1) = 0;
|
||||
errno = EINVAL;
|
||||
}
|
||||
buf
|
||||
ptr::null_mut()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user