X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fbuffer.c;h=80bbe829b4d031ed0ea7b47a527f818515550e4b;hb=ba08e339a6e05e2a0d1432efdadd67ff2c63f834;hp=f3cebc0aed908a5450a26404c927fd817164f2ae;hpb=2bda83b48d8a6807632312403561b11b79048443;p=chaz%2Ftar diff --git a/src/buffer.c b/src/buffer.c index f3cebc0..80bbe82 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -293,7 +293,6 @@ open_archive (enum access_mode wanted_access) { case ACCESS_READ: child_pid = sys_child_open_for_uncompress (); - read_full_records_option = false; break; case ACCESS_WRITE: @@ -889,6 +888,42 @@ backspace_output (void) } } +off_t +seek_archive (off_t size) +{ + off_t start = current_block_ordinal (); + off_t offset; + off_t nrec, nblk; + off_t skipped = (blocking_factor - (current_block - record_start)); + + size -= skipped * BLOCKSIZE; + + 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); + if (offset < 0) + return offset; + + if (offset % record_size) + FATAL_ERROR ((0, 0, _("rmtlseek not stopped at a record boundary"))); + + /* Convert to number of records */ + offset /= BLOCKSIZE; + /* Compute number of skipped blocks */ + nblk = offset - start; + + /* Update buffering info */ + records_read += nblk / blocking_factor; + record_start_block = offset - blocking_factor; + current_block = record_end; + + return nblk; +} + /* Close the archive file. */ void close_archive (void)