Merge branch 'canonicalize-libcscheme' into 'master'
fix canonicalize of libc: See merge request redox-os/relibc!445
This commit is contained in:
@@ -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))
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user