diff options
author | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2019-06-22 23:18:36 +0200 |
---|---|---|
committer | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2019-06-22 23:18:36 +0200 |
commit | 56786917339c1ac2190b8b903eaf79e60d726973 (patch) | |
tree | c9a5f63a18df3fc570a90b84aadc54cc869af672 /mkfs/mkfs.c | |
parent | 77bc1dd2116696b6d187cc3bf76de583f4f804fc (diff) |
Cleanup: unify packdir/packfile based directory changes in gensquashfs
This commit removes the packdir/packfile based directory setup magic
from fstree_from_file and moves it to gensquashfs. Over there, the
common parts are deduplicated.
Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
Diffstat (limited to 'mkfs/mkfs.c')
-rw-r--r-- | mkfs/mkfs.c | 75 |
1 files changed, 53 insertions, 22 deletions
diff --git a/mkfs/mkfs.c b/mkfs/mkfs.c index 12b4de9..371c578 100644 --- a/mkfs/mkfs.c +++ b/mkfs/mkfs.c @@ -39,25 +39,32 @@ static int pack_files_dfs(data_writer_t *data, tree_node_t *n, bool quiet) return 0; } -static int pack_files(data_writer_t *data, fstree_t *fs, options_t *opt) +static int set_working_dir(options_t *opt) { - bool need_restore = false; const char *ptr; - if (opt->packdir != NULL) { - if (pushd(opt->packdir)) - return -1; - need_restore = true; - } else { - ptr = strrchr(opt->infile, '/'); + if (opt->packdir != NULL) + return pushd(opt->packdir); - if (ptr != NULL) { - if (pushdn(opt->infile, ptr - opt->infile)) - return -1; + ptr = strrchr(opt->infile, '/'); + if (ptr != NULL) + return pushdn(opt->infile, ptr - opt->infile); - need_restore = true; - } - } + return 0; +} + +static int restore_working_dir(options_t *opt) +{ + if (opt->packdir != NULL || strrchr(opt->infile, '/') != NULL) + return popd(); + + return 0; +} + +static int pack_files(data_writer_t *data, fstree_t *fs, options_t *opt) +{ + if (set_working_dir(opt)) + return -1; if (pack_files_dfs(data, fs->root, opt->quiet)) return -1; @@ -65,7 +72,36 @@ static int pack_files(data_writer_t *data, fstree_t *fs, options_t *opt) if (data_writer_flush_fragments(data)) return -1; - return need_restore ? popd() : 0; + return restore_working_dir(opt); +} + +static int read_fstree(fstree_t *fs, options_t *opt) +{ + FILE *fp; + int ret; + + if (opt->infile == NULL) + return fstree_from_dir(fs, opt->packdir); + + fp = fopen(opt->infile, "rb"); + if (fp == NULL) { + perror(opt->infile); + return -1; + } + + if (set_working_dir(opt)) { + fclose(fp); + return -1; + } + + ret = fstree_from_file(fs, opt->infile, fp); + + fclose(fp); + + if (restore_working_dir(opt)) + return -1; + + return ret; } int main(int argc, char **argv) @@ -101,13 +137,8 @@ int main(int argc, char **argv) goto out_outfd; } - if (opt.infile != NULL) { - if (fstree_from_file(&fs, opt.infile, opt.packdir)) - goto out_fstree; - } else { - if (fstree_from_dir(&fs, opt.packdir)) - goto out_fstree; - } + if (read_fstree(&fs, &opt)) + goto out_fstree; tree_node_sort_recursive(fs.root); |