[Midnightbsd-cvs] src [11331] trunk/usr.bin/tail: update tail

laffer1 at midnightbsd.org laffer1 at midnightbsd.org
Wed Jul 4 20:57:51 EDT 2018


Revision: 11331
          http://svnweb.midnightbsd.org/src/?rev=11331
Author:   laffer1
Date:     2018-07-04 20:57:51 -0400 (Wed, 04 Jul 2018)
Log Message:
-----------
update tail

Modified Paths:
--------------
    trunk/usr.bin/tail/Makefile
    trunk/usr.bin/tail/extern.h
    trunk/usr.bin/tail/forward.c
    trunk/usr.bin/tail/misc.c
    trunk/usr.bin/tail/read.c
    trunk/usr.bin/tail/reverse.c
    trunk/usr.bin/tail/tail.1
    trunk/usr.bin/tail/tail.c

Added Paths:
-----------
    trunk/usr.bin/tail/tests/
    trunk/usr.bin/tail/tests/Makefile
    trunk/usr.bin/tail/tests/tail_test.sh

Property Changed:
----------------
    trunk/usr.bin/tail/tail.1

Modified: trunk/usr.bin/tail/Makefile
===================================================================
--- trunk/usr.bin/tail/Makefile	2018-07-05 00:56:10 UTC (rev 11330)
+++ trunk/usr.bin/tail/Makefile	2018-07-05 00:57:51 UTC (rev 11331)
@@ -1,7 +1,14 @@
 # $MidnightBSD$
+# $FreeBSD: stable/10/usr.bin/tail/Makefile 314425 2017-02-28 22:18:05Z asomers $
 #	@(#)Makefile	8.1 (Berkeley) 6/6/93
 
+.include <bsd.own.mk>
+
 PROG=	tail
 SRCS=	forward.c misc.c read.c reverse.c tail.c
 
+.if ${MK_TESTS} != "no"
+SUBDIR+= tests
+.endif
+
 .include <bsd.prog.mk>

Modified: trunk/usr.bin/tail/extern.h
===================================================================
--- trunk/usr.bin/tail/extern.h	2018-07-05 00:56:10 UTC (rev 11330)
+++ trunk/usr.bin/tail/extern.h	2018-07-05 00:57:51 UTC (rev 11331)
@@ -1,3 +1,4 @@
+/* $MidnightBSD$ */
 /*-
  * Copyright (c) 1991, 1993
  *	The Regents of the University of California.  All rights reserved.
@@ -28,7 +29,7 @@
  *
  *	@(#)extern.h	8.1 (Berkeley) 6/6/93
  *
- * $MidnightBSD$
+ * $FreeBSD: stable/10/usr.bin/tail/extern.h 251565 2013-06-09 08:06:26Z jh $
  */
 
 #define	WR(p, size) do { \
@@ -67,5 +68,6 @@
 void oerr(void);
 int mapprint(struct mapinfo *, off_t, off_t);
 int maparound(struct mapinfo *, off_t);
+void printfn(const char *, int);
 
 extern int Fflag, fflag, qflag, rflag, rval, no_files;

