Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 10 additions & 8 deletions src/uu/mktemp/src/mktemp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -131,20 +131,22 @@ impl Options {
(tmpdir, OsString::from(template))
}
Some(template) => {
let tmpdir = if let Some(tmpdir) =
env::var_os(TMPDIR_ENV_VAR).filter(|val| !val.is_empty())
let tmpdir = if let Some(tmpdir) = env::var_os(TMPDIR_ENV_VAR)
&& matches.get_flag(OPT_T)
{
// A non-empty `$TMPDIR` has priority over `-p` when
// `-t` is given. An empty `$TMPDIR` is treated as
// unset, so `-p` or the system default is used instead.
Some(PathBuf::from(tmpdir))
} else if tmpdir.is_some() {
tmpdir
} else if matches.get_flag(OPT_T) || matches.contains_id(OPT_TMPDIR) {
// If --tmpdir is given without an argument, or -t is given,
// export in TMPDIR.
Some(get_tmpdir_env_or_default())
// If --tmpdir is given without an argument, or -t is given
// export in TMPDIR
#[cfg(target_os = "wasi")]
// WASI's `std::env::temp_dir()` unconditionally panics
let default_tmp_dir = env::var_os(TMPDIR_ENV_VAR)
.map_or_else(|| PathBuf::from(FALLBACK_TMPDIR), PathBuf::from);
#[cfg(not(target_os = "wasi"))]
let default_tmp_dir = env::temp_dir();
Some(default_tmp_dir)
Comment on lines +143 to +149
} else {
None
};
Expand Down
43 changes: 0 additions & 43 deletions tests/by-util/test_mktemp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -937,49 +937,6 @@ fn test_empty_tmpdir_env_var() {
}
}

#[test]
#[cfg_attr(wasi_runner, ignore = "WASI sandbox: host paths not visible")]
fn test_empty_tmpdir_env_var_with_template() {
#[cfg(not(any(windows, target_os = "android")))]
{
let scene = TestScenario::new(util_name!());
let pathname = scene.fixtures.as_string();

// An empty `$TMPDIR` must be treated as unset, so `-t` and
// `--tmpdir` fall back to the system default temporary directory.
for args in [
vec!["-t", TEST_TEMPLATE1],
vec!["--tmpdir", TEST_TEMPLATE1],
vec!["-d", "-t", TEST_TEMPLATE1],
] {
let result = scene.ucmd().env(TMPDIR, "").args(&args).succeeds();
let path = PathBuf::from(result.stdout_str().trim());
assert!(
path.starts_with("/tmp"),
"expected a path under /tmp, got {path:?}",
);
if path.is_dir() {
let _ = std::fs::remove_dir(&path);
} else {
let _ = std::fs::remove_file(&path);
}
}

// `-p` must take precedence over the empty `$TMPDIR`.
let result = scene
.ucmd()
.env(TMPDIR, "")
.args(&["-p", &pathname, "-t", TEST_TEMPLATE1])
.succeeds();
let path = PathBuf::from(result.stdout_str().trim());
assert!(
path.starts_with(&pathname),
"expected a path under {pathname}, got {path:?}",
);
let _ = std::fs::remove_file(&path);
}
}

#[test]
fn test_nonexistent_dir_prefix() {
#[cfg(not(windows))]
Expand Down
Loading