diff options
Diffstat (limited to 'lib/common/writer/init.c')
-rw-r--r-- | lib/common/writer/init.c | 218 |
1 files changed, 0 insertions, 218 deletions
diff --git a/lib/common/writer/init.c b/lib/common/writer/init.c deleted file mode 100644 index 497fc6e..0000000 --- a/lib/common/writer/init.c +++ /dev/null @@ -1,218 +0,0 @@ -/* SPDX-License-Identifier: GPL-3.0-or-later */ -/* - * init.c - * - * Copyright (C) 2019 David Oberhollenzer <goliath@infraroot.at> - */ -#include "simple_writer.h" -#include "compress_cli.h" -#include "common.h" - -#include <string.h> -#include <stdlib.h> -#include <unistd.h> - -#ifdef HAVE_SCHED_GETAFFINITY -#include <sched.h> - -static size_t os_get_num_jobs(void) -{ - cpu_set_t cpu_set; - CPU_ZERO(&cpu_set); - - if (sched_getaffinity(0, sizeof cpu_set, &cpu_set) == -1) - return 1; - else - return CPU_COUNT(&cpu_set); -} -#else -static size_t os_get_num_jobs(void) -{ - return 1; -} -#endif - -void sqfs_writer_cfg_init(sqfs_writer_cfg_t *cfg) -{ - memset(cfg, 0, sizeof(*cfg)); - - cfg->num_jobs = os_get_num_jobs(); - cfg->block_size = SQFS_DEFAULT_BLOCK_SIZE; - cfg->devblksize = SQFS_DEVBLK_SIZE; - cfg->comp_id = compressor_get_default(); -} - -int sqfs_writer_init(sqfs_writer_t *sqfs, const sqfs_writer_cfg_t *wrcfg) -{ - sqfs_block_processor_desc_t blkdesc; - sqfs_compressor_config_t cfg; - int ret, flags; - - sqfs->filename = wrcfg->filename; - - if (compressor_cfg_init_options(&cfg, wrcfg->comp_id, - wrcfg->block_size, - wrcfg->comp_extra)) { - return -1; - } - - sqfs->outfile = sqfs_open_file(wrcfg->filename, wrcfg->outmode); - if (sqfs->outfile == NULL) { - perror(wrcfg->filename); - return -1; - } - - if (fstree_init(&sqfs->fs, wrcfg->fs_defaults)) - goto fail_file; - - ret = sqfs_compressor_create(&cfg, &sqfs->cmp); - -#ifdef WITH_LZO - if (cfg.id == SQFS_COMP_LZO) { - if (sqfs->cmp != NULL) - sqfs_drop(sqfs->cmp); - - ret = lzo_compressor_create(&cfg, &sqfs->cmp); - } -#endif - - if (ret != 0) { - sqfs_perror(wrcfg->filename, "creating compressor", ret); - goto fail_fs; - } - - cfg.flags |= SQFS_COMP_FLAG_UNCOMPRESS; - ret = sqfs_compressor_create(&cfg, &sqfs->uncmp); - -#ifdef WITH_LZO - if (cfg.id == SQFS_COMP_LZO) { - if (ret == 0 && sqfs->uncmp != NULL) - sqfs_drop(sqfs->uncmp); - - ret = lzo_compressor_create(&cfg, &sqfs->uncmp); - } -#endif - - if (ret != 0) { - sqfs_perror(wrcfg->filename, "creating uncompressor", ret); - goto fail_cmp; - } - - ret = sqfs_super_init(&sqfs->super, wrcfg->block_size, - sqfs->fs.defaults.st_mtime, wrcfg->comp_id); - if (ret) { - sqfs_perror(wrcfg->filename, "initializing super block", ret); - goto fail_uncmp; - } - - ret = sqfs_super_write(&sqfs->super, sqfs->outfile); - if (ret) { - sqfs_perror(wrcfg->filename, "writing super block", ret); - goto fail_uncmp; - } - - ret = sqfs->cmp->write_options(sqfs->cmp, sqfs->outfile); - if (ret < 0) { - sqfs_perror(wrcfg->filename, "writing compressor options", ret); - goto fail_uncmp; - } - - if (ret > 0) - sqfs->super.flags |= SQFS_FLAG_COMPRESSOR_OPTIONS; - - sqfs->blkwr = sqfs_block_writer_create(sqfs->outfile, - wrcfg->devblksize, 0); - if (sqfs->blkwr == NULL) { - perror("creating block writer"); - goto fail_uncmp; - } - - sqfs->fragtbl = sqfs_frag_table_create(0); - if (sqfs->fragtbl == NULL) { - perror("creating fragment table"); - goto fail_blkwr; - } - - memset(&blkdesc, 0, sizeof(blkdesc)); - blkdesc.size = sizeof(blkdesc); - blkdesc.max_block_size = wrcfg->block_size; - blkdesc.num_workers = wrcfg->num_jobs; - blkdesc.max_backlog = wrcfg->max_backlog; - blkdesc.cmp = sqfs->cmp; - blkdesc.wr = sqfs->blkwr; - blkdesc.tbl = sqfs->fragtbl; - blkdesc.file = sqfs->outfile; - blkdesc.uncmp = sqfs->uncmp; - - ret = sqfs_block_processor_create_ex(&blkdesc, &sqfs->data); - if (ret != 0) { - sqfs_perror(wrcfg->filename, "creating data block processor", - ret); - goto fail_fragtbl; - } - - sqfs->idtbl = sqfs_id_table_create(0); - if (sqfs->idtbl == NULL) { - sqfs_perror(wrcfg->filename, "creating ID table", - SQFS_ERROR_ALLOC); - goto fail_data; - } - - if (!wrcfg->no_xattr) { - sqfs->xwr = sqfs_xattr_writer_create(0); - - if (sqfs->xwr == NULL) { - sqfs_perror(wrcfg->filename, "creating xattr writer", - SQFS_ERROR_ALLOC); - 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_dm: - sqfs_drop(sqfs->dm); -fail_im: - sqfs_drop(sqfs->im); -fail_xwr: - sqfs_drop(sqfs->xwr); -fail_id: - sqfs_drop(sqfs->idtbl); -fail_data: - sqfs_drop(sqfs->data); -fail_fragtbl: - sqfs_drop(sqfs->fragtbl); -fail_blkwr: - sqfs_drop(sqfs->blkwr); -fail_uncmp: - sqfs_drop(sqfs->uncmp); -fail_cmp: - sqfs_drop(sqfs->cmp); -fail_fs: - fstree_cleanup(&sqfs->fs); -fail_file: - sqfs_drop(sqfs->outfile); - return -1; -} |