aboutsummaryrefslogtreecommitdiff
path: root/coreutils/dd.c
diff options
context:
space:
mode:
authorRob Landley <rob@landley.net>2006-05-02 22:44:04 +0000
committerRob Landley <rob@landley.net>2006-05-02 22:44:04 +0000
commitc5598177bc4b38d349e4fdbd08d997c170ed2f8b (patch)
tree9e88af6e4460a9afb83bb80e685cfc40f9c04dfc /coreutils/dd.c
parent67d5b8b5b1795a08eadfd3af467dc7a3e18d8769 (diff)
downloadbusybox-w32-c5598177bc4b38d349e4fdbd08d997c170ed2f8b.tar.gz
busybox-w32-c5598177bc4b38d349e4fdbd08d997c170ed2f8b.tar.bz2
busybox-w32-c5598177bc4b38d349e4fdbd08d997c170ed2f8b.zip
Patch from Jason Schoon to add optional SIGUSR1 support to dd.
Diffstat (limited to 'coreutils/dd.c')
-rw-r--r--coreutils/dd.c33
1 files changed, 25 insertions, 8 deletions
diff --git a/coreutils/dd.c b/coreutils/dd.c
index ce8bcc6a5..378e212de 100644
--- a/coreutils/dd.c
+++ b/coreutils/dd.c
@@ -15,9 +15,9 @@
15#include <unistd.h> 15#include <unistd.h>
16#include <string.h> 16#include <string.h>
17#include <fcntl.h> 17#include <fcntl.h>
18#include <signal.h> // For FEATURE_DD_SIGNAL_HANDLING
18#include "busybox.h" 19#include "busybox.h"
19 20
20
21static const struct suffix_mult dd_suffixes[] = { 21static const struct suffix_mult dd_suffixes[] = {
22 { "c", 1 }, 22 { "c", 1 },
23 { "w", 2 }, 23 { "w", 2 },
@@ -31,12 +31,20 @@ static const struct suffix_mult dd_suffixes[] = {
31 { NULL, 0 } 31 { NULL, 0 }
32}; 32};
33 33
34static size_t out_full;
35static size_t out_part;
36static size_t in_full;
37static size_t in_part;
38
39static void dd_output_status(int cur_signal)
40{
41 fprintf(stderr, "%ld+%ld records in\n%ld+%ld records out\n",
42 (long)in_full, (long)in_part,
43 (long)out_full, (long)out_part);
44}
45
34int dd_main(int argc, char **argv) 46int dd_main(int argc, char **argv)
35{ 47{
36 size_t out_full = 0;
37 size_t out_part = 0;
38 size_t in_full = 0;
39 size_t in_part = 0;
40 size_t count = -1; 48 size_t count = -1;
41 size_t bs = 512; 49 size_t bs = 512;
42 ssize_t n; 50 ssize_t n;
@@ -53,6 +61,17 @@ int dd_main(int argc, char **argv)
53 const char *outfile = NULL; 61 const char *outfile = NULL;
54 char *buf; 62 char *buf;
55 63
64 if (ENABLE_FEATURE_DD_SIGNAL_HANDLING)
65 {
66 struct sigaction sa;
67
68 memset(&sa, 0, sizeof(sa));
69 sa.sa_handler = dd_output_status;
70 sa.sa_flags = SA_RESTART;
71 sigemptyset(&sa.sa_mask);
72 sigaction(SIGUSR1, &sa, 0);
73 }
74
56 for (i = 1; i < argc; i++) { 75 for (i = 1; i < argc; i++) {
57 if (strncmp("bs=", argv[i], 3) == 0) 76 if (strncmp("bs=", argv[i], 3) == 0)
58 bs = bb_xparse_number(argv[i]+3, dd_suffixes); 77 bs = bb_xparse_number(argv[i]+3, dd_suffixes);
@@ -180,9 +199,7 @@ int dd_main(int argc, char **argv)
180 bb_perror_msg_and_die("%s", outfile); 199 bb_perror_msg_and_die("%s", outfile);
181 } 200 }
182 201
183 fprintf(stderr, "%ld+%ld records in\n%ld+%ld records out\n", 202 dd_output_status(0);
184 (long)in_full, (long)in_part,
185 (long)out_full, (long)out_part);
186 203
187 return EXIT_SUCCESS; 204 return EXIT_SUCCESS;
188} 205}