tail: make the new piped-stdin test as portable as the old one

* src/tail.c (main): Adapt piped-stdin test to use the same isapipe,
test as was used in the preceding POSIXLY_CORRECT condition.
Remove the now-subsumed POSIXLY_CORRECT test.
Reported by Pádraig Brady.
* doc/coreutils.texi (tail invocation): Document this change.
* NEWS (Changes in behavior): Reclassify, clarify.
This commit is contained in:
Jim Meyering
2009-09-08 08:26:22 +02:00
parent e8591fd39f
commit f0ff8c73fe
3 changed files with 16 additions and 30 deletions

10
NEWS
View File

@@ -46,11 +46,13 @@ GNU coreutils NEWS -*- outline -*-
cp --reflink accepts a new "auto" parameter which falls back to
a standard copy if creating a copy-on-write clone is not possible.
** POSIX conformance
** Changes in behavior
tail -f now ignores "-" when stdin is a pipe or FIFO, per POSIX.
Now, :|tail -f terminates immediately. Before, it would block indefinitely.
[the old behavior dates back to the original implementation]
tail -f now ignores "-" when stdin is a pipe or FIFO.
tail-with-no-args now ignores -f unconditionally when stdin is a pipe or FIFO.
Before, it would ignore -f only when no file argument was specified,
and then only when POSIXLY_CORRECT was set. Now, :|tail -f - terminates
immediately. Before, it would block indefinitely.
* Noteworthy changes in release 7.5 (2009-08-20) [stable]

View File

@@ -2782,9 +2782,10 @@ growing.
The option values @samp{descriptor} and @samp{name} may be specified only
with the long form of the option, not with @option{-f}.
@vindex POSIXLY_CORRECT
If @env{POSIXLY_CORRECT} is set, the @option{-f} option is ignored if
The @option{-f} option is ignored if
no @var{file} operand is specified and standard input is a FIFO or a pipe.
Likewise, the @option{-f} option has no effect for any
operand specified as @samp{-}, when standard input is a FIFO or a pipe.
@item -F
@opindex -F

View File

@@ -1922,28 +1922,6 @@ main (int argc, char **argv)
static char *dummy_stdin = (char *) "-";
n_files = 1;
file = &dummy_stdin;
/* POSIX says that -f is ignored if no file operand is specified
and standard input is a pipe. However, the GNU coding
standards say that program behavior should not depend on
device type, because device independence is an important
principle of the system's design.
Follow the POSIX requirement only if POSIXLY_CORRECT is set. */
if (forever && getenv ("POSIXLY_CORRECT"))
{
struct stat st;
int is_a_fifo_or_pipe =
(fstat (STDIN_FILENO, &st) != 0 ? -1
: S_ISFIFO (st.st_mode) ? 1
: HAVE_FIFO_PIPES == 1 ? 0
: isapipe (STDIN_FILENO));
if (is_a_fifo_or_pipe < 0)
error (EXIT_FAILURE, errno, _("standard input"));
if (is_a_fifo_or_pipe)
forever = false;
}
}
{
@@ -1986,8 +1964,13 @@ main (int argc, char **argv)
size_t n_viable = 0;
for (i = 0; i < n_files; i++)
{
if (STREQ (F[i].name, "-") && !F[i].ignore
&& 0 <= F[i].fd && S_ISFIFO (F[i].mode))
bool is_a_fifo_or_pipe =
(STREQ (F[i].name, "-")
&& !F[i].ignore
&& 0 <= F[i].fd
&& (S_ISFIFO (F[i].mode)
|| (HAVE_FIFO_PIPES != 1 && isapipe (F[i].fd))));
if (is_a_fifo_or_pipe)
F[i].ignore = true;
else
++n_viable;