/* Buffer management for tar.
Copyright (C) 1988, 1992, 1993, 1994, 1996, 1997, 1999, 2000, 2001,
- 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
+ 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
Written by John Gilmore, on 1985-08-25.
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
- Free Software Foundation; either version 2, or (at your option) any later
+ Free Software Foundation; either version 3, or (at your option) any later
version.
This program is distributed in the hope that it will be useful, but
static off_t save_sizeleft; /* where we are in the file we are writing,
only valid if save_name is nonzero */
+\f
+static struct tar_stat_info dummy;
+
+void
+buffer_write_global_xheader ()
+{
+ xheader_write_global (&dummy.xhdr);
+}
+
void
mv_begin (struct tar_stat_info *st)
{
abort (); /* Should not happen */
break;
}
+
+ if (!index_file_name
+ && wanted_access == ACCESS_WRITE
+ && strcmp (archive_name_array[0], "-") == 0)
+ stdlis = stderr;
}
else if (strcmp (archive_name_array[0], "-") == 0)
{
case ACCESS_WRITE:
archive = STDOUT_FILENO;
+ if (!index_file_name)
+ stdlis = stderr;
break;
case ACCESS_UPDATE:
archive = STDIN_FILENO;
write_archive_to_stdout = true;
record_end = record_start; /* set up for 1st record = # 0 */
+ if (!index_file_name)
+ stdlis = stderr;
break;
}
}
assign_string (&volume_label, NULL);
assign_string (&continued_file_name, NULL);
continued_file_size = continued_file_offset = 0;
-
+ current_block = record_start;
+
if (rmtclose (archive) != 0)
close_warn (*archive_name_cursor);
{
size_t status;
union block *header;
- struct tar_stat_info dummy;
-
+ int access;
+
switch (subcommand_option)
{
case APPEND_SUBCOMMAND:
case CAT_SUBCOMMAND:
case UPDATE_SUBCOMMAND:
- if (!new_volume (ACCESS_UPDATE))
- return true;
+ access = ACCESS_UPDATE;
break;
default:
- if (!new_volume (ACCESS_READ))
- return true;
+ access = ACCESS_READ;
break;
}
+ if (!new_volume (access))
+ return true;
+
while ((status = rmtread (archive, record_start->buffer, record_size))
== SAFE_READ_ERROR)
archive_read_error ();
_write_volume_label (const char *str)
{
if (archive_format == POSIX_FORMAT)
- xheader_store ("GNU.volume.label", NULL, str);
+ xheader_store ("GNU.volume.label", &dummy, str);
else
{
union block *label = find_next_block ();
if (archive_format == POSIX_FORMAT)
{
off_t d = real_s_totsize - real_s_sizeleft;
- xheader_store ("GNU.volume.filename", NULL, real_s_name);
- xheader_store ("GNU.volume.size", NULL, &real_s_sizeleft);
- xheader_store ("GNU.volume.offset", NULL, &d);
+ xheader_store ("GNU.volume.filename", &dummy, real_s_name);
+ xheader_store ("GNU.volume.size", &dummy, &real_s_sizeleft);
+ xheader_store ("GNU.volume.offset", &dummy, &d);
}
else
gnu_add_multi_volume_header ();
if (!new_volume (ACCESS_WRITE))
return;
- xheader_destroy (&extended_header);
+ tar_stat_destroy (&dummy);
increase_volume_number ();
prev_written += bytes_written;
if (real_s_name)
add_multi_volume_header ();
- write_extended (true, NULL, find_next_block ());
+ write_extended (true, &dummy, find_next_block ());
+ tar_stat_destroy (&dummy);
+
if (real_s_name)
add_chunk_header ();
header = find_next_block ();