Modified: trunk/usr.bin/tail/forward.c
===================================================================
--- trunk/usr.bin/tail/forward.c	2018-07-05 00:56:10 UTC (rev 11330)
+++ trunk/usr.bin/tail/forward.c	2018-07-05 00:57:51 UTC (rev 11331)
@@ -1,3 +1,4 @@
+/* $MidnightBSD$ */
 /*-
  * Copyright (c) 1991, 1993
  *	The Regents of the University of California.  All rights reserved.
@@ -32,7 +33,7 @@
 
 #include <sys/cdefs.h>
 
-__MBSDID("$MidnightBSD$");
+__FBSDID("$FreeBSD: stable/10/usr.bin/tail/forward.c 251565 2013-06-09 08:06:26Z jh $");
 
 #ifndef lint
 static const char sccsid[] = "@(#)forward.c	8.1 (Berkeley) 6/6/93";
@@ -66,9 +67,9 @@
 #define USE_KQUEUE	1
 #define ADD_EVENTS	2
 
-struct kevent *ev;
-int action = USE_SLEEP;
-int kq;
+static struct kevent *ev;
+static int action = USE_SLEEP;
+static int kq;
 
 static const file_info_t *last;
 
@@ -243,7 +244,7 @@
 	while ((ch = getc(file->fp)) != EOF) {
 		if (last != file && no_files > 1) {
 			if (!qflag)
-				(void)printf("\n==> %s <==\n", file->file_name);
+				printfn(file->file_name, 1);
 			last = file;
 		}
 		if (putchar(ch) == EOF)
@@ -320,7 +321,7 @@
 			active = 1;
 			n++;
 			if (no_files > 1 && !qflag)
-				(void)printf("\n==> %s <==\n", file->file_name);
+				printfn(file->file_name, 1);
 			forward(file->fp, file->file_name, style, off, &file->st);
 			if (Fflag && fileno(file->fp) != STDIN_FILENO)
 				n++;

Modified: trunk/usr.bin/tail/misc.c
===================================================================
--- trunk/usr.bin/tail/misc.c	2018-07-05 00:56:10 UTC (rev 11330)
+++ trunk/usr.bin/tail/misc.c	2018-07-05 00:57:51 UTC (rev 11331)
@@ -1,3 +1,4 @@
+/* $MidnightBSD$ */
 /*-
  * Copyright (c) 1991, 1993
  *	The Regents of the University of California.  All rights reserved.
@@ -32,7 +33,7 @@
 
 #include <sys/cdefs.h>
 
-__MBSDID("$MidnightBSD$");
+__FBSDID("$FreeBSD: stable/10/usr.bin/tail/misc.c 251565 2013-06-09 08:06:26Z jh $");
 
 #ifndef lint
 static const char sccsid[] = "@(#)misc.c	8.1 (Berkeley) 6/6/93";
@@ -113,3 +114,17 @@
 
 	return (0);
 }
+
+/*
+ * Print the file name without stdio buffering.
+ */
+void
+printfn(const char *fn, int print_nl)
+{
+
+	if (print_nl)
+		WR("\n", 1);
+	WR("==> ", 4);
+	WR(fn, strlen(fn));
+	WR(" <==\n", 5);
+}

Modified: trunk/usr.bin/tail/read.c
===================================================================
--- trunk/usr.bin/tail/read.c	2018-07-05 00:56:10 UTC (rev 11330)
+++ trunk/usr.bin/tail/read.c	2018-07-05 00:57:51 UTC (rev 11331)
@@ -1,3 +1,4 @@
+/* $MidnightBSD$ */
 /*-
  * Copyright (c) 1991, 1993
  *	The Regents of the University of California.  All rights reserved.
@@ -32,7 +33,7 @@
 
 #include <sys/cdefs.h>
 
-__MBSDID("$MidnightBSD$");
+__FBSDID("$FreeBSD: stable/10/usr.bin/tail/read.c 245184 2013-01-08 22:14:45Z delphij $");
 
 #ifndef lint
 static const char sccsid[] = "@(#)read.c	8.1 (Berkeley) 6/6/93";
@@ -143,9 +144,8 @@
 	char *p, *sp;
 	int blen, cnt, recno, wrap;
 
-	if ((llines = malloc(off * sizeof(*llines))) == NULL)
-		err(1, "malloc");
-	bzero(llines, off * sizeof(*llines));
+	if ((llines = calloc(off, sizeof(*llines))) == NULL)
+		err(1, "calloc");
 	p = sp = NULL;
 	blen = cnt = recno = wrap = 0;
 	rc = 0;

Modified: trunk/usr.bin/tail/reverse.c
===================================================================
--- trunk/usr.bin/tail/reverse.c	2018-07-05 00:56:10 UTC (rev 11330)
+++ trunk/usr.bin/tail/reverse.c	2018-07-05 00:57:51 UTC (rev 11331)
@@ -1,3 +1,4 @@
+/* $MidnightBSD$ */
 /*-
  * Copyright (c) 1991, 1993
  *	The Regents of the University of California.  All rights reserved.
@@ -37,9 +38,10 @@
 #endif
 
 #include <sys/cdefs.h>
-__MBSDID("$MidnightBSD$");
+__FBSDID("$FreeBSD: stable/10/usr.bin/tail/reverse.c 332610 2018-04-16 16:42:16Z asomers $");
 
 #include <sys/param.h>
+#include <sys/queue.h>
 #include <sys/stat.h>
 #include <sys/mman.h>
 
@@ -117,6 +119,7 @@
 	map.start = NULL;
 	map.mapoff = map.maxoff = size;
 	map.fd = fileno(fp);
+	map.maplen = 0;
 
 	/*
 	 * Last char is special, ignore whether newline or not. Note that
@@ -168,12 +171,12 @@
 		ierr(fn);
 }
 
-typedef struct bf {
-	struct bf *next;
-	struct bf *prev;
-	int len;
-	char *l;
-} BF;
+#define BSZ	(128 * 1024)
+typedef struct bfelem {
+	TAILQ_ENTRY(bfelem) entries;
+	size_t len;
+	char l[BSZ];
+} bfelem_t;
 
 /*
  * r_buf -- display a non-regular file in reverse order by line.
@@ -188,58 +191,44 @@
 static void
 r_buf(FILE *fp, const char *fn)
 {
-	BF *mark, *tl, *tr;
-	int ch, len, llen;
+	struct bfelem *tl, *first = NULL;
+	size_t llen;
 	char *p;
-	off_t enomem;
+	off_t enomem = 0;
+	TAILQ_HEAD(bfhead, bfelem) head;
 
-	tl = NULL;
-#define	BSZ	(128 * 1024)
-	for (mark = NULL, enomem = 0;;) {
+	TAILQ_INIT(&head);
+
+	while (!feof(fp)) {
+		size_t len;
+
 		/*
 		 * Allocate a new block and link it into place in a doubly
 		 * linked list.  If out of memory, toss the LRU block and
 		 * keep going.
 		 */
