Skip to content

Commit dd08296

Browse files
authored
Merge pull request #9874 from sylvestre/env2-dedup
env: dedup some code
2 parents 1aac2ec + fa0f161 commit dd08296

File tree

1 file changed

+32
-31
lines changed

1 file changed

+32
-31
lines changed

src/uu/env/src/env.rs

Lines changed: 32 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -701,9 +701,24 @@ impl EnvAppData {
701701
#[cfg(unix)]
702702
{
703703
let mut signal_action_log = SignalActionLog::default();
704-
apply_default_signal(&opts.default_signal, &mut signal_action_log)?;
705-
apply_ignore_signal(&opts.ignore_signal, &mut signal_action_log)?;
706-
apply_block_signal(&opts.block_signal, &mut signal_action_log)?;
704+
apply_signal_action(
705+
&opts.default_signal,
706+
&mut signal_action_log,
707+
SignalActionKind::Default,
708+
reset_signal,
709+
)?;
710+
apply_signal_action(
711+
&opts.ignore_signal,
712+
&mut signal_action_log,
713+
SignalActionKind::Ignore,
714+
ignore_signal,
715+
)?;
716+
apply_signal_action(
717+
&opts.block_signal,
718+
&mut signal_action_log,
719+
SignalActionKind::Block,
720+
block_signal,
721+
)?;
707722
if opts.list_signal_handling {
708723
list_signal_handling(&signal_action_log);
709724
}
@@ -990,19 +1005,29 @@ fn apply_specified_env_vars(opts: &Options<'_>) {
9901005
}
9911006

9921007
#[cfg(unix)]
993-
fn apply_default_signal(request: &SignalRequest, log: &mut SignalActionLog) -> UResult<()> {
1008+
fn apply_signal_action<F>(
1009+
request: &SignalRequest,
1010+
log: &mut SignalActionLog,
1011+
action_kind: SignalActionKind,
1012+
signal_fn: F,
1013+
) -> UResult<()>
1014+
where
1015+
F: Fn(Signal) -> UResult<()>,
1016+
{
9941017
request.for_each_signal(|sig_value, explicit| {
9951018
// On some platforms ALL_SIGNALS may contain values that are not valid in libc.
9961019
// Skip those invalid ones and continue (GNU env also ignores undefined signals).
9971020
let Ok(sig) = signal_from_value(sig_value) else {
9981021
return Ok(());
9991022
};
1000-
reset_signal(sig)?;
1001-
log.record(sig_value, SignalActionKind::Default, explicit);
1023+
signal_fn(sig)?;
1024+
log.record(sig_value, action_kind, explicit);
10021025

10031026
// Set environment variable to communicate to Rust child processes
10041027
// that SIGPIPE should be default (not ignored)
1005-
if sig_value == nix::libc::SIGPIPE as usize {
1028+
if matches!(action_kind, SignalActionKind::Default)
1029+
&& sig_value == nix::libc::SIGPIPE as usize
1030+
{
10061031
unsafe {
10071032
std::env::set_var("RUST_SIGPIPE", "default");
10081033
}
@@ -1012,30 +1037,6 @@ fn apply_default_signal(request: &SignalRequest, log: &mut SignalActionLog) -> U
10121037
})
10131038
}
10141039

1015-
#[cfg(unix)]
1016-
fn apply_ignore_signal(request: &SignalRequest, log: &mut SignalActionLog) -> UResult<()> {
1017-
request.for_each_signal(|sig_value, explicit| {
1018-
let Ok(sig) = signal_from_value(sig_value) else {
1019-
return Ok(());
1020-
};
1021-
ignore_signal(sig)?;
1022-
log.record(sig_value, SignalActionKind::Ignore, explicit);
1023-
Ok(())
1024-
})
1025-
}
1026-
1027-
#[cfg(unix)]
1028-
fn apply_block_signal(request: &SignalRequest, log: &mut SignalActionLog) -> UResult<()> {
1029-
request.for_each_signal(|sig_value, explicit| {
1030-
let Ok(sig) = signal_from_value(sig_value) else {
1031-
return Ok(());
1032-
};
1033-
block_signal(sig)?;
1034-
log.record(sig_value, SignalActionKind::Block, explicit);
1035-
Ok(())
1036-
})
1037-
}
1038-
10391040
#[cfg(unix)]
10401041
fn ignore_signal(sig: Signal) -> UResult<()> {
10411042
// SAFETY: This is safe because we write the handler for each signal only once, and therefore "the current handler is the default", as the documentation requires it.

0 commit comments

Comments
 (0)