Merge branch 'canonicalize-libcscheme' into 'master'

fix canonicalize of libc:

See merge request redox-os/relibc!445
This commit is contained in:
Jeremy Soller
2024-01-05 19:28:06 +00:00
3 changed files with 17 additions and 10 deletions
+8 -4
View File
@@ -1,7 +1,7 @@
use super::libredox;
use crate::{c_str::CStr, header::stdlib::getenv, platform::types::*};
use core::{ptr, slice};
use syscall::{Error, Result, EINVAL, EIO, ENOENT};
use syscall::{flag::*, Error, Result, EINVAL, EIO, ENOENT};
pub const LIBC_SCHEME: &'static str = "libc:";
@@ -25,11 +25,15 @@ macro_rules! env_str {
};
}
pub fn open(path: &str, oflag: c_int, mode: mode_t) -> Result<usize> {
pub fn open(path: &str, flags: usize) -> Result<usize> {
assert!(path.starts_with(LIBC_SCHEME));
if flags & O_SYMLINK != 0 {
return Err(Error::new(ENOENT));
}
let basename = match path.strip_prefix(LIBC_SCHEME) {
Some(path) => path.trim_start_matches('/').trim_end_matches('/'),
Some(path) => path.trim_matches('/'),
_ => return Err(Error::new(EIO)),
};
@@ -40,7 +44,7 @@ pub fn open(path: &str, oflag: c_int, mode: mode_t) -> Result<usize> {
"stdout" => syscall::dup(1, &[]),
"tty" => {
if let Some(tty) = env_str!("TTY") {
return libredox::open(tty, oflag, mode);
return syscall::open(tty, flags);
}
Err(Error::new(ENOENT))
}
-4
View File
@@ -778,10 +778,6 @@ impl Pal for Sys {
fn open(path: CStr, oflag: c_int, mode: mode_t) -> c_int {
let path = path_from_c_str!(path);
if path.starts_with(libcscheme::LIBC_SCHEME) {
return e(libcscheme::open(path, oflag, mode)) as c_int;
}
e(libredox::open(path, oflag, mode)) as c_int
}
+9 -2
View File
@@ -2,7 +2,7 @@ use syscall::{data::Stat, error::*, flag::*};
use alloc::{borrow::ToOwned, boxed::Box, string::String, vec::Vec};
use super::FdGuard;
use super::{libcscheme, FdGuard};
use crate::sync::Mutex;
// TODO: Define in syscall
@@ -168,7 +168,14 @@ pub fn open(path: &str, flags: usize) -> Result<usize> {
for _ in 0..MAX_LEVEL {
let canon = canonicalize(path)?;
match syscall::open(&*canon, flags) {
let open_res = if canon.starts_with(libcscheme::LIBC_SCHEME) {
libcscheme::open(&canon, flags)
} else {
syscall::open(&*canon, flags)
};
match open_res {
Ok(fd) => return Ok(fd),
Err(error) if error == Error::new(EXDEV) => {
let resolve_flags = O_CLOEXEC | O_SYMLINK | O_RDONLY;