]> Dogcows Code - chaz/tar/blobdiff - src/buffer.c
Update
[chaz/tar] / src / buffer.c
index 57b271527ba3d4c64dbad00d04ba92ed9cfb44c2..cea5f253f438e62bdaa65e03565a8e67f9f4ff4d 100644 (file)
@@ -1,13 +1,13 @@
 /* Buffer management for tar.
 
    Copyright (C) 1988, 1992, 1993, 1994, 1996, 1997, 1999, 2000, 2001,
 /* 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
 
    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
    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 */
 
 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)
 {
 void
 mv_begin (struct tar_stat_info *st)
 {
@@ -226,14 +235,16 @@ check_compressed_archive ()
 {
   struct zip_magic const *p;
   bool sfr;
 {
   struct zip_magic const *p;
   bool sfr;
-
+  bool short_file = false;
+  
   /* Prepare global data needed for find_next_block: */
   record_end = record_start; /* set up for 1st record = # 0 */
   sfr = read_full_records;
   read_full_records = true; /* Suppress fatal error on reading a partial
                               record */
   /* Prepare global data needed for find_next_block: */
   record_end = record_start; /* set up for 1st record = # 0 */
   sfr = read_full_records;
   read_full_records = true; /* Suppress fatal error on reading a partial
                               record */
-  find_next_block ();
-
+  if (find_next_block () == 0)
+    short_file = true;
+  
   /* Restore global values */
   read_full_records = sfr;
 
   /* Restore global values */
   read_full_records = sfr;
 
@@ -245,6 +256,9 @@ check_compressed_archive ()
     if (memcmp (record_start->buffer, p->magic, p->length) == 0)
       return p->type;
 
     if (memcmp (record_start->buffer, p->magic, p->length) == 0)
       return p->type;
 
+  if (short_file)
+    ERROR ((0, 0, _("This does not look like a tar archive")));
+
   return ct_none;
 }
 
   return ct_none;
 }
 
@@ -474,6 +488,11 @@ _open_archive (enum access_mode wanted_access)
          abort (); /* Should not happen */
          break;
        }
          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)
     {
     }
   else if (strcmp (archive_name_array[0], "-") == 0)
     {
@@ -499,12 +518,16 @@ _open_archive (enum access_mode wanted_access)
 
        case ACCESS_WRITE:
          archive = STDOUT_FILENO;
 
        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 */
          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;
        }
     }
          break;
        }
     }
@@ -1114,7 +1137,6 @@ try_new_volume ()
 {
   size_t status;
   union block *header;
 {
   size_t status;
   union block *header;
-  struct tar_stat_info dummy;
   int access;
   
   switch (subcommand_option)
   int access;
   
   switch (subcommand_option)
@@ -1286,7 +1308,7 @@ static void
 _write_volume_label (const char *str)
 {
   if (archive_format == POSIX_FORMAT)
 _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 ();
   else
     {
       union block *label = find_next_block ();
@@ -1403,9 +1425,9 @@ add_multi_volume_header (void)
   if (archive_format == POSIX_FORMAT)
     {
       off_t d = real_s_totsize - real_s_sizeleft;
   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 ();
     }
   else
     gnu_add_multi_volume_header ();
@@ -1592,7 +1614,7 @@ _gnu_flush_write (size_t buffer_level)
   if (!new_volume (ACCESS_WRITE))
     return;
 
   if (!new_volume (ACCESS_WRITE))
     return;
 
-  xheader_destroy (&extended_header);
+  tar_stat_destroy (&dummy);
 
   increase_volume_number ();
   prev_written += bytes_written;
 
   increase_volume_number ();
   prev_written += bytes_written;
@@ -1610,7 +1632,9 @@ _gnu_flush_write (size_t buffer_level)
   if (real_s_name)
     add_multi_volume_header ();
 
   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 ();
   if (real_s_name)
     add_chunk_header ();
   header = find_next_block ();
This page took 0.02734 seconds and 4 git commands to generate.