summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2008-11-25 12:33:28 +0000
committerSergey Poznyakoff <gray@gnu.org.ua>2008-11-25 12:33:28 +0000
commit7f6e6e6a3e4e9a66f86f0c781da0680a438df61a (patch)
tree619d3a8dbfe55a5e0c3a59379407664ed5d7bbbe
parent99e3a2604f3872b94d53bfdadd2cad5d299c739d (diff)
downloadtar-7f6e6e6a3e4e9a66f86f0c781da0680a438df61a.tar.gz
Do not try to drain the input pipe before closing the archive.
* src/buffer.c (close_archive): Remove call to sys_drain_input_pipe. Pass hit_eof as the second argument to sys_wait_for_child. * src/common.h (sys_drain_input_pipe): Remove (sys_wait_for_child): Declare second argument. * src/system.c (sys_drain_input_pipe): Remove. (sys_wait_for_child): Take two arguments. The second one helps to decide whether to tolerate child termination on SIGPIPE.
-rw-r--r--ChangeLog14
-rw-r--r--src/buffer.c4
-rw-r--r--src/common.h3
-rw-r--r--src/system.c37
4 files changed, 25 insertions, 33 deletions
diff --git a/ChangeLog b/ChangeLog
index 5036e699..62a15c82 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+2008-11-25 Sergey Poznyakoff <gray@gnu.org.ua>
+
+ Do not try to drain the input pipe before closing the
+ archive.
+
+ * src/buffer.c (close_archive): Remove call to
+ sys_drain_input_pipe. Pass hit_eof as the second
+ argument to sys_wait_for_child.
+ * src/common.h (sys_drain_input_pipe): Remove
+ (sys_wait_for_child): Declare second argument.
+ * src/system.c (sys_drain_input_pipe): Remove.
+ (sys_wait_for_child): Take two arguments. The second one helps to
+ decide whether to tolerate child termination on SIGPIPE.
+
2008-11-03 Sergey Poznyakoff <gray@gnu.org.ua>
* src/buffer.c (_write_volume_label): Fix typo, which prevented
diff --git a/src/buffer.c b/src/buffer.c
index 02a3e4c6..5f5457a9 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -848,8 +848,6 @@ close_archive (void)
flush_archive ();
}
- sys_drain_input_pipe ();
-
compute_duration ();
if (verify_option)
verify_volume ();
@@ -857,7 +855,7 @@ close_archive (void)
if (rmtclose (archive) != 0)
close_error (*archive_name_cursor);
- sys_wait_for_child (child_pid);
+ sys_wait_for_child (child_pid, hit_eof);
tar_stat_destroy (&current_stat_info);
if (save_name)
diff --git a/src/common.h b/src/common.h
index cc3483e2..9897b46c 100644
--- a/src/common.h
+++ b/src/common.h
@@ -699,8 +699,7 @@ char *xheader_format_name (struct tar_stat_info *st, const char *fmt,
void sys_detect_dev_null_output (void);
void sys_save_archive_dev_ino (void);
-void sys_drain_input_pipe (void);
-void sys_wait_for_child (pid_t);
+void sys_wait_for_child (pid_t, bool);
void sys_spawn_shell (void);
bool sys_compare_uid (struct stat *a, struct stat *b);
bool sys_compare_gid (struct stat *a, struct stat *b);
diff --git a/src/system.c b/src/system.c
index e57e6daf..c90a40d1 100644
--- a/src/system.c
+++ b/src/system.c
@@ -1,6 +1,7 @@
/* System-dependent calls for tar.
- Copyright (C) 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+ Copyright (C) 2003, 2004, 2005, 2006, 2007,
+ 2008 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
@@ -51,12 +52,7 @@ sys_detect_dev_null_output (void)
}
void
-sys_drain_input_pipe (void)
-{
-}
-
-void
-sys_wait_for_child (pid_t child_pid)
+sys_wait_for_child (pid_t child_pid, bool eof)
{
}
@@ -160,26 +156,8 @@ sys_detect_dev_null_output (void)
&& archive_stat.st_ino == dev_null_stat.st_ino));
}
-/* Manage to fully drain a pipe we might be reading, so to not break it on
- the producer after the EOF block. FIXME: one of these days, GNU tar
- might become clever enough to just stop working, once there is no more
- work to do, we might have to revise this area in such time. */
-
-void
-sys_drain_input_pipe (void)
-{
- size_t r;
-
- if (access_mode == ACCESS_READ
- && ! _isrmt (archive)
- && (S_ISFIFO (archive_stat.st_mode) || S_ISSOCK (archive_stat.st_mode)))
- while ((r = rmtread (archive, record_start->buffer, record_size)) != 0
- && r != SAFE_READ_ERROR)
- continue;
-}
-
void
-sys_wait_for_child (pid_t child_pid)
+sys_wait_for_child (pid_t child_pid, bool eof)
{
if (child_pid)
{
@@ -193,8 +171,11 @@ sys_wait_for_child (pid_t child_pid)
}
if (WIFSIGNALED (wait_status))
- ERROR ((0, 0, _("Child died with signal %d"),
- WTERMSIG (wait_status)));
+ {
+ int sig = WTERMSIG (wait_status);
+ if (!(!eof && sig == SIGPIPE))
+ ERROR ((0, 0, _("Child died with signal %d"), sig));
+ }
else if (WEXITSTATUS (wait_status) != 0)
ERROR ((0, 0, _("Child returned status %d"),
WEXITSTATUS (wait_status)));