diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/common/Makemodule.am | 2 | ||||
-rw-r--r-- | lib/common/serialize_fstree.c | 67 | ||||
-rw-r--r-- | lib/common/write_export_table.c | 43 | ||||
-rw-r--r-- | lib/common/writer.c | 52 |
4 files changed, 61 insertions, 103 deletions
diff --git a/lib/common/Makemodule.am b/lib/common/Makemodule.am index 7e1ec63..e97085b 100644 --- a/lib/common/Makemodule.am +++ b/lib/common/Makemodule.am @@ -1,5 +1,5 @@ libcommon_a_SOURCES = lib/common/serialize_fstree.c lib/common/statistics.c -libcommon_a_SOURCES += lib/common/write_export_table.c lib/common/inode_stat.c +libcommon_a_SOURCES += lib/common/inode_stat.c libcommon_a_SOURCES += lib/common/print_version.c lib/common/data_reader_dump.c libcommon_a_SOURCES += lib/common/compress.c lib/common/comp_opt.c libcommon_a_SOURCES += lib/common/data_writer.c include/common.h diff --git a/lib/common/serialize_fstree.c b/lib/common/serialize_fstree.c index 457c485..939b1c1 100644 --- a/lib/common/serialize_fstree.c +++ b/lib/common/serialize_fstree.c @@ -97,8 +97,7 @@ fail: return NULL; } -static int serialize_tree_node(const char *filename, sqfs_dir_writer_t *dirwr, - sqfs_meta_writer_t *im, sqfs_id_table_t *idtbl, +static int serialize_tree_node(const char *filename, sqfs_writer_t *wr, tree_node_t *n) { sqfs_inode_generic_t *inode; @@ -107,7 +106,7 @@ static int serialize_tree_node(const char *filename, sqfs_dir_writer_t *dirwr, int ret; if (S_ISDIR(n->mode)) { - inode = write_dir_entries(filename, dirwr, n); + inode = write_dir_entries(filename, wr->dirwr, n); ret = SQFS_ERROR_INTERNAL; } else if (S_ISREG(n->mode)) { inode = n->data.file.user_ptr; @@ -127,88 +126,56 @@ static int serialize_tree_node(const char *filename, sqfs_dir_writer_t *dirwr, sqfs_inode_set_xattr_index(inode, n->xattr_idx); - ret = sqfs_id_table_id_to_index(idtbl, n->uid, + ret = sqfs_id_table_id_to_index(wr->idtbl, n->uid, &inode->base.uid_idx); if (ret) goto out; - ret = sqfs_id_table_id_to_index(idtbl, n->gid, + ret = sqfs_id_table_id_to_index(wr->idtbl, n->gid, &inode->base.gid_idx); if (ret) goto out; - sqfs_meta_writer_get_position(im, &block, &offset); + sqfs_meta_writer_get_position(wr->im, &block, &offset); n->inode_ref = (block << 16) | offset; - ret = sqfs_meta_writer_write_inode(im, inode); + ret = sqfs_meta_writer_write_inode(wr->im, inode); out: free(inode); return ret; } -int sqfs_serialize_fstree(const char *filename, sqfs_file_t *file, - sqfs_super_t *super, fstree_t *fs, - sqfs_compressor_t *cmp, sqfs_id_table_t *idtbl) +int sqfs_serialize_fstree(const char *filename, sqfs_writer_t *wr) { - sqfs_meta_writer_t *im, *dm; - sqfs_dir_writer_t *dirwr; size_t i; int ret; - im = sqfs_meta_writer_create(file, cmp, 0); - if (im == NULL) { - ret = SQFS_ERROR_ALLOC; - goto out_err; - } - - dm = sqfs_meta_writer_create(file, cmp, - SQFS_META_WRITER_KEEP_IN_MEMORY); - if (dm == NULL) { - ret = SQFS_ERROR_ALLOC; - goto out_im; - } + wr->super.inode_table_start = wr->outfile->get_size(wr->outfile); - dirwr = sqfs_dir_writer_create(dm, 0); - if (dirwr == NULL) { - ret = SQFS_ERROR_ALLOC; - goto out_dm; - } - - super->inode_table_start = file->get_size(file); - - for (i = 0; i < fs->inode_tbl_size; ++i) { - ret = serialize_tree_node(filename, dirwr, im, idtbl, - fs->inode_table[i]); + for (i = 0; i < wr->fs.inode_tbl_size; ++i) { + ret = serialize_tree_node(filename, wr, wr->fs.inode_table[i]); if (ret) goto out; } - ret = sqfs_meta_writer_flush(im); + ret = sqfs_meta_writer_flush(wr->im); if (ret) goto out; - ret = sqfs_meta_writer_flush(dm); + ret = sqfs_meta_writer_flush(wr->dm); if (ret) goto out; - super->root_inode_ref = fs->root->inode_ref; - super->directory_table_start = file->get_size(file); + wr->super.root_inode_ref = wr->fs.root->inode_ref; + wr->super.directory_table_start = wr->outfile->get_size(wr->outfile); - ret = sqfs_meta_write_write_to_file(dm); + ret = sqfs_meta_write_write_to_file(wr->dm); if (ret) goto out; ret = 0; out: - sqfs_dir_writer_destroy(dirwr); -out_dm: - sqfs_meta_writer_destroy(dm); -out_im: - sqfs_meta_writer_destroy(im); -out_err: - if (ret < 0) { - sqfs_perror(filename, "storing filesystem tree", - ret); - } + if (ret) + sqfs_perror(filename, "storing filesystem tree", ret); return ret; } diff --git a/lib/common/write_export_table.c b/lib/common/write_export_table.c deleted file mode 100644 index c0d4993..0000000 --- a/lib/common/write_export_table.c +++ /dev/null @@ -1,43 +0,0 @@ -/* SPDX-License-Identifier: GPL-3.0-or-later */ -/* - * write_export_table.c - * - * Copyright (C) 2019 David Oberhollenzer <goliath@infraroot.at> - */ -#include "common.h" - -#include <stdlib.h> -#include <stdio.h> - -int write_export_table(const char *filename, sqfs_file_t *file, - fstree_t *fs, sqfs_super_t *super, - sqfs_compressor_t *cmp) -{ - sqfs_u64 *table, start; - size_t i, size; - int ret; - - if (fs->inode_tbl_size < 1) - return 0; - - table = calloc(1, sizeof(sqfs_u64) * fs->inode_tbl_size); - - if (table == NULL) { - perror("Allocating NFS export table"); - return -1; - } - - for (i = 0; i < fs->inode_tbl_size; ++i) { - table[i] = htole64(fs->inode_table[i]->inode_ref); - } - - size = sizeof(sqfs_u64) * fs->inode_tbl_size; - ret = sqfs_write_table(file, cmp, table, size, &start); - if (ret) - sqfs_perror(filename, "writing NFS export table", ret); - - super->export_table_start = start; - super->flags |= SQFS_FLAG_EXPORTABLE; - free(table); - return ret; -} diff --git a/lib/common/writer.c b/lib/common/writer.c index d67f76b..0b7f378 100644 --- a/lib/common/writer.c +++ b/lib/common/writer.c @@ -68,7 +68,7 @@ void sqfs_writer_cfg_init(sqfs_writer_cfg_t *cfg) int sqfs_writer_init(sqfs_writer_t *sqfs, const sqfs_writer_cfg_t *wrcfg) { sqfs_compressor_config_t cfg; - int ret; + int ret, flags; if (compressor_cfg_init_options(&cfg, wrcfg->comp_id, wrcfg->block_size, @@ -149,14 +149,42 @@ int sqfs_writer_init(sqfs_writer_t *sqfs, const sqfs_writer_cfg_t *wrcfg) if (sqfs->xwr == NULL) { sqfs_perror(wrcfg->filename, "creating xattr writer", SQFS_ERROR_ALLOC); - goto fail; + goto fail_id; } } + sqfs->im = sqfs_meta_writer_create(sqfs->outfile, sqfs->cmp, 0); + if (sqfs->im == NULL) { + fputs("Error creating inode meta data writer.\n", stderr); + goto fail_xwr; + } + + sqfs->dm = sqfs_meta_writer_create(sqfs->outfile, sqfs->cmp, + SQFS_META_WRITER_KEEP_IN_MEMORY); + if (sqfs->dm == NULL) { + fputs("Error creating directory meta data writer.\n", stderr); + goto fail_im; + } + + flags = 0; + if (wrcfg->exportable) + flags |= SQFS_DIR_WRITER_CREATE_EXPORT_TABLE; + + sqfs->dirwr = sqfs_dir_writer_create(sqfs->dm, flags); + if (sqfs->dirwr == NULL) { + fputs("Error creating directory table writer.\n", stderr); + goto fail_dm; + } + return 0; -fail: +fail_dm: + sqfs_meta_writer_destroy(sqfs->dm); +fail_im: + sqfs_meta_writer_destroy(sqfs->im); +fail_xwr: if (sqfs->xwr != NULL) sqfs_xattr_writer_destroy(sqfs->xwr); +fail_id: sqfs_id_table_destroy(sqfs->idtbl); fail_data: sqfs_data_writer_destroy(sqfs->data); @@ -191,10 +219,8 @@ int sqfs_writer_finish(sqfs_writer_t *sqfs, const sqfs_writer_cfg_t *cfg) sqfs->super.inode_count = sqfs->fs.inode_tbl_size; - if (sqfs_serialize_fstree(cfg->filename, sqfs->outfile, &sqfs->super, - &sqfs->fs, sqfs->cmp, sqfs->idtbl)) { + if (sqfs_serialize_fstree(cfg->filename, sqfs)) return -1; - } if (!cfg->quiet) fputs("Writing fragment table...\n", stdout); @@ -209,10 +235,14 @@ int sqfs_writer_finish(sqfs_writer_t *sqfs, const sqfs_writer_cfg_t *cfg) if (!cfg->quiet) fputs("Writing export table...\n", stdout); - if (write_export_table(cfg->filename, sqfs->outfile, &sqfs->fs, - &sqfs->super, sqfs->cmp)) { + + ret = sqfs_dir_writer_write_export_table(sqfs->dirwr, + sqfs->outfile, sqfs->cmp, + sqfs->fs.root->inode_num, + sqfs->fs.root->inode_ref, + &sqfs->super); + if (ret) return -1; - } } if (!cfg->quiet) @@ -260,6 +290,10 @@ void sqfs_writer_cleanup(sqfs_writer_t *sqfs) { if (sqfs->xwr != NULL) sqfs_xattr_writer_destroy(sqfs->xwr); + + sqfs_dir_writer_destroy(sqfs->dirwr); + sqfs_meta_writer_destroy(sqfs->dm); + sqfs_meta_writer_destroy(sqfs->im); sqfs_id_table_destroy(sqfs->idtbl); sqfs_data_writer_destroy(sqfs->data); sqfs->cmp->destroy(sqfs->cmp); |