From unknown Tue Aug 19 05:13:05 2025 X-Loop: help-debbugs@gnu.org Subject: bug#26363: [PATCH] tail: 'tail -F dir/file' reverts to polling mode if 'dir' is removed Resent-From: Sebastian Kisela Original-Sender: "Debbugs-submit" Resent-CC: bug-coreutils@gnu.org Resent-Date: Tue, 04 Apr 2017 17:00:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 26363 X-GNU-PR-Package: coreutils X-GNU-PR-Keywords: patch To: 26363@debbugs.gnu.org X-Debbugs-Original-To: bug-coreutils@gnu.org Received: via spool by submit@debbugs.gnu.org id=B.149132518711342 (code B ref -1); Tue, 04 Apr 2017 17:00:02 +0000 Received: (at submit) by debbugs.gnu.org; 4 Apr 2017 16:59:47 +0000 Received: from localhost ([127.0.0.1]:60894 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cvRo1-0002wo-1T for submit@debbugs.gnu.org; Tue, 04 Apr 2017 12:59:47 -0400 Received: from eggs.gnu.org ([208.118.235.92]:40606) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cvRch-0002f6-Jc for submit@debbugs.gnu.org; Tue, 04 Apr 2017 12:48:06 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cvRca-00051u-7C for submit@debbugs.gnu.org; Tue, 04 Apr 2017 12:47:58 -0400 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=0.8 required=5.0 tests=BAYES_50,HTML_MESSAGE autolearn=disabled version=3.3.2 Received: from lists.gnu.org ([2001:4830:134:3::11]:49993) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cvRca-00051f-3X for submit@debbugs.gnu.org; Tue, 04 Apr 2017 12:47:56 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59788) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cvRcX-0008Ed-H2 for bug-coreutils@gnu.org; Tue, 04 Apr 2017 12:47:55 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cvRcT-0004yd-Fc for bug-coreutils@gnu.org; Tue, 04 Apr 2017 12:47:53 -0400 Received: from mail-wm0-f53.google.com ([74.125.82.53]:32926) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1cvRcT-0004x5-5t for bug-coreutils@gnu.org; Tue, 04 Apr 2017 12:47:49 -0400 Received: by mail-wm0-f53.google.com with SMTP id x89so948886wma.0 for ; Tue, 04 Apr 2017 09:47:48 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=/9Nvm8lhnB8DNTfDdCbmm+pBXtbo+wgK5hKU2pSXsKM=; b=izHo7vBb9rhJKS8MUtDo97xiW0WxGpiMaYoz7umo+wVIUALqu82QTVTjkelwJhhESJ 59zHnPvZXVpHel2mn5SnzdJl2rNgaNQk/8kSqPq/v8/CsBTti4FBhFjdnBDC0NT/tJz6 H8IkdKdFmVFY0L7iBB92bErQZwSDJtJpCKIW9fQecFNwmQ73ID6o/AQXeSCQ72wPy1K3 h9hF62y3PUPj4lmwo8GqP0IADUXfJpa+DjjJhalebJS6PDBoSA944eOiihwqvhh+shz0 8QjV9QfaLjvCEcEhjKwm+0UL19Y6EmneBBW3cFTDMgEC5jsYtX6Qr5JgjC+nCp3qPnSw bGdg== X-Gm-Message-State: AFeK/H3dCYZiSdfN8UqllWceonI8BvG3pmDq1VJLeTYdar+CBrTYhVLXEbf2S46iwV/w7Y7jb5RuXRVwudbVCHRt X-Received: by 10.28.141.65 with SMTP id p62mr5323228wmd.122.1491324466926; Tue, 04 Apr 2017 09:47:46 -0700 (PDT) MIME-Version: 1.0 Received: by 10.223.161.144 with HTTP; Tue, 4 Apr 2017 09:47:46 -0700 (PDT) From: Sebastian Kisela Date: Tue, 4 Apr 2017 18:47:46 +0200 Message-ID: Content-Type: multipart/alternative; boundary=001a114703d618b22a054c5a0989 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x X-Received-From: 2001:4830:134:3::11 X-Spam-Score: -5.0 (-----) X-Mailman-Approved-At: Tue, 04 Apr 2017 12:59:43 -0400 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -5.0 (-----) --001a114703d618b22a054c5a0989 Content-Type: text/plain; charset=UTF-8 * src/tail.c (tail_forever_inotify): Add the IN_DELETE_SELF flag when creating watch for the parent directory. After the parent directory is removed, an event is caught and then we switch from inotify to polling mode. Till now, inotify has always frozen because it waited for an event from a watched dir, which has been already deleted and was not added again. * tests/tail-2/inotify-dir-recreate.sh: Add a test case. * tests/local.mk: Reference the new test. * NEWS: Mention the bug fix. Reported at https://bugzilla.redhat.com/1283760 --- NEWS | 2 ++ src/tail.c | 21 +++++++++++- tests/local.mk | 1 + tests/tail-2/inotify-dir-recreate.sh | 66 ++++++++++++++++++++++++++++++++++++ 4 files changed, 89 insertions(+), 1 deletion(-) create mode 100755 tests/tail-2/inotify-dir-recreate.sh diff --git a/NEWS b/NEWS index e2f298f..f34d667 100644 --- a/NEWS +++ b/NEWS @@ -74,6 +74,8 @@ GNU coreutils NEWS -*- outline -*- 'cp -fl A B' no longer remove B before creating the new link. That is, there is no longer a brief moment when B does not exist. + tail -F 'dir/file' reverts to polling mode in case 'dir' is removed. + ** New features expand and unexpand now support specifying a tab size to use diff --git a/src/tail.c b/src/tail.c index d1552d4..e35ee1e 100644 --- a/src/tail.c +++ b/src/tail.c @@ -1457,7 +1457,8 @@ tail_forever_inotify (int wd, struct File_spec *f, size_t n_files, In that case the same watch descriptor is returned. */ f[i].parent_wd = inotify_add_watch (wd, dirlen ? f[i].name : ".", (IN_CREATE | IN_DELETE - | IN_MOVED_TO | IN_ATTRIB)); + | IN_MOVED_TO | IN_ATTRIB + | IN_DELETE_SELF)); f[i].name[dirlen] = prev; @@ -1628,6 +1629,24 @@ tail_forever_inotify (int wd, struct File_spec *f, size_t n_files, ev = void_ev; evbuf_off += sizeof (*ev) + ev->len; + /* If a directory is deleted, IN_DELETE_SELF is emmited + with ev->name of length 0. + We need to catch it, otherwise it would wait forever, + as wd for directory becomes inactive. Revert to polling now. */ + if ((ev->mask & IN_DELETE_SELF) && !ev->len) + { + for (i = 0; i < n_files; i++) + { + if (ev->wd == f[i].parent_wd) + { + hash_free (wd_to_name); + error (0, 0, + _("directory containing watched file was removed")); + return true; + } + } + } + if (ev->len) /* event on ev->name in watched directory. */ { size_t j; diff --git a/tests/local.mk b/tests/local.mk index 9f1a853..bcf70c2 100644 --- a/tests/local.mk +++ b/tests/local.mk @@ -176,6 +176,7 @@ all_tests = \ tests/tail-2/descriptor-vs-rename.sh \ tests/tail-2/inotify-rotate.sh \ tests/tail-2/inotify-rotate-resources.sh \ + tests/tail-2/inotify-dir-recreate.sh \ tests/chmod/no-x.sh \ tests/chgrp/basic.sh \ tests/rm/dangling-symlink.sh \ diff --git a/tests/tail-2/inotify-dir-recreate.sh b/tests/tail-2/inotify-dir-recreate.sh new file mode 100755 index 0000000..ed5f339 --- /dev/null +++ b/tests/tail-2/inotify-dir-recreate.sh @@ -0,0 +1,66 @@ +#!/bin/sh +# Makes sure, inotify will switch to polling mode if directory +# of the watched file was removed and recreated. +# (...instead of getting stuck forever) + +# Copyright (C) 2006-2017 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 . + +. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src +print_ver_ tail + + +# Terminate any background tail process +cleanup_() { kill $pid 2>/dev/null && wait $pid; } + +# Check for existence of the important message +check_tail_output_ () +{ + grep "$1" out &>/dev/null || fail=1 +} + +# Prepare the file to be watched +mkdir dir && touch dir/file +sleep 1 + +timeout 60 tail --follow=name --retry dir/file &>out & pid=$! +sleep 1 + +# Remove the directory, should get the massage about the deletion +rm -r dir +sleep 1 + +# Recreate the dir, should get a message about recreation +mkdir dir && touch dir/file +sleep 1 + +cleanup_ +rm -r dir + +# Expected result for the whole process +cat <<\EOF > exp +tail: 'dir/file' has become inaccessible: No such file or directory +tail: directory containing watched file was removed +tail: inotify cannot be used, reverting to polling: No such file or directory +tail: 'dir/file' has appeared; following new file +EOF + +# If contains 'has appeared' string, than +# the polling mode has been reactivated succesfully +check_tail_output_ 'has appeared' + +compare exp out || fail=1 + +Exit $fail -- 2.9.3 --001a114703d618b22a054c5a0989 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: base64 PGRpdiBkaXI9Imx0ciI+PGRpdj48ZGl2PjxkaXY+PGRpdj48ZGl2Piogc3JjL3RhaWwuYyAodGFp bF9mb3JldmVyX2lub3RpZnkpOsKgIEFkZCB0aGUgSU5fREVMRVRFX1NFTEYgZmxhZyB3aGVuPGJy PmNyZWF0aW5nIHdhdGNoIGZvciB0aGUgcGFyZW50IGRpcmVjdG9yeS7CoCBBZnRlciB0aGUgcGFy ZW50IGRpcmVjdG9yeTxicj5pcyByZW1vdmVkLCBhbiBldmVudCBpcyBjYXVnaHQgYW5kIHRoZW4g d2Ugc3dpdGNoIGZyb20gaW5vdGlmeSB0bzxicj5wb2xsaW5nIG1vZGUuwqAgVGlsbCBub3csIGlu b3RpZnkgaGFzIGFsd2F5cyBmcm96ZW4gYmVjYXVzZSBpdCB3YWl0ZWQgZm9yPGJyPmFuIGV2ZW50 IGZyb20gYSB3YXRjaGVkIGRpciwgd2hpY2ggaGFzIGJlZW4gYWxyZWFkeSBkZWxldGVkIGFuZCB3 YXMgbm90PGJyPmFkZGVkIGFnYWluLjxicj4qIHRlc3RzL3RhaWwtMi9pbm90aWZ5LWRpci1yZWNy ZWF0ZS5zaDogQWRkIGEgdGVzdCBjYXNlLjxicj4qIHRlc3RzLzxhIGhyZWY9Imh0dHA6Ly9sb2Nh bC5tayI+bG9jYWwubWs8L2E+OiBSZWZlcmVuY2UgdGhlIG5ldyB0ZXN0Ljxicj4qIE5FV1M6IE1l bnRpb24gdGhlIGJ1ZyBmaXguPGJyPjxicj5SZXBvcnRlZCBhdCA8YSBocmVmPSJodHRwczovL2J1 Z3ppbGxhLnJlZGhhdC5jb20vMTI4Mzc2MCI+aHR0cHM6Ly9idWd6aWxsYS5yZWRoYXQuY29tLzEy ODM3NjA8L2E+PGJyPi0tLTxicj7CoE5FV1PCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHzCoCAyICsrPGJyPsKgc3JjL3RhaWwu Y8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfCAy MSArKysrKysrKysrKy08YnI+wqB0ZXN0cy88YSBocmVmPSJodHRwOi8vbG9jYWwubWsiPmxvY2Fs Lm1rPC9hPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHzCoCAx ICs8YnI+wqB0ZXN0cy90YWlsLTIvaW5vdGlmeS1kaXItcmVjcmVhdGUuc2ggfCA2NiArKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKys8YnI+wqA0IGZpbGVzIGNoYW5nZWQsIDg5IGlu c2VydGlvbnMoKyksIDEgZGVsZXRpb24oLSk8YnI+wqBjcmVhdGUgbW9kZSAxMDA3NTUgdGVzdHMv dGFpbC0yL2lub3RpZnktZGlyLXJlY3JlYXRlLnNoPGJyPjxicj5kaWZmIC0tZ2l0IGEvTkVXUyBi L05FV1M8YnI+aW5kZXggZTJmMjk4Zi4uZjM0ZDY2NyAxMDA2NDQ8YnI+LS0tIGEvTkVXUzxicj4r KysgYi9ORVdTPGJyPkBAIC03NCw2ICs3NCw4IEBAIEdOVSBjb3JldXRpbHMgTkVXU8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgLSotIG91dGxpbmUgLSotPGJyPsKgwqAgJiMzOTtjcCAtZmwgQSBCJiMzOTsgbm8gbG9u Z2VyIHJlbW92ZSBCIGJlZm9yZSBjcmVhdGluZyB0aGUgbmV3IGxpbmsuPGJyPsKgwqAgVGhhdCBp cywgdGhlcmUgaXMgbm8gbG9uZ2VyIGEgYnJpZWYgbW9tZW50IHdoZW4gQiBkb2VzIG5vdCBleGlz dC48YnI+wqA8YnI+K8KgIHRhaWwgLUYgJiMzOTtkaXIvZmlsZSYjMzk7IHJldmVydHMgdG8gcG9s bGluZyBtb2RlIGluIGNhc2UgJiMzOTtkaXImIzM5OyBpcyByZW1vdmVkLjxicj4rPGJyPsKgKiog TmV3IGZlYXR1cmVzPGJyPsKgPGJyPsKgwqAgZXhwYW5kIGFuZCB1bmV4cGFuZCBub3cgc3VwcG9y dCBzcGVjaWZ5aW5nIGEgdGFiIHNpemUgdG8gdXNlPGJyPmRpZmYgLS1naXQgYS9zcmMvdGFpbC5j IGIvc3JjL3RhaWwuYzxicj5pbmRleCBkMTU1MmQ0Li5lMzVlZTFlIDEwMDY0NDxicj4tLS0gYS9z cmMvdGFpbC5jPGJyPisrKyBiL3NyYy90YWlsLmM8YnI+QEAgLTE0NTcsNyArMTQ1Nyw4IEBAIHRh aWxfZm9yZXZlcl9pbm90aWZ5IChpbnQgd2QsIHN0cnVjdCBGaWxlX3NwZWMgKmYsIHNpemVfdCBu X2ZpbGVzLDxicj7CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgSW4gdGhhdCBj YXNlIHRoZSBzYW1lIHdhdGNoIGRlc2NyaXB0b3IgaXMgcmV0dXJuZWQuwqAgKi88YnI+wqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBmW2ldLnBhcmVudF93ZCA9IGlub3RpZnlfYWRkX3dhdGNo ICh3ZCwgZGlybGVuID8gZltpXS5uYW1lIDogJnF1b3Q7LiZxdW90Oyw8YnI+wqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAoSU5fQ1JFQVRFIHwgSU5fREVMRVRFPGJy Pi3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHwgSU5fTU9WRURf VE8gfCBJTl9BVFRSSUIpKTs8YnI+K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgfCBJTl9NT1ZFRF9UTyB8IElOX0FUVFJJQjxicj4rwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB8IElOX0RFTEVURV9TRUxGKSk7PGJyPsKgPGJyPsKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZltpXS5uYW1lW2Rpcmxlbl0gPSBwcmV2Ozxicj7C oDxicj5AQCAtMTYyOCw2ICsxNjI5LDI0IEBAIHRhaWxfZm9yZXZlcl9pbm90aWZ5IChpbnQgd2Qs IHN0cnVjdCBGaWxlX3NwZWMgKmYsIHNpemVfdCBuX2ZpbGVzLDxicj7CoMKgwqDCoMKgwqAgZXYg PSB2b2lkX2V2Ozxicj7CoMKgwqDCoMKgwqAgZXZidWZfb2ZmICs9IHNpemVvZiAoKmV2KSArIGV2 LSZndDtsZW47PGJyPsKgPGJyPivCoMKgwqDCoMKgIC8qIElmIGEgZGlyZWN0b3J5IGlzIGRlbGV0 ZWQsIElOX0RFTEVURV9TRUxGIGlzIGVtbWl0ZWQ8YnI+K8KgwqDCoMKgwqDCoMKgwqAgd2l0aCBl di0mZ3Q7bmFtZSBvZiBsZW5ndGggMC48YnI+K8KgwqDCoMKgwqDCoMKgwqAgV2UgbmVlZCB0byBj YXRjaCBpdCwgb3RoZXJ3aXNlIGl0IHdvdWxkIHdhaXQgZm9yZXZlciw8YnI+K8KgwqDCoMKgwqDC oMKgwqAgYXMgd2QgZm9yIGRpcmVjdG9yeSBiZWNvbWVzIGluYWN0aXZlLiBSZXZlcnQgdG8gcG9s bGluZyBub3cuwqDCoCAqLzxicj4rwqDCoMKgwqDCoCBpZiAoKGV2LSZndDttYXNrICZhbXA7IElO X0RFTEVURV9TRUxGKSAmYW1wOyZhbXA7ICFldi0mZ3Q7bGVuKTxicj4rwqDCoMKgwqDCoMKgwqAg ezxicj4rwqDCoMKgwqDCoMKgwqDCoMKgIGZvciAoaSA9IDA7IGkgJmx0OyBuX2ZpbGVzOyBpKysp PGJyPivCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHs8YnI+K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIGlmIChldi0mZ3Q7d2QgPT0gZltpXS5wYXJlbnRfd2QpPGJyPivCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgezxicj4rwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBo YXNoX2ZyZWUgKHdkX3RvX25hbWUpOzxicj4rwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCBlcnJvciAoMCwgMCw8YnI+K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBfKCZxdW90O2RpcmVjdG9yeSBjb250YWluaW5nIHdhdGNoZWQgZmlsZSB3YXMgcmVt b3ZlZCZxdW90OykpOzxicj4rwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1 cm4gdHJ1ZTs8YnI+K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9PGJyPivCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIH08YnI+K8KgwqDCoMKgwqDCoMKgIH08YnI+Kzxicj7CoMKgwqDCoMKg wqAgaWYgKGV2LSZndDtsZW4pIC8qIGV2ZW50IG9uIGV2LSZndDtuYW1lIGluIHdhdGNoZWQgZGly ZWN0b3J5LsKgICovPGJyPsKgwqDCoMKgwqDCoMKgwqAgezxicj7CoMKgwqDCoMKgwqDCoMKgwqDC oCBzaXplX3Qgajs8YnI+ZGlmZiAtLWdpdCBhL3Rlc3RzLzxhIGhyZWY9Imh0dHA6Ly9sb2NhbC5t ayI+bG9jYWwubWs8L2E+IGIvdGVzdHMvPGEgaHJlZj0iaHR0cDovL2xvY2FsLm1rIj5sb2NhbC5t azwvYT48YnI+aW5kZXggOWYxYTg1My4uYmNmNzBjMiAxMDA2NDQ8YnI+LS0tIGEvdGVzdHMvPGEg aHJlZj0iaHR0cDovL2xvY2FsLm1rIj5sb2NhbC5tazwvYT48YnI+KysrIGIvdGVzdHMvPGEgaHJl Zj0iaHR0cDovL2xvY2FsLm1rIj5sb2NhbC5tazwvYT48YnI+QEAgLTE3Niw2ICsxNzYsNyBAQCBh bGxfdGVzdHMgPcKgwqDCoCDCoMKgwqAgwqDCoMKgIMKgwqDCoCDCoMKgwqAgXDxicj7CoMKgIHRl c3RzL3RhaWwtMi9kZXNjcmlwdG9yLXZzLXJlbmFtZS5zaMKgwqDCoCDCoMKgwqAgXDxicj7CoMKg IHRlc3RzL3RhaWwtMi9pbm90aWZ5LXJvdGF0ZS5zaMKgwqDCoCDCoMKgwqAgXDxicj7CoMKgIHRl c3RzL3RhaWwtMi9pbm90aWZ5LXJvdGF0ZS1yZXNvdXJjZXMuc2jCoMKgwqAgXDxicj4rwqAgdGVz dHMvdGFpbC0yL2lub3RpZnktZGlyLXJlY3JlYXRlLnNowqDCoMKgIMKgwqDCoCBcPGJyPsKgwqAg dGVzdHMvY2htb2Qvbm8teC5zaMKgwqDCoCDCoMKgwqAgwqDCoMKgIMKgwqDCoCBcPGJyPsKgwqAg dGVzdHMvY2hncnAvYmFzaWMuc2jCoMKgwqAgwqDCoMKgIMKgwqDCoCDCoMKgwqAgXDxicj7CoMKg IHRlc3RzL3JtL2RhbmdsaW5nLXN5bWxpbmsuc2jCoMKgwqAgwqDCoMKgIMKgwqDCoCBcPGJyPmRp ZmYgLS1naXQgYS90ZXN0cy90YWlsLTIvaW5vdGlmeS1kaXItcmVjcmVhdGUuc2ggYi90ZXN0cy90 YWlsLTIvaW5vdGlmeS1kaXItcmVjcmVhdGUuc2g8YnI+bmV3IGZpbGUgbW9kZSAxMDA3NTU8YnI+ aW5kZXggMDAwMDAwMC4uZWQ1ZjMzOTxicj4tLS0gL2Rldi9udWxsPGJyPisrKyBiL3Rlc3RzL3Rh aWwtMi9pbm90aWZ5LWRpci1yZWNyZWF0ZS5zaDxicj5AQCAtMCwwICsxLDY2IEBAPGJyPisjIS9i aW4vc2g8YnI+KyMgTWFrZXMgc3VyZSwgaW5vdGlmeSB3aWxsIHN3aXRjaCB0byBwb2xsaW5nIG1v ZGUgaWYgZGlyZWN0b3J5PGJyPisjIG9mIHRoZSB3YXRjaGVkIGZpbGUgd2FzIHJlbW92ZWQgYW5k IHJlY3JlYXRlZC48YnI+KyMgKC4uLmluc3RlYWQgb2YgZ2V0dGluZyBzdHVjayBmb3JldmVyKTxi cj4rPGJyPisjIENvcHlyaWdodCAoQykgMjAwNi0yMDE3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlv biwgSW5jLjxicj4rPGJyPisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2Fu IHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5PGJyPisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBv ZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5PGJyPisjIHRo ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vu c2UsIG9yPGJyPisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uPGJyPis8YnI+ KyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBi ZSB1c2VmdWwsPGJyPisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRo ZSBpbXBsaWVkIHdhcnJhbnR5IG9mPGJyPisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZP UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS7CoCBTZWUgdGhlPGJyPisjIEdOVSBHZW5lcmFsIFB1Ymxp YyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuPGJyPis8YnI+KyMgWW91IHNob3VsZCBoYXZlIHJl Y2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2U8YnI+KyMgYWxv bmcgd2l0aCB0aGlzIHByb2dyYW0uwqAgSWYgbm90LCBzZWUgJmx0OzxhIGhyZWY9Imh0dHA6Ly93 d3cuZ251Lm9yZy9saWNlbnNlcy8iPmh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy88L2E+Jmd0 Oy48YnI+Kzxicj4rLiAmcXVvdDske3NyY2Rpcj0ufS90ZXN0cy9pbml0LnNoJnF1b3Q7OyBwYXRo X3ByZXBlbmRfIC4vc3JjPGJyPitwcmludF92ZXJfIHRhaWw8YnI+Kzxicj4rPGJyPisjIFRlcm1p bmF0ZSBhbnkgYmFja2dyb3VuZCB0YWlsIHByb2Nlc3M8YnI+K2NsZWFudXBfKCkgeyBraWxsICRw aWQgMiZndDsvZGV2L251bGwgJmFtcDsmYW1wOyB3YWl0ICRwaWQ7IH08YnI+Kzxicj4rIyBDaGVj ayBmb3IgZXhpc3RlbmNlIG9mIHRoZSBpbXBvcnRhbnQgbWVzc2FnZTxicj4rY2hlY2tfdGFpbF9v dXRwdXRfICgpPGJyPit7PGJyPivCoCBncmVwICZxdW90OyQxJnF1b3Q7IG91dCAmYW1wOyZndDsv ZGV2L251bGwgfHzCoCBmYWlsPTE8YnI+K308YnI+Kzxicj4rIyBQcmVwYXJlIHRoZSBmaWxlIHRv IGJlIHdhdGNoZWQ8YnI+K21rZGlyIGRpciAmYW1wOyZhbXA7IHRvdWNoIGRpci9maWxlPGJyPitz bGVlcCAxPGJyPis8YnI+K3RpbWVvdXQgNjAgdGFpbCAtLWZvbGxvdz1uYW1lIC0tcmV0cnkgZGly L2ZpbGUgJmFtcDsmZ3Q7b3V0wqAgJmFtcDsgcGlkPSQhPGJyPitzbGVlcCAxPGJyPis8YnI+KyMg UmVtb3ZlIHRoZSBkaXJlY3RvcnksIHNob3VsZCBnZXQgdGhlIG1hc3NhZ2UgYWJvdXQgdGhlIGRl bGV0aW9uPGJyPitybSAtciBkaXI8YnI+K3NsZWVwIDE8YnI+Kzxicj4rIyBSZWNyZWF0ZSB0aGUg ZGlyLCBzaG91bGQgZ2V0IGEgbWVzc2FnZSBhYm91dCByZWNyZWF0aW9uPGJyPitta2RpciBkaXIg JmFtcDsmYW1wOyB0b3VjaCBkaXIvZmlsZTxicj4rc2xlZXAgMTxicj4rPGJyPitjbGVhbnVwXzxi cj4rcm0gLXIgZGlyPGJyPis8YnI+KyMgRXhwZWN0ZWQgcmVzdWx0IGZvciB0aGUgd2hvbGUgcHJv Y2Vzczxicj4rY2F0ICZsdDsmbHQ7XEVPRiAmZ3Q7IGV4cDxicj4rdGFpbDogJiMzOTtkaXIvZmls ZSYjMzk7IGhhcyBiZWNvbWUgaW5hY2Nlc3NpYmxlOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5 PGJyPit0YWlsOiBkaXJlY3RvcnkgY29udGFpbmluZyB3YXRjaGVkIGZpbGUgd2FzIHJlbW92ZWQ8 YnI+K3RhaWw6IGlub3RpZnkgY2Fubm90IGJlIHVzZWQsIHJldmVydGluZyB0byBwb2xsaW5nOiBO byBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5PGJyPit0YWlsOiAmIzM5O2Rpci9maWxlJiMzOTsgaGFz IGFwcGVhcmVkO8KgIGZvbGxvd2luZyBuZXcgZmlsZTxicj4rRU9GPGJyPis8YnI+KyMgSWYgY29u dGFpbnMgJiMzOTtoYXMgYXBwZWFyZWQmIzM5OyBzdHJpbmcsIHRoYW48YnI+KyMgdGhlIHBvbGxp bmcgbW9kZSBoYXMgYmVlbiByZWFjdGl2YXRlZCBzdWNjZXNmdWxseTxicj4rY2hlY2tfdGFpbF9v dXRwdXRfICYjMzk7aGFzIGFwcGVhcmVkJiMzOTs8YnI+Kzxicj4rY29tcGFyZSBleHAgb3V0IHx8 IGZhaWw9MTxicj4rPGJyPitFeGl0ICRmYWlsPGJyPi0tIDxicj4yLjkuMzxicj48YnI+PGJyPjwv ZGl2PjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2Pg0K --001a114703d618b22a054c5a0989-- From unknown Tue Aug 19 05:13:05 2025 X-Loop: help-debbugs@gnu.org Subject: bug#26363: [PATCH] tail: 'tail -F dir/file' reverts to polling mode if 'dir' is removed Resent-From: =?UTF-8?Q?P=C3=A1draig?= Brady Original-Sender: "Debbugs-submit" Resent-CC: bug-coreutils@gnu.org Resent-Date: Wed, 05 Apr 2017 02:17:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 26363 X-GNU-PR-Package: coreutils X-GNU-PR-Keywords: patch To: Sebastian Kisela , 26363@debbugs.gnu.org Received: via spool by 26363-submit@debbugs.gnu.org id=B26363.14913585955319 (code B ref 26363); Wed, 05 Apr 2017 02:17:02 +0000 Received: (at 26363) by debbugs.gnu.org; 5 Apr 2017 02:16:35 +0000 Received: from localhost ([127.0.0.1]:33003 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cvaUt-0001Nj-Lr for submit@debbugs.gnu.org; Tue, 04 Apr 2017 22:16:35 -0400 Received: from midir.magicbluesmoke.com ([82.195.144.46]:47590 helo=mail.magicbluesmoke.com) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cvaUs-0001Nb-4H for 26363@debbugs.gnu.org; Tue, 04 Apr 2017 22:16:34 -0400 Received: from localhost.localdomain (unknown [166.170.40.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.magicbluesmoke.com (Postfix) with ESMTPSA id D81D74A75; Wed, 5 Apr 2017 03:16:31 +0100 (IST) References: From: =?UTF-8?Q?P=C3=A1draig?= Brady Message-ID: <7c9bae90-54f9-8fd2-f74e-1deca4e4e63d@draigBrady.com> Date: Tue, 4 Apr 2017 19:16:28 -0700 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.8.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Spam-Score: 0.0 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: 0.0 (/) On 04/04/17 09:47, Sebastian Kisela wrote: > * src/tail.c (tail_forever_inotify): Add the IN_DELETE_SELF flag when > creating watch for the parent directory. After the parent directory > is removed, an event is caught and then we switch from inotify to > polling mode. Till now, inotify has always frozen because it waited for > an event from a watched dir, which has been already deleted and was not > added again. > * tests/tail-2/inotify-dir-recreate.sh: Add a test case. > * tests/local.mk: Reference the new test. > * NEWS: Mention the bug fix. > > Reported at https://bugzilla.redhat.com/1283760 Excellent. That looks like a fine fall back. Not having looked at the C code, have you considered if another dir/files are already setup with inotify watches, and if files are deleted but still open? Other comments below... > @@ -1628,6 +1629,24 @@ tail_forever_inotify (int wd, struct File_spec *f, > size_t n_files, > ev = void_ev; > evbuf_off += sizeof (*ev) + ev->len; > > + /* If a directory is deleted, IN_DELETE_SELF is emmited > + with ev->name of length 0. > + We need to catch it, otherwise it would wait forever, > + as wd for directory becomes inactive. Revert to polling now. */ > + if ((ev->mask & IN_DELETE_SELF) && !ev->len) > + { > + for (i = 0; i < n_files; i++) > + { > + if (ev->wd == f[i].parent_wd) > + { > + hash_free (wd_to_name); > + error (0, 0, > + _("directory containing watched file was removed")); > + return true; > + } > + } > + } > + > if (ev->len) /* event on ev->name in watched directory. */ > { > size_t j; > + > +# Check for existence of the important message > +check_tail_output_ () > +{ > + grep "$1" out &>/dev/null || fail=1 > +} > + > +# Prepare the file to be watched > +mkdir dir && touch dir/file > +sleep 1 Why this sleep? > +timeout 60 tail --follow=name --retry dir/file &>out & pid=$! > +sleep 1 We can't depend on absolute sleeps like this. See: http://www.pixelbeat.org/docs/coreutils-testing.html#backoff or the existing tail-2/ tests cheers, Pádraig From unknown Tue Aug 19 05:13:05 2025 X-Loop: help-debbugs@gnu.org Subject: bug#26363: [PATCH] tail: 'tail -F dir/file' reverts to polling mode if 'dir' is removed Resent-From: Sebastian Kisela Original-Sender: "Debbugs-submit" Resent-CC: bug-coreutils@gnu.org Resent-Date: Wed, 05 Apr 2017 09:05:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 26363 X-GNU-PR-Package: coreutils X-GNU-PR-Keywords: patch To: =?UTF-8?Q?P=C3=A1draig?= Brady Cc: 26363@debbugs.gnu.org Received: via spool by 26363-submit@debbugs.gnu.org id=B26363.149138307220668 (code B ref 26363); Wed, 05 Apr 2017 09:05:02 +0000 Received: (at 26363) by debbugs.gnu.org; 5 Apr 2017 09:04:32 +0000 Received: from localhost ([127.0.0.1]:33173 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cvgrX-0005N4-7o for submit@debbugs.gnu.org; Wed, 05 Apr 2017 05:04:32 -0400 Received: from mail-wm0-f49.google.com ([74.125.82.49]:37446) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cvgrS-0005Mo-CH for 26363@debbugs.gnu.org; Wed, 05 Apr 2017 05:04:22 -0400 Received: by mail-wm0-f49.google.com with SMTP id x124so7918064wmf.0 for <26363@debbugs.gnu.org>; Wed, 05 Apr 2017 02:04:18 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=Cp/cEmY7bt/Ki5nmumwyyJw3CfE2gR69QhFRirBokbE=; b=g2QB5XvGRGLDeogAZaidHGGc6rMxtNXQoPct9KeAKp2Fdsa1Vh04rcO85R60nUg2f2 1aNX8WkxUN8OPLel4Txfc4nDIBSgals8XqKRE+GCG383azJaRE4VZwFL3iLttge5OYnK lsbNKeJ3K45kprGlJ3PNp+uqmxMfmmEk/gdonoFkb9wiIenAzgsiDQNUkk3NygUYQ5ol ARSnszfwbaLzQIUC9AxVfmMj+xa6jqdPzRwJyT3/c/rWHCM/1w1wn8fg1dsJ76fpvv9b zKWqiHrKayqCXxrLtcE36tFShd8IptR6uwbYttxRYIVdlJoiEcuIFj7Ro0T5Xi1Fch6C k9MA== X-Gm-Message-State: AFeK/H1vAU4uSUvN5bq465Ql1bW9DApvmvIWcxBzKjdb9XsdA/dBL3uB /vmj9SqxUDFaML+Zo45nsl6ODLqdwxazUDo= X-Received: by 10.28.98.135 with SMTP id w129mr18427573wmb.68.1491383052713; Wed, 05 Apr 2017 02:04:12 -0700 (PDT) MIME-Version: 1.0 Received: by 10.223.161.144 with HTTP; Wed, 5 Apr 2017 02:04:11 -0700 (PDT) In-Reply-To: <7c9bae90-54f9-8fd2-f74e-1deca4e4e63d@draigBrady.com> References: <7c9bae90-54f9-8fd2-f74e-1deca4e4e63d@draigBrady.com> From: Sebastian Kisela Date: Wed, 5 Apr 2017 11:04:11 +0200 Message-ID: Content-Type: multipart/mixed; boundary=001a1148eb3614fb6e054c67ad23 X-Spam-Score: -0.0 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.0 (/) --001a1148eb3614fb6e054c67ad23 Content-Type: multipart/alternative; boundary=001a1148eb3614fb69054c67ad21 --001a1148eb3614fb69054c67ad21 Content-Type: text/plain; charset=UTF-8 > Excellent. That looks like a fine fall back. > > Not having looked at the C code, > have you considered if another dir/files are already setup with inotify > watches, > and if files are deleted but still open? > Other comments below... > I changed the behaviour of tail to exit inotify mode if at least one of the watched directories is deleted. If I understand you correctly, there should not be problem with files that are deleted while being open. The files are tailed again in the polling mode, after the path leading to them is recreated(tail -F uses following by name not by fd). I also thought about entering inotify mode again after all watched directories(and the files) are found by polling mode. What I made so far, contained too many deleted and recreated watches due to exiting inotify(deleting watches to all inotify watch descriptors) mode immediately after at least one watched directory is removed. I have not found any discussion about such solution, therefore I am unsure about the safety of the solution so far. > Why this sleep? > > > +timeout 60 tail --follow=name --retry dir/file &>out & pid=$! > > +sleep 1 > > We can't depend on absolute sleeps like this. See: > http://www.pixelbeat.org/docs/coreutils-testing.html#backoff > or the existing tail-2/ tests > I apologize, thanks for the tip. See V2 patch attached with correct usage of sleep by *retry_delay_ ().* *Sebastian.* --001a1148eb3614fb69054c67ad21 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable

=
Excellent. That looks like a fine fall back.

Not having looked at the C code,
have you considered if another dir/files are already setup with inotify wat= ches,
and if files are deleted but still open?
Other comments below...

I changed the behaviour of= tail to exit inotify mode if at least one of the watched directories is de= leted.

If I understand you correctly, there should not be= problem with files that are deleted while being open.
The fi= les are tailed again in the polling mode, after the path leading to them is= recreated(tail -F uses following by name not by fd).

I a= lso thought about entering inotify mode again after all watched directories= (and the files) are found by polling mode.
What I made so far= , contained too many deleted and recreated watches due to exiting inotify(d= eleting watches to all
inotify watch descriptors) mode immediately after= at least one watched directory is removed.

I have not fo= und any discussion about such solution, therefore I am unsure about the saf= ety of the solution so far.
=C2=A0
Why this sleep?

> +timeout 60 tail --follow=3Dname --retry dir/file &>out=C2=A0 &= amp; pid=3D$!
> +sleep 1

We can't depend on absolute sleeps like this. See:
http://www.pixelbeat.org/docs/coreu= tils-testing.html#backoff
or the existing tail-2/ tests

I apologize, thanks= for the tip.
See V2 patch attached with correct usage of sleep by re= try_delay_ ().

Sebastian.
--001a1148eb3614fb69054c67ad21-- --001a1148eb3614fb6e054c67ad23 Content-Type: text/x-patch; charset=US-ASCII; name="inotify-dir-recreate-V2.patch" Content-Disposition: attachment; filename="inotify-dir-recreate-V2.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_j14qfi0f0 RnJvbSAwOTMwYzJkYmRiNTA0OTZmNWJmZTJiMzcwODA4ZWMxYzNmY2FhYmRhIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBTZWJhc3RpYW4gS2lzZWxhIDxza2lzZWxhQHJlZGhhdC5jb20+ CkRhdGU6IFdlZCwgNSBBcHIgMjAxNyAwOTo0MDo0MSArMDIwMApTdWJqZWN0OiBbUEFUQ0hdIHRh aWw6ICd0YWlsIC1GIGRpci9maWxlJyByZXZlcnRzIHRvIHBvbGxpbmcgbW9kZSBpZiAnZGlyJyBp cwogcmVtb3ZlZAoKKiBzcmMvdGFpbC5jICh0YWlsX2ZvcmV2ZXJfaW5vdGlmeSk6ICBBZGQgdGhl IElOX0RFTEVURV9TRUxGIGZsYWcgd2hlbgpjcmVhdGluZyB3YXRjaCBmb3IgdGhlIHBhcmVudCBk aXJlY3RvcnkuICBBZnRlciB0aGUgcGFyZW50IGRpcmVjdG9yeQppcyByZW1vdmVkLCBhbiBldmVu dCBpcyBjYXVnaHQgYW5kIHRoZW4gd2Ugc3dpdGNoIGZyb20gaW5vdGlmeSB0bwpwb2xsaW5nIG1v ZGUuICBUaWxsIG5vdywgaW5vdGlmeSBoYXMgYWx3YXlzIGZyb3plbiBiZWNhdXNlIGl0IHdhaXRl ZCBmb3IKYW4gZXZlbnQgZnJvbSBhIHdhdGNoZWQgZGlyLCB3aGljaCBoYXMgYmVlbiBhbHJlYWR5 IGRlbGV0ZWQgYW5kIHdhcyBub3QKYWRkZWQgYWdhaW4uCiogdGVzdHMvdGFpbC0yL2lub3RpZnkt ZGlyLXJlY3JlYXRlLnNoOiBBZGQgYSB0ZXN0IGNhc2UuCiogdGVzdHMvbG9jYWwubWs6IFJlZmVy ZW5jZSB0aGUgbmV3IHRlc3QuCiogTkVXUzogTWVudGlvbiB0aGUgYnVnIGZpeC4KCiBSZXBvcnRl ZCBhdCBodHRwczovL2J1Z3ppbGxhLnJlZGhhdC5jb20vMTI4Mzc2MAotLS0KIE5FV1MgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAyICsKIHNyYy90YWlsLmMgICAgICAgICAgICAg ICAgICAgICAgICAgICB8IDIxICsrKysrKysrLQogdGVzdHMvbG9jYWwubWsgICAgICAgICAgICAg ICAgICAgICAgIHwgIDEgKwogdGVzdHMvdGFpbC0yL2lub3RpZnktZGlyLXJlY3JlYXRlLnNoIHwg ODQgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiA0IGZpbGVzIGNoYW5nZWQs IDEwNyBpbnNlcnRpb25zKCspLCAxIGRlbGV0aW9uKC0pCiBjcmVhdGUgbW9kZSAxMDA3NTUgdGVz dHMvdGFpbC0yL2lub3RpZnktZGlyLXJlY3JlYXRlLnNoCgpkaWZmIC0tZ2l0IGEvTkVXUyBiL05F V1MKaW5kZXggZTJmMjk4Zi4uZjM0ZDY2NyAxMDA2NDQKLS0tIGEvTkVXUworKysgYi9ORVdTCkBA IC03NCw2ICs3NCw4IEBAIEdOVSBjb3JldXRpbHMgTkVXUyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIC0qLSBvdXRsaW5lIC0qLQogICAnY3AgLWZsIEEgQicgbm8gbG9uZ2VyIHJl bW92ZSBCIGJlZm9yZSBjcmVhdGluZyB0aGUgbmV3IGxpbmsuCiAgIFRoYXQgaXMsIHRoZXJlIGlz IG5vIGxvbmdlciBhIGJyaWVmIG1vbWVudCB3aGVuIEIgZG9lcyBub3QgZXhpc3QuCiAKKyAgdGFp bCAtRiAnZGlyL2ZpbGUnIHJldmVydHMgdG8gcG9sbGluZyBtb2RlIGluIGNhc2UgJ2RpcicgaXMg cmVtb3ZlZC4KKwogKiogTmV3IGZlYXR1cmVzCiAKICAgZXhwYW5kIGFuZCB1bmV4cGFuZCBub3cg c3VwcG9ydCBzcGVjaWZ5aW5nIGEgdGFiIHNpemUgdG8gdXNlCmRpZmYgLS1naXQgYS9zcmMvdGFp bC5jIGIvc3JjL3RhaWwuYwppbmRleCBkMTU1MmQ0Li5lMzVlZTFlIDEwMDY0NAotLS0gYS9zcmMv dGFpbC5jCisrKyBiL3NyYy90YWlsLmMKQEAgLTE0NTcsNyArMTQ1Nyw4IEBAIHRhaWxfZm9yZXZl cl9pbm90aWZ5IChpbnQgd2QsIHN0cnVjdCBGaWxlX3NwZWMgKmYsIHNpemVfdCBuX2ZpbGVzLAog ICAgICAgICAgICAgICAgICAgSW4gdGhhdCBjYXNlIHRoZSBzYW1lIHdhdGNoIGRlc2NyaXB0b3Ig aXMgcmV0dXJuZWQuICAqLwogICAgICAgICAgICAgICBmW2ldLnBhcmVudF93ZCA9IGlub3RpZnlf YWRkX3dhdGNoICh3ZCwgZGlybGVuID8gZltpXS5uYW1lIDogIi4iLAogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSU5fQ1JFQVRFIHwgSU5fREVMRVRF Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IElO X01PVkVEX1RPIHwgSU5fQVRUUklCKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICB8IElOX01PVkVEX1RPIHwgSU5fQVRUUklCCisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IElOX0RFTEVURV9TRUxG KSk7CiAKICAgICAgICAgICAgICAgZltpXS5uYW1lW2Rpcmxlbl0gPSBwcmV2OwogCkBAIC0xNjI4 LDYgKzE2MjksMjQgQEAgdGFpbF9mb3JldmVyX2lub3RpZnkgKGludCB3ZCwgc3RydWN0IEZpbGVf c3BlYyAqZiwgc2l6ZV90IG5fZmlsZXMsCiAgICAgICBldiA9IHZvaWRfZXY7CiAgICAgICBldmJ1 Zl9vZmYgKz0gc2l6ZW9mICgqZXYpICsgZXYtPmxlbjsKIAorICAgICAgLyogSWYgYSBkaXJlY3Rv cnkgaXMgZGVsZXRlZCwgSU5fREVMRVRFX1NFTEYgaXMgZW1taXRlZAorICAgICAgICAgd2l0aCBl di0+bmFtZSBvZiBsZW5ndGggMC4KKyAgICAgICAgIFdlIG5lZWQgdG8gY2F0Y2ggaXQsIG90aGVy d2lzZSBpdCB3b3VsZCB3YWl0IGZvcmV2ZXIsCisgICAgICAgICBhcyB3ZCBmb3IgZGlyZWN0b3J5 IGJlY29tZXMgaW5hY3RpdmUuIFJldmVydCB0byBwb2xsaW5nIG5vdy4gICAqLworICAgICAgaWYg KChldi0+bWFzayAmIElOX0RFTEVURV9TRUxGKSAmJiAhZXYtPmxlbikKKyAgICAgICAgeworICAg ICAgICAgIGZvciAoaSA9IDA7IGkgPCBuX2ZpbGVzOyBpKyspCisgICAgICAgICAgICB7CisgICAg ICAgICAgICAgIGlmIChldi0+d2QgPT0gZltpXS5wYXJlbnRfd2QpCisgICAgICAgICAgICAgICAg eworICAgICAgICAgICAgICAgICAgaGFzaF9mcmVlICh3ZF90b19uYW1lKTsKKyAgICAgICAgICAg ICAgICAgIGVycm9yICgwLCAwLAorICAgICAgICAgICAgICAgICAgICAgIF8oImRpcmVjdG9yeSBj b250YWluaW5nIHdhdGNoZWQgZmlsZSB3YXMgcmVtb3ZlZCIpKTsKKyAgICAgICAgICAgICAgICAg IHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAg fQorCiAgICAgICBpZiAoZXYtPmxlbikgLyogZXZlbnQgb24gZXYtPm5hbWUgaW4gd2F0Y2hlZCBk aXJlY3RvcnkuICAqLwogICAgICAgICB7CiAgICAgICAgICAgc2l6ZV90IGo7CmRpZmYgLS1naXQg YS90ZXN0cy9sb2NhbC5tayBiL3Rlc3RzL2xvY2FsLm1rCmluZGV4IDlmMWE4NTMuLmJjZjcwYzIg MTAwNjQ0Ci0tLSBhL3Rlc3RzL2xvY2FsLm1rCisrKyBiL3Rlc3RzL2xvY2FsLm1rCkBAIC0xNzYs NiArMTc2LDcgQEAgYWxsX3Rlc3RzID0JCQkJCVwKICAgdGVzdHMvdGFpbC0yL2Rlc2NyaXB0b3It dnMtcmVuYW1lLnNoCQlcCiAgIHRlc3RzL3RhaWwtMi9pbm90aWZ5LXJvdGF0ZS5zaAkJXAogICB0 ZXN0cy90YWlsLTIvaW5vdGlmeS1yb3RhdGUtcmVzb3VyY2VzLnNoCVwKKyAgdGVzdHMvdGFpbC0y L2lub3RpZnktZGlyLXJlY3JlYXRlLnNoCQlcCiAgIHRlc3RzL2NobW9kL25vLXguc2gJCQkJXAog ICB0ZXN0cy9jaGdycC9iYXNpYy5zaAkJCQlcCiAgIHRlc3RzL3JtL2RhbmdsaW5nLXN5bWxpbmsu c2gJCQlcCmRpZmYgLS1naXQgYS90ZXN0cy90YWlsLTIvaW5vdGlmeS1kaXItcmVjcmVhdGUuc2gg Yi90ZXN0cy90YWlsLTIvaW5vdGlmeS1kaXItcmVjcmVhdGUuc2gKbmV3IGZpbGUgbW9kZSAxMDA3 NTUKaW5kZXggMDAwMDAwMC4uMDgzZTRlYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3RhaWwt Mi9pbm90aWZ5LWRpci1yZWNyZWF0ZS5zaApAQCAtMCwwICsxLDg0IEBACisjIS9iaW4vc2gKKyMg TWFrZXMgc3VyZSwgaW5vdGlmeSB3aWxsIHN3aXRjaCB0byBwb2xsaW5nIG1vZGUgaWYgZGlyZWN0 b3J5CisjIG9mIHRoZSB3YXRjaGVkIGZpbGUgd2FzIHJlbW92ZWQgYW5kIHJlY3JlYXRlZC4KKyMg KC4uLmluc3RlYWQgb2YgZ2V0dGluZyBzdHVjayBmb3JldmVyKQorCisjIENvcHlyaWdodCAoQykg MjAwNi0yMDE3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3Jh bSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5 CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ug YXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2 ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVy IHZlcnNpb24uCisKKyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRo YXQgaXQgd2lsbCBiZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91 dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRO RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgR05VIEdlbmVyYWwgUHVi bGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2 ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRo IHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMv Pi4KKworLiAiJHtzcmNkaXI9Ln0vdGVzdHMvaW5pdC5zaCI7IHBhdGhfcHJlcGVuZF8gLi9zcmMK K3ByaW50X3Zlcl8gdGFpbAorCisKKyMgVGVybWluYXRlIGFueSBiYWNrZ3JvdW5kIHRhaWwgcHJv Y2VzcworY2xlYW51cF8oKSB7IGtpbGwgJHBpZCAyPi9kZXYvbnVsbCAmJiB3YWl0ICRwaWQ7IHJt IC1yIGRpcjsgfQorCitjbGVhbnVwX2ZhaWxfICgpCit7CisgIHdhcm5fICQxCisgIGNsZWFudXBf CisgIGZhaWw9MQorfQorCisjICRjaGVja19yZSAtIHN0cmluZyB0byBiZSBmb3VuZAorIyAkY2hl Y2tfZiAtIGZpbGUgdG8gYmUgc2VhcmNoZWQKK2NoZWNrX3RhaWxfb3V0cHV0XyAoKQoreworICBs b2NhbCBkZWxheT0iJDEiCisgIGdyZXAgJGNoZWNrX3JlICRjaGVja19mID4gL2Rldi9udWxsIHx8 CisgICAgeyBzbGVlcCAkZGVsYXkgOyByZXR1cm4gMTsgfQorfQorCitncmVwX3RpbWVvdXRfICgp Cit7CisgIGNoZWNrX3JlPSIkMSIKKyAgY2hlY2tfZj0iJDIiCisgIHJldHJ5X2RlbGF5XyBjaGVj a190YWlsX291dHB1dF8gLjEgNQorfQorCisjIFByZXBhcmUgdGhlIGZpbGUgdG8gYmUgd2F0Y2hl ZAorbWtkaXIgZGlyICYmIHRvdWNoIGRpci9maWxlICYmIGVjaG8gImlub3RpZnkiID4gZGlyL2Zp bGUKK2dyZXBfdGltZW91dF8gImlub3RpZnkiICJkaXIvZmlsZSIgfHwKK3sgY2xlYW51cF9mYWls XyAnZmlsZSB3YXMgbm90IGNyZWF0ZWQnOyB9CisKKyN0YWlsIG11c3QgcHJpbnQgY29udGVudCBv ZiB0aGUgZmlsZSB0byBzdGRvdXQsIHZlcmlmeQordGltZW91dCA2MCB0YWlsIC1GIGRpci9maWxl ICY+b3V0ICAmIHBpZD0kIQorZ3JlcF90aW1lb3V0XyAiaW5vdGlmeSIgIm91dCIgfHwKK3sgY2xl YW51cF9mYWlsXyAnZmlsZSB0byBiZSB0YWlsZWQgZG9lcyBub3QgZXhpc3QnOyB9CisKKyMgUmVt b3ZlIHRoZSBkaXJlY3RvcnksIHNob3VsZCBnZXQgdGhlIG1hc3NhZ2UgYWJvdXQgdGhlIGRlbGV0 aW9uCitybSAtciBkaXIKK2dyZXBfdGltZW91dF8gInBvbGxpbmciICJvdXQiIHx8Cit7IGNsZWFu dXBfZmFpbF8gJ3RhaWwgZGlkIG5vdCBzd2l0Y2ggdG8gcG9sbGluZyBtb2RlJzsgfQorCisjIFJl Y3JlYXRlIHRoZSBkaXIsIG11c3QgZ2V0IGEgbWVzc2FnZSBhYm91dCByZWNyZWF0aW9uCitta2Rp ciBkaXIgJiYgdG91Y2ggZGlyL2ZpbGUKK2dyZXBfdGltZW91dF8gImFwcGVhcmVkIiAib3V0IiB8 fAoreyBjbGVhbnVwX2ZhaWxfICdwcmV2aW91c2x5IHJlbW92ZWQgZmlsZSBkaWQgbm90IGFwcGVh cic7IH0KKworY2xlYW51cF8KKworIyBFeHBlY3RlZCByZXN1bHQgZm9yIHRoZSB3aG9sZSBwcm9j ZXNzCitjYXQgPDxcRU9GID4gZXhwCitpbm90aWZ5Cit0YWlsOiAnZGlyL2ZpbGUnIGhhcyBiZWNv bWUgaW5hY2Nlc3NpYmxlOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5Cit0YWlsOiBkaXJlY3Rv cnkgY29udGFpbmluZyB3YXRjaGVkIGZpbGUgd2FzIHJlbW92ZWQKK3RhaWw6IGlub3RpZnkgY2Fu bm90IGJlIHVzZWQsIHJldmVydGluZyB0byBwb2xsaW5nOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0 b3J5Cit0YWlsOiAnZGlyL2ZpbGUnIGhhcyBhcHBlYXJlZDsgIGZvbGxvd2luZyBuZXcgZmlsZQor RU9GCisKK2NvbXBhcmUgZXhwIG91dCB8fCBmYWlsPTEKKworRXhpdCAkZmFpbAotLSAKMi45LjMK Cg== --001a1148eb3614fb6e054c67ad23-- From unknown Tue Aug 19 05:13:05 2025 MIME-Version: 1.0 X-Mailer: MIME-tools 5.505 (Entity 5.505) X-Loop: help-debbugs@gnu.org From: help-debbugs@gnu.org (GNU bug Tracking System) To: Sebastian Kisela Subject: bug#26363: closed (Re: bug#26363: [PATCH] tail: 'tail -F dir/file' reverts to polling mode if 'dir' is removed) Message-ID: References: <29783970-7ccb-7f64-eb35-b9ba40c8ff10@draigBrady.com> X-Gnu-PR-Message: they-closed 26363 X-Gnu-PR-Package: coreutils X-Gnu-PR-Keywords: patch Reply-To: 26363@debbugs.gnu.org Date: Thu, 06 Apr 2017 00:48:02 +0000 Content-Type: multipart/mixed; boundary="----------=_1491439682-5113-1" This is a multi-part message in MIME format... ------------=_1491439682-5113-1 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Your bug report #26363: [PATCH] tail: 'tail -F dir/file' reverts to polling mode if 'dir' i= s removed which was filed against the coreutils package, has been closed. The explanation is attached below, along with your original report. If you require more details, please reply to 26363@debbugs.gnu.org. --=20 26363: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=3D26363 GNU Bug Tracking System Contact help-debbugs@gnu.org with problems ------------=_1491439682-5113-1 Content-Type: message/rfc822 Content-Disposition: inline Content-Transfer-Encoding: 7bit Received: (at 26363-done) by debbugs.gnu.org; 6 Apr 2017 00:47:05 +0000 Received: from localhost ([127.0.0.1]:34212 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cvvZo-0001JB-Rz for submit@debbugs.gnu.org; Wed, 05 Apr 2017 20:47:05 -0400 Received: from midir.magicbluesmoke.com ([82.195.144.46]:56906 helo=mail.magicbluesmoke.com) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cvvZn-0001Iw-2e for 26363-done@debbugs.gnu.org; Wed, 05 Apr 2017 20:47:03 -0400 Received: from localhost.localdomain (unknown [166.170.41.166]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.magicbluesmoke.com (Postfix) with ESMTPSA id CCC6294B7; Thu, 6 Apr 2017 01:47:00 +0100 (IST) Subject: Re: bug#26363: [PATCH] tail: 'tail -F dir/file' reverts to polling mode if 'dir' is removed To: Sebastian Kisela References: <7c9bae90-54f9-8fd2-f74e-1deca4e4e63d@draigBrady.com> From: =?UTF-8?Q?P=c3=a1draig_Brady?= Message-ID: <29783970-7ccb-7f64-eb35-b9ba40c8ff10@draigBrady.com> Date: Wed, 5 Apr 2017 17:46:56 -0700 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.8.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: 8bit X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 26363-done Cc: 26363-done@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: 0.0 (/) Pushed with some NEWS and test tweaks at: http://git.sv.gnu.org/gitweb/?p=coreutils.git;a=commitdiff;h=ba5fe2d Marking this as done. thanks! Pádraig. ------------=_1491439682-5113-1 Content-Type: message/rfc822 Content-Disposition: inline Content-Transfer-Encoding: 7bit Received: (at submit) by debbugs.gnu.org; 4 Apr 2017 16:59:47 +0000 Received: from localhost ([127.0.0.1]:60894 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cvRo1-0002wo-1T for submit@debbugs.gnu.org; Tue, 04 Apr 2017 12:59:47 -0400 Received: from eggs.gnu.org ([208.118.235.92]:40606) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cvRch-0002f6-Jc for submit@debbugs.gnu.org; Tue, 04 Apr 2017 12:48:06 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cvRca-00051u-7C for submit@debbugs.gnu.org; Tue, 04 Apr 2017 12:47:58 -0400 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=0.8 required=5.0 tests=BAYES_50,HTML_MESSAGE autolearn=disabled version=3.3.2 Received: from lists.gnu.org ([2001:4830:134:3::11]:49993) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cvRca-00051f-3X for submit@debbugs.gnu.org; Tue, 04 Apr 2017 12:47:56 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59788) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cvRcX-0008Ed-H2 for bug-coreutils@gnu.org; Tue, 04 Apr 2017 12:47:55 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cvRcT-0004yd-Fc for bug-coreutils@gnu.org; Tue, 04 Apr 2017 12:47:53 -0400 Received: from mail-wm0-f53.google.com ([74.125.82.53]:32926) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1cvRcT-0004x5-5t for bug-coreutils@gnu.org; Tue, 04 Apr 2017 12:47:49 -0400 Received: by mail-wm0-f53.google.com with SMTP id x89so948886wma.0 for ; Tue, 04 Apr 2017 09:47:48 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=/9Nvm8lhnB8DNTfDdCbmm+pBXtbo+wgK5hKU2pSXsKM=; b=izHo7vBb9rhJKS8MUtDo97xiW0WxGpiMaYoz7umo+wVIUALqu82QTVTjkelwJhhESJ 59zHnPvZXVpHel2mn5SnzdJl2rNgaNQk/8kSqPq/v8/CsBTti4FBhFjdnBDC0NT/tJz6 H8IkdKdFmVFY0L7iBB92bErQZwSDJtJpCKIW9fQecFNwmQ73ID6o/AQXeSCQ72wPy1K3 h9hF62y3PUPj4lmwo8GqP0IADUXfJpa+DjjJhalebJS6PDBoSA944eOiihwqvhh+shz0 8QjV9QfaLjvCEcEhjKwm+0UL19Y6EmneBBW3cFTDMgEC5jsYtX6Qr5JgjC+nCp3qPnSw bGdg== X-Gm-Message-State: AFeK/H3dCYZiSdfN8UqllWceonI8BvG3pmDq1VJLeTYdar+CBrTYhVLXEbf2S46iwV/w7Y7jb5RuXRVwudbVCHRt X-Received: by 10.28.141.65 with SMTP id p62mr5323228wmd.122.1491324466926; Tue, 04 Apr 2017 09:47:46 -0700 (PDT) MIME-Version: 1.0 Received: by 10.223.161.144 with HTTP; Tue, 4 Apr 2017 09:47:46 -0700 (PDT) From: Sebastian Kisela Date: Tue, 4 Apr 2017 18:47:46 +0200 Message-ID: Subject: [PATCH] tail: 'tail -F dir/file' reverts to polling mode if 'dir' is removed To: bug-coreutils@gnu.org Content-Type: multipart/alternative; boundary=001a114703d618b22a054c5a0989 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x X-Received-From: 2001:4830:134:3::11 X-Spam-Score: -5.0 (-----) X-Debbugs-Envelope-To: submit X-Mailman-Approved-At: Tue, 04 Apr 2017 12:59:43 -0400 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -5.0 (-----) --001a114703d618b22a054c5a0989 Content-Type: text/plain; charset=UTF-8 * src/tail.c (tail_forever_inotify): Add the IN_DELETE_SELF flag when creating watch for the parent directory. After the parent directory is removed, an event is caught and then we switch from inotify to polling mode. Till now, inotify has always frozen because it waited for an event from a watched dir, which has been already deleted and was not added again. * tests/tail-2/inotify-dir-recreate.sh: Add a test case. * tests/local.mk: Reference the new test. * NEWS: Mention the bug fix. Reported at https://bugzilla.redhat.com/1283760 --- NEWS | 2 ++ src/tail.c | 21 +++++++++++- tests/local.mk | 1 + tests/tail-2/inotify-dir-recreate.sh | 66 ++++++++++++++++++++++++++++++++++++ 4 files changed, 89 insertions(+), 1 deletion(-) create mode 100755 tests/tail-2/inotify-dir-recreate.sh diff --git a/NEWS b/NEWS index e2f298f..f34d667 100644 --- a/NEWS +++ b/NEWS @@ -74,6 +74,8 @@ GNU coreutils NEWS -*- outline -*- 'cp -fl A B' no longer remove B before creating the new link. That is, there is no longer a brief moment when B does not exist. + tail -F 'dir/file' reverts to polling mode in case 'dir' is removed. + ** New features expand and unexpand now support specifying a tab size to use diff --git a/src/tail.c b/src/tail.c index d1552d4..e35ee1e 100644 --- a/src/tail.c +++ b/src/tail.c @@ -1457,7 +1457,8 @@ tail_forever_inotify (int wd, struct File_spec *f, size_t n_files, In that case the same watch descriptor is returned. */ f[i].parent_wd = inotify_add_watch (wd, dirlen ? f[i].name : ".", (IN_CREATE | IN_DELETE - | IN_MOVED_TO | IN_ATTRIB)); + | IN_MOVED_TO | IN_ATTRIB + | IN_DELETE_SELF)); f[i].name[dirlen] = prev; @@ -1628,6 +1629,24 @@ tail_forever_inotify (int wd, struct File_spec *f, size_t n_files, ev = void_ev; evbuf_off += sizeof (*ev) + ev->len; + /* If a directory is deleted, IN_DELETE_SELF is emmited + with ev->name of length 0. + We need to catch it, otherwise it would wait forever, + as wd for directory becomes inactive. Revert to polling now. */ + if ((ev->mask & IN_DELETE_SELF) && !ev->len) + { + for (i = 0; i < n_files; i++) + { + if (ev->wd == f[i].parent_wd) + { + hash_free (wd_to_name); + error (0, 0, + _("directory containing watched file was removed")); + return true; + } + } + } + if (ev->len) /* event on ev->name in watched directory. */ { size_t j; diff --git a/tests/local.mk b/tests/local.mk index 9f1a853..bcf70c2 100644 --- a/tests/local.mk +++ b/tests/local.mk @@ -176,6 +176,7 @@ all_tests = \ tests/tail-2/descriptor-vs-rename.sh \ tests/tail-2/inotify-rotate.sh \ tests/tail-2/inotify-rotate-resources.sh \ + tests/tail-2/inotify-dir-recreate.sh \ tests/chmod/no-x.sh \ tests/chgrp/basic.sh \ tests/rm/dangling-symlink.sh \ diff --git a/tests/tail-2/inotify-dir-recreate.sh b/tests/tail-2/inotify-dir-recreate.sh new file mode 100755 index 0000000..ed5f339 --- /dev/null +++ b/tests/tail-2/inotify-dir-recreate.sh @@ -0,0 +1,66 @@ +#!/bin/sh +# Makes sure, inotify will switch to polling mode if directory +# of the watched file was removed and recreated. +# (...instead of getting stuck forever) + +# Copyright (C) 2006-2017 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 . + +. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src +print_ver_ tail + + +# Terminate any background tail process +cleanup_() { kill $pid 2>/dev/null && wait $pid; } + +# Check for existence of the important message +check_tail_output_ () +{ + grep "$1" out &>/dev/null || fail=1 +} + +# Prepare the file to be watched +mkdir dir && touch dir/file +sleep 1 + +timeout 60 tail --follow=name --retry dir/file &>out & pid=$! +sleep 1 + +# Remove the directory, should get the massage about the deletion +rm -r dir +sleep 1 + +# Recreate the dir, should get a message about recreation +mkdir dir && touch dir/file +sleep 1 + +cleanup_ +rm -r dir + +# Expected result for the whole process +cat <<\EOF > exp +tail: 'dir/file' has become inaccessible: No such file or directory +tail: directory containing watched file was removed +tail: inotify cannot be used, reverting to polling: No such file or directory +tail: 'dir/file' has appeared; following new file +EOF + +# If contains 'has appeared' string, than +# the polling mode has been reactivated succesfully +check_tail_output_ 'has appeared' + +compare exp out || fail=1 + +Exit $fail -- 2.9.3 --001a114703d618b22a054c5a0989 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: base64 PGRpdiBkaXI9Imx0ciI+PGRpdj48ZGl2PjxkaXY+PGRpdj48ZGl2Piogc3JjL3RhaWwuYyAodGFp bF9mb3JldmVyX2lub3RpZnkpOsKgIEFkZCB0aGUgSU5fREVMRVRFX1NFTEYgZmxhZyB3aGVuPGJy PmNyZWF0aW5nIHdhdGNoIGZvciB0aGUgcGFyZW50IGRpcmVjdG9yeS7CoCBBZnRlciB0aGUgcGFy ZW50IGRpcmVjdG9yeTxicj5pcyByZW1vdmVkLCBhbiBldmVudCBpcyBjYXVnaHQgYW5kIHRoZW4g d2Ugc3dpdGNoIGZyb20gaW5vdGlmeSB0bzxicj5wb2xsaW5nIG1vZGUuwqAgVGlsbCBub3csIGlu b3RpZnkgaGFzIGFsd2F5cyBmcm96ZW4gYmVjYXVzZSBpdCB3YWl0ZWQgZm9yPGJyPmFuIGV2ZW50 IGZyb20gYSB3YXRjaGVkIGRpciwgd2hpY2ggaGFzIGJlZW4gYWxyZWFkeSBkZWxldGVkIGFuZCB3 YXMgbm90PGJyPmFkZGVkIGFnYWluLjxicj4qIHRlc3RzL3RhaWwtMi9pbm90aWZ5LWRpci1yZWNy ZWF0ZS5zaDogQWRkIGEgdGVzdCBjYXNlLjxicj4qIHRlc3RzLzxhIGhyZWY9Imh0dHA6Ly9sb2Nh bC5tayI+bG9jYWwubWs8L2E+OiBSZWZlcmVuY2UgdGhlIG5ldyB0ZXN0Ljxicj4qIE5FV1M6IE1l bnRpb24gdGhlIGJ1ZyBmaXguPGJyPjxicj5SZXBvcnRlZCBhdCA8YSBocmVmPSJodHRwczovL2J1 Z3ppbGxhLnJlZGhhdC5jb20vMTI4Mzc2MCI+aHR0cHM6Ly9idWd6aWxsYS5yZWRoYXQuY29tLzEy ODM3NjA8L2E+PGJyPi0tLTxicj7CoE5FV1PCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHzCoCAyICsrPGJyPsKgc3JjL3RhaWwu Y8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfCAy MSArKysrKysrKysrKy08YnI+wqB0ZXN0cy88YSBocmVmPSJodHRwOi8vbG9jYWwubWsiPmxvY2Fs Lm1rPC9hPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHzCoCAx ICs8YnI+wqB0ZXN0cy90YWlsLTIvaW5vdGlmeS1kaXItcmVjcmVhdGUuc2ggfCA2NiArKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKys8YnI+wqA0IGZpbGVzIGNoYW5nZWQsIDg5IGlu c2VydGlvbnMoKyksIDEgZGVsZXRpb24oLSk8YnI+wqBjcmVhdGUgbW9kZSAxMDA3NTUgdGVzdHMv dGFpbC0yL2lub3RpZnktZGlyLXJlY3JlYXRlLnNoPGJyPjxicj5kaWZmIC0tZ2l0IGEvTkVXUyBi L05FV1M8YnI+aW5kZXggZTJmMjk4Zi4uZjM0ZDY2NyAxMDA2NDQ8YnI+LS0tIGEvTkVXUzxicj4r KysgYi9ORVdTPGJyPkBAIC03NCw2ICs3NCw4IEBAIEdOVSBjb3JldXRpbHMgTkVXU8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgLSotIG91dGxpbmUgLSotPGJyPsKgwqAgJiMzOTtjcCAtZmwgQSBCJiMzOTsgbm8gbG9u Z2VyIHJlbW92ZSBCIGJlZm9yZSBjcmVhdGluZyB0aGUgbmV3IGxpbmsuPGJyPsKgwqAgVGhhdCBp cywgdGhlcmUgaXMgbm8gbG9uZ2VyIGEgYnJpZWYgbW9tZW50IHdoZW4gQiBkb2VzIG5vdCBleGlz dC48YnI+wqA8YnI+K8KgIHRhaWwgLUYgJiMzOTtkaXIvZmlsZSYjMzk7IHJldmVydHMgdG8gcG9s bGluZyBtb2RlIGluIGNhc2UgJiMzOTtkaXImIzM5OyBpcyByZW1vdmVkLjxicj4rPGJyPsKgKiog TmV3IGZlYXR1cmVzPGJyPsKgPGJyPsKgwqAgZXhwYW5kIGFuZCB1bmV4cGFuZCBub3cgc3VwcG9y dCBzcGVjaWZ5aW5nIGEgdGFiIHNpemUgdG8gdXNlPGJyPmRpZmYgLS1naXQgYS9zcmMvdGFpbC5j IGIvc3JjL3RhaWwuYzxicj5pbmRleCBkMTU1MmQ0Li5lMzVlZTFlIDEwMDY0NDxicj4tLS0gYS9z cmMvdGFpbC5jPGJyPisrKyBiL3NyYy90YWlsLmM8YnI+QEAgLTE0NTcsNyArMTQ1Nyw4IEBAIHRh aWxfZm9yZXZlcl9pbm90aWZ5IChpbnQgd2QsIHN0cnVjdCBGaWxlX3NwZWMgKmYsIHNpemVfdCBu X2ZpbGVzLDxicj7CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgSW4gdGhhdCBj YXNlIHRoZSBzYW1lIHdhdGNoIGRlc2NyaXB0b3IgaXMgcmV0dXJuZWQuwqAgKi88YnI+wqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBmW2ldLnBhcmVudF93ZCA9IGlub3RpZnlfYWRkX3dhdGNo ICh3ZCwgZGlybGVuID8gZltpXS5uYW1lIDogJnF1b3Q7LiZxdW90Oyw8YnI+wqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAoSU5fQ1JFQVRFIHwgSU5fREVMRVRFPGJy Pi3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHwgSU5fTU9WRURf VE8gfCBJTl9BVFRSSUIpKTs8YnI+K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgfCBJTl9NT1ZFRF9UTyB8IElOX0FUVFJJQjxicj4rwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB8IElOX0RFTEVURV9TRUxGKSk7PGJyPsKgPGJyPsKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZltpXS5uYW1lW2Rpcmxlbl0gPSBwcmV2Ozxicj7C oDxicj5AQCAtMTYyOCw2ICsxNjI5LDI0IEBAIHRhaWxfZm9yZXZlcl9pbm90aWZ5IChpbnQgd2Qs IHN0cnVjdCBGaWxlX3NwZWMgKmYsIHNpemVfdCBuX2ZpbGVzLDxicj7CoMKgwqDCoMKgwqAgZXYg PSB2b2lkX2V2Ozxicj7CoMKgwqDCoMKgwqAgZXZidWZfb2ZmICs9IHNpemVvZiAoKmV2KSArIGV2 LSZndDtsZW47PGJyPsKgPGJyPivCoMKgwqDCoMKgIC8qIElmIGEgZGlyZWN0b3J5IGlzIGRlbGV0 ZWQsIElOX0RFTEVURV9TRUxGIGlzIGVtbWl0ZWQ8YnI+K8KgwqDCoMKgwqDCoMKgwqAgd2l0aCBl di0mZ3Q7bmFtZSBvZiBsZW5ndGggMC48YnI+K8KgwqDCoMKgwqDCoMKgwqAgV2UgbmVlZCB0byBj YXRjaCBpdCwgb3RoZXJ3aXNlIGl0IHdvdWxkIHdhaXQgZm9yZXZlciw8YnI+K8KgwqDCoMKgwqDC oMKgwqAgYXMgd2QgZm9yIGRpcmVjdG9yeSBiZWNvbWVzIGluYWN0aXZlLiBSZXZlcnQgdG8gcG9s bGluZyBub3cuwqDCoCAqLzxicj4rwqDCoMKgwqDCoCBpZiAoKGV2LSZndDttYXNrICZhbXA7IElO X0RFTEVURV9TRUxGKSAmYW1wOyZhbXA7ICFldi0mZ3Q7bGVuKTxicj4rwqDCoMKgwqDCoMKgwqAg ezxicj4rwqDCoMKgwqDCoMKgwqDCoMKgIGZvciAoaSA9IDA7IGkgJmx0OyBuX2ZpbGVzOyBpKysp PGJyPivCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHs8YnI+K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIGlmIChldi0mZ3Q7d2QgPT0gZltpXS5wYXJlbnRfd2QpPGJyPivCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgezxicj4rwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBo YXNoX2ZyZWUgKHdkX3RvX25hbWUpOzxicj4rwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCBlcnJvciAoMCwgMCw8YnI+K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBfKCZxdW90O2RpcmVjdG9yeSBjb250YWluaW5nIHdhdGNoZWQgZmlsZSB3YXMgcmVt b3ZlZCZxdW90OykpOzxicj4rwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1 cm4gdHJ1ZTs8YnI+K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9PGJyPivCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIH08YnI+K8KgwqDCoMKgwqDCoMKgIH08YnI+Kzxicj7CoMKgwqDCoMKg wqAgaWYgKGV2LSZndDtsZW4pIC8qIGV2ZW50IG9uIGV2LSZndDtuYW1lIGluIHdhdGNoZWQgZGly ZWN0b3J5LsKgICovPGJyPsKgwqDCoMKgwqDCoMKgwqAgezxicj7CoMKgwqDCoMKgwqDCoMKgwqDC oCBzaXplX3Qgajs8YnI+ZGlmZiAtLWdpdCBhL3Rlc3RzLzxhIGhyZWY9Imh0dHA6Ly9sb2NhbC5t ayI+bG9jYWwubWs8L2E+IGIvdGVzdHMvPGEgaHJlZj0iaHR0cDovL2xvY2FsLm1rIj5sb2NhbC5t azwvYT48YnI+aW5kZXggOWYxYTg1My4uYmNmNzBjMiAxMDA2NDQ8YnI+LS0tIGEvdGVzdHMvPGEg aHJlZj0iaHR0cDovL2xvY2FsLm1rIj5sb2NhbC5tazwvYT48YnI+KysrIGIvdGVzdHMvPGEgaHJl Zj0iaHR0cDovL2xvY2FsLm1rIj5sb2NhbC5tazwvYT48YnI+QEAgLTE3Niw2ICsxNzYsNyBAQCBh bGxfdGVzdHMgPcKgwqDCoCDCoMKgwqAgwqDCoMKgIMKgwqDCoCDCoMKgwqAgXDxicj7CoMKgIHRl c3RzL3RhaWwtMi9kZXNjcmlwdG9yLXZzLXJlbmFtZS5zaMKgwqDCoCDCoMKgwqAgXDxicj7CoMKg IHRlc3RzL3RhaWwtMi9pbm90aWZ5LXJvdGF0ZS5zaMKgwqDCoCDCoMKgwqAgXDxicj7CoMKgIHRl c3RzL3RhaWwtMi9pbm90aWZ5LXJvdGF0ZS1yZXNvdXJjZXMuc2jCoMKgwqAgXDxicj4rwqAgdGVz dHMvdGFpbC0yL2lub3RpZnktZGlyLXJlY3JlYXRlLnNowqDCoMKgIMKgwqDCoCBcPGJyPsKgwqAg dGVzdHMvY2htb2Qvbm8teC5zaMKgwqDCoCDCoMKgwqAgwqDCoMKgIMKgwqDCoCBcPGJyPsKgwqAg dGVzdHMvY2hncnAvYmFzaWMuc2jCoMKgwqAgwqDCoMKgIMKgwqDCoCDCoMKgwqAgXDxicj7CoMKg IHRlc3RzL3JtL2RhbmdsaW5nLXN5bWxpbmsuc2jCoMKgwqAgwqDCoMKgIMKgwqDCoCBcPGJyPmRp ZmYgLS1naXQgYS90ZXN0cy90YWlsLTIvaW5vdGlmeS1kaXItcmVjcmVhdGUuc2ggYi90ZXN0cy90 YWlsLTIvaW5vdGlmeS1kaXItcmVjcmVhdGUuc2g8YnI+bmV3IGZpbGUgbW9kZSAxMDA3NTU8YnI+ aW5kZXggMDAwMDAwMC4uZWQ1ZjMzOTxicj4tLS0gL2Rldi9udWxsPGJyPisrKyBiL3Rlc3RzL3Rh aWwtMi9pbm90aWZ5LWRpci1yZWNyZWF0ZS5zaDxicj5AQCAtMCwwICsxLDY2IEBAPGJyPisjIS9i aW4vc2g8YnI+KyMgTWFrZXMgc3VyZSwgaW5vdGlmeSB3aWxsIHN3aXRjaCB0byBwb2xsaW5nIG1v ZGUgaWYgZGlyZWN0b3J5PGJyPisjIG9mIHRoZSB3YXRjaGVkIGZpbGUgd2FzIHJlbW92ZWQgYW5k IHJlY3JlYXRlZC48YnI+KyMgKC4uLmluc3RlYWQgb2YgZ2V0dGluZyBzdHVjayBmb3JldmVyKTxi cj4rPGJyPisjIENvcHlyaWdodCAoQykgMjAwNi0yMDE3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlv biwgSW5jLjxicj4rPGJyPisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2Fu IHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5PGJyPisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBv ZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5PGJyPisjIHRo ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vu c2UsIG9yPGJyPisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uPGJyPis8YnI+ KyMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBi ZSB1c2VmdWwsPGJyPisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRo ZSBpbXBsaWVkIHdhcnJhbnR5IG9mPGJyPisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZP UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS7CoCBTZWUgdGhlPGJyPisjIEdOVSBHZW5lcmFsIFB1Ymxp YyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuPGJyPis8YnI+KyMgWW91IHNob3VsZCBoYXZlIHJl Y2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2U8YnI+KyMgYWxv bmcgd2l0aCB0aGlzIHByb2dyYW0uwqAgSWYgbm90LCBzZWUgJmx0OzxhIGhyZWY9Imh0dHA6Ly93 d3cuZ251Lm9yZy9saWNlbnNlcy8iPmh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy88L2E+Jmd0 Oy48YnI+Kzxicj4rLiAmcXVvdDske3NyY2Rpcj0ufS90ZXN0cy9pbml0LnNoJnF1b3Q7OyBwYXRo X3ByZXBlbmRfIC4vc3JjPGJyPitwcmludF92ZXJfIHRhaWw8YnI+Kzxicj4rPGJyPisjIFRlcm1p bmF0ZSBhbnkgYmFja2dyb3VuZCB0YWlsIHByb2Nlc3M8YnI+K2NsZWFudXBfKCkgeyBraWxsICRw aWQgMiZndDsvZGV2L251bGwgJmFtcDsmYW1wOyB3YWl0ICRwaWQ7IH08YnI+Kzxicj4rIyBDaGVj ayBmb3IgZXhpc3RlbmNlIG9mIHRoZSBpbXBvcnRhbnQgbWVzc2FnZTxicj4rY2hlY2tfdGFpbF9v dXRwdXRfICgpPGJyPit7PGJyPivCoCBncmVwICZxdW90OyQxJnF1b3Q7IG91dCAmYW1wOyZndDsv ZGV2L251bGwgfHzCoCBmYWlsPTE8YnI+K308YnI+Kzxicj4rIyBQcmVwYXJlIHRoZSBmaWxlIHRv IGJlIHdhdGNoZWQ8YnI+K21rZGlyIGRpciAmYW1wOyZhbXA7IHRvdWNoIGRpci9maWxlPGJyPitz bGVlcCAxPGJyPis8YnI+K3RpbWVvdXQgNjAgdGFpbCAtLWZvbGxvdz1uYW1lIC0tcmV0cnkgZGly L2ZpbGUgJmFtcDsmZ3Q7b3V0wqAgJmFtcDsgcGlkPSQhPGJyPitzbGVlcCAxPGJyPis8YnI+KyMg UmVtb3ZlIHRoZSBkaXJlY3RvcnksIHNob3VsZCBnZXQgdGhlIG1hc3NhZ2UgYWJvdXQgdGhlIGRl bGV0aW9uPGJyPitybSAtciBkaXI8YnI+K3NsZWVwIDE8YnI+Kzxicj4rIyBSZWNyZWF0ZSB0aGUg ZGlyLCBzaG91bGQgZ2V0IGEgbWVzc2FnZSBhYm91dCByZWNyZWF0aW9uPGJyPitta2RpciBkaXIg JmFtcDsmYW1wOyB0b3VjaCBkaXIvZmlsZTxicj4rc2xlZXAgMTxicj4rPGJyPitjbGVhbnVwXzxi cj4rcm0gLXIgZGlyPGJyPis8YnI+KyMgRXhwZWN0ZWQgcmVzdWx0IGZvciB0aGUgd2hvbGUgcHJv Y2Vzczxicj4rY2F0ICZsdDsmbHQ7XEVPRiAmZ3Q7IGV4cDxicj4rdGFpbDogJiMzOTtkaXIvZmls ZSYjMzk7IGhhcyBiZWNvbWUgaW5hY2Nlc3NpYmxlOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5 PGJyPit0YWlsOiBkaXJlY3RvcnkgY29udGFpbmluZyB3YXRjaGVkIGZpbGUgd2FzIHJlbW92ZWQ8 YnI+K3RhaWw6IGlub3RpZnkgY2Fubm90IGJlIHVzZWQsIHJldmVydGluZyB0byBwb2xsaW5nOiBO byBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5PGJyPit0YWlsOiAmIzM5O2Rpci9maWxlJiMzOTsgaGFz IGFwcGVhcmVkO8KgIGZvbGxvd2luZyBuZXcgZmlsZTxicj4rRU9GPGJyPis8YnI+KyMgSWYgY29u dGFpbnMgJiMzOTtoYXMgYXBwZWFyZWQmIzM5OyBzdHJpbmcsIHRoYW48YnI+KyMgdGhlIHBvbGxp bmcgbW9kZSBoYXMgYmVlbiByZWFjdGl2YXRlZCBzdWNjZXNmdWxseTxicj4rY2hlY2tfdGFpbF9v dXRwdXRfICYjMzk7aGFzIGFwcGVhcmVkJiMzOTs8YnI+Kzxicj4rY29tcGFyZSBleHAgb3V0IHx8 IGZhaWw9MTxicj4rPGJyPitFeGl0ICRmYWlsPGJyPi0tIDxicj4yLjkuMzxicj48YnI+PGJyPjwv ZGl2PjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2Pg0K --001a114703d618b22a054c5a0989-- ------------=_1491439682-5113-1--