95 lines
3.2 KiB
Diff
95 lines
3.2 KiB
Diff
From 9d1993f651d72f78b2afe416c72b1aeb0c1215ab Mon Sep 17 00:00:00 2001
|
||
From: Sergey Poznyakoff <gray@gnu.org>
|
||
Date: Fri, 28 Dec 2018 17:49:08 +0200
|
||
Subject: [PATCH 41/58] Work over a bug in gnulib error()
|
||
|
||
The error() function from glibc correctly prefixes each message it
|
||
prints with program_name as set by set_program_name. However, its
|
||
replacement from gnulib, which is linked in on systems where this
|
||
function is not available, prints the name returned by getprogname()
|
||
instead. Due to this messages output by tar subprocess (which sets its
|
||
program name to 'tar (child)') become indiscernible from those printed
|
||
by the main process. In particular, this breaks the remfiles01.at and
|
||
remfiles02.at test cases.
|
||
|
||
* configure.ac: Define ENABLE_ERROR_PRINT_PROGNAME if using
|
||
gnulib error().
|
||
* src/tar.c [ENABLE_ERROR_PRINT_PROGNAME] (tar_print_progname): New function.
|
||
(main) [ENABLE_ERROR_PRINT_PROGNAME]: Set error_print_progname.
|
||
---
|
||
configure.ac | 12 ++++++++++++
|
||
src/tar.c | 27 +++++++++++++++++++++++++--
|
||
2 files changed, 37 insertions(+), 2 deletions(-)
|
||
|
||
diff --git a/configure.ac b/configure.ac
|
||
index 66ed8ca..8e4207b 100644
|
||
--- a/configure.ac
|
||
+++ b/configure.ac
|
||
@@ -102,6 +102,18 @@ gt_TYPE_SSIZE_T
|
||
|
||
# gnulib modules
|
||
gl_INIT
|
||
+
|
||
+if test $ac_cv_lib_error_at_line = no; then
|
||
+ # This means that the error() function is not present in libc, so
|
||
+ # the one from gnulib will be used instead. This function precedes
|
||
+ # error messages it prints with the program name as returned by getprogname()
|
||
+ # call, instead of using the name set by set_program_name.
|
||
+ # Install workaround.
|
||
+ AC_DEFINE([ENABLE_ERROR_PRINT_PROGNAME],[1],
|
||
+ [Enable the use of error_print_progname to print program name with error messages.
|
||
+ See comment to function tar_print_progname in src/tar.c])
|
||
+fi
|
||
+
|
||
# paxutils modules
|
||
tar_PAXUTILS
|
||
|
||
diff --git a/src/tar.c b/src/tar.c
|
||
index 9c939f3..721d777 100644
|
||
--- a/src/tar.c
|
||
+++ b/src/tar.c
|
||
@@ -2666,7 +2666,28 @@ decode_options (int argc, char **argv)
|
||
|
||
report_textual_dates (&args);
|
||
}
|
||
-
|
||
+
|
||
+#ifdef ENABLE_ERROR_PRINT_PROGNAME
|
||
+/* The error() function from glibc correctly prefixes each message it
|
||
+ prints with program_name as set by set_program_name. However, its
|
||
+ replacement from gnulib, which is linked in on systems where this
|
||
+ function is not available, prints the name returned by getprogname()
|
||
+ instead. Due to this messages output by tar subprocess (which sets its
|
||
+ program name to 'tar (child)') become indiscernible from those printed
|
||
+ by the main process. In particular, this breaks the remfiles01.at and
|
||
+ remfiles02.at test cases.
|
||
+
|
||
+ To avoid this, on such systems the following helper function is used
|
||
+ to print proper program name. Its address is assigned to the
|
||
+ error_print_progname variable, which error() then uses instead of
|
||
+ printing getprogname() result.
|
||
+ */
|
||
+static void
|
||
+tar_print_progname (void)
|
||
+{
|
||
+ fprintf (stderr, "%s: ", program_name);
|
||
+}
|
||
+#endif
|
||
|
||
/* Tar proper. */
|
||
|
||
@@ -2676,7 +2697,9 @@ main (int argc, char **argv)
|
||
{
|
||
set_start_time ();
|
||
set_program_name (argv[0]);
|
||
-
|
||
+#ifdef ENABLE_ERROR_PRINT_PROGNAME
|
||
+ error_print_progname = tar_print_progname;
|
||
+#endif
|
||
setlocale (LC_ALL, "");
|
||
bindtextdomain (PACKAGE, LOCALEDIR);
|
||
textdomain (PACKAGE);
|
||
--
|
||
2.19.1
|
||
|