diff --git a/Cargo.lock b/Cargo.lock index 0aa89491dcd44d20c43df9395a4d7ede714f2a43..d6ce4d0a6824f189d235de3dcc85e77eb4041263 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -200,9 +200,9 @@ dependencies = [ [[package]] name = "redox-path" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f45c7275fe1467ea17542c01766ae9872fa98aa7fe06ba5ea6595f7a9f0699c6" +checksum = "64072665120942deff5fd5425d6c1811b854f4939e7f1c01ce755f64432bbea7" [[package]] name = "redox_syscall" diff --git a/Cargo.toml b/Cargo.toml index 37c9fb26c28ebcfdbf41327670e2bb6088e9c111..3e8e98e16c9309e16349669c1a71b9ee5760645f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -53,7 +53,7 @@ sc = "0.2.3" [target.'cfg(target_os = "redox")'.dependencies] redox_syscall = "0.4" redox-exec = { path = "src/platform/redox/redox-exec" } -redox-path = "0.1" +redox-path = "0.2" [features] default = ["check_against_libc_crate"] diff --git a/src/platform/redox/mod.rs b/src/platform/redox/mod.rs index 20885fed4169a5be495465bfc2fef0aa50f69048..f3f5b113248c3e6afd708dc901f6fec256bc59d7 100644 --- a/src/platform/redox/mod.rs +++ b/src/platform/redox/mod.rs @@ -11,7 +11,7 @@ use crate::{ header::{ dirent::dirent, errno::{EBADR, EINVAL, EIO, ENOENT, ENOMEM, ENOSYS, EPERM, ERANGE}, - fcntl, + fcntl, limits, sys_mman::{MAP_ANONYMOUS, MAP_FAILED, PROT_READ, PROT_WRITE}, sys_random, sys_resource::{rlimit, RLIM_INFINITY}, @@ -822,7 +822,36 @@ impl Pal for Sys { } fn fpath(fildes: c_int, out: &mut [u8]) -> ssize_t { - e(syscall::fpath(fildes as usize, out)) as ssize_t + // Since this is used by realpath, it converts from the old format to the new one for + // compatibility reasons + let mut buf = [0; limits::PATH_MAX]; + let count = match syscall::fpath(fildes as usize, &mut buf) { + Ok(ok) => ok, + Err(err) => return e(Err(err)) as ssize_t, + }; + + let redox_path = match str::from_utf8(&buf[..count]) + .ok() + .and_then(|x| redox_path::RedoxPath::from_absolute(x)) + { + Some(some) => some, + None => return e(Err(syscall::Error::new(EINVAL))) as ssize_t, + }; + + let (scheme, reference) = match redox_path.as_parts() { + Some(some) => some, + None => return e(Err(syscall::Error::new(EINVAL))) as ssize_t, + }; + + let mut cursor = io::Cursor::new(out); + let res = match scheme.as_ref() { + "file" => write!(cursor, "/{}", reference.as_ref()), + _ => write!(cursor, "/scheme/{}/{}", scheme.as_ref(), reference.as_ref()), + }; + match res { + Ok(()) => cursor.position() as ssize_t, + Err(_err) => e(Err(syscall::Error::new(syscall::ENAMETOOLONG))) as ssize_t, + } } fn readlink(pathname: CStr, out: &mut [u8]) -> ssize_t {