X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fextract.c;h=2247de9b206106b24d610ca3281b19382d34137f;hb=29c902bc4949f6020df6470aa1115ce15dab802a;hp=3f4eb06ad6e75c13d1419b97b592e114bc8782f3;hpb=5179c0b5e6a658ff002916058f95f246ed3216c8;p=chaz%2Ftar diff --git a/src/extract.c b/src/extract.c index 3f4eb06..2247de9 100644 --- a/src/extract.c +++ b/src/extract.c @@ -684,6 +684,15 @@ extract_file (char *file_name, int typeflag) if (to_stdout_option) fd = STDOUT_FILENO; + else if (to_command_option) + { + fd = sys_exec_command (file_name, 'f', ¤t_stat_info); + if (fd < 0) + { + skip_member (); + return 0; + } + } else { do @@ -704,7 +713,7 @@ extract_file (char *file_name, int typeflag) { if (multi_volume_option) { - assign_string (&save_name, current_stat_info.file_name); + assign_string (&save_name, current_stat_info.orig_file_name); save_totsize = current_stat_info.stat.st_size; save_sizeleft = size; } @@ -726,14 +735,15 @@ extract_file (char *file_name, int typeflag) written = size; errno = 0; count = full_write (fd, data_block->buffer, written); - size -= count; + size -= written; set_next_block_after ((union block *) (data_block->buffer + written - 1)); if (count != written) { - write_error_details (file_name, count, written); /* FIXME: shouldn't we - restore from backup? */ + if (!to_command_option) + write_error_details (file_name, count, written); + /* FIXME: shouldn't we restore from backup? */ break; } } @@ -753,10 +763,13 @@ extract_file (char *file_name, int typeflag) if (status < 0) close_error (file_name); - set_stat (file_name, ¤t_stat_info.stat, 0, 0, - (old_files_option == OVERWRITE_OLD_FILES ? - UNKNOWN_PERMSTATUS : ARCHIVED_PERMSTATUS), - typeflag); + if (to_command_option) + sys_wait_command (); + else + set_stat (file_name, ¤t_stat_info.stat, 0, 0, + (old_files_option == OVERWRITE_OLD_FILES ? + UNKNOWN_PERMSTATUS : ARCHIVED_PERMSTATUS), + typeflag); return status; } @@ -976,7 +989,7 @@ prepare_to_extract (char const *file_name, int typeflag, tar_extractor_t *fun) { int rc = 1; - if (to_stdout_option) + if (EXTRACT_OVER_PIPE) rc = 0; /* Select the extractor */ @@ -1059,7 +1072,7 @@ prepare_to_extract (char const *file_name, int typeflag, tar_extractor_t *fun) default: WARN ((0, 0, - _("%s: Unknown file type '%c', extracted as normal file"), + _("%s: Unknown file type `%c', extracted as normal file"), quotearg_colon (file_name), typeflag)); *fun = extract_file; } @@ -1134,7 +1147,7 @@ extract_archive (void) /* Take a safety backup of a previously existing file. */ - if (backup_option && !to_stdout_option) + if (backup_option) if (!maybe_backup_file (file_name, 0)) { int e = errno;