]> git.ipfire.org Git - thirdparty/coreutils.git/commitdiff
tail --follow=name no longer implies --retry
authorJim Meyering <meyering@redhat.com>
Sun, 24 Apr 2011 21:20:01 +0000 (23:20 +0200)
committerJim Meyering <meyering@redhat.com>
Mon, 25 Apr 2011 08:59:15 +0000 (10:59 +0200)
* src/tail.c (tail_forever_inotify): Just as without inotify,
tail --follow=name now terminates when the last tailed-by-name file
is unlinked or moved aside.  This bug was introduced on 2009-06-15
via commit ae494d4b, "tail: use inotify if it is available".
Reported by Tim Underwood in
http://thread.gmane.org/gmane.comp.gnu.coreutils.bugs/22286
* NEWS (Bug fixes): Mention this.
* tests/tail-2/follow-name: Test for this.
* tests/Makefile.am (TESTS): Add it.

NEWS
THANKS.in
src/tail.c
tests/Makefile.am
tests/tail-2/follow-name [new file with mode: 0755]

diff --git a/NEWS b/NEWS
index 7bc2ef39ac7c0c9c7ef92cab09e451d86dfe346e..3307e71e9bf24d3475d0933c94e5a667414d2b35 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,11 @@ GNU coreutils NEWS                                    -*- outline -*-
 
 * Noteworthy changes in release ?.? (????-??-??) [?]
 
+** Bug fixes
+
+  tail's --follow=name option no longer implies --retry on systems
+  with inotify support.  [bug introduced in coreutils-7.5]
+
 ** Changes in behavior
 
   cp's extent-based (FIEMAP) copying code is more reliable in the face
index 342a52c811aa94cb3543a1446e16c4ee32727aeb..d1ca380720ff3952e334bbbd502ec6b1e90f2d43 100644 (file)
--- a/THANKS.in
+++ b/THANKS.in
@@ -560,6 +560,7 @@ Tim J. Robbins                      tjr@FreeBSD.org
 Tim Mooney                          mooney@dogbert.cc.ndsu.NoDak.edu
 Tim Ryan                            Tim_Ryan@bnz.co.nz
 Tim Smithers                        mouse@dmouse.com.au
+Tim Underwood                       timunderwood@gmail.com
 Tim Waugh                           twaugh@redhat
 Toby Peterson                       toby@opendarwin.org
 Todd A. Jacobs                      tjacobs@codegnome.org
index 88fbd10b8111518736bf9eebbda61d87d3c5e1bc..e6d816432b456dec9d1848ab303b3691faf849ca 100644 (file)
@@ -1432,6 +1432,16 @@ tail_forever_inotify (int wd, struct File_spec *f, size_t n_files,
       struct File_spec *fspec;
       struct inotify_event *ev;
 
+      /* When following by name without --retry, and the last file has
+         been unlinked or renamed-away, diagnose it and return.  */
+      if (follow_mode == Follow_name
+          && ! reopen_inaccessible_files
+          && hash_get_n_entries (wd_to_name) == 0)
+        {
+          error (0, 0, _("no files remaining"));
+          return false;
+        }
+
       /* When watching a PID, ensure that a read from WD will not block
          indefinitely.  */
       if (pid)
index 685eb52b958466f98a3bb7fb65f09b9874defaa1..2f4a5613aa301469f8a5aaf04d3c76778fb25bf6 100644 (file)
@@ -489,6 +489,7 @@ TESTS =                                             \
   tail-2/assert-2                              \
   tail-2/big-4gb                               \
   tail-2/flush-initial                         \
+  tail-2/follow-name                           \
   tail-2/follow-stdin                          \
   tail-2/pipe-f                                        \
   tail-2/pipe-f2                               \
diff --git a/tests/tail-2/follow-name b/tests/tail-2/follow-name
new file mode 100755 (executable)
index 0000000..ef9434a
--- /dev/null
@@ -0,0 +1,32 @@
+#!/bin/sh
+# ensure that --follow=name does not imply --retry
+
+# Copyright (C) 2011 Free Software Foundation, Inc.
+
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+. "${srcdir=.}/init.sh"; path_prepend_ ../src
+print_ver_ tail
+
+cat <<\EOF > exp || framework_failure_
+tail: cannot open `no-such' for reading: No such file or directory
+tail: no files remaining
+EOF
+
+timeout 10 tail --follow=name no-such > out 2> err
+test $? = 1 || fail=1
+
+compare err exp || fail=1
+
+Exit $fail