summaryrefslogtreecommitdiffstats
path: root/usr.bin
diff options
context:
space:
mode:
authordelphij <delphij@FreeBSD.org>2010-05-10 02:07:57 +0000
committerdelphij <delphij@FreeBSD.org>2010-05-10 02:07:57 +0000
commit7d27cb89f2545f95dedf983df63ec8402815eeba (patch)
tree86d594956ade8c20bd002188c28c993d7690caea /usr.bin
parent7e663c88a37acf47f4a7353a2c7e3a6380160444 (diff)
downloadFreeBSD-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')
-rw-r--r--usr.bin/gzip/gzip.16
-rw-r--r--usr.bin/gzip/gzip.c25
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:
OpenPOWER on IntegriCloud