aboutsummaryrefslogtreecommitdiff
path: root/toys
diff options
context:
space:
mode:
Diffstat (limited to 'toys')
-rw-r--r--toys/pending/dd.c18
1 files changed, 5 insertions, 13 deletions
diff --git a/toys/pending/dd.c b/toys/pending/dd.c
index 8f4e711e..199e5914 100644
--- a/toys/pending/dd.c
+++ b/toys/pending/dd.c
@@ -98,8 +98,8 @@ static void status()
}
}
-static void dd_sigint(int sig) {
- status();
+static void dd_sigint(int sig)
+{
toys.exitval = sig|128;
xexit();
}
@@ -174,8 +174,9 @@ void dd_main()
}
if (bs) TT.in.sz = TT.out.sz = bs;
- signal(SIGINT, dd_sigint);
- signal(SIGUSR1, generic_signal);
+ sigatexit(status);
+ xsignal(SIGINT, dd_sigint);
+ xsignal(SIGUSR1, status);
gettimeofday(&TT.start, NULL);
// For bs=, in/out is done as it is. so only in.sz is enough.
@@ -238,13 +239,6 @@ void dd_main()
int chunk = bytes_left < TT.in.sz ? bytes_left : TT.in.sz;
ssize_t n;
- // Show progress and exit on SIGINT or just continue on SIGUSR1.
- if (toys.signal) {
- status();
- if (toys.signal==SIGINT) exit_signal(toys.signal);
- toys.signal = 0;
- }
-
TT.in.bp = TT.in.buff + TT.in.count;
if (TT.conv & _DD_conv_sync) memset(TT.in.bp, 0, TT.in.sz);
if (!(n = read(TT.in.fd, TT.in.bp, chunk))) break;
@@ -288,6 +282,4 @@ void dd_main()
close(TT.in.fd);
close(TT.out.fd);
if (TT.in.buff) free(TT.in.buff);
-
- status();
}