summaryrefslogtreecommitdiff
path: root/src/tail.c
diff options
context:
space:
mode:
authorJim Meyering <jim@meyering.net>1999-07-10 09:56:37 +0000
committerJim Meyering <jim@meyering.net>1999-07-10 09:56:37 +0000
commitae1e1e5e19f4e8f4c7e574772c7d19404a124d52 (patch)
treec46f59c333ed845ed17e4e855ee4ac6f5f36b2f7 /src/tail.c
parent647e6ab6445abd43d5e7411b8c01043b0d79b076 (diff)
downloadcoreutils-ae1e1e5e19f4e8f4c7e574772c7d19404a124d52.tar.xz
(struct File_spec): New member, errnum.
(recheck): Record the new value of errno in f->errnum. Don't output an error message unless the new value of errno differs from the old one. Output a message if previously-inaccessible file becomes accessible. (tail_forever): Always recheck files whose fd is negative. If the file cannot be fstat'ed, record the errno value in f[i].errnum. (tail_file): If the file cannot be open, record the errno value in f->errnum. If it can be opened, initialize f->errnum to zero. If it's a non-regular non-fifo file, initialize f->errnum to -1.
Diffstat (limited to 'src/tail.c')
-rw-r--r--src/tail.c30
1 files changed, 26 insertions, 4 deletions
diff --git a/src/tail.c b/src/tail.c
index da64f653f..12f472073 100644
--- a/src/tail.c
+++ b/src/tail.c
@@ -113,6 +113,10 @@ struct File_spec
/* FIXME: describe */
int missing;
+
+ /* The value of errno seen last time we checked this file. */
+ int errnum;
+
};
/* FIXME: describe */
@@ -653,6 +657,7 @@ recheck (struct File_spec *f)
int fail = 0;
int is_stdin = (STREQ (f->name, "-"));
int was_missing = f->missing;
+ int prev_errnum = f->errnum;
int new_file;
fd = (is_stdin ? STDIN_FILENO : open (f->name, O_RDONLY));
@@ -664,6 +669,7 @@ recheck (struct File_spec *f)
if (fd == -1 || fstat (fd, &new_stats) < 0)
{
fail = 1;
+ f->errnum = errno;
if (f->missing)
{
if (!was_missing)
@@ -673,7 +679,7 @@ recheck (struct File_spec *f)
/* say nothing... it's still missing */
}
}
- else
+ else if (prev_errnum != errno)
{
error (0, errno, "%s", pretty_name (f));
}
@@ -682,11 +688,14 @@ recheck (struct File_spec *f)
&& !S_ISFIFO (new_stats.st_mode))
{
fail = 1;
+ f->errnum = -1; /* FIXME */
error (0, 0,
_("`%s' has been replaced with a non-regular file; \
cannot follow end of non-regular file"),
pretty_name (f));
}
+ else
+ f->errnum = 0;
new_file = 0;
if (fail)
@@ -695,6 +704,13 @@ cannot follow end of non-regular file"),
close_fd (f->fd, pretty_name (f));
f->fd = -1;
}
+ else if (prev_errnum && prev_errnum != ENOENT)
+ {
+ new_file = 1;
+ if (f->fd != -1)
+ close_fd (f->fd, pretty_name (f)); /* close the old handle */
+ error (0, 0, _("`%s' has become accessible"), pretty_name (f));
+ }
else if (f->ino != new_stats.st_ino || f->dev != new_stats.st_dev)
{
new_file = 1;
@@ -783,8 +799,7 @@ tail_forever (struct File_spec *f, int nfiles)
if (f[i].fd < 0)
{
- if (f[i].missing)
- recheck (&f[i]);
+ recheck (&f[i]);
continue;
}
@@ -792,6 +807,7 @@ tail_forever (struct File_spec *f, int nfiles)
{
error (0, errno, "%s", pretty_name (&f[i]));
f[i].fd = -1;
+ f[i].errnum = errno;
continue;
}
@@ -1022,7 +1038,10 @@ tail_file (struct File_spec *f, off_t n_units)
if (fd == -1)
{
if (forever)
- f->fd = -1;
+ {
+ f->fd = -1;
+ f->errnum = errno;
+ }
error (0, errno, "%s", pretty_name (f));
errors = 1;
}
@@ -1033,17 +1052,20 @@ tail_file (struct File_spec *f, off_t n_units)
errors = tail (pretty_name (f), fd, n_units);
if (forever)
{
+ f->errnum = 0;
/* FIXME: duplicate code */
if (fstat (fd, &stats) < 0)
{
error (0, errno, "%s", pretty_name (f));
errors = 1;
+ f->errnum = errno;
}
else if (!S_ISREG (stats.st_mode) && !S_ISFIFO (stats.st_mode))
{
error (0, 0, _("%s: cannot follow end of non-regular file"),
pretty_name (f));
errors = 1;
+ f->errnum = -1; /* FIXME */
}
if (errors)
{