* archival/gzip.c (ifname, ofname): Delete.
  (gzip_main): Handle multiple files.
* include/usage.h (gzip_trivial_usage): Allow multiple FILEs.
  (gzip_full_usage): Ditto.
* testsuite/gzip/gzip-accepts-multiple-files: New.
* testsuite/gzip/gzip-removes-original-file: New.
diff --git a/archival/gzip.c b/archival/gzip.c
index 732a83e..fed9390 100644
--- a/archival/gzip.c
+++ b/archival/gzip.c
@@ -317,8 +317,6 @@
 static char z_suffix[MAX_SUFFIX + 1];	/* default suffix (can be set with --suffix) */
 static int z_len;						/* strlen(z_suffix) */
 
-static char ifname[MAX_PATH_LEN];		/* input file name */
-static char ofname[MAX_PATH_LEN];		/* output file name */
 static int ifd;						/* input file descriptor */
 static int ofd;						/* output file descriptor */
 static unsigned insize;				/* valid bytes in inbuf */
@@ -1214,7 +1212,6 @@
 	struct stat statBuf;
 	char *delFileName;
 	int tostdout = 0;
-	int fromstdin = 0;
 	int force = 0;
 	int opt;
 
@@ -1241,16 +1238,6 @@
 			show_usage();
 		}
 	}
-	if ((optind == argc) || (strcmp(argv[optind], "-") == 0)) {
-		fromstdin = 1;
-		tostdout = 1;
-	}
-
-	if (argc - optind > 1)
-		show_usage ();
-
-	if (isatty(fileno(stdout)) && tostdout==1 && force==0)
-		error_msg_and_die( "compressed data not written to terminal. Use -f to force it.");
 
 	foreground = signal(SIGINT, SIG_IGN) != SIG_IGN;
 	if (foreground) {
@@ -1277,70 +1264,78 @@
 	ALLOC(uch, window, 2L * WSIZE);
 	ALLOC(ush, tab_prefix, 1L << BITS);
 
-	if (fromstdin == 1) {
-		strcpy(ofname, "stdin");
+	clear_bufs();
+	part_nb = 0;
 
-		inFileNum = fileno(stdin);
-		time_stamp = 0;			/* time unknown by default */
-		ifile_size = -1L;		/* convention for unknown size */
+	if (optind == argc) {
+		time_stamp = 0;
+		ifile_size = -1L;
+		zip(STDIN_FILENO, STDOUT_FILENO);
 	} else {
-		/* Open up the input file */
-		strncpy(ifname, argv[optind], MAX_PATH_LEN);
+		int i;
 
-		/* Open input file */
-		inFileNum = open(ifname, O_RDONLY);
-		if (inFileNum < 0 || stat(ifname, &statBuf) < 0)
-			perror_msg_and_die("%s", ifname);
-		/* Get the time stamp on the input file. */
-		time_stamp = statBuf.st_ctime;
-		ifile_size = statBuf.st_size;
-	}
+		for (i = optind; i < argc; i++) {
+			char *path = NULL;
 
+			if (strcmp(argv[i], "-") == 0) {
+				time_stamp = 0;
+				ifile_size = -1L;
+				inFileNum = STDIN_FILENO;
+				outFileNum = STDOUT_FILENO;
+			} else {
+				inFileNum = open(argv[i], O_RDONLY);
+				if (inFileNum < 0 || fstat (inFileNum, &statBuf) < 0)
+					perror_msg_and_die("%s", argv[i]);
+				time_stamp = statBuf.st_ctime;
+				ifile_size = statBuf.st_size;
 
-	if (tostdout == 1) {
-		/* And get to work */
-		strcpy(ofname, "stdout");
-		outFileNum = fileno(stdout);
+				if (!tostdout) {
+					path = xmalloc(strlen(argv[i]) + 4);
+					strcpy(path, argv[i]);
+					strcat(path, ".gz");
 
-		clear_bufs();			/* clear input and output buffers */
-		part_nb = 0;
-
-		/* Actually do the compression/decompression. */
-		zip(inFileNum, outFileNum);
-
-	} else {
-
-		/* And get to work */
-		strncpy(ofname, ifname, MAX_PATH_LEN - 4);
-		strcat(ofname, ".gz");
-
-
-		/* Open output fille */
+					/* Open output file */
 #if (__GLIBC__ >= 2) && (__GLIBC_MINOR__ >= 1)
-		outFileNum = open(ofname, O_RDWR | O_CREAT | O_EXCL | O_NOFOLLOW);
+					outFileNum = open(path, O_RDWR | O_CREAT | O_EXCL | O_NOFOLLOW);
 #else
-		outFileNum = open(ofname, O_RDWR | O_CREAT | O_EXCL);
+					outFileNum = open(path, O_RDWR | O_CREAT | O_EXCL);
 #endif
-		if (outFileNum < 0)
-			perror_msg_and_die("%s", ofname);
-		/* Set permissions on the file */
-		fchmod(outFileNum, statBuf.st_mode);
+					if (outFileNum < 0) {
+						perror_msg("%s", path);
+						free(path);
+						continue;
+					}
 
-		clear_bufs();			/* clear input and output buffers */
-		part_nb = 0;
+					/* Set permissions on the file */
+					fchmod(outFileNum, statBuf.st_mode);
+				} else
+					outFileNum = STDOUT_FILENO;
+			}
 
-		/* Actually do the compression/decompression. */
-		result = zip(inFileNum, outFileNum);
-		close(outFileNum);
-		close(inFileNum);
-		/* Delete the original file */
-		if (result == OK)
-			delFileName = ifname;
-		else
-			delFileName = ofname;
+			if (path == NULL && force == 0) {
+				perror_msg("compressed data not written to a terminal. Use -f to force compression.");
+				free(path);
+				continue;
+			}
 
-		if (unlink(delFileName) < 0)
-			perror_msg_and_die("%s", delFileName);
+			result = zip(inFileNum, outFileNum);
+
+			if (path != NULL) {
+				close (inFileNum);
+				close (outFileNum);
+
+				/* Delete the original file */
+				if (result == OK)
+					delFileName = argv[i];
+				else
+					delFileName = path;
+
+				if (unlink(delFileName) < 0)
+					perror_msg("%s", delFileName);
+			}
+
+			free(path);
+		}
 	}
 
 	return(exit_code);