diff options
Diffstat (limited to 'lib/sqfs/data_reader.c')
-rw-r--r-- | lib/sqfs/data_reader.c | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/lib/sqfs/data_reader.c b/lib/sqfs/data_reader.c index 4fbd97a..e03a436 100644 --- a/lib/sqfs/data_reader.c +++ b/lib/sqfs/data_reader.c @@ -65,6 +65,7 @@ int data_reader_dump_file(data_reader_t *data, file_info_t *fi, int outfd, bool allow_sparse) { size_t i, count, fragsz, unpackedsz; + off_t sqfs_location; uint64_t filesz = 0; bool compressed; uint32_t bs; @@ -81,8 +82,7 @@ int data_reader_dump_file(data_reader_t *data, file_info_t *fi, int outfd, } if (count > 0) { - if (lseek(data->sqfsfd, fi->startblock, SEEK_SET) == (off_t)-1) - goto fail_seek; + sqfs_location = fi->startblock; for (i = 0; i < count; ++i) { bs = fi->blocksizes[i]; @@ -112,9 +112,13 @@ int data_reader_dump_file(data_reader_t *data, file_info_t *fi, int outfd, if (bs == 0) { memset(data->buffer, 0, unpackedsz); compressed = false; - } else if (read_data("reading data block", - data->sqfsfd, data->buffer, bs)) { - return -1; + } else { + if (read_data_at("reading data block", + sqfs_location, data->sqfsfd, + data->buffer, bs)) { + return -1; + } + sqfs_location += bs; } if (compressed) { @@ -157,9 +161,6 @@ int data_reader_dump_file(data_reader_t *data, file_info_t *fi, int outfd, fail_sparse: perror("creating sparse output file"); return -1; -fail_seek: - perror("seek on squashfs"); - return -1; fail_bs: fputs("found compressed block larger than block size\n", stderr); return -1; |