• 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( &mut self, res: &mut ResponseWriter<'_, C>, target: &mut T, command: ExtendedMode<'_>, ) -> Result<HandlerStatus, Error<T::Error, C::Error>>5     pub(crate) fn handle_extended_mode(
6         &mut self,
7         res: &mut ResponseWriter<'_, C>,
8         target: &mut T,
9         command: ExtendedMode<'_>,
10     ) -> Result<HandlerStatus, Error<T::Error, C::Error>> {
11         let ops = match target.support_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                 // This is a reasonable response, as the `run` handler must
41                 // spawn the process in a stopped state.
42                 res.write_str("S05")?;
43                 HandlerStatus::Handled
44             }
45             // --------- ASLR --------- //
46             ExtendedMode::QDisableRandomization(cmd) if ops.support_configure_aslr().is_some() => {
47                 let ops = ops.support_configure_aslr().unwrap();
48                 ops.cfg_aslr(cmd.value).handle_error()?;
49                 HandlerStatus::NeedsOk
50             }
51             // --------- Environment --------- //
52             ExtendedMode::QEnvironmentHexEncoded(cmd) if ops.support_configure_env().is_some() => {
53                 let ops = ops.support_configure_env().unwrap();
54                 ops.set_env(cmd.key, cmd.value).handle_error()?;
55                 HandlerStatus::NeedsOk
56             }
57             ExtendedMode::QEnvironmentUnset(cmd) if ops.support_configure_env().is_some() => {
58                 let ops = ops.support_configure_env().unwrap();
59                 ops.remove_env(cmd.key).handle_error()?;
60                 HandlerStatus::NeedsOk
61             }
62             ExtendedMode::QEnvironmentReset(_cmd) if ops.support_configure_env().is_some() => {
63                 let ops = ops.support_configure_env().unwrap();
64                 ops.reset_env().handle_error()?;
65                 HandlerStatus::NeedsOk
66             }
67             // --------- Working Dir --------- //
68             ExtendedMode::QSetWorkingDir(cmd) if ops.support_configure_working_dir().is_some() => {
69                 let ops = ops.support_configure_working_dir().unwrap();
70                 ops.cfg_working_dir(cmd.dir).handle_error()?;
71                 HandlerStatus::NeedsOk
72             }
73             // --------- Startup Shell --------- //
74             ExtendedMode::QStartupWithShell(cmd)
75                 if ops.support_configure_startup_shell().is_some() =>
76             {
77                 let ops = ops.support_configure_startup_shell().unwrap();
78                 ops.cfg_startup_with_shell(cmd.value).handle_error()?;
79                 HandlerStatus::NeedsOk
80             }
81             _ => HandlerStatus::Handled,
82         };
83 
84         Ok(handler_status)
85     }
86 }
87