• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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