From: Sergey Poznyakoff Date: Thu, 16 Nov 2017 11:55:15 +0000 (+0200) Subject: New option --warning=failed-read X-Git-Tag: release_1_30~10 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=32e51de2af3ac51dd7a00754d1f6d241ea3c0403;p=thirdparty%2Ftar.git New option --warning=failed-read * NEWS: Document the --warning=failed-read option. * doc/tar.texi: Likewise. * doc/tar.1: Likewise. * src/common.h (WARN_FAILED_READ): New constant. (WARNING_ENABLED): New macro. * src/misc.c (close_diag, open_diag) (read_diag_details, readlink_diag) (savedir_diag, seek_diag_details) (stat_diag): Suppress warnings if WARN_FAILED_READ is set. * src/warning.c (failed-read): New keyword. --- diff --git a/NEWS b/NEWS index 0a173e0c..333e99ae 100644 --- a/NEWS +++ b/NEWS @@ -37,6 +37,18 @@ This helps the output of 'tar' to be more deterministic. In some cases tar would restore the directory permissions too early, causing subsequent link extractions in that directory to fail. +* The --warnings=failed-read option + +This new warning control option suppresses warning messages about +unreadable files and directories. It has effect only if used together +with the --ignore-failed-read option. + +* The --warnings=none option now suppresses all warnings + +This includes warnings about unreadable files produced when +--ignore-failed-read is in effect. To output these, use +--warnings=none --warnings=no-failed-read. + version 1.29 - Sergey Poznyakoff, 2016-05-16 diff --git a/doc/tar.1 b/doc/tar.1 index f5c1fcac..c4c990f9 100644 --- a/doc/tar.1 +++ b/doc/tar.1 @@ -13,7 +13,7 @@ .\" .\" You should have received a copy of the GNU General Public License .\" along with this program. If not, see . -.TH TAR 1 "March 23, 2016" "TAR" "GNU TAR Manual" +.TH TAR 1 "November 16, 2017" "TAR" "GNU TAR Manual" .SH NAME tar \- an archiving utility .SH SYNOPSIS @@ -1163,6 +1163,12 @@ Keywords applicable for \fBtar --create\fR: .TP .B file-changed "%s: file changed as we read it" +.TP +.B failed-read +Suppresses warnings about unreadable files or directories. This +keyword applies only if used together with the +.B \-\-ignore\-failed\-read +option. .HP Keywords applicable for \fBtar --extract\fR: .TP diff --git a/doc/tar.texi b/doc/tar.texi index 09c4fbb3..572e3dd9 100644 --- a/doc/tar.texi +++ b/doc/tar.texi @@ -4610,6 +4610,10 @@ Disable all warning messages. @cindex @samp{file changed as we read it}, warning message @item file-changed @samp{%s: file changed as we read it} +@item failed-read +Suppresses warnings about unreadable files or directories. This +keyword applies only if used together with the @option{--ignore-failed-read} +option. @xref{Ignore Failed Read}. @end table @subheading Keywords applicable for @command{tar --extract} @@ -5726,7 +5730,7 @@ Disable SELinux context support. @end table @node Ignore Failed Read -@subsection Ignore Fail Read +@subsection Ignore Failed Read @table @option @item --ignore-failed-read @@ -5734,6 +5738,13 @@ Disable SELinux context support. Do not exit with nonzero on unreadable files or directories. @end table +This option has effect only during creation. It instructs tar to +treat as mild conditions any missing or unreadable files (directories). +Such failures don't affect the program exit code, and the +corresponding diagnostic messages are marked as warnings, not errors. +These warnings can be suppressed using the +@option{--warning=failed-read} option (@pxref{warnings}). + @node extract options @section Options Used by @option{--extract} @cindex options for use with @option{--extract} diff --git a/src/common.h b/src/common.h index e49bd9f1..964f0b64 100644 --- a/src/common.h +++ b/src/common.h @@ -927,6 +927,7 @@ void checkpoint_flush_actions (void); #define WARN_EXISTING_FILE 0x00100000 #define WARN_XATTR_WRITE 0x00200000 #define WARN_RECORD_SIZE 0x00400000 +#define WARN_FAILED_READ 0x00800000 /* These warnings are enabled by default in verbose mode: */ #define WARN_VERBOSE_WARNINGS (WARN_RENAME_DIRECTORY|WARN_NEW_DIRECTORY|\ @@ -938,10 +939,12 @@ void set_warning_option (const char *arg); extern int warning_option; +#define WARNING_ENABLED(opt) (warning_option & (opt)) + #define WARNOPT(opt,args) \ do \ { \ - if (warning_option & opt) WARN (args); \ + if (WARNING_ENABLED(opt)) WARN (args); \ } \ while (0) diff --git a/src/misc.c b/src/misc.c index 1e5ca2aa..cd07f530 100644 --- a/src/misc.c +++ b/src/misc.c @@ -1044,7 +1044,10 @@ void close_diag (char const *name) { if (ignore_failed_read_option) - close_warn (name); + { + if (WARNING_ENABLED(WARN_FAILED_READ)) + close_warn (name); + } else close_error (name); } @@ -1053,7 +1056,10 @@ void open_diag (char const *name) { if (ignore_failed_read_option) - open_warn (name); + { + if (WARNING_ENABLED(WARN_FAILED_READ)) + open_warn (name); + } else open_error (name); } @@ -1062,7 +1068,10 @@ void read_diag_details (char const *name, off_t offset, size_t size) { if (ignore_failed_read_option) - read_warn_details (name, offset, size); + { + if (WARNING_ENABLED(WARN_FAILED_READ)) + read_warn_details (name, offset, size); + } else read_error_details (name, offset, size); } @@ -1071,7 +1080,10 @@ void readlink_diag (char const *name) { if (ignore_failed_read_option) - readlink_warn (name); + { + if (WARNING_ENABLED(WARN_FAILED_READ)) + readlink_warn (name); + } else readlink_error (name); } @@ -1080,7 +1092,10 @@ void savedir_diag (char const *name) { if (ignore_failed_read_option) - savedir_warn (name); + { + if (WARNING_ENABLED(WARN_FAILED_READ)) + savedir_warn (name); + } else savedir_error (name); } @@ -1089,7 +1104,10 @@ void seek_diag_details (char const *name, off_t offset) { if (ignore_failed_read_option) - seek_warn_details (name, offset); + { + if (WARNING_ENABLED(WARN_FAILED_READ)) + seek_warn_details (name, offset); + } else seek_error_details (name, offset); } @@ -1098,7 +1116,10 @@ void stat_diag (char const *name) { if (ignore_failed_read_option) - stat_warn (name); + { + if (WARNING_ENABLED(WARN_FAILED_READ)) + stat_warn (name); + } else stat_error (name); } diff --git a/src/warning.c b/src/warning.c index 2a436d76..bfcd2d27 100644 --- a/src/warning.c +++ b/src/warning.c @@ -47,6 +47,7 @@ static char const *const warning_args[] = { "existing-file", "xattr-write", "record-size", + "failed-read", NULL }; @@ -74,7 +75,8 @@ static int warning_types[] = { WARN_DECOMPRESS_PROGRAM, WARN_EXISTING_FILE, WARN_XATTR_WRITE, - WARN_RECORD_SIZE + WARN_RECORD_SIZE, + WARN_FAILED_READ }; ARGMATCH_VERIFY (warning_args, warning_types);