Remove all remaining errno interfaces from Pal.
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
use core::ptr;
|
||||
|
||||
use crate::{
|
||||
error::ResultExtPtrMut,
|
||||
header::errno::ENOMEM,
|
||||
platform::{self, types::*, Pal, Sys},
|
||||
};
|
||||
@@ -9,7 +10,7 @@ static mut BRK: *mut c_void = ptr::null_mut();
|
||||
|
||||
#[no_mangle]
|
||||
pub unsafe extern "C" fn brk(addr: *mut c_void) -> c_int {
|
||||
BRK = Sys::brk(addr);
|
||||
BRK = Sys::brk(addr).or_errno_null_mut();
|
||||
|
||||
if BRK < addr {
|
||||
platform::ERRNO.set(ENOMEM);
|
||||
@@ -22,7 +23,7 @@ pub unsafe extern "C" fn brk(addr: *mut c_void) -> c_int {
|
||||
#[no_mangle]
|
||||
pub unsafe extern "C" fn sbrk(incr: intptr_t) -> *mut c_void {
|
||||
if BRK.is_null() {
|
||||
BRK = Sys::brk(ptr::null_mut());
|
||||
BRK = Sys::brk(ptr::null_mut()).or_errno_null_mut();
|
||||
}
|
||||
|
||||
let old_brk = BRK;
|
||||
@@ -30,7 +31,7 @@ pub unsafe extern "C" fn sbrk(incr: intptr_t) -> *mut c_void {
|
||||
if incr != 0 {
|
||||
let addr = old_brk.offset(incr);
|
||||
|
||||
BRK = Sys::brk(addr);
|
||||
BRK = Sys::brk(addr).or_errno_null_mut();
|
||||
|
||||
if BRK < addr {
|
||||
platform::ERRNO.set(ENOMEM);
|
||||
|
||||
@@ -9,7 +9,7 @@ use core::{
|
||||
|
||||
use crate::{
|
||||
c_str::CStr,
|
||||
error::ResultExt,
|
||||
error::{Errno, ResultExt},
|
||||
header::{
|
||||
crypt::{crypt_data, crypt_r},
|
||||
errno, fcntl, limits,
|
||||
@@ -17,7 +17,7 @@ use crate::{
|
||||
sys_ioctl, sys_resource, sys_time, sys_utsname, termios,
|
||||
time::timespec,
|
||||
},
|
||||
platform::{self, types::*, Pal, Sys},
|
||||
platform::{self, types::*, Pal, Sys, ERRNO},
|
||||
};
|
||||
|
||||
use alloc::collections::LinkedList;
|
||||
@@ -377,7 +377,7 @@ pub extern "C" fn ftruncate(fildes: c_int, length: off_t) -> c_int {
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub extern "C" fn getcwd(mut buf: *mut c_char, mut size: size_t) -> *mut c_char {
|
||||
pub unsafe extern "C" fn getcwd(mut buf: *mut c_char, mut size: size_t) -> *mut c_char {
|
||||
let alloc = buf.is_null();
|
||||
let mut stack_buf = [0; limits::PATH_MAX];
|
||||
if alloc {
|
||||
@@ -385,10 +385,13 @@ pub extern "C" fn getcwd(mut buf: *mut c_char, mut size: size_t) -> *mut c_char
|
||||
size = stack_buf.len();
|
||||
}
|
||||
|
||||
let ret = Sys::getcwd(buf, size);
|
||||
if ret.is_null() {
|
||||
return ptr::null_mut();
|
||||
}
|
||||
let ret = match Sys::getcwd(buf, size) {
|
||||
Ok(()) => buf,
|
||||
Err(Errno(errno)) => {
|
||||
ERRNO.set(errno);
|
||||
return ptr::null_mut();
|
||||
}
|
||||
};
|
||||
|
||||
if alloc {
|
||||
let len = stack_buf
|
||||
@@ -537,8 +540,8 @@ pub extern "C" fn getuid() -> uid_t {
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub extern "C" fn getwd(path_name: *mut c_char) -> *mut c_char {
|
||||
getcwd(path_name, limits::PATH_MAX)
|
||||
pub unsafe extern "C" fn getwd(path_name: *mut c_char) -> *mut c_char {
|
||||
unsafe { getcwd(path_name, limits::PATH_MAX) }
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
|
||||
@@ -92,8 +92,8 @@ impl Pal for Sys {
|
||||
e_raw(unsafe { syscall!(ACCESS, path.as_ptr(), mode) }).map(|_| ())
|
||||
}
|
||||
|
||||
unsafe fn brk(addr: *mut c_void) -> *mut c_void {
|
||||
unsafe { syscall!(BRK, addr) as *mut c_void }
|
||||
unsafe fn brk(addr: *mut c_void) -> Result<*mut c_void> {
|
||||
Ok(e_raw(unsafe { syscall!(BRK, addr) })? as *mut c_void)
|
||||
}
|
||||
|
||||
fn chdir(path: CStr) -> Result<()> {
|
||||
@@ -273,12 +273,9 @@ impl Pal for Sys {
|
||||
e_raw(unsafe { syscall!(UTIMENSAT, AT_FDCWD, path.as_ptr(), times, 0) }).map(|_| ())
|
||||
}
|
||||
|
||||
fn getcwd(buf: *mut c_char, size: size_t) -> *mut c_char {
|
||||
if e(unsafe { syscall!(GETCWD, buf, size) }) == !0 {
|
||||
ptr::null_mut()
|
||||
} else {
|
||||
buf
|
||||
}
|
||||
unsafe fn getcwd(buf: *mut c_char, size: size_t) -> Result<()> {
|
||||
e_raw(unsafe { syscall!(GETCWD, buf, size) })?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn getdents(fd: c_int, buf: &mut [u8], _off: u64) -> Result<usize> {
|
||||
|
||||
@@ -28,7 +28,7 @@ mod socket;
|
||||
pub trait Pal {
|
||||
fn access(path: CStr, mode: c_int) -> Result<()>;
|
||||
|
||||
unsafe fn brk(addr: *mut c_void) -> *mut c_void;
|
||||
unsafe fn brk(addr: *mut c_void) -> Result<*mut c_void>;
|
||||
|
||||
fn chdir(path: CStr) -> Result<()>;
|
||||
|
||||
@@ -92,7 +92,7 @@ pub trait Pal {
|
||||
|
||||
unsafe fn utimens(path: CStr, times: *const timespec) -> Result<()>;
|
||||
|
||||
fn getcwd(buf: *mut c_char, size: size_t) -> *mut c_char;
|
||||
unsafe fn getcwd(buf: *mut c_char, size: size_t) -> Result<()>;
|
||||
|
||||
fn getdents(fd: c_int, buf: &mut [u8], opaque_offset: u64) -> Result<usize>;
|
||||
fn dir_seek(fd: c_int, opaque_offset: u64) -> Result<()>;
|
||||
@@ -102,10 +102,13 @@ pub trait Pal {
|
||||
// possible this_dent slice is safe (and will be validated).
|
||||
unsafe fn dent_reclen_offset(this_dent: &[u8], offset: usize) -> Option<(u16, u64)>;
|
||||
|
||||
// Always successful
|
||||
fn getegid() -> gid_t;
|
||||
|
||||
// Always successful
|
||||
fn geteuid() -> uid_t;
|
||||
|
||||
// Always successful
|
||||
fn getgid() -> gid_t;
|
||||
|
||||
unsafe fn getgroups(size: c_int, list: *mut gid_t) -> Result<c_int>;
|
||||
@@ -117,8 +120,10 @@ pub trait Pal {
|
||||
|
||||
fn getpgid(pid: pid_t) -> Result<pid_t>;
|
||||
|
||||
// Always successful
|
||||
fn getpid() -> pid_t;
|
||||
|
||||
// Always successful
|
||||
fn getppid() -> pid_t;
|
||||
|
||||
fn getpriority(which: c_int, who: id_t) -> Result<c_int>;
|
||||
@@ -133,6 +138,7 @@ pub trait Pal {
|
||||
|
||||
fn getsid(pid: pid_t) -> Result<pid_t>;
|
||||
|
||||
// Always successful
|
||||
fn gettid() -> pid_t;
|
||||
|
||||
unsafe fn gettimeofday(tp: *mut timeval, tzp: *mut timezone) -> Result<()>;
|
||||
@@ -224,6 +230,7 @@ pub trait Pal {
|
||||
|
||||
fn sync() -> Result<()>;
|
||||
|
||||
// Always successful
|
||||
fn umask(mask: mode_t) -> mode_t;
|
||||
|
||||
unsafe fn uname(utsname: *mut utsname) -> Result<()>;
|
||||
|
||||
+11
-24
@@ -74,6 +74,7 @@ macro_rules! path_from_c_str {
|
||||
|
||||
use self::{exec::Executable, path::canonicalize};
|
||||
|
||||
// TODO: Remove
|
||||
pub fn e(sys: syscall::error::Result<usize>) -> usize {
|
||||
match sys {
|
||||
Ok(ok) => ok,
|
||||
@@ -118,27 +119,20 @@ impl Pal for Sys {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
// TODO: Rustify
|
||||
unsafe fn brk(addr: *mut c_void) -> *mut c_void {
|
||||
unsafe fn brk(addr: *mut c_void) -> Result<*mut c_void> {
|
||||
// On first invocation, allocate a buffer for brk
|
||||
if BRK_CUR.is_null() {
|
||||
// 4 megabytes of RAM ought to be enough for anybody
|
||||
const BRK_MAX_SIZE: usize = 4 * 1024 * 1024;
|
||||
|
||||
let allocated = match Self::mmap(
|
||||
let allocated = Self::mmap(
|
||||
ptr::null_mut(),
|
||||
BRK_MAX_SIZE,
|
||||
PROT_READ | PROT_WRITE,
|
||||
MAP_ANONYMOUS,
|
||||
0,
|
||||
0,
|
||||
) {
|
||||
Ok(allocated) => allocated,
|
||||
Err(Errno(errno)) => {
|
||||
ERRNO.set(errno);
|
||||
return !0 as *mut c_void;
|
||||
}
|
||||
};
|
||||
)?;
|
||||
|
||||
BRK_CUR = allocated;
|
||||
BRK_END = (allocated as *mut u8).add(BRK_MAX_SIZE) as *mut c_void;
|
||||
@@ -146,15 +140,14 @@ impl Pal for Sys {
|
||||
|
||||
if addr.is_null() {
|
||||
// Lookup what previous brk() invocations have set the address to
|
||||
BRK_CUR
|
||||
Ok(BRK_CUR)
|
||||
} else if BRK_CUR <= addr && addr < BRK_END {
|
||||
// It's inside buffer, return
|
||||
BRK_CUR = addr;
|
||||
addr
|
||||
Ok(addr)
|
||||
} else {
|
||||
// It was outside of valid range
|
||||
ERRNO.set(ENOMEM);
|
||||
ptr::null_mut()
|
||||
Err(Errno(ENOMEM))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -325,22 +318,16 @@ impl Pal for Sys {
|
||||
Self::futimens(*file, times)
|
||||
}
|
||||
|
||||
// FIXME: unsound
|
||||
fn getcwd(buf: *mut c_char, size: size_t) -> *mut c_char {
|
||||
unsafe fn getcwd(buf: *mut c_char, size: size_t) -> Result<()> {
|
||||
// TODO: Not using MaybeUninit seems a little unsafe
|
||||
|
||||
let buf_slice = unsafe { slice::from_raw_parts_mut(buf as *mut u8, size as usize) };
|
||||
if buf_slice.is_empty() {
|
||||
ERRNO.set(EINVAL);
|
||||
return ptr::null_mut();
|
||||
return Err(Errno(EINVAL));
|
||||
}
|
||||
|
||||
if path::getcwd(buf_slice).is_none() {
|
||||
ERRNO.set(ERANGE);
|
||||
return ptr::null_mut();
|
||||
}
|
||||
|
||||
buf
|
||||
path::getcwd(buf_slice).ok_or(Errno(ERANGE))?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn getdents(fd: c_int, buf: &mut [u8], opaque: u64) -> Result<usize> {
|
||||
|
||||
Reference in New Issue
Block a user