]> Dogcows Code - chaz/tar/blobdiff - src/buffer.c
Relicense under GPLv3
[chaz/tar] / src / buffer.c
index 77ebe272f14b827a26f6506b587787917ee45b11..13e1c139048603bc2e6d5a339b83247754e3a705 100644 (file)
@@ -1,13 +1,13 @@
 /* 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
@@ -121,6 +121,15 @@ static off_t save_totsize; /* total size of file we are writing, only
 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)
 {
@@ -474,6 +483,11 @@ _open_archive (enum access_mode wanted_access)
          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)
     {
@@ -499,12 +513,16 @@ _open_archive (enum access_mode wanted_access)
 
        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;
        }
     }
@@ -1020,7 +1038,8 @@ new_volume (enum access_mode mode)
   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);
 
@@ -1113,23 +1132,24 @@ try_new_volume ()
 {
   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 ();
@@ -1283,7 +1303,7 @@ static void
 _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 ();
@@ -1400,9 +1420,9 @@ add_multi_volume_header (void)
   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 ();
@@ -1589,7 +1609,7 @@ _gnu_flush_write (size_t buffer_level)
   if (!new_volume (ACCESS_WRITE))
     return;
 
-  xheader_destroy (&extended_header);
+  tar_stat_destroy (&dummy);
 
   increase_volume_number ();
   prev_written += bytes_written;
@@ -1607,7 +1627,9 @@ _gnu_flush_write (size_t buffer_level)
   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 ();
This page took 0.023731 seconds and 4 git commands to generate.