| [bf56c25] | 1 | Submitted By: Jim Gifford (jim at cross-lfs dot org) | 
|---|
|  | 2 | Date: 2009-01-04 | 
|---|
|  | 3 | Initial Package Version: 1.21 | 
|---|
|  | 4 | Origin: Tar Bug List | 
|---|
|  | 5 | Upstream Status: Applied | 
|---|
|  | 6 | Description: http://lists.gnu.org/archive/html/bug-tar/2008-12/msg00028.html | 
|---|
|  | 7 |  | 
|---|
|  | 8 | diff -Naur tar-1.21.orig/src/buffer.c tar-1.21/src/buffer.c | 
|---|
|  | 9 | --- tar-1.21.orig/src/buffer.c  2008-11-30 04:30:29.000000000 -0800 | 
|---|
|  | 10 | +++ tar-1.21/src/buffer.c       2009-01-04 20:04:57.000000000 -0800 | 
|---|
|  | 11 | @@ -848,6 +848,8 @@ | 
|---|
|  | 12 | flush_archive (); | 
|---|
|  | 13 | } | 
|---|
|  | 14 |  | 
|---|
|  | 15 | +  sys_drain_input_pipe (); | 
|---|
|  | 16 | + | 
|---|
|  | 17 | compute_duration (); | 
|---|
|  | 18 | if (verify_option) | 
|---|
|  | 19 | verify_volume (); | 
|---|
|  | 20 | @@ -855,7 +857,7 @@ | 
|---|
|  | 21 | if (rmtclose (archive) != 0) | 
|---|
|  | 22 | close_error (*archive_name_cursor); | 
|---|
|  | 23 |  | 
|---|
|  | 24 | -  sys_wait_for_child (child_pid, hit_eof); | 
|---|
|  | 25 | +  sys_wait_for_child (child_pid); | 
|---|
|  | 26 |  | 
|---|
|  | 27 | tar_stat_destroy (¤t_stat_info); | 
|---|
|  | 28 | if (save_name) | 
|---|
|  | 29 | diff -Naur tar-1.21.orig/src/common.h tar-1.21/src/common.h | 
|---|
|  | 30 | --- tar-1.21.orig/src/common.h  2008-11-30 04:30:29.000000000 -0800 | 
|---|
|  | 31 | +++ tar-1.21/src/common.h       2009-01-04 20:04:57.000000000 -0800 | 
|---|
|  | 32 | @@ -699,7 +699,8 @@ | 
|---|
|  | 33 |  | 
|---|
|  | 34 | void sys_detect_dev_null_output (void); | 
|---|
|  | 35 | void sys_save_archive_dev_ino (void); | 
|---|
|  | 36 | -void sys_wait_for_child (pid_t, bool); | 
|---|
|  | 37 | +void sys_drain_input_pipe (void); | 
|---|
|  | 38 | +void sys_wait_for_child (pid_t); | 
|---|
|  | 39 | void sys_spawn_shell (void); | 
|---|
|  | 40 | bool sys_compare_uid (struct stat *a, struct stat *b); | 
|---|
|  | 41 | bool sys_compare_gid (struct stat *a, struct stat *b); | 
|---|
|  | 42 | diff -Naur tar-1.21.orig/src/system.c tar-1.21/src/system.c | 
|---|
|  | 43 | --- tar-1.21.orig/src/system.c  2008-11-30 04:30:30.000000000 -0800 | 
|---|
|  | 44 | +++ tar-1.21/src/system.c       2009-01-04 20:04:57.000000000 -0800 | 
|---|
|  | 45 | @@ -1,7 +1,6 @@ | 
|---|
|  | 46 | /* System-dependent calls for tar. | 
|---|
|  | 47 |  | 
|---|
|  | 48 | -   Copyright (C) 2003, 2004, 2005, 2006, 2007, | 
|---|
|  | 49 | -   2008 Free Software Foundation, Inc. | 
|---|
|  | 50 | +   Copyright (C) 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. | 
|---|
|  | 51 |  | 
|---|
|  | 52 | This program is free software; you can redistribute it and/or modify it | 
|---|
|  | 53 | under the terms of the GNU General Public License as published by the | 
|---|
|  | 54 | @@ -52,7 +51,12 @@ | 
|---|
|  | 55 | } | 
|---|
|  | 56 |  | 
|---|
|  | 57 | void | 
|---|
|  | 58 | -sys_wait_for_child (pid_t child_pid, bool eof) | 
|---|
|  | 59 | +sys_drain_input_pipe (void) | 
|---|
|  | 60 | +{ | 
|---|
|  | 61 | +} | 
|---|
|  | 62 | + | 
|---|
|  | 63 | +void | 
|---|
|  | 64 | +sys_wait_for_child (pid_t child_pid) | 
|---|
|  | 65 | { | 
|---|
|  | 66 | } | 
|---|
|  | 67 |  | 
|---|
|  | 68 | @@ -156,8 +160,26 @@ | 
|---|
|  | 69 | && archive_stat.st_ino == dev_null_stat.st_ino)); | 
|---|
|  | 70 | } | 
|---|
|  | 71 |  | 
|---|
|  | 72 | +/* Manage to fully drain a pipe we might be reading, so to not break it on | 
|---|
|  | 73 | +   the producer after the EOF block.  FIXME: one of these days, GNU tar | 
|---|
|  | 74 | +   might become clever enough to just stop working, once there is no more | 
|---|
|  | 75 | +   work to do, we might have to revise this area in such time.  */ | 
|---|
|  | 76 | + | 
|---|
|  | 77 | +void | 
|---|
|  | 78 | +sys_drain_input_pipe (void) | 
|---|
|  | 79 | +{ | 
|---|
|  | 80 | +  size_t r; | 
|---|
|  | 81 | + | 
|---|
|  | 82 | +  if (access_mode == ACCESS_READ | 
|---|
|  | 83 | +      && ! _isrmt (archive) | 
|---|
|  | 84 | +      && (S_ISFIFO (archive_stat.st_mode) || S_ISSOCK (archive_stat.st_mode))) | 
|---|
|  | 85 | +    while ((r = rmtread (archive, record_start->buffer, record_size)) != 0 | 
|---|
|  | 86 | +          && r != SAFE_READ_ERROR) | 
|---|
|  | 87 | +      continue; | 
|---|
|  | 88 | +} | 
|---|
|  | 89 | + | 
|---|
|  | 90 | void | 
|---|
|  | 91 | -sys_wait_for_child (pid_t child_pid, bool eof) | 
|---|
|  | 92 | +sys_wait_for_child (pid_t child_pid) | 
|---|
|  | 93 | { | 
|---|
|  | 94 | if (child_pid) | 
|---|
|  | 95 | { | 
|---|
|  | 96 | @@ -171,11 +193,8 @@ | 
|---|
|  | 97 | } | 
|---|
|  | 98 |  | 
|---|
|  | 99 | if (WIFSIGNALED (wait_status)) | 
|---|
|  | 100 | -       { | 
|---|
|  | 101 | -         int sig = WTERMSIG (wait_status); | 
|---|
|  | 102 | -         if (!(!eof && sig == SIGPIPE)) | 
|---|
|  | 103 | -           ERROR ((0, 0, _("Child died with signal %d"), sig)); | 
|---|
|  | 104 | -       } | 
|---|
|  | 105 | +       ERROR ((0, 0, _("Child died with signal %d"), | 
|---|
|  | 106 | +               WTERMSIG (wait_status))); | 
|---|
|  | 107 | else if (WEXITSTATUS (wait_status) != 0) | 
|---|
|  | 108 | ERROR ((0, 0, _("Child returned status %d"), | 
|---|
|  | 109 | WEXITSTATUS (wait_status))); | 
|---|