(read_and): Invoke apply_nonancestor_delayed_set_stat on file names

after handling them.
(list_archive): Use consistent message for unexpected EOF.
Use error message functions to report errors consistently.
(read_header): Use xalloc_die to report memory exhaustion.
Use consistent message for unexpected EOF.
(decode_mode): Remove; moved to misc.c.
(skip_file): Use consistent message for unexpected EOF.
(skip_extended_headers): Likewise.
This commit is contained in:
Paul Eggert
2000-01-07 19:25:23 +00:00
parent f74454cb37
commit c18999bad5

View File

@@ -89,43 +89,45 @@ read_and (void (*do_something) ())
/* Valid header. We should decode next field (mode) first.
Ensure incoming names are null terminated. */
if (!name_match (current_file_name)
if (! name_match (current_file_name)
|| (newer_mtime_option != TYPE_MINIMUM (time_t)
/* FIXME: We get mtime now, and again later; this
causes duplicate diagnostics if header.mtime is
bogus. */
/* FIXME: We get mtime now, and again later; this causes
duplicate diagnostics if header.mtime is bogus. */
&& ((current_stat.st_mtime
= TIME_FROM_HEADER (current_header->header.mtime))
< newer_mtime_option))
|| excluded_name (current_file_name))
{
char save_typeflag;
if (current_header->header.typeflag == GNUTYPE_VOLHDR
|| current_header->header.typeflag == GNUTYPE_MULTIVOL
|| current_header->header.typeflag == GNUTYPE_NAMES)
char save_typeflag = current_header->header.typeflag;
switch (save_typeflag)
{
(*do_something) ();
case GNUTYPE_VOLHDR:
case GNUTYPE_MULTIVOL:
case GNUTYPE_NAMES:
break;
case DIRTYPE:
if (show_omitted_dirs_option)
WARN ((0, 0, _("%s: Omitting"),
quotearg_colon (current_file_name)));
/* Fall through. */
default:
/* Skip past it in the archive. */
set_next_block_after (current_header);
if (current_header->oldgnu_header.isextended)
skip_extended_headers ();
/* Skip to the next header on the archive. */
if (save_typeflag != DIRTYPE)
skip_file (current_stat.st_size);
continue;
}
if (show_omitted_dirs_option
&& current_header->header.typeflag == DIRTYPE)
WARN ((0, 0, _("Omitting %s"), quote (current_file_name)));
/* Skip past it in the archive. */
save_typeflag = current_header->header.typeflag;
set_next_block_after (current_header);
if (current_header->oldgnu_header.isextended)
skip_extended_headers ();
/* Skip to the next header on the archive. */
if (save_typeflag != DIRTYPE)
skip_file (current_stat.st_size);
continue;
}
}
apply_nonancestor_delayed_set_stat (current_file_name);
(*do_something) ();
continue;
@@ -177,7 +179,7 @@ read_and (void (*do_something) ())
break;
}
apply_delayed_set_stat ("");
apply_delayed_set_stat ();
close_archive ();
names_notfound (); /* print names not found */
}
@@ -217,7 +219,7 @@ list_archive (void)
data_block = find_next_block ();
if (!data_block)
{
ERROR ((0, 0, _("EOF in archive file")));
ERROR ((0, 0, _("Unexpected EOF in archive")));
break; /* FIXME: What happens, then? */
}
written = available_space_after (data_block);
@@ -229,10 +231,7 @@ list_archive (void)
(data_block->buffer + written - 1));
if (check != written)
{
int e = errno;
ERROR ((0, e, _("Only wrote %lu of %lu bytes to file %s"),
(unsigned long) check,
(unsigned long) written, quote (current_file_name)));
write_error_details (current_file_name, check, written);
skip_file (size - written);
break;
}
@@ -359,7 +358,7 @@ read_header (void)
free (*longp);
size = current_stat.st_size;
if (size != current_stat.st_size)
FATAL_ERROR ((0, 0, _("Memory exhausted")));
xalloc_die ();
bp = *longp = xmalloc (size);
for (; size > 0; size -= written)
@@ -367,7 +366,7 @@ read_header (void)
data_block = find_next_block ();
if (! data_block)
{
ERROR ((0, 0, _("Unexpected EOF on archive file")));
ERROR ((0, 0, _("Unexpected EOF in archive")));
break;
}
written = available_space_after (data_block);
@@ -868,32 +867,6 @@ tartime (time_t t)
return p;
}
/*-------------------------------------------------------------------------.
| Decode MODE from its binary form in a stat structure, and encode it into |
| a 9 characters string STRING, terminated with a NUL. |
`-------------------------------------------------------------------------*/
static void
decode_mode (mode_t mode, char *string)
{
*string++ = mode & S_IRUSR ? 'r' : '-';
*string++ = mode & S_IWUSR ? 'w' : '-';
*string++ = (mode & S_ISUID
? (mode & S_IXUSR ? 's' : 'S')
: (mode & S_IXUSR ? 'x' : '-'));
*string++ = mode & S_IRGRP ? 'r' : '-';
*string++ = mode & S_IWGRP ? 'w' : '-';
*string++ = (mode & S_ISGID
? (mode & S_IXGRP ? 's' : 'S')
: (mode & S_IXGRP ? 'x' : '-'));
*string++ = mode & S_IROTH ? 'r' : '-';
*string++ = mode & S_IWOTH ? 'w' : '-';
*string++ = (mode & S_ISVTX
? (mode & S_IXOTH ? 't' : 'T')
: (mode & S_IXOTH ? 'x' : '-'));
*string = '\0';
}
/*-------------------------------------------------------------------------.
| Actually print it. |
| |
@@ -1153,7 +1126,7 @@ skip_file (off_t size)
{
x = find_next_block ();
if (! x)
FATAL_ERROR ((0, 0, _("Unexpected EOF on archive file")));
FATAL_ERROR ((0, 0, _("Unexpected EOF in archive")));
set_next_block_after (x);
size -= BLOCKSIZE;
@@ -1175,7 +1148,7 @@ skip_extended_headers (void)
{
exhdr = find_next_block ();
if (!exhdr)
FATAL_ERROR ((0, 0, _("Unexpected EOF on archive file")));
FATAL_ERROR ((0, 0, _("Unexpected EOF in archive")));
set_next_block_after (exhdr);
}
while (exhdr->sparse_header.isextended);