Remove all remaining errno interfaces from Pal.

This commit is contained in:
4lDO2
2024-09-27 10:29:32 +02:00
parent 313b32c815
commit 986754e7b3
5 changed files with 41 additions and 46 deletions
+4 -3
View File
@@ -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);
+12 -9
View File
@@ -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]
+5 -8
View File
@@ -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> {
+9 -2
View File
@@ -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
View File
@@ -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> {