From owner-svn-src-head@FreeBSD.ORG  Mon Apr 26 20:05:49 2010
Return-Path: <owner-svn-src-head@FreeBSD.ORG>
Delivered-To: svn-src-head@freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34])
	by hub.freebsd.org (Postfix) with ESMTP id 12097106564A;
	Mon, 26 Apr 2010 20:05:49 +0000 (UTC)
	(envelope-from delphij@FreeBSD.org)
Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c])
	by mx1.freebsd.org (Postfix) with ESMTP id DB8D08FC15;
	Mon, 26 Apr 2010 20:05:48 +0000 (UTC)
Received: from svn.freebsd.org (localhost [127.0.0.1])
	by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o3QK5mnq086782;
	Mon, 26 Apr 2010 20:05:48 GMT (envelope-from delphij@svn.freebsd.org)
Received: (from delphij@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id o3QK5mUK086780;
	Mon, 26 Apr 2010 20:05:48 GMT (envelope-from delphij@svn.freebsd.org)
Message-Id: <201004262005.o3QK5mUK086780@svn.freebsd.org>
From: Xin LI <delphij@FreeBSD.org>
Date: Mon, 26 Apr 2010 20:05:48 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-all@freebsd.org,
	svn-src-head@freebsd.org
X-SVN-Group: head
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Cc: 
Subject: svn commit: r207247 - head/usr.bin/gzip
X-BeenThere: svn-src-head@freebsd.org
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: SVN commit messages for the src tree for head/-current
	<svn-src-head.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-head>,
	<mailto:svn-src-head-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-head>
List-Post: <mailto:svn-src-head@freebsd.org>
List-Help: <mailto:svn-src-head-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-head>,
	<mailto:svn-src-head-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Mon, 26 Apr 2010 20:05:49 -0000

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: