| // Copyright 2019 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // Provides the command "shell" for crosh which gives developers access to bash if it is available, |
| // or dash otherwise. |
| |
| use std::path::Path; |
| use std::process; |
| |
| use crate::dispatcher::{self, wait_for_result, Arguments, Command, Dispatcher}; |
| |
| static DEFAULT_SHELL: &str = "/bin/sh"; |
| static BASH_SHELL: &str = "/bin/bash"; |
| |
| pub fn register(dispatcher: &mut Dispatcher) { |
| dispatcher.register_command( |
| Command::new( |
| "shell".to_string(), |
| "".to_string(), |
| "Open a command line shell.".to_string(), |
| ) |
| .set_command_callback(Some(execute_shell)), |
| ); |
| } |
| |
| fn execute_shell(_cmd: &Command, _args: &Arguments) -> Result<(), dispatcher::Error> { |
| wait_for_result( |
| process::Command::new(get_shell()) |
| .arg("-l") |
| .spawn() |
| .or(Err(dispatcher::Error::CommandReturnedError))?, |
| ) |
| } |
| |
| fn get_shell() -> &'static str { |
| if Path::new(BASH_SHELL).exists() { |
| return BASH_SHELL; |
| } |
| |
| DEFAULT_SHELL |
| } |