diff --git a/Cargo.lock b/Cargo.lock index b80b032..77242ef 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -31,6 +31,12 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bitflags" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" + [[package]] name = "block-buffer" version = "0.10.4" @@ -220,6 +226,17 @@ version = "0.2.159" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.6.0", + "libc", + "redox_syscall 0.5.6", +] + [[package]] name = "log" version = "0.4.22" @@ -332,10 +349,11 @@ dependencies = [ "ed25519-dalek", "hmac", "libc", + "libredox", "log", "num-bigint", "rand", - "redox_syscall", + "redox_syscall 0.2.16", "sha2", ] @@ -345,7 +363,16 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" dependencies = [ - "bitflags", + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "355ae415ccd3a04315d3f8246e86d67689ea74d88d915576e1589a351062a13b" +dependencies = [ + "bitflags 2.6.0", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 7ef92db..07eecfb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,6 +23,9 @@ name = "ssh-keygen" path = "src/bin/ssh-keygen.rs" doc = false +[features] +default = [] + [dependencies] byteorder = "^1.5.0" log = "^0.4.22" @@ -46,3 +49,4 @@ libc = "^0.2.159" [target.'cfg(target_os = "redox")'.dependencies] redox_syscall = "0.2" +libredox = "~0.1.3" # Does not follow SemVer diff --git a/src/channel.rs b/src/channel.rs index 91e1ba1..0bd09f8 100644 --- a/src/channel.rs +++ b/src/channel.rs @@ -88,14 +88,9 @@ impl Channel { self.read_thread = Some(thread::spawn(move || { #[cfg(target_os = "redox")] - use syscall::dup; - #[cfg(target_os = "redox")] - let master2 = unsafe { dup(master_fd as usize, &[]).unwrap_or(!0) }; - + let master2 = unsafe { syscall::dup(master_fd as usize, &[]).unwrap_or(!0) }; #[cfg(not(target_os = "redox"))] - use libc::dup; - #[cfg(not(target_os = "redox"))] - let master2 = unsafe { dup(master_fd) }; + let master2 = unsafe { libc::dup(master_fd) }; println!("dup result: {}", master2 as u32); let mut master = unsafe { File::from_raw_fd(master2 as i32) }; @@ -103,6 +98,9 @@ impl Channel { use std::str::from_utf8_unchecked; let mut buf = [0; 4096]; let count = master.read(&mut buf).unwrap(); + // This is weird. + // An error is thrown&unwrapped here (panic) + // but yet it continues to function properly if count == 0 { break; } diff --git a/src/lib.rs b/src/lib.rs index 8a2b1fa..d4882ea 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,8 +4,8 @@ extern crate rand; extern crate num_bigint; #[macro_use] extern crate log; -#[cfg(target_os = "redox")] -extern crate syscall; +// #[cfg(target_os = "redox")] +// extern crate syscall; #[cfg(not(target_os = "redox"))] extern crate libc; diff --git a/src/sys/redox.rs b/src/sys/redox.rs index f653f8e..0fdd0c5 100644 --- a/src/sys/redox.rs +++ b/src/sys/redox.rs @@ -7,21 +7,24 @@ pub fn before_exec() -> Result<()> { } pub fn fork() -> usize { - extern crate syscall; - unsafe { syscall::clone(syscall::CloneFlags::empty()).unwrap() } + todo!("You must specify -f, the old forking for Redox doesn't work anyway."); + // The following on't work anyway + // but will panic due to missing implementation + // extern crate syscall; + // unsafe { syscall::clone(syscall::CloneFlags::empty()).unwrap() } } pub fn set_winsize(fd: RawFd, row: u16, col: u16, xpixel: u16, ypixel: u16) {} pub fn getpty() -> (RawFd, PathBuf) { - use syscall; + use libredox::{call, flag}; - let master = syscall::open("pty:", syscall::O_RDWR | syscall::O_CREAT) + let master = call::open("pty:", flag::O_RDWR | flag::O_CREAT, 777) .unwrap(); let mut buf: [u8; 4096] = [0; 4096]; - let count = syscall::fpath(master, &mut buf).unwrap(); + let count = call::fpath(master, &mut buf).unwrap(); ( master as i32, PathBuf::from(unsafe {