mirror of
https://gitlab.redox-os.org/CoffeeCode/redox-ssh.git
synced 2025-12-28 17:02:19 +01:00
Feature: Specification of executable (exec channel request)
This commit is contained in:
parent
1386c1dc4c
commit
0ceefb1eca
3 changed files with 25 additions and 6 deletions
|
|
@ -27,6 +27,7 @@ pub struct Channel {
|
||||||
max_packet_size: u32,
|
max_packet_size: u32,
|
||||||
read_thread: Option<JoinHandle<()>>,
|
read_thread: Option<JoinHandle<()>>,
|
||||||
env: Vec<(String, String)>,
|
env: Vec<(String, String)>,
|
||||||
|
executable: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
|
@ -34,6 +35,7 @@ pub enum ChannelRequest {
|
||||||
Pty(PtyConfig),
|
Pty(PtyConfig),
|
||||||
Shell,
|
Shell,
|
||||||
Env(String, String),
|
Env(String, String),
|
||||||
|
Exec(String),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Channel {
|
impl Channel {
|
||||||
|
|
@ -55,6 +57,7 @@ impl Channel {
|
||||||
max_packet_size,
|
max_packet_size,
|
||||||
read_thread: None,
|
read_thread: None,
|
||||||
env: Vec::new(),
|
env: Vec::new(),
|
||||||
|
executable: "/bin/sh".to_string(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -76,6 +79,10 @@ impl Channel {
|
||||||
ChannelRequest::Pty(ref pty) => self.setup_tty(pty),
|
ChannelRequest::Pty(ref pty) => self.setup_tty(pty),
|
||||||
ChannelRequest::Shell => self.setup_shell(),
|
ChannelRequest::Shell => self.setup_shell(),
|
||||||
ChannelRequest::Env(key, value) => self.env.push((key, value)),
|
ChannelRequest::Env(key, value) => self.env.push((key, value)),
|
||||||
|
ChannelRequest::Exec(executable) => {
|
||||||
|
self.executable = executable;
|
||||||
|
self.setup_shell();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -84,10 +91,12 @@ impl Channel {
|
||||||
if let Some(ref mut master) = self.master {
|
if let Some(ref mut master) = self.master {
|
||||||
master.write_all(data)?;
|
master.write_all(data)?;
|
||||||
master.flush()
|
master.flush()
|
||||||
} else if let Some(PipeContainer { ref mut stdin, .. }) = self.pipes {
|
}
|
||||||
|
else if let Some(PipeContainer { ref mut stdin, .. }) = self.pipes {
|
||||||
stdin.write_all(data)?;
|
stdin.write_all(data)?;
|
||||||
stdin.flush()
|
stdin.flush()
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -96,7 +105,8 @@ impl Channel {
|
||||||
pub fn read_pty_master(&mut self, buf: &mut [u8]) -> io::Result<usize> {
|
pub fn read_pty_master(&mut self, buf: &mut [u8]) -> io::Result<usize> {
|
||||||
if let Some(ref mut master) = self.master {
|
if let Some(ref mut master) = self.master {
|
||||||
master.read(buf)
|
master.read(buf)
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
Ok(0)
|
Ok(0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -106,7 +116,8 @@ impl Channel {
|
||||||
if let Some(pipes) = &mut self.pipes {
|
if let Some(pipes) = &mut self.pipes {
|
||||||
let res_len = pipes.stdout.read_line(buf);
|
let res_len = pipes.stdout.read_line(buf);
|
||||||
res_len
|
res_len
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
Ok(0)
|
Ok(0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -115,7 +126,8 @@ impl Channel {
|
||||||
if let Some(pipes) = &mut self.pipes {
|
if let Some(pipes) = &mut self.pipes {
|
||||||
let res_len = pipes.stderr.read_line(buf);
|
let res_len = pipes.stderr.read_line(buf);
|
||||||
res_len
|
res_len
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
Ok(0)
|
Ok(0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -32,9 +32,15 @@ impl Channel {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn without_tty(&mut self) -> PipeContainer {
|
fn without_tty(&mut self) -> PipeContainer {
|
||||||
|
let mut args = self.executable.split_ascii_whitespace();
|
||||||
|
let exec = args.next().expect("Failed to get executable from args.");
|
||||||
|
|
||||||
|
info!("Executable {exec}, args: {args:?}");
|
||||||
|
|
||||||
let proc = unsafe {
|
let proc = unsafe {
|
||||||
process::Command::new("/bin/sh")
|
process::Command::new(exec)
|
||||||
// .env_clear()
|
// .env_clear()
|
||||||
|
.args(args)
|
||||||
.envs(self.env.drain(..))
|
.envs(self.env.drain(..))
|
||||||
.stdin(Stdio::piped())
|
.stdin(Stdio::piped())
|
||||||
.stdout(Stdio::piped())
|
.stdout(Stdio::piped())
|
||||||
|
|
|
||||||
|
|
@ -360,6 +360,7 @@ impl Connection {
|
||||||
String::from_utf8(reader.read_string()?).unwrap(), // TODO: error handling
|
String::from_utf8(reader.read_string()?).unwrap(), // TODO: error handling
|
||||||
String::from_utf8(reader.read_string()?).unwrap(),
|
String::from_utf8(reader.read_string()?).unwrap(),
|
||||||
)),
|
)),
|
||||||
|
"exec" => Some(ChannelRequest::Exec(String::from_utf8(reader.read_string()?).unwrap())),
|
||||||
_ => None,
|
_ => None,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue