blob: 13329a5fa7d0c68e571eb6e459138e03523fe53c [file] [log] [blame] [edit]
// Copyright 2024 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Provides the command "vmstat" for crosh.
use std::process;
use getopts::Options;
use crate::dispatcher::{self, wait_for_result, Arguments, Command, Dispatcher};
pub fn register(dispatcher: &mut Dispatcher) {
dispatcher.register_command(
Command::new("vmstat", "[options]", "Report virtual memory statistics.")
.set_command_callback(Some(execute_uptime)),
);
}
fn execute_uptime(_cmd: &Command, args: &Arguments) -> Result<(), dispatcher::Error> {
/* We keep a reduced set of options here for security */
let mut opts = Options::new();
opts.optflag("a", "active", "");
opts.optflag("f", "forks", "");
opts.optflag("m", "slabs", "");
opts.optflag("n", "one-header", "");
opts.optflag("s", "stats", "");
opts.optflag("d", "disk", "");
opts.optflag("D", "disk-sum", "");
// The tool only does strcmp against the partition argument.
// It doesn't try to open or access the path directly.
opts.optopt("p", "partition", "", "");
opts.optopt("S", "unit", "", "");
opts.optflag("w", "wide", "");
opts.optflag("t", "timestamp", "");
opts.optflag("h", "help", "");
opts.optflag("V", "version", "");
opts.parse(args.get_tokens()).map_err(|_| {
dispatcher::Error::CommandInvalidArguments(String::from("Unsupported option"))
})?;
wait_for_result(
process::Command::new("vmstat")
.args(args.get_args())
.spawn()
.or(Err(dispatcher::Error::CommandReturnedError))?,
)
}