X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;ds=sidebyside;f=src%2Fbuffer.c;h=cea5f253f438e62bdaa65e03565a8e67f9f4ff4d;hb=5416153391152c1d894fbae391ba1ccd6f9d1e0e;hp=57b271527ba3d4c64dbad00d04ba92ed9cfb44c2;hpb=f5504a3bae51922f5adffd348e5e61df2c46bcf3;p=chaz%2Ftar diff --git a/src/buffer.c b/src/buffer.c index 57b2715..cea5f25 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -1,13 +1,13 @@ /* Buffer management for tar. Copyright (C) 1988, 1992, 1993, 1994, 1996, 1997, 1999, 2000, 2001, - 2003, 2004, 2005, 2006 Free Software Foundation, Inc. + 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. Written by John Gilmore, on 1985-08-25. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the - Free Software Foundation; either version 2, or (at your option) any later + Free Software Foundation; either version 3, or (at your option) any later version. This program is distributed in the hope that it will be useful, but @@ -121,6 +121,15 @@ static off_t save_totsize; /* total size of file we are writing, only static off_t save_sizeleft; /* where we are in the file we are writing, only valid if save_name is nonzero */ + +static struct tar_stat_info dummy; + +void +buffer_write_global_xheader () +{ + xheader_write_global (&dummy.xhdr); +} + void mv_begin (struct tar_stat_info *st) { @@ -226,14 +235,16 @@ check_compressed_archive () { struct zip_magic const *p; bool sfr; - + bool short_file = false; + /* Prepare global data needed for find_next_block: */ record_end = record_start; /* set up for 1st record = # 0 */ sfr = read_full_records; read_full_records = true; /* Suppress fatal error on reading a partial record */ - find_next_block (); - + if (find_next_block () == 0) + short_file = true; + /* Restore global values */ read_full_records = sfr; @@ -245,6 +256,9 @@ check_compressed_archive () if (memcmp (record_start->buffer, p->magic, p->length) == 0) return p->type; + if (short_file) + ERROR ((0, 0, _("This does not look like a tar archive"))); + return ct_none; } @@ -474,6 +488,11 @@ _open_archive (enum access_mode wanted_access) abort (); /* Should not happen */ break; } + + if (!index_file_name + && wanted_access == ACCESS_WRITE + && strcmp (archive_name_array[0], "-") == 0) + stdlis = stderr; } else if (strcmp (archive_name_array[0], "-") == 0) { @@ -499,12 +518,16 @@ _open_archive (enum access_mode wanted_access) case ACCESS_WRITE: archive = STDOUT_FILENO; + if (!index_file_name) + stdlis = stderr; break; case ACCESS_UPDATE: archive = STDIN_FILENO; write_archive_to_stdout = true; record_end = record_start; /* set up for 1st record = # 0 */ + if (!index_file_name) + stdlis = stderr; break; } } @@ -1114,7 +1137,6 @@ try_new_volume () { size_t status; union block *header; - struct tar_stat_info dummy; int access; switch (subcommand_option) @@ -1286,7 +1308,7 @@ static void _write_volume_label (const char *str) { if (archive_format == POSIX_FORMAT) - xheader_store ("GNU.volume.label", NULL, str); + xheader_store ("GNU.volume.label", &dummy, str); else { union block *label = find_next_block (); @@ -1403,9 +1425,9 @@ add_multi_volume_header (void) if (archive_format == POSIX_FORMAT) { off_t d = real_s_totsize - real_s_sizeleft; - xheader_store ("GNU.volume.filename", NULL, real_s_name); - xheader_store ("GNU.volume.size", NULL, &real_s_sizeleft); - xheader_store ("GNU.volume.offset", NULL, &d); + xheader_store ("GNU.volume.filename", &dummy, real_s_name); + xheader_store ("GNU.volume.size", &dummy, &real_s_sizeleft); + xheader_store ("GNU.volume.offset", &dummy, &d); } else gnu_add_multi_volume_header (); @@ -1592,7 +1614,7 @@ _gnu_flush_write (size_t buffer_level) if (!new_volume (ACCESS_WRITE)) return; - xheader_destroy (&extended_header); + tar_stat_destroy (&dummy); increase_volume_number (); prev_written += bytes_written; @@ -1610,7 +1632,9 @@ _gnu_flush_write (size_t buffer_level) if (real_s_name) add_multi_volume_header (); - write_extended (true, NULL, find_next_block ()); + write_extended (true, &dummy, find_next_block ()); + tar_stat_destroy (&dummy); + if (real_s_name) add_chunk_header (); header = find_next_block ();