(flush_read): Fixed behavior on short

reads right after opening the new archive (multiv01.sh test).
(new_volume): Special handling for "-".
This commit is contained in:
Sergey Poznyakoff
2003-07-24 14:45:29 +00:00
parent 31d9c7e2a4
commit eb66edaa9f

View File

@@ -1036,13 +1036,52 @@ archive_read_error (void)
return;
}
static void
short_read (ssize_t status)
{
size_t left; /* bytes left */
char *more; /* pointer to next byte to read */
more = record_start->buffer + status;
left = record_size - status;
while (left % BLOCKSIZE != 0
|| (left && status && read_full_records_option))
{
if (status)
while ((status = rmtread (archive, more, left)) < 0)
archive_read_error ();
if (status == 0)
break;
if (! read_full_records_option)
FATAL_ERROR ((0, 0, _("Unaligned block (%lu bytes) in archive"),
(unsigned long) (record_size - left)));
/* User warned us about this. Fix up. */
left -= status;
more += status;
}
/* FIXME: for size=0, multi-volume support. On the first record, warn
about the problem. */
if (!read_full_records_option && verbose_option
&& record_start_block == 0 && status > 0)
WARN ((0, 0, _("Record size = %lu blocks"),
(unsigned long) ((record_size - left) / BLOCKSIZE)));
record_end = record_start + (record_size - left) / BLOCKSIZE;
records_read++;
}
/* Perform a read to flush the buffer. */
void
flush_read (void)
{
ssize_t status; /* result from system call */
size_t left; /* bytes left */
char *more; /* pointer to next byte to read */
if (checkpoint_option && !(++checkpoint % 10))
WARN ((0, 0, _("Read checkpoint %d"), checkpoint));
@@ -1115,7 +1154,7 @@ flush_read (void)
goto vol_error;
}
if (status != record_size)
goto short_read;
short_read (status);
cursor = record_start;
@@ -1189,40 +1228,7 @@ flush_read (void)
goto error_loop; /* try again */
}
short_read:
more = record_start->buffer + status;
left = record_size - status;
while (left % BLOCKSIZE != 0
|| (left && status && read_full_records_option))
{
if (status)
while ((status = rmtread (archive, more, left)) < 0)
archive_read_error ();
if (status == 0)
break;
if (! read_full_records_option)
FATAL_ERROR ((0, 0, _("Unaligned block (%lu bytes) in archive"),
(unsigned long) (record_size - left)));
/* User warned us about this. Fix up. */
left -= status;
more += status;
}
/* FIXME: for size=0, multi-volume support. On the first record, warn
about the problem. */
if (!read_full_records_option && verbose_option
&& record_start_block == 0 && status > 0)
WARN ((0, 0, _("Record size = %lu blocks"),
(unsigned long) ((record_size - left) / BLOCKSIZE)));
record_end = record_start + (record_size - left) / BLOCKSIZE;
records_read++;
short_read (status);
}
/* Flush the current buffer to/from the archive. */
@@ -1551,7 +1557,12 @@ new_volume (enum access_mode access)
}
}
if (verify_option)
if (strcmp (archive_name_cursor[0], "-") == 0)
{
read_full_records_option = true;
archive = STDIN_FILENO;
}
else if (verify_option)
archive = rmtopen (*archive_name_cursor, O_RDWR | O_CREAT, MODE_RW,
rsh_command_option);
else
@@ -1589,3 +1600,4 @@ new_volume (enum access_mode access)
return 1;
}