summaryrefslogtreecommitdiff
path: root/src/buffer.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/buffer.c')
-rw-r--r--src/buffer.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/src/buffer.c b/src/buffer.c
index be0b3784..e590e128 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -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 ();
}