#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 ()
{
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;
}
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 */