aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorH. Peter Anvin <hpa@zytor.com>2002-08-21 18:44:44 +0000
committerH. Peter Anvin <hpa@zytor.com>2002-08-21 18:44:44 +0000
commita208472f9535ab629aa2f7b6c0575f389a0d0863 (patch)
treece811c52e22447fb6426fac5c4070e0358e9ec21
parent011529d0afff7706a97c78d94118b572f1ac2c07 (diff)
downloadklibc-a208472f9535ab629aa2f7b6c0575f389a0d0863.tar.gz
Clean up setjmp/longjmp bogosity.klibc-0.56
-rw-r--r--utils/dd.c33
1 files changed, 18 insertions, 15 deletions
diff --git a/utils/dd.c b/utils/dd.c
index 20dcce5b0a21f..0cf7947d092a8 100644
--- a/utils/dd.c
+++ b/utils/dd.c
@@ -424,10 +424,25 @@ static void sigint_handler(int sig)
siglongjmp(jmp, -sig);
}
+static int dd(int rd_fd, int wr_fd, struct stats *stats)
+{
+ int ret;
+
+ ret = sigsetjmp(jmp, 1);
+ if (ret == 0) {
+ signal(SIGINT, sigint_handler);
+ ret = do_dd(rd_fd, wr_fd, stats);
+ }
+
+ signal(SIGINT, SIG_DFL);
+ return ret;
+}
+
int main(int argc, char *argv[])
{
struct stats stats;
- int rd_fd = 0, wr_fd = 1, ret;
+ int ret;
+ int rd_fd = 0, wr_fd = 1;
progname = argv[0];
@@ -489,22 +504,10 @@ int main(int argc, char *argv[])
memset(&stats, 0, sizeof(stats));
- ret = sigsetjmp(jmp, 1);
- if (ret == 0) {
- signal(SIGINT, sigint_handler);
-
- /*
- * GCC complains about rd_fd and wr_fd. However,
- * since we're only calling this if we didn't
- * siglongjmp, it should be safe.
- */
- ret = do_dd(rd_fd, wr_fd, &stats);
- }
-
/*
- * Just in case we get a SIGINT after we return.
+ * Do the real work
*/
- signal(SIGINT, SIG_DFL);
+ ret = dd(rd_fd, wr_fd, &stats);
fprintf(stderr, "%u+%u records in\n",
stats.in_full, stats.in_partial);