summaryrefslogtreecommitdiffstats
path: root/usr.bin/gzip
diff options
context:
space:
mode:
authordelphij <delphij@FreeBSD.org>2010-04-26 20:05:48 +0000
committerdelphij <delphij@FreeBSD.org>2010-04-26 20:05:48 +0000
commit6776eaaf2482b08619709c8f8fd18b08ff3f0266 (patch)
tree6beb395ab7774bfaba43ddf8f0aba60de36ae3b3 /usr.bin/gzip
parent8fbd99ea26952e9cb598f137750ba9347dd7e8f4 (diff)
downloadFreeBSD-src-6776eaaf2482b08619709c8f8fd18b08ff3f0266.zip
FreeBSD-src-6776eaaf2482b08619709c8f8fd18b08ff3f0266.tar.gz
Add a signal handler for SIGINT which removes output file when necessary.
While I'm there, move unlink_input() slightly down to after closing the output file, in uncompression path. MFC after: 2 weeks
Diffstat (limited to 'usr.bin/gzip')
-rw-r--r--usr.bin/gzip/gzip.c25
1 files changed, 21 insertions, 4 deletions
diff --git a/usr.bin/gzip/gzip.c b/usr.bin/gzip/gzip.c
index ef81442..9503762 100644
--- a/usr.bin/gzip/gzip.c
+++ b/usr.bin/gzip/gzip.c
@@ -43,7 +43,6 @@ __RCSID("$FreeBSD$");
*
* TODO:
* - use mmap where possible
- * - handle some signals better (remove outfile?)
* - make bzip2/compress -v/-t/-l support work as well as possible
*/
@@ -194,6 +193,7 @@ static int qflag; /* quiet mode */
static int rflag; /* recursive mode */
static int tflag; /* test */
static int vflag; /* verbose mode */
+static const char *remove_file = NULL; /* file to be removed upon SIGINT */
#else
#define qflag 0
#define tflag 0
@@ -231,6 +231,7 @@ static void usage(void);
static void display_version(void);
#ifndef SMALL
static void display_license(void);
+static void sigint_handler(int);
#endif
static const suffixes_t *check_suffix(char *, int);
static ssize_t read_retry(int, void *, size_t);
@@ -300,11 +301,10 @@ main(int argc, char **argv)
#endif
int ch;
- /* XXX set up signals */
-
#ifndef SMALL
if ((gzip = getenv("GZIP")) != NULL)
prepend_gzip(gzip, &argc, &argv);
+ signal(SIGINT, sigint_handler);
#endif
/*
@@ -1171,6 +1171,15 @@ unlink_input(const char *file, const struct stat *sb)
return;
unlink(file);
}
+
+static void
+sigint_handler(int signo __unused)
+{
+
+ if (remove_file != NULL)
+ unlink(remove_file);
+ exit(2);
+}
#endif
static const suffixes_t *
@@ -1257,6 +1266,9 @@ file_compress(char *file, char *outfile, size_t outsize)
fclose(stdin);
return -1;
}
+#ifndef SMALL
+ remove_file = outfile;
+#endif
} else
out = STDOUT_FILENO;
@@ -1288,6 +1300,7 @@ file_compress(char *file, char *outfile, size_t outsize)
}
copymodes(out, &isb, outfile);
+ remove_file = NULL;
#endif
if (close(out) == -1)
maybe_warn("couldn't close output");
@@ -1424,6 +1437,9 @@ file_uncompress(char *file, char *outfile, size_t outsize)
maybe_warn("can't open %s", outfile);
goto lose;
}
+#ifndef SMALL
+ remove_file = outfile;
+#endif
} else
zfd = STDOUT_FILENO;
@@ -1555,11 +1571,12 @@ file_uncompress(char *file, char *outfile, size_t outsize)
unlink(outfile);
return -1;
}
- unlink_input(file, &isb);
#ifndef SMALL
copymodes(ofd, &isb, outfile);
+ remove_file = NULL;
#endif
close(ofd);
+ unlink_input(file, &isb);
return size;
unexpected_EOF:
OpenPOWER on IntegriCloud