-		if (enomem || (tl = malloc(sizeof(BF))) == NULL ||
-		    (tl->l = malloc(BSZ)) == NULL) {
-			if (!mark)
+		while ((tl = malloc(sizeof(bfelem_t))) == NULL) {
+			first = TAILQ_FIRST(&head);
+			if (TAILQ_EMPTY(&head))
 				err(1, "malloc");
-			tl = enomem ? tl->next : mark;
-			enomem += tl->len;
-		} else if (mark) {
-			tl->next = mark;
-			tl->prev = mark->prev;
-			mark->prev->next = tl;
-			mark->prev = tl;
-		} else {
-			mark = tl;
-			mark->next = mark->prev = mark;
+			enomem += first->len;
+			TAILQ_REMOVE(&head, first, entries);
+			free(first);
 		}
+		TAILQ_INSERT_TAIL(&head, tl, entries);
 
 		/* Fill the block with input data. */
-		for (p = tl->l, len = 0;
-		    len < BSZ && (ch = getc(fp)) != EOF; ++len)
-			*p++ = ch;
-
-		if (ferror(fp)) {
-			ierr(fn);
-			return;
+		len = 0;
+		while ((!feof(fp)) && len < BSZ) {
+			p = tl->l + len;
+			len += fread(p, 1, BSZ - len, fp);
+			if (ferror(fp)) {
+				ierr(fn);
+				return;
+			}
 		}
 
-		/*
-		 * If no input data for this block and we tossed some data,
-		 * recover it.
-		 */
-		if (!len && enomem) {
-			enomem -= tl->len;
-			tl = tl->prev;
-			break;
-		}
-
 		tl->len = len;
-		if (ch == EOF)
-			break;
 	}
 
 	if (enomem) {
@@ -248,37 +237,49 @@
 	}
 
 	/*
-	 * Step through the blocks in the reverse order read.  The last char
-	 * is special, ignore whether newline or not.
+	 * Now print the lines in reverse order
+	 * Outline:
+	 *    Scan backward for "\n",
+	 *    print forward to the end of the buffers
+	 *    free any buffers that start after the "\n" just found
+	 *    Loop
 	 */
-	for (mark = tl;;) {
-		for (p = tl->l + (len = tl->len) - 1, llen = 0; len--;
-		    --p, ++llen)
-			if (*p == '\n') {
-				if (llen) {
+	tl = TAILQ_LAST(&head, bfhead);
+	first = TAILQ_FIRST(&head);
+	while (tl != NULL) {
+		struct bfelem *temp;
+
+		for (p = tl->l + tl->len - 1, llen = 0; p >= tl->l;
+		    --p, ++llen) {
+			int start = (tl == first && p == tl->l);
+
+			if ((*p == '\n') || start) {
+				struct bfelem *tr;
+
+				if (llen && start && *p != '\n')
+					WR(p, llen + 1);
+				else if (llen) {
 					WR(p + 1, llen);
-					llen = 0;
+					if (start && *p == '\n')
+						WR(p, 1);
 				}
-				if (tl == mark)
-					continue;
-				for (tr = tl->next; tr->len; tr = tr->next) {
-					WR(tr->l, tr->len);
-					tr->len = 0;
-					if (tr == mark)
-						break;
+				tr = TAILQ_NEXT(tl, entries);
+				llen = 0;
+				if (tr != NULL) {
+					TAILQ_FOREACH_FROM_SAFE(tr, &head,
+					    entries, temp) {
+						if (tr->len)
+							WR(&tr->l, tr->len);
+						TAILQ_REMOVE(&head, tr,
+						    entries);
+						free(tr);
+					}
 				}
 			}
+		}
 		tl->len = llen;
-		if ((tl = tl->prev) == mark)
-			break;
+		tl = TAILQ_PREV(tl, bfhead, entries);
 	}
-	tl = tl->next;
-	if (tl->len) {
-		WR(tl->l, tl->len);
-		tl->len = 0;
-	}
-	while ((tl = tl->next)->len) {
-		WR(tl->l, tl->len);
-		tl->len = 0;
-	}
+	TAILQ_REMOVE(&head, first, entries);
+	free(first);
 }

Modified: trunk/usr.bin/tail/tail.1
===================================================================
--- trunk/usr.bin/tail/tail.1	2018-07-05 00:56:10 UTC (rev 11330)
+++ trunk/usr.bin/tail/tail.1	2018-07-05 00:57:51 UTC (rev 11331)
@@ -1,3 +1,4 @@
+.\" $MidnightBSD$
 .\" Copyright (c) 1980, 1990, 1991, 1993
 .\"	The Regents of the University of California.  All rights reserved.
 .\"
@@ -29,9 +30,9 @@
 .\" SUCH DAMAGE.
 .\"
 .\"	@(#)tail.1	8.1 (Berkeley) 6/6/93
-.\" $MidnightBSD$
+.\" $FreeBSD: stable/10/usr.bin/tail/tail.1 248414 2013-03-17 06:57:25Z joel $
 .\"
-.Dd June 5, 2009
+.Dd March 16, 2013
 .Dt TAIL 1
 .Os
 .Sh NAME
@@ -147,6 +148,17 @@
 flag is specified.
 .Sh EXIT STATUS
 .Ex -std
+.Sh EXAMPLES
+To display the last 500 lines of the file
+.Ar foo :
+.Pp
+.Dl $ tail -n 500 foo
+.Pp
+Keep
+.Pa /var/log/messages
+open, displaying to the standard output anything appended to the file:
+.Pp
+.Dl $ tail -f /var/log/messages
 .Sh SEE ALSO
 .Xr cat 1 ,
 .Xr head 1 ,


Property changes on: trunk/usr.bin/tail/tail.1
___________________________________________________________________
Added: svn:keywords
## -0,0 +1 ##
+MidnightBSD=%H
\ No newline at end of property
Modified: trunk/usr.bin/tail/tail.c
===================================================================
--- trunk/usr.bin/tail/tail.c	2018-07-05 00:56:10 UTC (rev 11330)
+++ trunk/usr.bin/tail/tail.c	2018-07-05 00:57:51 UTC (rev 11331)
@@ -1,3 +1,4 @@
+/* $MidnightBSD$ */
 /*-
  * Copyright (c) 1991, 1993
  *	The Regents of the University of California.  All rights reserved.
@@ -32,7 +33,7 @@
 
 #include <sys/cdefs.h>
 
-__MBSDID("$MidnightBSD$");
+__FBSDID("$FreeBSD: stable/10/usr.bin/tail/tail.c 251565 2013-06-09 08:06:26Z jh $");
 
 #ifndef lint
 static const char copyright[] =
@@ -58,7 +59,7 @@
 
 int Fflag, fflag, qflag, rflag, rval, no_files;
 
-file_info_t *files;
+static file_info_t *files;
 
 static void obsolete(char **);
 static void usage(void);
@@ -203,10 +204,8 @@
 				continue;
 			}
 			if (argc > 1 && !qflag) {
-				(void)printf("%s==> %s <==\n",
-				    first ? "" : "\n", fn);
+				printfn(fn, !first);
 				first = 0;
-				(void)fflush(stdout);
 			}
 
 			if (rflag)

Added: trunk/usr.bin/tail/tests/Makefile
===================================================================
--- trunk/usr.bin/tail/tests/Makefile	                        (rev 0)
+++ trunk/usr.bin/tail/tests/Makefile	2018-07-05 00:57:51 UTC (rev 11331)
@@ -0,0 +1,8 @@
+# $MidnightBSD$
+# $FreeBSD: stable/10/usr.bin/tail/tests/Makefile 311895 2017-01-10 20:43:32Z asomers $
+
+PACKAGE=	tests
+
+ATF_TESTS_SH=	tail_test
+
+.include <bsd.test.mk>


Property changes on: trunk/usr.bin/tail/tests/Makefile
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:keywords
## -0,0 +1 ##
+MidnightBSD=%H
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Added: trunk/usr.bin/tail/tests/tail_test.sh
===================================================================
--- trunk/usr.bin/tail/tests/tail_test.sh	                        (rev 0)
+++ trunk/usr.bin/tail/tests/tail_test.sh	2018-07-05 00:57:51 UTC (rev 11331)
@@ -0,0 +1,278 @@
+# Copyright (c) 2016 Alan Somers
+# All rights reserved.
+#
+# 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.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
+#
+# $FreeBSD: stable/10/usr.bin/tail/tests/tail_test.sh 332610 2018-04-16 16:42:16Z asomers $
+# $MidnightBSD$
+
+atf_test_case empty_r
+empty_r_head()
+{
+	atf_set "descr" "Reverse an empty file"
+}
+empty_r_body()
+{
+	touch infile expectfile
+	tail -r infile > outfile
+	tail -r < infile > outpipe
+	atf_check cmp expectfile outfile
+	atf_check cmp expectfile outpipe
+}
+
+atf_test_case file_r
+file_r_head()
+{
+	atf_set "descr" "Reverse a file"
+}
+file_r_body()
+{
+	cat > infile <<HERE
+This is the first line
+This is the second line
+This is the third line
+HERE
+	cat > expectfile << HERE
+This is the third line
+This is the second line
+This is the first line
+HERE
+	tail -r infile > outfile
+	tail -r < infile > outpipe
+	atf_check cmp expectfile outfile
+	atf_check cmp expectfile outpipe
+}
+
+atf_test_case file_rn2
+file_rn2_head()
+{
+	atf_set "descr" "Reverse the last two lines of a file"
+}
+file_rn2_body()
+{
+	cat > infile <<HERE
+This is the first line
+This is the second line
+This is the third line
+HERE
+	cat > expectfile << HERE
+This is the third line
+This is the second line
+HERE
+	tail -rn2 infile > outfile
+	tail -rn2 < infile > outpipe
+	atf_check cmp expectfile outfile
+	atf_check cmp expectfile outpipe
+}
+
+# Regression test for PR 222671
+# https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=222671
+atf_test_case pipe_leading_newline_r
+pipe_leading_newline_r_head()
+{
+	atf_set "descr" "Reverse a pipe whose first character is a newline"
+}
+pipe_leading_newline_r_body()
+{
+	cat > expectfile << HERE
+3
+2
+1
+
+HERE
+	printf '\n1\n2\n3\n' | tail -r > outfile
+	printf '\n1\n2\n3\n' | tail -r > outpipe
+	atf_check cmp expectfile outfile
+	atf_check cmp expectfile outpipe
+}
+
+atf_test_case file_rc28
+file_rc28_head()
+{
+	atf_set "descr" "Reverse a file and display the last 28 characters"
+}
+file_rc28_body()
+{
+	cat > infile <<HERE
+This is the first line
+This is the second line
+This is the third line
+HERE
+	cat > expectfile << HERE
+This is the third line
+line
+HERE
+	tail -rc28 infile > outfile
+	tail -rc28 < infile > outpipe
+	atf_check cmp expectfile outfile
+	atf_check cmp expectfile outpipe
+}
+
+atf_test_case file_rc28
+file_rc28_head()
+{
+	atf_set "descr" "Reverse a file and display the last 28 characters"
+}
+file_rc28_body()
+{
+	cat > infile <<HERE
+This is the first line
+This is the second line
+This is the third line
+HERE
+	cat > expectfile << HERE
+This is the third line
+line
+HERE
+	tail -rc28 infile > outfile
+	tail -rc28 < infile > outpipe
+	atf_check cmp expectfile outfile
+	atf_check cmp expectfile outpipe
+}
+
+atf_test_case longfile_r
+longfile_r_head()
+{
+	atf_set "descr" "Reverse a long file"
+}
+longfile_r_body()
+{
+	jot -w "%0511d" 1030 0 > infile
+	jot -w "%0511d" 1030 1029 0 -1 > expectfile
+	tail -r infile > outfile
+	tail -r < infile > outpipe
+	atf_check cmp expectfile outfile
+	atf_check cmp expectfile outpipe
+}
+
+atf_test_case longfile_r_enomem
+longfile_r_enomem_head()
+{
+	atf_set "descr" "Reverse a file that's too long to store in RAM"
+}
+longfile_r_enomem_body()
+{
+	# When we reverse a file that's too long for RAM, tail should drop the
+	# first part and just print what it can.  We'll check that the last
+	# part is ok
+	{
+		ulimit -v 32768 || atf_skip "Can't adjust ulimit"
+		jot -w "%01023d" 32768 0 | tail -r > outfile ;
+	}
+	if [ "$?" -ne 1 ]; then
+		atf_skip "Didn't get ENOMEM.  Adjust test parameters"
+	fi
+	# We don't know how much of the input we dropped.  So just check that
+	# the first ten lines of tail's output are the same as the last ten of
+	# the input
+	jot -w "%01023d" 10 32767 0 -1 > expectfile
+	head -n 10 outfile > outtrunc
+	diff expectfile outtrunc
+	atf_check cmp expectfile outtrunc
+}
+
+atf_test_case longfile_r_longlines
+longfile_r_longlines_head()
+{
+	atf_set "descr" "Reverse a long file with extremely long lines"
+}
+longfile_r_longlines_body()
+{
+	jot -s " " -w "%07d" 18000 0 > infile
+	jot -s " " -w "%07d" 18000 18000 >> infile
+	jot -s " " -w "%07d" 18000 36000 >> infile
+	jot -s " " -w "%07d" 18000 36000 > expectfile
+	jot -s " " -w "%07d" 18000 18000 >> expectfile
+	jot -s " " -w "%07d" 18000 0 >> expectfile
+	tail -r infile > outfile
+	tail -r < infile > outpipe
+	atf_check cmp expectfile outfile
+	atf_check cmp expectfile outpipe
+}
+
+atf_test_case longfile_rc135782
+longfile_rc135782_head()
+{
+	atf_set "descr" "Reverse a long file and print the last 135,782 bytes"
+}
+longfile_rc135782_body()
+{
+	jot -w "%063d" 9000 0 > infile
+	jot -w "%063d" 2121 8999 0 -1 > expectfile
+	echo "0000000000000000000000000000000006878" >> expectfile
+	tail -rc135782 infile > outfile
+	tail -rc135782 < infile > outpipe
+	atf_check cmp expectfile outfile
+	atf_check cmp expectfile outpipe
+}
+
+atf_test_case longfile_rc145782_longlines
+longfile_rc145782_longlines_head()
+{
+	atf_set "descr" "Reverse a long file with extremely long lines and print the last 145,782 bytes"
+}
+longfile_rc145782_longlines_body()
+{
+	jot -s " " -w "%07d" 18000 0 > infile
+	jot -s " " -w "%07d" 18000 18000 >> infile
+	jot -s " " -w "%07d" 18000 36000 >> infile
+	jot -s " " -w "%07d" 18000 36000 > expectfile
+	echo -n "35777 " >> expectfile
+	jot -s " " -w "%07d" 222 35778 >> expectfile
+	tail -rc145782 infile > outfile
+	tail -rc145782 < infile > outpipe
+	atf_check cmp expectfile outfile
+	atf_check cmp expectfile outpipe
+}
+
+atf_test_case longfile_rn2500
+longfile_rn2500_head()
+{
+	atf_set "descr" "Reverse a long file and print the last 2,500 lines"
+}
+longfile_rn2500_body()
+{
+	jot -w "%063d" 9000 0 > infile
+	jot -w "%063d" 2500 8999 0 -1 > expectfile
+	tail -rn2500 infile > outfile
+	tail -rn2500 < infile > outpipe
+	atf_check cmp expectfile outfile
+	atf_check cmp expectfile outpipe
+}
+
+
+atf_init_test_cases()
+{
+	atf_add_test_case empty_r
+	atf_add_test_case file_r
+	atf_add_test_case file_rc28
+	atf_add_test_case file_rn2
+	atf_add_test_case pipe_leading_newline_r
+	# The longfile tests are designed to exercise behavior in r_buf(),
+	# which operates on 128KB blocks
+	atf_add_test_case longfile_r
+	atf_add_test_case longfile_r_enomem
+	atf_add_test_case longfile_r_longlines
+	atf_add_test_case longfile_rc135782
+	atf_add_test_case longfile_rc145782_longlines
+	atf_add_test_case longfile_rn2500
+}


Property changes on: trunk/usr.bin/tail/tests/tail_test.sh
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:keywords
## -0,0 +1 ##
+MidnightBSD=%H
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property


More information about the Midnightbsd-cvs mailing list