1 use super::prelude::*; 2 use crate::protocol::commands::ext::ExtendedMode; 3 4 impl<T: Target, C: Connection> GdbStubImpl<T, C> { handle_extended_mode<'a>( &mut self, res: &mut ResponseWriter<C>, target: &mut T, command: ExtendedMode<'a>, ) -> Result<HandlerStatus, Error<T::Error, C::Error>>5 pub(crate) fn handle_extended_mode<'a>( 6 &mut self, 7 res: &mut ResponseWriter<C>, 8 target: &mut T, 9 command: ExtendedMode<'a>, 10 ) -> Result<HandlerStatus, Error<T::Error, C::Error>> { 11 let ops = match target.extended_mode() { 12 Some(ops) => ops, 13 None => return Ok(HandlerStatus::Handled), 14 }; 15 16 crate::__dead_code_marker!("extended_mode", "impl"); 17 18 let handler_status = match command { 19 ExtendedMode::ExclamationMark(_cmd) => { 20 ops.on_start().map_err(Error::TargetError)?; 21 HandlerStatus::NeedsOk 22 } 23 ExtendedMode::R(_cmd) => { 24 ops.restart().map_err(Error::TargetError)?; 25 HandlerStatus::Handled 26 } 27 ExtendedMode::vAttach(cmd) => { 28 ops.attach(cmd.pid).handle_error()?; 29 30 // TODO: sends OK when running in Non-Stop mode 31 HandlerStatus::Handled 32 } 33 ExtendedMode::vRun(cmd) => { 34 use crate::target::ext::extended_mode::Args; 35 36 let _pid = ops 37 .run(cmd.filename, Args::new(&mut cmd.args.into_iter())) 38 .handle_error()?; 39 40 // TODO: send a more descriptive stop packet? 41 res.write_str("S05")?; 42 HandlerStatus::Handled 43 } 44 // --------- ASLR --------- // 45 ExtendedMode::QDisableRandomization(cmd) if ops.configure_aslr().is_some() => { 46 let ops = ops.configure_aslr().unwrap(); 47 ops.cfg_aslr(cmd.value).handle_error()?; 48 HandlerStatus::NeedsOk 49 } 50 // --------- Environment --------- // 51 ExtendedMode::QEnvironmentHexEncoded(cmd) if ops.configure_env().is_some() => { 52 let ops = ops.configure_env().unwrap(); 53 ops.set_env(cmd.key, cmd.value).handle_error()?; 54 HandlerStatus::NeedsOk 55 } 56 ExtendedMode::QEnvironmentUnset(cmd) if ops.configure_env().is_some() => { 57 let ops = ops.configure_env().unwrap(); 58 ops.remove_env(cmd.key).handle_error()?; 59 HandlerStatus::NeedsOk 60 } 61 ExtendedMode::QEnvironmentReset(_cmd) if ops.configure_env().is_some() => { 62 let ops = ops.configure_env().unwrap(); 63 ops.reset_env().handle_error()?; 64 HandlerStatus::NeedsOk 65 } 66 // --------- Working Dir --------- // 67 ExtendedMode::QSetWorkingDir(cmd) if ops.configure_working_dir().is_some() => { 68 let ops = ops.configure_working_dir().unwrap(); 69 ops.cfg_working_dir(cmd.dir).handle_error()?; 70 HandlerStatus::NeedsOk 71 } 72 // --------- Startup Shell --------- // 73 ExtendedMode::QStartupWithShell(cmd) if ops.configure_startup_shell().is_some() => { 74 let ops = ops.configure_startup_shell().unwrap(); 75 ops.cfg_startup_with_shell(cmd.value).handle_error()?; 76 HandlerStatus::NeedsOk 77 } 78 _ => HandlerStatus::Handled, 79 }; 80 81 Ok(handler_status) 82 } 83 } 84