diff --git a/usr.bin/gzip/gzip.c b/usr.bin/gzip/gzip.c
index 65b0b76499ec..3dc490594e81 100644
--- a/usr.bin/gzip/gzip.c
+++ b/usr.bin/gzip/gzip.c
@@ -1,4 +1,4 @@
-/*	$NetBSD: gzip.c,v 1.50 2004/06/22 12:01:29 mrg Exp $	*/
+/*	$NetBSD: gzip.c,v 1.51 2004/07/03 09:39:30 mrg Exp $	*/
 
 /*
  * Copyright (c) 1997, 1998, 2003, 2004 Matthew R. Green
@@ -32,7 +32,7 @@
 #ifndef lint
 __COPYRIGHT("@(#) Copyright (c) 1997, 1998, 2003, 2004 Matthew R. Green\n\
      All rights reserved.\n");
-__RCSID("$NetBSD: gzip.c,v 1.50 2004/06/22 12:01:29 mrg Exp $");
+__RCSID("$NetBSD: gzip.c,v 1.51 2004/07/03 09:39:30 mrg Exp $");
 #endif /* not lint */
 
 /*
@@ -141,6 +141,7 @@ static	off_t	gz_compress(FILE *, int, off_t *, const char *, time_t);
 static	off_t	gz_uncompress(int, int, char *, size_t, off_t *, const char *);
 static	off_t	file_compress(char *, char *, size_t);
 static	off_t	file_uncompress(char *, char *, size_t);
+static	off_t	cat_fd(unsigned char *, size_t, off_t *, int fd);
 static	void	handle_pathname(char *);
 static	void	handle_file(char *, struct stat *);
 static	void	handle_stdin(void);
@@ -620,7 +621,7 @@ gz_uncompress(int in, int out, char *pre, size_t prelen, off_t *gsizep,
 				if (tflag && vflag)
 					print_test(filename, 0);
 #endif
-				maybe_warn("failed to read stdin\n");
+				maybe_warn("failed to read stdin");
 				out_tot = -1;
 				goto stop;
 			} else if (in_size == 0)
@@ -634,7 +635,7 @@ gz_uncompress(int in, int out, char *pre, size_t prelen, off_t *gsizep,
 		switch (state) {
 		case GZSTATE_MAGIC0:
 			if (*z.next_in != GZIP_MAGIC0) {
-				maybe_warn("input not gziped\n");
+				maybe_warnx("input not gziped");
 				out_tot = -1;
 				goto stop;
 			}
@@ -645,7 +646,7 @@ gz_uncompress(int in, int out, char *pre, size_t prelen, off_t *gsizep,
 		case GZSTATE_MAGIC1:
 			if (*z.next_in != GZIP_MAGIC1 &&
 			    *z.next_in != GZIP_OMAGIC1) {
-				maybe_warn("input not gziped\n");
+				maybe_warnx("input not gziped");
 				out_tot = -1;
 				goto stop;
 			}
@@ -655,7 +656,7 @@ gz_uncompress(int in, int out, char *pre, size_t prelen, off_t *gsizep,
 
 		case GZSTATE_METHOD:
 			if (*z.next_in != Z_DEFLATED) {
-				maybe_warn("unknown compression method\n");
+				maybe_warnx("unknown compression method");
 				out_tot = -1;
 				goto stop;
 			}
@@ -740,7 +741,7 @@ gz_uncompress(int in, int out, char *pre, size_t prelen, off_t *gsizep,
 
 		case GZSTATE_INIT:
 			if (inflateInit2(&z, -MAX_WBITS) != Z_OK) {
-				maybe_warn("failed to inflateInit\n");
+				maybe_warnx("failed to inflateInit");
 				out_tot = -1;
 				goto stop;
 			}
@@ -780,7 +781,7 @@ gz_uncompress(int in, int out, char *pre, size_t prelen, off_t *gsizep,
 				break;
 			}
 			if (error < 0) {
-				maybe_warnx("decompression error\n");
+				maybe_warnx("decompression error");
 				out_tot = -1;
 				goto stop;
 			}
@@ -1218,6 +1219,19 @@ close_header_read:
 		}
 	} else
 #endif
+
+#ifndef SMALL
+	if (method == FT_UNKNOWN) {
+		int in;
+
+		in = open(file, O_RDONLY);
+		if (in == -1) {
+			maybe_warn("can't open %s", file);
+			goto lose;
+		}
+		size = cat_fd(NULL, 0, NULL, in);
+	} else
+#endif
 	{
 		int in;
 
@@ -1294,7 +1308,7 @@ lose:
 
 #ifndef SMALL
 static off_t
-cat_stdin(unsigned char * prepend, size_t count, off_t *gsizep)
+cat_fd(unsigned char * prepend, size_t count, off_t *gsizep, int fd)
 {
 	char buf[BUFLEN];
 	size_t rv;
@@ -1306,11 +1320,17 @@ cat_stdin(unsigned char * prepend, size_t count, off_t *gsizep)
 		return -1;
 	}
 	for (;;) {
-		rv = read(STDIN_FILENO, buf, sizeof buf);
+		rv = read(fd, buf, sizeof buf);
+		if (rv == 0)
+			break;
+		if (rv < 0) {
+			maybe_warn("read from fd %d", fd);
+			break;
+		}
 
 		if (write(STDOUT_FILENO, buf, rv) != rv) {
 			maybe_warn("write to stdout");
-			return -1;
+			break;
 		}
 		in_tot += rv;
 	}
@@ -1363,7 +1383,7 @@ handle_stdin(void)
 			maybe_warnx("unknown compression format");
 			return;
 		}
-		usize = cat_stdin(header1, sizeof header1, &gsize);
+		usize = cat_fd(header1, sizeof header1, &gsize, STDIN_FILENO);
 		break;
 #endif
 	case FT_GZIP: