Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 21 Aug 2021 17:59:13 GMT
From:      Mark Johnston <markj@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org
Subject:   git: 9bfe19ff8253 - stable/13 - tail: Fix -f with stdin
Message-ID:  <202108211759.17LHxDBw008106@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch stable/13 has been updated by markj:

URL: https://cgit.FreeBSD.org/src/commit/?id=9bfe19ff8253d08482cbbbf59cca435c4de87ac5

commit 9bfe19ff8253d08482cbbbf59cca435c4de87ac5
Author:     Mark Johnston <markj@FreeBSD.org>
AuthorDate: 2021-07-08 21:40:59 +0000
Commit:     Mark Johnston <markj@FreeBSD.org>
CommitDate: 2021-08-21 16:18:17 +0000

    tail: Fix -f with stdin
    
    Based on a patch from swills@.
    
    (cherry picked from commit 7e11889959a6c92f05e1c1949deb73295ce60bac)
---
 usr.bin/tail/extern.h |  2 +-
 usr.bin/tail/tail.c   | 43 ++++++++++++++++++++-----------------------
 2 files changed, 21 insertions(+), 24 deletions(-)

diff --git a/usr.bin/tail/extern.h b/usr.bin/tail/extern.h
index 65ddb519dc61..3d8c12629682 100644
--- a/usr.bin/tail/extern.h
+++ b/usr.bin/tail/extern.h
@@ -56,7 +56,7 @@ struct mapinfo {
 
 struct file_info {
 	FILE *fp;
-	char *file_name;
+	const char *file_name;
 	struct stat st;
 };
 
diff --git a/usr.bin/tail/tail.c b/usr.bin/tail/tail.c
index b52043c5e580..874557f105ec 100644
--- a/usr.bin/tail/tail.c
+++ b/usr.bin/tail/tail.c
@@ -67,8 +67,6 @@ static const char sccsid[] = "@(#)tail.c	8.1 (Berkeley) 6/6/93";
 int Fflag, fflag, qflag, rflag, rval, no_files;
 fileargs_t *fa;
 
-static file_info_t *files;
-
 static void obsolete(char **);
 static void usage(void);
 
@@ -88,8 +86,8 @@ main(int argc, char *argv[])
 	FILE *fp;
 	off_t off;
 	enum STYLE style;
-	int i, ch, first;
-	file_info_t *file;
+	int ch, first;
+	file_info_t file, *filep, *files;
 	char *p;
 	cap_rights_t rights;
 
@@ -206,30 +204,24 @@ main(int argc, char *argv[])
 	}
 
 	if (*argv && fflag) {
-		files = (struct file_info *) malloc(no_files *
-		    sizeof(struct file_info));
-		if (!files)
+		files = malloc(no_files * sizeof(struct file_info));
+		if (files == NULL)
 			err(1, "Couldn't malloc space for file descriptors.");
 
-		for (file = files; (fn = *argv++); file++) {
-			file->file_name = strdup(fn);
-			if (! file->file_name)
-				errx(1, "Couldn't malloc space for file name.");
-			file->fp = fileargs_fopen(fa, file->file_name, "r");
-			if (file->fp == NULL ||
-			    fstat(fileno(file->fp), &file->st)) {
-				if (file->fp != NULL) {
-					fclose(file->fp);
-					file->fp = NULL;
+		for (filep = files; (fn = *argv++); filep++) {
+			filep->file_name = fn;
+			filep->fp = fileargs_fopen(fa, filep->file_name, "r");
+			if (filep->fp == NULL ||
+			    fstat(fileno(filep->fp), &filep->st)) {
+				if (filep->fp != NULL) {
+					fclose(filep->fp);
+					filep->fp = NULL;
 				}
 				if (!Fflag || errno != ENOENT)
-					ierr(file->file_name);
+					ierr(filep->file_name);
 			}
 		}
 		follow(files, style, off);
-		for (i = 0, file = files; i < no_files; i++, file++) {
-		    free(file->file_name);
-		}
 		free(files);
 	} else if (*argv) {
 		for (first = 1; (fn = *argv++);) {
@@ -266,10 +258,15 @@ main(int argc, char *argv[])
 			fflag = 0;		/* POSIX.2 requires this. */
 		}
 
-		if (rflag)
+		if (rflag) {
 			reverse(stdin, fn, style, off, &sb);
-		else
+		} else if (fflag) {
+			file.file_name = fn;
+			file.fp = stdin;
+			follow(&file, style, off);
+		} else {
 			forward(stdin, fn, style, off, &sb);
+		}
 	}
 	fileargs_free(fa);
 	exit(rval);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202108211759.17LHxDBw008106>