The unsigned char * pointer ran afoul of pedantic C compilers, and
we didn't need pointers anyway. Put the size field before the
data to avoid unnecessary padding. All uses changed.
(magic) Make it const, since it doesn't change. All uses changed.
/* 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 Free Software Foundation, Inc.
+ 2003, 2004, 2005 Free Software Foundation, Inc.
Written by John Gilmore, on 1985-08-25.
Written by John Gilmore, on 1985-08-25.
struct zip_magic
{
enum compress_type type;
struct zip_magic
{
enum compress_type type;
- char *program;
- char *option;
+ char magic[sizeof "BZh" - 1];
+ char program[sizeof "compress"];
+ char option[sizeof "-Z"];
-static struct zip_magic magic[] = {
+static struct zip_magic const magic[] = {
- { ct_compress, "\037\235", 2, "compress", "-Z" },
- { ct_gzip, "\037\213", 2, "gzip", "-z" },
- { ct_bzip2, "BZh", 3, "bzip2", "-j" },
+ { ct_compress, 2, "\037\235", "compress", "-Z" },
+ { ct_gzip, 2, "\037\213", "gzip", "-z" },
+ { ct_bzip2, 3, "BZh", "bzip2", "-j" },
};
#define NMAGIC (sizeof(magic)/sizeof(magic[0]))
};
#define NMAGIC (sizeof(magic)/sizeof(magic[0]))
#define compress_program(t) magic[t].program
/* Check if the file ARCHIVE is a compressed archive. */
#define compress_program(t) magic[t].program
/* Check if the file ARCHIVE is a compressed archive. */
check_compressed_archive ()
{
check_compressed_archive ()
{
+ struct zip_magic const *p;
bool sfr, srp;
/* Prepare global data needed for find_next_block: */
bool sfr, srp;
/* Prepare global data needed for find_next_block: */
for (p = magic + 1; p < magic + NMAGIC; p++)
if (memcmp (record_start->buffer, p->magic, p->length) == 0)
return p->type;
for (p = magic + 1; p < magic + NMAGIC; p++)
if (memcmp (record_start->buffer, p->magic, p->length) == 0)
return p->type;
if (archive == -1)
return archive;
if (archive == -1)
return archive;
- if (!multi_volume_option)
+ if (!multi_volume_option)
{
enum compress_type type = check_compressed_archive ();
{
enum compress_type type = check_compressed_archive ();
if (type == ct_none)
return archive;
if (type == ct_none)
return archive;
child_pid = sys_child_open_for_uncompress ();
read_full_records = reading_from_pipe = true;
}
child_pid = sys_child_open_for_uncompress ();
read_full_records = reading_from_pipe = true;
}
records_read = 0;
record_end = record_start; /* set up for 1st record = # 0 */
records_read = 0;
record_end = record_start; /* set up for 1st record = # 0 */
char bytes[sizeof (tarlong) * CHAR_BIT];
char abbr[LONGEST_HUMAN_READABLE + 1];
char rate[LONGEST_HUMAN_READABLE + 1];
char bytes[sizeof (tarlong) * CHAR_BIT];
char abbr[LONGEST_HUMAN_READABLE + 1];
char rate[LONGEST_HUMAN_READABLE + 1];
int human_opts = human_autoscale | human_base_1024 | human_SI | human_B;
sprintf (bytes, TARLONG_FORMAT, written);
int human_opts = human_autoscale | human_base_1024 | human_SI | human_B;
sprintf (bytes, TARLONG_FORMAT, written);
read_full_records = read_full_records_option;
reading_from_pipe = false;
read_full_records = read_full_records_option;
reading_from_pipe = false;
if (use_compress_program_option)
{
switch (wanted_access)
if (use_compress_program_option)
{
switch (wanted_access)
case ACCESS_READ:
{
enum compress_type type;
case ACCESS_READ:
{
enum compress_type type;
archive = STDIN_FILENO;
type = check_compressed_archive (archive);
archive = STDIN_FILENO;
type = check_compressed_archive (archive);
if (checkpoint_option && !(++checkpoint % 10))
/* TRANSLATORS: This is a ``checkpoint of write operation'',
if (checkpoint_option && !(++checkpoint % 10))
/* TRANSLATORS: This is a ``checkpoint of write operation'',
- *not* ``Writing a checkpoint''.
+ *not* ``Writing a checkpoint''.
E.g. in Spanish ``Punto de comprobaci@'on de escritura'',
*not* ``Escribiendo un punto de comprobaci@'on'' */
WARN ((0, 0, _("Write checkpoint %d"), checkpoint));
E.g. in Spanish ``Punto de comprobaci@'on de escritura'',
*not* ``Escribiendo un punto de comprobaci@'on'' */
WARN ((0, 0, _("Write checkpoint %d"), checkpoint));
FATAL_ERROR ((0, 0,
_("%s: file name too long to be stored in a GNU multivolume header"),
quotearg_colon (real_s_name)));
FATAL_ERROR ((0, 0,
_("%s: file name too long to be stored in a GNU multivolume header"),
quotearg_colon (real_s_name)));
memset (record_start, 0, BLOCKSIZE);
/* FIXME: Michael P Urban writes: [a long name file] is being written
memset (record_start, 0, BLOCKSIZE);
/* FIXME: Michael P Urban writes: [a long name file] is being written
OFF_TO_CHARS (real_s_sizeleft, record_start->header.size);
OFF_TO_CHARS (real_s_totsize - real_s_sizeleft,
record_start->oldgnu_header.offset);
OFF_TO_CHARS (real_s_sizeleft, record_start->header.size);
OFF_TO_CHARS (real_s_totsize - real_s_sizeleft,
record_start->oldgnu_header.offset);
tmp = verbose_option;
verbose_option = 0;
finish_header (¤t_stat_info, record_start, -1);
tmp = verbose_option;
verbose_option = 0;
finish_header (¤t_stat_info, record_start, -1);
off_t offset;
off_t nrec, nblk;
off_t skipped = (blocking_factor - (current_block - record_start));
off_t offset;
off_t nrec, nblk;
off_t skipped = (blocking_factor - (current_block - record_start));
size -= skipped * BLOCKSIZE;
size -= skipped * BLOCKSIZE;
if (size < record_size)
return 0;
/* FIXME: flush? */
if (size < record_size)
return 0;
/* FIXME: flush? */
/* Compute number of records to skip */
nrec = size / record_size;
offset = rmtlseek (archive, nrec * record_size, SEEK_CUR);
/* Compute number of records to skip */
nrec = size / record_size;
offset = rmtlseek (archive, nrec * record_size, SEEK_CUR);
records_read += nblk / blocking_factor;
record_start_block = offset - blocking_factor;
current_block = record_end;
records_read += nblk / blocking_factor;
record_start_block = offset - blocking_factor;
current_block = record_end;
sys_drain_input_pipe ();
compute_duration ();
sys_drain_input_pipe ();
compute_duration ();
verify_volume ();
if (rmtclose (archive) != 0)
verify_volume ();
if (rmtclose (archive) != 0)