aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorElliott Hughes <enh@google.com>2021-02-23 14:24:19 -0800
committerRob Landley <rob@landley.net>2021-02-23 19:46:52 -0600
commit1ba53eead1ab9787e77dc43196b8402ec96e7fd4 (patch)
tree8c2b984e074cdf00babbb26b51f3a4c7f7644a66 /lib
parentd57dddaf264c57df6e7efdcd294d39060ae3e199 (diff)
downloadtoybox-1ba53eead1ab9787e77dc43196b8402ec96e7fd4.tar.gz
dd: simplify signal handling and fix status output.
Other dd implementations always show the status on exit, whether success or failure. Fix that by using xsigatexit() (and clarify the comment for that function a little, since it didn't previously address the "at exit" part of its behavior at all). This also fixes SIGUSR1 behavior so that we show the status immediately rather than on the next trip round the read/write loop. Tested with `dd of=/dev/full`, sending SIGUSR1 twice from another shell (to see the status immediately each time, without exiting), then hitting ^C (to see the status and then exiting), then restarting dd and hitting enter (to see a write error followed by the status before exiting). Bug: https://issuetracker.google.com/177017283
Diffstat (limited to 'lib')
-rw-r--r--lib/lib.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/lib/lib.c b/lib/lib.c
index 06e39169..87bda4f6 100644
--- a/lib/lib.c
+++ b/lib/lib.c
@@ -911,9 +911,10 @@ void exit_signal(int sig)
xexit();
}
-// Install the same handler on every signal that defaults to killing the
-// process, calling the handler on the way out. Calling multiple times
-// adds the handlers to a list, to be called in order.
+// Install an atexit handler. Also install the same handler on every signal
+// that defaults to killing the process, calling the handler on the way out.
+// Calling multiple times adds the handlers to a list, to be called in LIFO
+// order.
void sigatexit(void *handler)
{
struct arg_list *al = 0;