]> Dogcows Code - chaz/tar/blobdiff - src/buffer.c
Fix multivolume archive creation when volume length=record size.
[chaz/tar] / src / buffer.c
index be0b3784e02897f3c1cd4b8173a5349f584f144f..e590e12834280f52400b3d2a797c7106b0033d39 100644 (file)
@@ -1,7 +1,7 @@
 /* Buffer management for tar.
 
    Copyright (C) 1988, 1992, 1993, 1994, 1996, 1997, 1999, 2000, 2001,
-   2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+   2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
 
    Written by John Gilmore, on 1985-08-25.
 
@@ -1599,13 +1599,15 @@ _gnu_flush_write (size_t buffer_level)
   char *copy_ptr;
   size_t copy_size;
   size_t bufsize;
-
+  tarlong wrt;
+  
   status = _flush_write ();
   if (status != record_size && !multi_volume_option)
     archive_write_error (status);
   else
     {
-      records_written++;
+      if (status)
+       records_written++; 
       bytes_written += status;
     }
 
@@ -1654,6 +1656,7 @@ _gnu_flush_write (size_t buffer_level)
   
   if (real_s_name)
     add_chunk_header ();
+  wrt = bytes_written;
   header = find_next_block ();
   bufsize = available_space_after (header);
   while (bufsize < copy_size)
@@ -1668,6 +1671,16 @@ _gnu_flush_write (size_t buffer_level)
   memcpy (header->buffer, copy_ptr, copy_size);
   memset (header->buffer + copy_size, 0, bufsize - copy_size);
   set_next_block_after (header + (copy_size - 1) / BLOCKSIZE);
+  if (multi_volume_option && wrt < bytes_written)
+    {
+      /* The value of bytes_written has changed while moving data;
+        that means that flush_archive was executed at least once in
+        between, and, as a consequence, copy_size bytes were not written
+        to disk.  We need to update sizeleft variables to compensate for
+         that. */
+      save_sizeleft += copy_size;
+      multi_volume_sync ();
+    }
   find_next_block ();
 }
 
This page took 0.021224 seconds and 4 git commands to generate.