/* Rust Arch Linux Updater Copyright (C) 2024 Luke Harding This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ /* shell_commands.rs This file contains utility functions to interact with the shell. */ use std::ffi::OsStr; use std::io; use std::io::{ErrorKind, Read}; use std::process::{Command, Stdio}; pub fn execute_and_display, I>(cmd: S, args: I) -> io::Result<()> where I: IntoIterator, I::Item: AsRef, { let mut child = Command::new(cmd) .args(args) .stderr(Stdio::piped()) .spawn()?; child.wait()?; if let Some(mut child_stderr) = child.stderr { let mut output = String::new(); child_stderr.read_to_string(&mut output)?; // TODO: Relocate to future pacman api if output == "error: you cannot perform this operation unless you are root.\n" { Err(io::Error::from(ErrorKind::PermissionDenied)) } else if output.is_empty() { Ok(()) } else { Err(io::Error::new(ErrorKind::Other, output)) } } else { Ok(()) } } pub fn execute_in_sh(cmd: &'static str) -> io::Result<()> { execute_and_display("sh", ["-c", cmd]) }