X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fbuffer.c;h=6390d7db401c0194b2443481cfa57e9df75f78e6;hb=e7db56c0ef5db2000c79fc87c96d669c51c6b2e9;hp=01f1f7017b3bbc118f8b44a4a68c6066fef81fe3;hpb=2d57bb240d22259f0e2af3a36e7314f4cacf2434;p=chaz%2Ftar diff --git a/src/buffer.c b/src/buffer.c index 01f1f70..6390d7d 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -177,8 +177,7 @@ static struct zip_magic magic[] = { #define compress_option(t) magic[t].option #define compress_program(t) magic[t].program -/* Check if the file FD is a compressed archive. FD is guaranteed to - represent a local file */ +/* Check if the file ARCHIVE is a compressed archive. */ enum compress_type check_compressed_archive () { @@ -200,16 +199,13 @@ check_compressed_archive () read_full_records = sfr; reading_from_pipe = srp; - if (tar_checksum (record_start) == HEADER_SUCCESS) + if (tar_checksum (record_start, true) == HEADER_SUCCESS) /* Probably a valid header */ return ct_none; for (p = magic + 1; p < magic + NMAGIC; p++) if (memcmp (record_start->buffer, p->magic, p->length) == 0) - { - hit_eof = false; /* It might have been set by find_next_block */ - return p->type; - } + return p->type; return ct_none; } @@ -220,26 +216,29 @@ check_compressed_archive () int open_compressed_archive () { - enum compress_type type; - - int fd = rmtopen (archive_name_array[0], O_RDONLY | O_BINARY, - MODE_RW, rsh_command_option); - if (fd == -1 || _isrmt (fd)) - return fd; + archive = rmtopen (archive_name_array[0], O_RDONLY | O_BINARY, + MODE_RW, rsh_command_option); + if (archive == -1) + return archive; - archive = fd; - type = check_compressed_archive (); + if (!multi_volume_option) + { + enum compress_type type = check_compressed_archive (); - if (type == ct_none) - return fd; + if (type == ct_none) + return archive; + + /* FD is not needed any more */ + rmtclose (archive); - /* FD is not needed any more */ - rmtclose (fd); + hit_eof = false; /* It might have been set by find_next_block in + check_compressed_archive */ - /* Open compressed archive */ - use_compress_program_option = compress_program (type); - child_pid = sys_child_open_for_uncompress (); - read_full_records = reading_from_pipe = true; + /* Open compressed archive */ + use_compress_program_option = compress_program (type); + 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 */