git: 7e11889959a6 - main - tail: Fix -f with stdin

Mark Johnston markj at FreeBSD.org
Sat Aug 14 15:22:28 UTC 2021


The branch main has been updated by markj:

URL: https://cgit.FreeBSD.org/src/commit/?id=7e11889959a6c92f05e1c1949deb73295ce60bac

commit 7e11889959a6c92f05e1c1949deb73295ce60bac
Author:     Mark Johnston <markj at FreeBSD.org>
AuthorDate: 2021-07-08 21:40:59 +0000
Commit:     Mark Johnston <markj at FreeBSD.org>
CommitDate: 2021-08-14 15:19:32 +0000

    tail: Fix -f with stdin
    
    Based on a patch from swills at .
    
    MFC after:      2 weeks
    Differential Revision:  https://reviews.freebsd.org/D31113
---
 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);


More information about the dev-commits-src-all mailing list