Browse Source

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.
Sergey Poznyakoff 16 years ago
parent
commit
7f6e6e6a3e
4 changed files with 25 additions and 33 deletions
  1. 14 0
      ChangeLog
  2. 1 3
      src/buffer.c
  3. 1 2
      src/common.h
  4. 9 28
      src/system.c

+ 14 - 0
ChangeLog

@@ -1,3 +1,17 @@
+2008-11-25  Sergey Poznyakoff  <[email protected]>
+
+	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  <[email protected]>
 
 	* src/buffer.c (_write_volume_label): Fix typo, which prevented

+ 1 - 3
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)

+ 1 - 2
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);

+ 9 - 28
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)));