Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 26 Apr 2010 20:05:48 +0000 (UTC)
From:      Xin LI <delphij@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r207247 - head/usr.bin/gzip
Message-ID:  <201004262005.o3QK5mUK086780@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: delphij
Date: Mon Apr 26 20:05:48 2010
New Revision: 207247
URL: http://svn.freebsd.org/changeset/base/207247

Log:
  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

Modified:
  head/usr.bin/gzip/gzip.c

Modified: head/usr.bin/gzip/gzip.c
==============================================================================
--- head/usr.bin/gzip/gzip.c	Mon Apr 26 20:01:52 2010	(r207246)
+++ head/usr.bin/gzip/gzip.c	Mon Apr 26 20:05:48 2010	(r207247)
@@ -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 str
 		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,
 			fclose(stdin);
 			return -1;
 		}
+#ifndef SMALL
+		remove_file = outfile;
+#endif
 	} else
 		out = STDOUT_FILENO;
 
@@ -1288,6 +1300,7 @@ file_compress(char *file, char *outfile,
 	}
 
 	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 *outfil
 			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 *outfil
 		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:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201004262005.o3QK5mUK086780>