summaryrefslogtreecommitdiff
path: root/usr.bin
diff options
context:
space:
mode:
authorTodd C. Miller <millert@cvs.openbsd.org>1999-02-03 02:09:31 +0000
committerTodd C. Miller <millert@cvs.openbsd.org>1999-02-03 02:09:31 +0000
commit7e9859d97bc8f1706d241b7645557258c0497a5c (patch)
treef6d95b752868e7d93fc9f7a3662c9549e37cf7d3 /usr.bin
parentbcd8667f4722cbb3b96946ddea33356473b5f0d6 (diff)
Fix broken conversion of private err() function and make ierr() and oerr()
back into functions, not macros. Also make functions that call mmap() return an int so we can fall back to non-mmap (slow) version on mmap failure. Noticable effects: o when you tail multiple files, if one of the files doesn't exist or is otherwise broken, keep on going to the next file. o it is now possible to tail files > 2gig, though it will be *very* slow since tail will be unable to use mmap()
Diffstat (limited to 'usr.bin')
-rw-r--r--usr.bin/tail/Makefile4
-rw-r--r--usr.bin/tail/extern.h8
-rw-r--r--usr.bin/tail/forward.c46
-rw-r--r--usr.bin/tail/misc.c70
-rw-r--r--usr.bin/tail/reverse.c32
-rw-r--r--usr.bin/tail/tail.c7
6 files changed, 117 insertions, 50 deletions
diff --git a/usr.bin/tail/Makefile b/usr.bin/tail/Makefile
index 6b94b2c250e..5001de0616c 100644
--- a/usr.bin/tail/Makefile
+++ b/usr.bin/tail/Makefile
@@ -1,6 +1,6 @@
-# $OpenBSD: Makefile,v 1.4 1997/09/21 11:51:04 deraadt Exp $
+# $OpenBSD: Makefile,v 1.5 1999/02/03 02:09:30 millert Exp $
PROG= tail
-SRCS= forward.c read.c reverse.c tail.c
+SRCS= forward.c misc.c read.c reverse.c tail.c
.include <bsd.prog.mk>
diff --git a/usr.bin/tail/extern.h b/usr.bin/tail/extern.h
index 3bcd1ad5e13..a87460ac699 100644
--- a/usr.bin/tail/extern.h
+++ b/usr.bin/tail/extern.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: extern.h,v 1.3 1997/01/12 23:43:04 millert Exp $ */
+/* $OpenBSD: extern.h,v 1.4 1999/02/03 02:09:30 millert Exp $ */
/* $NetBSD: extern.h,v 1.3 1994/11/23 07:42:00 jtc Exp $ */
/*-
@@ -36,9 +36,6 @@
* @(#)extern.h 8.1 (Berkeley) 6/6/93
*/
-#define ierr() (err(0, fname))
-#define oerr() (err(1, "stdout"))
-
#define WR(p, size) \
if (write(STDOUT_FILENO, p, size) != size) \
oerr();
@@ -51,5 +48,8 @@ void reverse __P((FILE *, enum STYLE, long, struct stat *));
void bytes __P((FILE *, off_t));
void lines __P((FILE *, off_t));
+void ierr __P((void));
+void oerr __P((void));
+
extern int fflag, rflag, rval;
extern char *fname;
diff --git a/usr.bin/tail/forward.c b/usr.bin/tail/forward.c
index ae48d56791c..f77edd00a6f 100644
--- a/usr.bin/tail/forward.c
+++ b/usr.bin/tail/forward.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: forward.c,v 1.6 1997/05/30 19:33:44 millert Exp $ */
+/* $OpenBSD: forward.c,v 1.7 1999/02/03 02:09:30 millert Exp $ */
/* $NetBSD: forward.c,v 1.7 1996/02/13 16:49:10 ghudson Exp $ */
/*-
@@ -41,7 +41,7 @@
#if 0
static char sccsid[] = "@(#)forward.c 8.1 (Berkeley) 6/6/93";
#endif
-static char rcsid[] = "$OpenBSD: forward.c,v 1.6 1997/05/30 19:33:44 millert Exp $";
+static char rcsid[] = "$OpenBSD: forward.c,v 1.7 1999/02/03 02:09:30 millert Exp $";
#endif /* not lint */
#include <sys/types.h>
@@ -59,7 +59,7 @@ static char rcsid[] = "$OpenBSD: forward.c,v 1.6 1997/05/30 19:33:44 millert Exp
#include "extern.h"
-static void rlines __P((FILE *, long, struct stat *));
+static int rlines __P((FILE *, long, struct stat *));
/*
* forward -- display the file, from an offset, forward.
@@ -136,7 +136,8 @@ forward(fp, style, off, sbp)
return;
}
} else if (off == 0) {
- while (getc(fp) != EOF);
+ while (getc(fp) != EOF)
+ ;
if (ferror(fp)) {
ierr();
return;
@@ -145,16 +146,17 @@ forward(fp, style, off, sbp)
bytes(fp, off);
break;
case RLINES:
- if (S_ISREG(sbp->st_mode))
+ if (S_ISREG(sbp->st_mode)) {
if (!off) {
if (fseek(fp, 0L, SEEK_END) == -1) {
ierr();
return;
}
- } else
- rlines(fp, off, sbp);
- else if (off == 0) {
- while (getc(fp) != EOF);
+ } else if (rlines(fp, off, sbp) != 0)
+ lines(fp, off);
+ } else if (off == 0) {
+ while (getc(fp) != EOF)
+ ;
if (ferror(fp)) {
ierr();
return;
@@ -199,7 +201,7 @@ forward(fp, style, off, sbp)
/*
* rlines -- display the last offset lines of the file.
*/
-static void
+static int
rlines(fp, off, sbp)
FILE *fp;
long off;
@@ -210,18 +212,14 @@ rlines(fp, off, sbp)
char *start;
if (!(size = sbp->st_size))
- return;
+ return (0);
- if (size > SIZE_T_MAX) {
- errx(0, "%s: %s", fname, strerror(EFBIG));
- return;
- }
+ if (size > SIZE_T_MAX)
+ return (1);
- if ((start = mmap(NULL, (size_t)size,
- PROT_READ, 0, fileno(fp), (off_t)0)) == (caddr_t)-1) {
- errx(0, "%s: %s", fname, strerror(EFBIG));
- return;
- }
+ if ((start = mmap(NULL, (size_t)size, PROT_READ, 0, fileno(fp),
+ (off_t)0)) == (caddr_t)-1)
+ return (1);
/* Last char is special, ignore whether newline or not. */
for (p = start + size - 1; --size;)
@@ -235,10 +233,12 @@ rlines(fp, off, sbp)
WR(p, size);
if (fseek(fp, (long)sbp->st_size, SEEK_SET) == -1) {
ierr();
- return;
+ return (1);
}
if (munmap(start, (size_t)sbp->st_size)) {
- err(0, fname);
- return;
+ ierr();
+ return (1);
}
+
+ return (0);
}
diff --git a/usr.bin/tail/misc.c b/usr.bin/tail/misc.c
new file mode 100644
index 00000000000..f997a0da727
--- /dev/null
+++ b/usr.bin/tail/misc.c
@@ -0,0 +1,70 @@
+/* $OpenBSD: misc.c,v 1.4 1999/02/03 02:09:30 millert Exp $ */
+
+/*-
+ * Copyright (c) 1991, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Edward Sze-Tyan Wang.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+#if 0
+static char sccsid[] = "@(#)misc.c 8.1 (Berkeley) 6/6/93";
+#else
+static char rcsid[] = "$OpenBSD: misc.c,v 1.4 1999/02/03 02:09:30 millert Exp $";
+#endif
+#endif /* not lint */
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <err.h>
+#include <errno.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "extern.h"
+
+void
+ierr()
+{
+
+ warn("%s", fname);
+ rval = 1;
+}
+
+void
+oerr()
+{
+
+ err(1, "stdout");
+}
diff --git a/usr.bin/tail/reverse.c b/usr.bin/tail/reverse.c
index 9711616978b..13dd65795fc 100644
--- a/usr.bin/tail/reverse.c
+++ b/usr.bin/tail/reverse.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: reverse.c,v 1.3 1997/01/12 23:43:06 millert Exp $ */
+/* $OpenBSD: reverse.c,v 1.4 1999/02/03 02:09:30 millert Exp $ */
/* $NetBSD: reverse.c,v 1.6 1994/11/23 07:42:10 jtc Exp $ */
/*-
@@ -41,7 +41,7 @@
#if 0
static char sccsid[] = "@(#)reverse.c 8.1 (Berkeley) 6/6/93";
#endif
-static char rcsid[] = "$OpenBSD: reverse.c,v 1.3 1997/01/12 23:43:06 millert Exp $";
+static char rcsid[] = "$OpenBSD: reverse.c,v 1.4 1999/02/03 02:09:30 millert Exp $";
#endif /* not lint */
#include <sys/param.h>
@@ -59,7 +59,7 @@ static char rcsid[] = "$OpenBSD: reverse.c,v 1.3 1997/01/12 23:43:06 millert Exp
#include "extern.h"
static void r_buf __P((FILE *));
-static void r_reg __P((FILE *, enum STYLE, long, struct stat *));
+static int r_reg __P((FILE *, enum STYLE, long, struct stat *));
/*
* reverse -- display input in reverse order by line.
@@ -89,9 +89,7 @@ reverse(fp, style, off, sbp)
if (style != REVERSE && off == 0)
return;
- if (S_ISREG(sbp->st_mode))
- r_reg(fp, style, off, sbp);
- else
+ if (!S_ISREG(sbp->st_mode) || r_reg(fp, style, off, sbp) != 0)
switch(style) {
case FBYTES:
case RBYTES:
@@ -110,7 +108,7 @@ reverse(fp, style, off, sbp)
/*
* r_reg -- display a regular file in reverse order by line.
*/
-static void
+static int
r_reg(fp, style, off, sbp)
FILE *fp;
register enum STYLE style;
@@ -123,18 +121,14 @@ r_reg(fp, style, off, sbp)
char *start;
if (!(size = sbp->st_size))
- return;
+ return (0);
- if (size > SIZE_T_MAX) {
- errx(0, "%s: %s", fname, strerror(EFBIG));
- return;
- }
+ if (size > SIZE_T_MAX)
+ return (1);
- if ((start = mmap(NULL, (size_t)size,
- PROT_READ, 0, fileno(fp), (off_t)0)) == (caddr_t)-1) {
- errx(0, "%s: %s", fname, strerror(EFBIG));
- return;
- }
+ if ((start = mmap(NULL, (size_t)size, PROT_READ, 0, fileno(fp),
+ (off_t)0)) == (caddr_t)-1)
+ return (1);
p = start + size - 1;
if (style == RBYTES && off < size)
@@ -153,7 +147,9 @@ r_reg(fp, style, off, sbp)
if (llen)
WR(p, llen);
if (munmap(start, (size_t)sbp->st_size))
- err(0, fname);
+ ierr();
+
+ return (0);
}
typedef struct bf {
diff --git a/usr.bin/tail/tail.c b/usr.bin/tail/tail.c
index 70aa03547b7..8aae71e370c 100644
--- a/usr.bin/tail/tail.c
+++ b/usr.bin/tail/tail.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: tail.c,v 1.4 1997/01/15 23:43:18 millert Exp $ */
+/* $OpenBSD: tail.c,v 1.5 1999/02/03 02:09:30 millert Exp $ */
/*-
* Copyright (c) 1991, 1993
@@ -46,7 +46,7 @@ static char copyright[] =
#if 0
static char sccsid[] = "@(#)tail.c 8.1 (Berkeley) 6/6/93";
#endif
-static char rcsid[] = "$OpenBSD: tail.c,v 1.4 1997/01/15 23:43:18 millert Exp $";
+static char rcsid[] = "$OpenBSD: tail.c,v 1.5 1999/02/03 02:09:30 millert Exp $";
#endif /* not lint */
#include <sys/types.h>
@@ -158,7 +158,7 @@ main(argc, argv)
* If style not specified, the default is the whole file for -r, and
* the last 10 lines if not -r.
*/
- if (style == NOTSET)
+ if (style == NOTSET) {
if (rflag) {
off = 0;
style = REVERSE;
@@ -166,6 +166,7 @@ main(argc, argv)
off = 10;
style = RLINES;
}
+ }
if (*argv)
for (first = 1; (fname = *argv++);) {