summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--difftool/node_compare.c3
-rw-r--r--extras/browse.c14
-rw-r--r--extras/list_files.c4
-rw-r--r--extras/mk42sqfs.c5
-rw-r--r--extras/mknastyfs.c3
-rw-r--r--include/sqfs/inode.h24
-rw-r--r--lib/common/data_reader_dump.c3
-rw-r--r--lib/common/serialize_fstree.c1
-rw-r--r--lib/sqfs/data_reader.c15
-rw-r--r--lib/sqfs/data_writer/block.c2
-rw-r--r--lib/sqfs/data_writer/fileapi.c2
-rw-r--r--lib/sqfs/dir_writer.c3
-rw-r--r--lib/sqfs/inode.c3
-rw-r--r--lib/sqfs/read_inode.c19
-rw-r--r--lib/sqfs/write_inode.c9
-rw-r--r--mkfs/mkfs.c1
-rw-r--r--tar/sqfs2tar.c2
-rw-r--r--tar/tar2sqfs.c1
-rw-r--r--unpack/describe.c3
-rw-r--r--unpack/list_files.c7
-rw-r--r--unpack/restore_fstree.c4
21 files changed, 52 insertions, 76 deletions
diff --git a/difftool/node_compare.c b/difftool/node_compare.c
index d9ccf34..59d1831 100644
--- a/difftool/node_compare.c
+++ b/difftool/node_compare.c
@@ -150,7 +150,8 @@ int node_compare(sqfsdiff_t *sd, sqfs_tree_node_t *a, sqfs_tree_node_t *b)
break;
case SQFS_INODE_SLINK:
case SQFS_INODE_EXT_SLINK:
- if (strcmp(a->inode->slink_target, b->inode->slink_target)) {
+ if (strcmp((const char *)a->inode->extra,
+ (const char *)b->inode->extra)) {
fprintf(stdout, "%s has a different link target\n",
path);
}
diff --git a/extras/browse.c b/extras/browse.c
index 1d6417f..1cd2cf1 100644
--- a/extras/browse.c
+++ b/extras/browse.c
@@ -293,13 +293,13 @@ static void stat_cmd(const char *filename)
case SQFS_INODE_SLINK:
printf("Hard link count: %u\n", inode->data.slink.nlink);
printf("Link target: %.*s\n", inode->data.slink.target_size,
- inode->slink_target);
+ (const char *)inode->extra);
break;
case SQFS_INODE_EXT_SLINK:
printf("Hard link count: %u\n", inode->data.slink_ext.nlink);
printf("Xattr index: 0x%X\n", inode->data.slink_ext.xattr_idx);
- printf("Link target: %.*s\n",
- inode->data.slink_ext.target_size, inode->slink_target);
+ printf("Link target: %.*s\n", inode->data.slink_ext.target_size,
+ (const char *)inode->extra);
break;
case SQFS_INODE_FILE:
printf("Blocks start: %u\n", inode->data.file.blocks_start);
@@ -313,8 +313,8 @@ static void stat_cmd(const char *filename)
for (i = 0; i < inode->num_file_blocks; ++i) {
printf("\tBlock #%lu size: %u (%s)\n", (unsigned long)i,
- inode->block_sizes[i] & 0x00FFFFFF,
- inode->block_sizes[i] & (1 << 24) ?
+ inode->extra[i] & 0x00FFFFFF,
+ inode->extra[i] & (1 << 24) ?
"uncompressed" : "compressed");
}
break;
@@ -334,8 +334,8 @@ static void stat_cmd(const char *filename)
for (i = 0; i < inode->num_file_blocks; ++i) {
printf("\tBlock #%lu size: %u (%s)\n", (unsigned long)i,
- inode->block_sizes[i] & 0x00FFFFFF,
- inode->block_sizes[i] & (1 << 24) ?
+ inode->extra[i] & 0x00FFFFFF,
+ inode->extra[i] & (1 << 24) ?
"compressed" : "uncompressed");
}
break;
diff --git a/extras/list_files.c b/extras/list_files.c
index 3f6725a..16fe360 100644
--- a/extras/list_files.c
+++ b/extras/list_files.c
@@ -34,10 +34,10 @@ static void write_tree_dfs(const sqfs_tree_node_t *n)
if (n->inode->base.type == SQFS_INODE_SLINK) {
printf(" ⭢ %.*s", n->inode->data.slink.target_size,
- n->inode->slink_target);
+ (const char *)n->inode->extra);
} else if (n->inode->base.type == SQFS_INODE_EXT_SLINK) {
printf(" ⭢ %.*s", n->inode->data.slink_ext.target_size,
- n->inode->slink_target);
+ (const char *)n->inode->extra);
}
fputc('\n', stdout);
diff --git a/extras/mk42sqfs.c b/extras/mk42sqfs.c
index 25c9047..1c55bf1 100644
--- a/extras/mk42sqfs.c
+++ b/extras/mk42sqfs.c
@@ -42,8 +42,7 @@ static sqfs_inode_generic_t *create_file_inode(sqfs_id_table_t *idtbl,
inode->data.file.fragment_index = 0xFFFFFFFF;
inode->num_file_blocks = 1;
- inode->block_sizes = (sqfs_u32 *)inode->extra;
- inode->block_sizes[0] = (1 << 24) | inode->data.file.file_size;
+ inode->extra[0] = (1 << 24) | inode->data.file.file_size;
return inode;
}
@@ -144,7 +143,7 @@ int main(void)
inode = create_file_inode(idtbl, inode_num++);
inode->data.file.blocks_start = sizeof(super);
inode->data.file.file_size = strlen(README);
- inode->block_sizes[0] = (1 << 24) | inode->data.file.file_size;
+ inode->extra[0] = (1 << 24) | inode->data.file.file_size;
sqfs_meta_writer_get_position(inode_m, &block_start, &offset);
sqfs_meta_writer_write_inode(inode_m, inode);
diff --git a/extras/mknastyfs.c b/extras/mknastyfs.c
index 823bcf8..216c7eb 100644
--- a/extras/mknastyfs.c
+++ b/extras/mknastyfs.c
@@ -38,8 +38,7 @@ static sqfs_inode_generic_t *create_file_inode(sqfs_id_table_t *idtbl,
inode->data.file.fragment_index = 0xFFFFFFFF;
inode->num_file_blocks = 1;
- inode->block_sizes = (sqfs_u32 *)inode->extra;
- inode->block_sizes[0] = (1 << 24) | inode->data.file.file_size;
+ inode->extra[0] = (1 << 24) | inode->data.file.file_size;
return inode;
}
diff --git a/include/sqfs/inode.h b/include/sqfs/inode.h
index 65ff45e..17df022 100644
--- a/include/sqfs/inode.h
+++ b/include/sqfs/inode.h
@@ -483,23 +483,6 @@ struct sqfs_inode_generic_t {
sqfs_inode_t base;
/**
- * @brief A pointer into the extra field holding the symlink target.
- *
- * @param This string is not null terminated. The helper functions rely
- * entirely on the length stored in the symlink inode.
- */
- char *slink_target;
-
- /**
- * @brief A pointer into the extra field holding file blocks sizes.
- *
- * For file inodes, holds the consecutive block sizes. Bit number 24 is
- * set if the block is stored uncompressed. If it the size is zero,
- * the block is sparse.
- */
- sqfs_u32 *block_sizes;
-
- /**
* @brief For file inodes, stores the number of blocks used.
*/
size_t num_file_blocks;
@@ -528,8 +511,13 @@ struct sqfs_inode_generic_t {
/**
* @brief Holds type specific extra data, such as symlink target.
+ *
+ * For regular file inodes, this is an array of block sizes. For symlink
+ * inodes, this is actually a string holding the target. For extended
+ * directory inodes, this is actually a blob of tightly packed directory
+ * index entries.
*/
- sqfs_u8 extra[];
+ sqfs_u32 extra[];
};
#ifdef __cplusplus
diff --git a/lib/common/data_reader_dump.c b/lib/common/data_reader_dump.c
index 96103ce..bf418c6 100644
--- a/lib/common/data_reader_dump.c
+++ b/lib/common/data_reader_dump.c
@@ -60,8 +60,7 @@ int sqfs_data_reader_dump(const char *name, sqfs_data_reader_t *data,
for (i = 0; i < inode->num_file_blocks; ++i) {
diff = (filesz < block_size) ? filesz : block_size;
- if (SQFS_IS_SPARSE_BLOCK(inode->block_sizes[i]) &&
- allow_sparse) {
+ if (SQFS_IS_SPARSE_BLOCK(inode->extra[i]) && allow_sparse) {
if (fseek(fp, diff, SEEK_CUR) < 0)
goto fail_sparse;
} else {
diff --git a/lib/common/serialize_fstree.c b/lib/common/serialize_fstree.c
index f20ae07..c69f0ea 100644
--- a/lib/common/serialize_fstree.c
+++ b/lib/common/serialize_fstree.c
@@ -38,7 +38,6 @@ static sqfs_inode_generic_t *tree_node_to_inode(tree_node_t *node)
inode->base.type = SQFS_INODE_SLINK;
inode->data.slink.nlink = node->link_count;
inode->data.slink.target_size = extra;
- inode->slink_target = (char *)inode->extra;
memcpy(inode->extra, node->data.target, extra);
break;
case S_IFBLK:
diff --git a/lib/sqfs/data_reader.c b/lib/sqfs/data_reader.c
index 6a0db35..af15b9b 100644
--- a/lib/sqfs/data_reader.c
+++ b/lib/sqfs/data_reader.c
@@ -219,14 +219,13 @@ int sqfs_data_reader_get_block(sqfs_data_reader_t *data,
return SQFS_ERROR_OUT_OF_BOUNDS;
for (i = 0; i < index; ++i) {
- off += SQFS_ON_DISK_BLOCK_SIZE(inode->block_sizes[i]);
+ off += SQFS_ON_DISK_BLOCK_SIZE(inode->extra[i]);
filesz -= data->block_size;
}
unpacked_size = filesz < data->block_size ? filesz : data->block_size;
- return get_block(data, off, inode->block_sizes[index],
- unpacked_size, out);
+ return get_block(data, off, inode->extra[index], unpacked_size, out);
}
int sqfs_data_reader_get_fragment(sqfs_data_reader_t *data,
@@ -285,7 +284,7 @@ sqfs_s32 sqfs_data_reader_read(sqfs_data_reader_t *data,
i = 0;
while (offset > data->block_size && i < inode->num_file_blocks) {
- off += SQFS_ON_DISK_BLOCK_SIZE(inode->block_sizes[i++]);
+ off += SQFS_ON_DISK_BLOCK_SIZE(inode->extra[i++]);
offset -= data->block_size;
if (filesz >= data->block_size) {
@@ -301,17 +300,15 @@ sqfs_s32 sqfs_data_reader_read(sqfs_data_reader_t *data,
if (size < diff)
diff = size;
- if (SQFS_IS_SPARSE_BLOCK(inode->block_sizes[i])) {
+ if (SQFS_IS_SPARSE_BLOCK(inode->extra[i])) {
memset(buffer, 0, diff);
} else {
- if (precache_data_block(data, off,
- inode->block_sizes[i])) {
+ if (precache_data_block(data, off, inode->extra[i]))
return -1;
- }
memcpy(buffer, (char *)data->data_block->data + offset,
diff);
- off += SQFS_ON_DISK_BLOCK_SIZE(inode->block_sizes[i]);
+ off += SQFS_ON_DISK_BLOCK_SIZE(inode->extra[i]);
}
if (filesz >= data->block_size) {
diff --git a/lib/sqfs/data_writer/block.c b/lib/sqfs/data_writer/block.c
index 9396e4a..5967e59 100644
--- a/lib/sqfs/data_writer/block.c
+++ b/lib/sqfs/data_writer/block.c
@@ -116,7 +116,7 @@ int process_completed_block(sqfs_data_writer_t *proc, sqfs_block_t *blk)
proc->fragments[blk->index].pad0 = 0;
proc->fragments[blk->index].size = htole32(out);
} else {
- blk->inode->block_sizes[blk->index] = out;
+ blk->inode->extra[blk->index] = out;
}
err = store_block_location(proc, offset, out, blk->checksum);
diff --git a/lib/sqfs/data_writer/fileapi.c b/lib/sqfs/data_writer/fileapi.c
index de77690..89bac0b 100644
--- a/lib/sqfs/data_writer/fileapi.c
+++ b/lib/sqfs/data_writer/fileapi.c
@@ -67,7 +67,7 @@ static int flush_block(sqfs_data_writer_t *proc, sqfs_block_t *block)
sqfs_inode_make_extended(proc->inode);
proc->inode->data.file_ext.sparse += block->size;
proc->inode->num_file_blocks += 1;
- proc->inode->block_sizes[block->index] = 0;
+ proc->inode->extra[block->index] = 0;
free(block);
return 0;
}
diff --git a/lib/sqfs/dir_writer.c b/lib/sqfs/dir_writer.c
index 78256a1..53e5800 100644
--- a/lib/sqfs/dir_writer.c
+++ b/lib/sqfs/dir_writer.c
@@ -419,7 +419,8 @@ sqfs_inode_generic_t
ent.index = idx->index;
ent.size = idx->ent->name_len - 1;
- ptr = inode->extra + inode->num_dir_idx_bytes;
+ ptr = (sqfs_u8 *)inode->extra +
+ inode->num_dir_idx_bytes;
memcpy(ptr, &ent, sizeof(ent));
memcpy(ptr + sizeof(ent), idx->ent->name,
idx->ent->name_len);
diff --git a/lib/sqfs/inode.c b/lib/sqfs/inode.c
index 3a4ec09..815cc0f 100644
--- a/lib/sqfs/inode.c
+++ b/lib/sqfs/inode.c
@@ -72,9 +72,6 @@ int sqfs_inode_copy(const sqfs_inode_generic_t *src,
return SQFS_ERROR_ALLOC;
memcpy(copy, src, size);
- copy->block_sizes = (sqfs_u32 *)copy->extra;
- copy->slink_target = (char *)copy->extra;
-
*out = copy;
return 0;
}
diff --git a/lib/sqfs/read_inode.c b/lib/sqfs/read_inode.c
index f7bfff0..8653928 100644
--- a/lib/sqfs/read_inode.c
+++ b/lib/sqfs/read_inode.c
@@ -101,18 +101,16 @@ static int read_inode_file(sqfs_meta_reader_t *ir, sqfs_inode_t *base,
out->base = *base;
out->data.file = file;
- out->block_sizes = (sqfs_u32 *)out->extra;
out->num_file_blocks = count;
- err = sqfs_meta_reader_read(ir, out->block_sizes,
- count * sizeof(sqfs_u32));
+ err = sqfs_meta_reader_read(ir, out->extra, count * sizeof(sqfs_u32));
if (err) {
free(out);
return err;
}
for (i = 0; i < count; ++i)
- SWAB32(out->block_sizes[i]);
+ SWAB32(out->extra[i]);
*result = out;
return 0;
@@ -149,18 +147,16 @@ static int read_inode_file_ext(sqfs_meta_reader_t *ir, sqfs_inode_t *base,
out->base = *base;
out->data.file_ext = file;
- out->block_sizes = (sqfs_u32 *)out->extra;
out->num_file_blocks = count;
- err = sqfs_meta_reader_read(ir, out->block_sizes,
- count * sizeof(sqfs_u32));
+ err = sqfs_meta_reader_read(ir, out->extra, count * sizeof(sqfs_u32));
if (err) {
free(out);
return err;
}
for (i = 0; i < count; ++i)
- SWAB32(out->block_sizes[i]);
+ SWAB32(out->extra[i]);
*result = out;
return 0;
@@ -190,11 +186,10 @@ static int read_inode_slink(sqfs_meta_reader_t *ir, sqfs_inode_t *base,
if (out == NULL)
return SQFS_ERROR_ALLOC;
- out->slink_target = (char *)out->extra;
out->base = *base;
out->data.slink = slink;
- err = sqfs_meta_reader_read(ir, out->slink_target, slink.target_size);
+ err = sqfs_meta_reader_read(ir, (void *)out->extra, slink.target_size);
if (err) {
free(out);
return err;
@@ -290,10 +285,10 @@ static int read_inode_dir_ext(sqfs_meta_reader_t *ir, sqfs_inode_t *base,
index_max = new_sz;
}
- memcpy(out->extra + index_used, &ent, sizeof(ent));
+ memcpy((char *)out->extra + index_used, &ent, sizeof(ent));
index_used += sizeof(ent);
- err = sqfs_meta_reader_read(ir, out->extra + index_used,
+ err = sqfs_meta_reader_read(ir, (char *)out->extra + index_used,
ent.size + 1);
if (err) {
free(out);
diff --git a/lib/sqfs/write_inode.c b/lib/sqfs/write_inode.c
index 5f0ef4c..b5ba905 100644
--- a/lib/sqfs/write_inode.c
+++ b/lib/sqfs/write_inode.c
@@ -22,7 +22,7 @@ static int write_block_sizes(sqfs_meta_writer_t *ir,
size_t i;
for (i = 0; i < n->num_file_blocks; ++i)
- sizes[i] = htole32(n->block_sizes[i]);
+ sizes[i] = htole32(n->extra[i]);
return sqfs_meta_writer_append(ir, sizes,
sizeof(sqfs_u32) * n->num_file_blocks);
@@ -112,7 +112,7 @@ int sqfs_meta_writer_write_inode(sqfs_meta_writer_t *ir,
ret = sqfs_meta_writer_append(ir, &slink, sizeof(slink));
if (ret)
return ret;
- return sqfs_meta_writer_append(ir, n->slink_target,
+ return sqfs_meta_writer_append(ir, n->extra,
n->data.slink.target_size);
}
case SQFS_INODE_BDEV:
@@ -143,7 +143,8 @@ int sqfs_meta_writer_write_inode(sqfs_meta_writer_t *ir,
ret = sqfs_meta_writer_append(ir, &dir, sizeof(dir));
if (ret)
return ret;
- return write_dir_index(ir, n->extra, n->num_dir_idx_bytes);
+ return write_dir_index(ir, (const sqfs_u8 *)n->extra,
+ n->num_dir_idx_bytes);
}
case SQFS_INODE_EXT_FILE: {
sqfs_inode_file_ext_t file = {
@@ -171,7 +172,7 @@ int sqfs_meta_writer_write_inode(sqfs_meta_writer_t *ir,
ret = sqfs_meta_writer_append(ir, &slink, sizeof(slink));
if (ret)
return ret;
- ret = sqfs_meta_writer_append(ir, n->slink_target,
+ ret = sqfs_meta_writer_append(ir, n->extra,
n->data.slink_ext.target_size);
if (ret)
return ret;
diff --git a/mkfs/mkfs.c b/mkfs/mkfs.c
index 213fb36..b5d3443 100644
--- a/mkfs/mkfs.c
+++ b/mkfs/mkfs.c
@@ -109,7 +109,6 @@ static int pack_files(sqfs_data_writer_t *data, fstree_t *fs,
return -1;
}
- inode->block_sizes = (sqfs_u32 *)inode->extra;
inode->base.type = SQFS_INODE_FILE;
sqfs_inode_set_file_size(inode, filesize);
sqfs_inode_set_frag_location(inode, 0xFFFFFFFF, 0xFFFFFFFF);
diff --git a/tar/sqfs2tar.c b/tar/sqfs2tar.c
index 4d31fbe..935b687 100644
--- a/tar/sqfs2tar.c
+++ b/tar/sqfs2tar.c
@@ -414,7 +414,7 @@ static int write_tree_dfs(const sqfs_tree_node_t *n)
}
}
- target = S_ISLNK(sb.st_mode) ? n->inode->slink_target : NULL;
+ target = S_ISLNK(sb.st_mode) ? (char *)n->inode->extra : NULL;
ret = write_tar_header(out_file, &sb, name, target, xattr,
record_counter++);
diff --git a/tar/tar2sqfs.c b/tar/tar2sqfs.c
index 12055c3..b180739 100644
--- a/tar/tar2sqfs.c
+++ b/tar/tar2sqfs.c
@@ -275,7 +275,6 @@ static int write_file(tar_header_decoded_t *hdr, file_info_t *fi,
return -1;
}
- inode->block_sizes = (sqfs_u32 *)inode->extra;
inode->base.type = SQFS_INODE_FILE;
sqfs_inode_set_file_size(inode, filesize);
sqfs_inode_set_frag_location(inode, 0xFFFFFFFF, 0xFFFFFFFF);
diff --git a/unpack/describe.c b/unpack/describe.c
index 4c35070..d30f844 100644
--- a/unpack/describe.c
+++ b/unpack/describe.c
@@ -74,7 +74,8 @@ int describe_tree(const sqfs_tree_node_t *root, const char *unpack_root)
case S_IFSOCK:
return print_simple("sock", root, NULL);
case S_IFLNK:
- return print_simple("slink", root, root->inode->slink_target);
+ return print_simple("slink", root,
+ (const char *)root->inode->extra);
case S_IFIFO:
return print_simple("pipe", root, NULL);
case S_IFREG:
diff --git a/unpack/list_files.c b/unpack/list_files.c
index 0d64010..c08c2dd 100644
--- a/unpack/list_files.c
+++ b/unpack/list_files.c
@@ -85,7 +85,7 @@ static void print_node_size(const sqfs_tree_node_t *n, char *buffer)
{
switch (n->inode->base.mode & S_IFMT) {
case S_IFLNK:
- print_size(strlen(n->inode->slink_target), buffer);
+ print_size(strlen((const char *)n->inode->extra), buffer);
break;
case S_IFREG: {
sqfs_u64 size;
@@ -151,7 +151,8 @@ void list_files(const sqfs_tree_node_t *node)
n->name);
if (S_ISLNK(n->inode->base.mode)) {
- printf(" -> %s\n", n->inode->slink_target);
+ printf(" -> %s\n",
+ (const char *)n->inode->extra);
} else {
fputc('\n', stdout);
}
@@ -164,7 +165,7 @@ void list_files(const sqfs_tree_node_t *node)
node->uid, node->gid, sizestr, node->name);
if (S_ISLNK(node->inode->base.mode)) {
- printf(" -> %s\n", node->inode->slink_target);
+ printf(" -> %s\n", (const char *)node->inode->extra);
} else {
fputc('\n', stdout);
}
diff --git a/unpack/restore_fstree.c b/unpack/restore_fstree.c
index 00d75ef..8f99439 100644
--- a/unpack/restore_fstree.c
+++ b/unpack/restore_fstree.c
@@ -57,9 +57,9 @@ static int create_node(const sqfs_tree_node_t *n, const char *name)
}
break;
case S_IFLNK:
- if (symlink(n->inode->slink_target, name)) {
+ if (symlink((const char *)n->inode->extra, name)) {
fprintf(stderr, "ln -s %s %s: %s\n",
- n->inode->slink_target, name,
+ (const char *)n->inode->extra, name,
strerror(errno));
return -1;
}