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-main
mailing list