aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/comp/compressor.c4
-rw-r--r--lib/sqfs/data_reader.c17
-rw-r--r--lib/sqfs/frag_reader.c19
-rw-r--r--lib/sqfs/id_table_read.c10
-rw-r--r--lib/sqfs/meta_reader.c11
-rw-r--r--lib/sqfs/read_super.c8
6 files changed, 24 insertions, 45 deletions
diff --git a/lib/comp/compressor.c b/lib/comp/compressor.c
index ce88bdd..fd67257 100644
--- a/lib/comp/compressor.c
+++ b/lib/comp/compressor.c
@@ -77,8 +77,8 @@ int generic_read_options(int fd, void *data, size_t size)
{
uint8_t buffer[size + 2];
- if (read_data("reading compressor options",
- fd, buffer, sizeof(buffer))) {
+ if (read_data_at("reading compressor options", sizeof(sqfs_super_t),
+ fd, buffer, sizeof(buffer))) {
return -1;
}
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;
diff --git a/lib/sqfs/frag_reader.c b/lib/sqfs/frag_reader.c
index 87e4c35..721286c 100644
--- a/lib/sqfs/frag_reader.c
+++ b/lib/sqfs/frag_reader.c
@@ -31,11 +31,6 @@ static int precache_block(frag_reader_t *f, size_t i)
if (i == f->current_index)
return 0;
- if (lseek(f->fd, f->tbl[i].start_offset, SEEK_SET) == (off_t)-1) {
- perror("seeking to fragment location");
- return -1;
- }
-
compressed = (f->tbl[i].size & (1 << 24)) == 0;
size = f->tbl[i].size & ((1 << 24) - 1);
@@ -44,8 +39,10 @@ static int precache_block(frag_reader_t *f, size_t i)
return -1;
}
- if (read_data("reading fragment", f->fd, f->buffer, size))
+ if (read_data_at("reading fragment", f->tbl[i].start_offset,
+ f->fd, f->buffer, size)) {
return -1;
+ }
if (compressed) {
ret = f->cmp->do_block(f->cmp, f->buffer, size,
@@ -95,11 +92,8 @@ frag_reader_t *frag_reader_create(sqfs_super_t *super, int fd,
goto fail_rd;
/* read the meta block offset table */
- if (lseek(fd, super->fragment_table_start, SEEK_SET) == (off_t)-1)
- goto fail_seek;
-
- if (read_data("reading fragment table", fd, locations,
- blockcount * sizeof(locations[0]))) {
+ if (read_data_at("reading fragment table", super->fragment_table_start,
+ fd, locations, blockcount * sizeof(locations[0]))) {
goto fail;
}
@@ -139,9 +133,6 @@ frag_reader_t *frag_reader_create(sqfs_super_t *super, int fd,
f->block_size = super->block_size;
f->current_index = count;
return f;
-fail_seek:
- perror("seek to fragment table");
- goto fail;
fail_rd:
perror("reading fragment table");
goto fail;
diff --git a/lib/sqfs/id_table_read.c b/lib/sqfs/id_table_read.c
index 7147f2e..1e92f75 100644
--- a/lib/sqfs/id_table_read.c
+++ b/lib/sqfs/id_table_read.c
@@ -38,15 +38,12 @@ int id_table_read(id_table_t *tbl, int fd, sqfs_super_t *super,
tbl->num_ids = super->id_count;
tbl->max_ids = super->id_count;
- if (lseek(fd, super->id_table_start, SEEK_SET) == (off_t)-1)
- goto fail_seek;
-
block_count = super->id_count / 2048;
if (super->id_count % 2048)
++block_count;
- if (read_data("reading ID table", fd, blocks,
- sizeof(blocks[0]) * block_count)) {
+ if (read_data_at("reading ID table", super->id_table_start, fd,
+ blocks, sizeof(blocks[0]) * block_count)) {
return -1;
}
@@ -82,7 +79,4 @@ int id_table_read(id_table_t *tbl, int fd, sqfs_super_t *super,
fail_meta:
meta_reader_destroy(m);
return -1;
-fail_seek:
- perror("seeking to ID table");
- return -1;
}
diff --git a/lib/sqfs/meta_reader.c b/lib/sqfs/meta_reader.c
index 96b59fd..2c6ec97 100644
--- a/lib/sqfs/meta_reader.c
+++ b/lib/sqfs/meta_reader.c
@@ -68,14 +68,11 @@ int meta_reader_seek(meta_reader_t *m, uint64_t block_start, size_t offset)
return 0;
}
- if (lseek(m->fd, block_start, SEEK_SET) == (off_t)-1) {
- perror("seek on image file");
+ if (read_data_at("reading meta data header", block_start,
+ m->fd, &header, 2)) {
return -1;
}
- if (read_data("reading meta data header", m->fd, &header, 2))
- return -1;
-
header = le16toh(header);
compressed = (header & 0x8000) == 0;
size = header & 0x7FFF;
@@ -92,8 +89,10 @@ int meta_reader_seek(meta_reader_t *m, uint64_t block_start, size_t offset)
memset(m->data, 0, sizeof(m->data));
- if (read_data("reading meta data block", m->fd, m->data, size))
+ if (read_data_at("reading meta data block", block_start + 2,
+ m->fd, m->data, size)) {
return -1;
+ }
if (compressed) {
ret = m->cmp->do_block(m->cmp, m->data, size,
diff --git a/lib/sqfs/read_super.c b/lib/sqfs/read_super.c
index 1a84ff9..fff3d50 100644
--- a/lib/sqfs/read_super.c
+++ b/lib/sqfs/read_super.c
@@ -15,10 +15,7 @@ int sqfs_super_read(sqfs_super_t *super, int fd)
sqfs_super_t temp;
int i;
- if (lseek(fd, 0, SEEK_SET) == (off_t)-1)
- goto fail_seek;
-
- if (read_data("reading super block", fd, &temp, sizeof(temp)))
+ if (read_data_at("reading super block", 0, fd, &temp, sizeof(temp)))
return -1;
temp.magic = le32toh(temp.magic);
@@ -87,7 +84,4 @@ int sqfs_super_read(sqfs_super_t *super, int fd)
memcpy(super, &temp, sizeof(temp));
return 0;
-fail_seek:
- perror("squashfs writing super block: seek on output file");
- return -1;
}