diff options
author | delphij <delphij@FreeBSD.org> | 2010-05-10 02:07:57 +0000 |
---|---|---|
committer | delphij <delphij@FreeBSD.org> | 2010-05-10 02:07:57 +0000 |
commit | 7d27cb89f2545f95dedf983df63ec8402815eeba (patch) | |
tree | 86d594956ade8c20bd002188c28c993d7690caea /usr.bin/gzip | |
parent | 7e663c88a37acf47f4a7353a2c7e3a6380160444 (diff) | |
download | FreeBSD-src-7d27cb89f2545f95dedf983df63ec8402815eeba.zip FreeBSD-src-7d27cb89f2545f95dedf983df63ec8402815eeba.tar.gz |
MFC r207247,r207283,207284:
- 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.
- Language improvements to make the BUGS section easier to read.
Diffstat (limited to 'usr.bin/gzip')
-rw-r--r-- | usr.bin/gzip/gzip.1 | 6 | ||||
-rw-r--r-- | usr.bin/gzip/gzip.c | 25 |
2 files changed, 24 insertions, 7 deletions
diff --git a/usr.bin/gzip/gzip.1 b/usr.bin/gzip/gzip.1 index bb1fadd..848a4b3 100644 --- a/usr.bin/gzip/gzip.1 +++ b/usr.bin/gzip/gzip.1 @@ -25,7 +25,7 @@ .\" SUCH DAMAGE. .\" .\" $FreeBSD$ -.Dd April 7, 2010 +.Dd April 27, 2010 .Dt GZIP 1 .Os .Sh NAME @@ -218,8 +218,8 @@ with unpack support written by .An Xin LI Aq delphij@FreeBSD.org . .Sh BUGS According to RFC 1952, the recorded file size is stored in a 32-bit -integer and therefore it can not represent files that is bigger than -4GB in size. This limitation also applies to +integer, therefore, it can not represent files larger than 4GB. +This limitation also applies to .Fl l option of .Nm diff --git a/usr.bin/gzip/gzip.c b/usr.bin/gzip/gzip.c index bb2b735..f465ef9 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: |