[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))); |
---|