X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2Fbuffer.c;h=06b6901a58efc23f0b4dae90ed3729cd152e3f07;hb=67877f7de264b23f58eb3578e6a189148aab658e;hp=1b36051e19c784f7e5588162c8f7b06a92ea2f3c;hpb=84378fa99ae3ce256fea9eb25d8ae999d1c91fdf;p=chaz%2Ftar diff --git a/src/buffer.c b/src/buffer.c index 1b36051..06b6901 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -20,11 +20,13 @@ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include +#include #include #include #include +#include #include #include @@ -42,6 +44,7 @@ static tarlong prev_written; /* bytes written on previous volumes */ static tarlong bytes_written; /* bytes written on this volume */ static void *record_buffer[2]; /* allocated memory */ +union block *record_buffer_aligned[2]; static int record_index; /* FIXME: The following variables should ideally be static to this @@ -367,10 +370,11 @@ xclose (int fd) static void init_buffer () { - if (!record_buffer[record_index]) - page_aligned_alloc (&record_buffer[record_index], record_size); + if (! record_buffer_aligned[record_index]) + record_buffer_aligned[record_index] = + page_aligned_alloc (&record_buffer[record_index], record_size); - record_start = record_buffer[record_index]; + record_start = record_buffer_aligned[record_index]; current_block = record_start; record_end = record_start + blocking_factor; } @@ -449,7 +453,7 @@ _open_archive (enum access_mode wanted_access) archive = STDIN_FILENO; - type = check_compressed_archive (archive); + type = check_compressed_archive (); if (type != ct_none) FATAL_ERROR ((0, 0, _("Archive is compressed. Use %s option"), @@ -966,6 +970,7 @@ new_volume (enum access_mode mode) { static FILE *read_file; static int looped; + int prompt; if (!read_file && !info_script_option) /* FIXME: if fopen is used, it will never be closed. */ @@ -989,9 +994,10 @@ new_volume (enum access_mode mode) archive_name_cursor = archive_name_array; looped = 1; } + prompt = looped; tryagain: - if (looped) + if (prompt) { /* We have to prompt from now on. */ @@ -1041,6 +1047,7 @@ new_volume (enum access_mode mode) open_warn (*archive_name_cursor); if (!verify_option && mode == ACCESS_WRITE && backup_option) undo_last_backup (); + prompt = 1; goto tryagain; } @@ -1144,9 +1151,19 @@ try_new_volume () if (!continued_file_name || strcmp (continued_file_name, real_s_name)) { - WARN ((0, 0, _("%s is not continued on this volume"), - quote (real_s_name))); - return false; + if ((archive_format == GNU_FORMAT || archive_format == OLDGNU_FORMAT) + && strlen (real_s_name) >= NAME_FIELD_SIZE + && strncmp (continued_file_name, real_s_name, + NAME_FIELD_SIZE) == 0) + WARN ((0, 0, + _("%s is possibly continued on this volume: header contains truncated name"), + quote (real_s_name))); + else + { + WARN ((0, 0, _("%s is not continued on this volume"), + quote (real_s_name))); + return false; + } } s = continued_file_size + continued_file_offset; @@ -1285,10 +1302,10 @@ add_chunk_header () block_ordinal = current_block_ordinal (); blk = start_header (&st); - free (st.orig_file_name); if (!blk) abort (); /* FIXME */ finish_header (&st, blk, block_ordinal); + free (st.orig_file_name); } }