Skip to content

Commit

Permalink
Merge pull request #7090 from sylvestre/env
Browse files Browse the repository at this point in the history
env/stbuf: better handling of the errors
  • Loading branch information
cakebaker authored Jan 8, 2025
2 parents 62e6dad + 20e043c commit c531fb3
Show file tree
Hide file tree
Showing 4 changed files with 60 additions and 13 deletions.
23 changes: 13 additions & 10 deletions src/uu/env/src/env.rs
Original file line number Diff line number Diff line change
Expand Up @@ -539,16 +539,19 @@ impl EnvAppData {
}
return Err(exit.code().unwrap().into());
}
Err(ref err)
if (err.kind() == io::ErrorKind::NotFound)
|| (err.kind() == io::ErrorKind::InvalidInput) =>
{
return Err(self.make_error_no_such_file_or_dir(prog.deref()));
}
Err(e) => {
uucore::show_error!("unknown error: {:?}", e);
return Err(126.into());
}
Err(ref err) => match err.kind() {
io::ErrorKind::NotFound | io::ErrorKind::InvalidInput => {
return Err(self.make_error_no_such_file_or_dir(prog.deref()));
}
io::ErrorKind::PermissionDenied => {
uucore::show_error!("{}: Permission denied", prog.quote());
return Err(126.into());
}
_ => {
uucore::show_error!("unknown error: {:?}", err);
return Err(126.into());
}
},
Ok(_) => (),
}
Ok(())
Expand Down
21 changes: 18 additions & 3 deletions src/uu/stdbuf/src/stdbuf.rs
Original file line number Diff line number Diff line change
Expand Up @@ -157,9 +157,24 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> {
set_command_env(&mut command, "_STDBUF_E", &options.stderr);
command.args(command_params);

let mut process = command
.spawn()
.map_err_context(|| "failed to execute process".to_string())?;
const EXEC_ERROR: &str = "failed to execute process:";
let mut process = match command.spawn() {
Ok(p) => p,
Err(e) => {
return match e.kind() {
std::io::ErrorKind::PermissionDenied => Err(USimpleError::new(
126,
format!("{EXEC_ERROR} Permission denied"),
)),
std::io::ErrorKind::NotFound => Err(USimpleError::new(
127,
format!("{EXEC_ERROR} No such file or directory"),
)),
_ => Err(USimpleError::new(1, format!("{EXEC_ERROR} {}", e))),
}
}
};

let status = process.wait().map_err_context(String::new)?;
match status.code() {
Some(i) => {
Expand Down
9 changes: 9 additions & 0 deletions tests/by-util/test_env.rs
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,15 @@ fn test_env_version() {
.stdout_contains(util_name!());
}

#[test]
fn test_env_permissions() {
new_ucmd!()
.arg(".")
.fails()
.code_is(126)
.stderr_is("env: '.': Permission denied\n");
}

#[test]
fn test_echo() {
#[cfg(target_os = "windows")]
Expand Down
20 changes: 20 additions & 0 deletions tests/by-util/test_stdbuf.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,26 @@ fn invalid_input() {
new_ucmd!().arg("-/").fails().code_is(125);
}

#[test]
fn test_permission() {
new_ucmd!()
.arg("-o1")
.arg(".")
.fails()
.code_is(126)
.stderr_contains("Permission denied");
}

#[test]
fn test_no_such() {
new_ucmd!()
.arg("-o1")
.arg("no_such")
.fails()
.code_is(127)
.stderr_contains("No such file or directory");
}

#[cfg(all(not(target_os = "windows"), not(target_os = "openbsd")))]
#[test]
fn test_stdbuf_unbuffered_stdout() {
Expand Down

0 comments on commit c531fb3

Please sign in to comment.