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
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;
}
}
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;
}
\f
+#define EXTRACT_OVER_PIPE (to_stdout_option || to_command_option)
+
/* Prepare to extract a file. Find extractor function.
Return zero if extraction should not proceed. */
{
int rc = 1;
- if (to_stdout_option)
+ if (EXTRACT_OVER_PIPE)
rc = 0;
/* Select the extractor */
/* Take a safety backup of a previously existing file. */
- if (backup_option && !to_stdout_option)
+ if (backup_option && ! EXTRACT_OVER_PIPE)
if (!maybe_backup_file (file_name, 0))
{
int e = errno;