diff --git a/bin/adb_client.rs b/bin/adb_client.rs index 90bc30d..040e28e 100644 --- a/bin/adb_client.rs +++ b/bin/adb_client.rs @@ -12,6 +12,9 @@ struct Args { /// Sets the listening port of ADB server #[clap(short = 'p', long = "port", default_value = "5037")] pub port: u16, + /// Serial id of a specific device. Every request will be sent to this device. + #[clap(short = 's', long = "serial")] + pub serial: Option, #[clap(subcommand)] pub command: Command, } @@ -30,7 +33,7 @@ enum Command { /// Tracks new devices showing up TrackDevices, /// Run 'command' in a shell on the device, and return its output and error streams. - Shell { command: Option }, + Shell { command: Vec }, } fn main() -> Result<()> { @@ -69,10 +72,10 @@ fn main() -> Result<()> { connexion.track_devices(callback)?; } Command::Shell { command } => { - if let Some(command) = command { - connexion.shell_command(command)?; + if command.is_empty() { + connexion.shell(opt.serial)?; } else { - connexion.shell()?; + connexion.shell_command(opt.serial, command)?; } } } diff --git a/src/adb_tcp_connexion.rs b/src/adb_tcp_connexion.rs index d925df7..cf4408f 100644 --- a/src/adb_tcp_connexion.rs +++ b/src/adb_tcp_connexion.rs @@ -192,15 +192,15 @@ impl AdbTcpConnexion { } /// Runs 'command' in a shell on the device, and return its output and error streams. - pub fn shell_command(&self, command: S) -> Result<()> { + pub fn shell_command(&self, serial: Option, command: Vec) -> Result<()> { let mut tcp_stream = TcpStream::connect(self.socket_addr)?; - - Self::send_adb_request(&mut tcp_stream, AdbCommand::TransportAny)?; - - Self::send_adb_request( - &mut tcp_stream, - AdbCommand::ShellCommand(command.to_string()), - )?; + match serial { + None => Self::send_adb_request(&mut tcp_stream, AdbCommand::TransportAny)?, + Some(serial) => { + Self::send_adb_request(&mut tcp_stream, AdbCommand::TransportSerial(serial))? + } + } + Self::send_adb_request(&mut tcp_stream, AdbCommand::ShellCommand(command.join(" ")))?; let buffer_size = 512; loop { @@ -222,14 +222,19 @@ impl AdbTcpConnexion { } /// Starts an interactive shell session on the device. Redirects stdin/stdout/stderr as appropriate. - pub fn shell(&self) -> Result<()> { + pub fn shell(&self, serial: Option) -> Result<()> { let mut adb_termios = ADBTermios::new(std::io::stdin())?; adb_termios.set_adb_termios()?; let mut tcp_stream = TcpStream::connect(self.socket_addr)?; tcp_stream.set_nodelay(true)?; - Self::send_adb_request(&mut tcp_stream, AdbCommand::TransportAny)?; + match serial { + None => Self::send_adb_request(&mut tcp_stream, AdbCommand::TransportAny)?, + Some(serial) => { + Self::send_adb_request(&mut tcp_stream, AdbCommand::TransportSerial(serial))? + } + } Self::send_adb_request(&mut tcp_stream, AdbCommand::Shell)?; let read_stream = Arc::new(tcp_stream); diff --git a/src/models/adb_command.rs b/src/models/adb_command.rs index 0c527f2..66f2b82 100644 --- a/src/models/adb_command.rs +++ b/src/models/adb_command.rs @@ -10,6 +10,7 @@ pub enum AdbCommand { // TransportUSB, // TransportLocal, TransportAny, + TransportSerial(String), // Serial((String, String)), // USB(String), // Local(String), @@ -49,6 +50,7 @@ impl ToString for AdbCommand { AdbCommand::DevicesLong => "host:devices-l".into(), AdbCommand::TrackDevices => "host:track-devices".into(), AdbCommand::TransportAny => "host:transport-any".into(), + AdbCommand::TransportSerial(serial) => format!("host:transport:{}", serial), AdbCommand::ShellCommand(command) => format!("shell:{}", command), AdbCommand::Shell => "shell:".into(), }