diff options
author | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2022-07-04 20:01:59 +0200 |
---|---|---|
committer | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2022-07-08 19:17:35 +0200 |
commit | 3946cf086183f8dd4d5d115f52ba1b87560b7ce4 (patch) | |
tree | 2659b940b757d1bd177d00562bf8e41a333ef12e | |
parent | 8c0aa2504199036eaaa09673ea93dcdcd79606ef (diff) |
Move sqfs_tree_node_get_path to libsquashfs
Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
-rw-r--r-- | bin/rdsquashfs/describe.c | 4 | ||||
-rw-r--r-- | bin/rdsquashfs/fill_files.c | 4 | ||||
-rw-r--r-- | bin/rdsquashfs/restore_fstree.c | 6 | ||||
-rw-r--r-- | bin/sqfs2tar/write_tree.c | 16 | ||||
-rw-r--r-- | bin/sqfsdiff/node_compare.c | 6 | ||||
-rw-r--r-- | bin/sqfsdiff/util.c | 2 | ||||
-rw-r--r-- | include/common.h | 2 | ||||
-rw-r--r-- | include/sqfs/dir_reader.h | 21 | ||||
-rw-r--r-- | lib/common/Makemodule.am | 2 | ||||
-rw-r--r-- | lib/common/hardlink.c | 2 | ||||
-rw-r--r-- | lib/sqfs/Makemodule.am | 1 | ||||
-rw-r--r-- | lib/sqfs/dir_reader/get_path.c (renamed from lib/common/get_path.c) | 11 |
12 files changed, 47 insertions, 30 deletions
diff --git a/bin/rdsquashfs/describe.c b/bin/rdsquashfs/describe.c index e0e22bc..1e723bc 100644 --- a/bin/rdsquashfs/describe.c +++ b/bin/rdsquashfs/describe.c @@ -17,7 +17,7 @@ static int print_name(const sqfs_tree_node_t *n, bool dont_escape) if (canonicalize_name(name) != 0) { fprintf(stderr, "Error sanitizing file path '%s'\n", name); - free(name); + sqfs_free(name); return -1; } @@ -47,7 +47,7 @@ static int print_name(const sqfs_tree_node_t *n, bool dont_escape) fputc('"', stdout); } - free(name); + sqfs_free(name); return 0; } diff --git a/bin/rdsquashfs/fill_files.c b/bin/rdsquashfs/fill_files.c index 1afe6b8..8459c1e 100644 --- a/bin/rdsquashfs/fill_files.c +++ b/bin/rdsquashfs/fill_files.c @@ -89,7 +89,7 @@ static int add_file(const sqfs_tree_node_t *node) if (canonicalize_name(path)) { fprintf(stderr, "Invalid file path '%s'\n", path); - free(path); + sqfs_free(path); return -1; } @@ -104,7 +104,7 @@ static void clear_file_list(void) size_t i; for (i = 0; i < num_files; ++i) - free(files[i].path); + sqfs_free(files[i].path); free(files); files = NULL; diff --git a/bin/rdsquashfs/restore_fstree.c b/bin/rdsquashfs/restore_fstree.c index 57582c2..cf5bc2a 100644 --- a/bin/rdsquashfs/restore_fstree.c +++ b/bin/rdsquashfs/restore_fstree.c @@ -141,7 +141,7 @@ static int create_node_dfs(const sqfs_tree_node_t *n, int flags) printf("creating %s\n", name); ret = create_node(n, name, flags); - free(name); + sqfs_free(name); if (ret) return -1; @@ -276,10 +276,10 @@ static int set_attribs(sqfs_xattr_reader_t *xattr, } } - free(path); + sqfs_free(path); return 0; fail: - free(path); + sqfs_free(path); return -1; } diff --git a/bin/sqfs2tar/write_tree.c b/bin/sqfs2tar/write_tree.c index 5fa08e8..d4f8366 100644 --- a/bin/sqfs2tar/write_tree.c +++ b/bin/sqfs2tar/write_tree.c @@ -119,14 +119,14 @@ static int write_tree_dfs(const sqfs_tree_node_t *n) if (lnk != NULL) { ret = write_hard_link(out_file, &sb, name, lnk->target, record_counter++); - free(name); + sqfs_free(name); return ret; } } if (!no_xattr) { if (get_xattrs(name, n->inode, &xattr)) { - free(name); + sqfs_free(name); return -1; } } @@ -140,24 +140,24 @@ static int write_tree_dfs(const sqfs_tree_node_t *n) goto out_skip; if (ret < 0) { - free(name); + sqfs_free(name); return -1; } if (S_ISREG(sb.st_mode)) { if (sqfs_data_reader_dump(name, data, n->inode, out_file, super.block_size)) { - free(name); + sqfs_free(name); return -1; } if (padd_file(out_file, sb.st_size)) { - free(name); + sqfs_free(name); return -1; } } - free(name); + sqfs_free(name); skip_hdr: for (n = n->children; n != NULL; n = n->next) { if (write_tree_dfs(n)) @@ -172,7 +172,7 @@ out_skip: fprintf(stderr, "Skipping %s\n", name); ret = 0; } - free(name); + sqfs_free(name); return ret; } @@ -198,7 +198,7 @@ out_links: while (links != NULL) { lnk = links; links = links->next; - free(lnk->target); + sqfs_free(lnk->target); free(lnk); } return status; diff --git a/bin/sqfsdiff/node_compare.c b/bin/sqfsdiff/node_compare.c index d8f0878..6e8c2fa 100644 --- a/bin/sqfsdiff/node_compare.c +++ b/bin/sqfsdiff/node_compare.c @@ -90,7 +90,7 @@ int node_compare(sqfsdiff_t *sd, sqfs_tree_node_t *a, sqfs_tree_node_t *b) status = 1; } else { fprintf(stdout, "%s has a different type\n", path); - free(path); + sqfs_free(path); return 1; } } @@ -168,7 +168,7 @@ int node_compare(sqfsdiff_t *sd, sqfs_tree_node_t *a, sqfs_tree_node_t *b) if (ret > 0) status = 1; - free(path); + sqfs_free(path); path = NULL; ait = a->children; @@ -200,6 +200,6 @@ int node_compare(sqfsdiff_t *sd, sqfs_tree_node_t *a, sqfs_tree_node_t *b) break; } - free(path); + sqfs_free(path); return status; } diff --git a/bin/sqfsdiff/util.c b/bin/sqfsdiff/util.c index 5e9161a..ab6fa59 100644 --- a/bin/sqfsdiff/util.c +++ b/bin/sqfsdiff/util.c @@ -17,7 +17,7 @@ char *node_path(const sqfs_tree_node_t *n) if (canonicalize_name(path)) { fprintf(stderr, "failed to canonicalization '%s'\n", path); - free(path); + sqfs_free(path); return NULL; } diff --git a/include/common.h b/include/common.h index 5ef4e05..84ec3ca 100644 --- a/include/common.h +++ b/include/common.h @@ -34,8 +34,6 @@ typedef struct sqfs_hard_link_t { char *target; } sqfs_hard_link_t; -char *sqfs_tree_node_get_path(const sqfs_tree_node_t *node); - int sqfs_data_reader_dump(const char *name, sqfs_data_reader_t *data, const sqfs_inode_generic_t *inode, ostream_t *fp, size_t block_size); diff --git a/include/sqfs/dir_reader.h b/include/sqfs/dir_reader.h index c528e33..3ae4ca4 100644 --- a/include/sqfs/dir_reader.h +++ b/include/sqfs/dir_reader.h @@ -384,6 +384,27 @@ SQFS_API int sqfs_dir_reader_get_full_hierarchy(sqfs_dir_reader_t *rd, */ SQFS_API void sqfs_dir_tree_destroy(sqfs_tree_node_t *root); +/** + * @brief Recursively destroy a tree of @ref sqfs_tree_node_t nodes + * + * @memberof sqfs_tree_node_t + * + * This function can be used to assemble an absolute path from a tree + * node returned by @ref sqfs_dir_reader_get_full_hierarchy. + * + * The function recursively walks up the tree to assemble a path string. It + * returns "/" for the root node and assembles paths beginning with "/" for + * non-root nodes. The resulting path is slash separated, but (except for + * the root) never ends with a slash. + * + * The returned string needs to be free'd with @ref sqfs_free. + * + * @param node A pointer to a tree node. + * + * @return A pointer to a string on success, NULL on allocation failure. + */ +SQFS_API char *sqfs_tree_node_get_path(const sqfs_tree_node_t *node); + #ifdef __cplusplus } #endif diff --git a/lib/common/Makemodule.am b/lib/common/Makemodule.am index f0616fc..b19ecd6 100644 --- a/lib/common/Makemodule.am +++ b/lib/common/Makemodule.am @@ -2,7 +2,7 @@ libcommon_a_SOURCES = lib/common/hardlink.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 -libcommon_a_SOURCES += lib/common/get_path.c lib/common/data_writer_ostream.c +libcommon_a_SOURCES += lib/common/data_writer_ostream.c libcommon_a_SOURCES += lib/common/perror.c lib/common/parse_size.c libcommon_a_SOURCES += lib/common/print_size.c include/simple_writer.h libcommon_a_SOURCES += include/compress_cli.h diff --git a/lib/common/hardlink.c b/lib/common/hardlink.c index c64ec4a..031724b 100644 --- a/lib/common/hardlink.c +++ b/lib/common/hardlink.c @@ -57,7 +57,7 @@ static int map_nodes(rbtree_t *inumtree, sqfs_hard_link_t **out, lnk->next = (*out); (*out) = lnk; } else { - free(lnk->target); + sqfs_free(lnk->target); free(lnk); } return 0; diff --git a/lib/sqfs/Makemodule.am b/lib/sqfs/Makemodule.am index d49482e..ad3d42d 100644 --- a/lib/sqfs/Makemodule.am +++ b/lib/sqfs/Makemodule.am @@ -20,6 +20,7 @@ libsquashfs_la_SOURCES += lib/sqfs/read_table.c lib/sqfs/comp/compressor.c libsquashfs_la_SOURCES += lib/sqfs/comp/internal.h libsquashfs_la_SOURCES += lib/sqfs/dir_reader/dir_reader.c libsquashfs_la_SOURCES += lib/sqfs/dir_reader/read_tree.c +libsquashfs_la_SOURCES += lib/sqfs/dir_reader/get_path.c libsquashfs_la_SOURCES += lib/sqfs/dir_reader/internal.h libsquashfs_la_SOURCES += lib/sqfs/inode.c lib/sqfs/xattr/xattr_writer.c libsquashfs_la_SOURCES += lib/sqfs/xattr/xattr_writer_flush.c diff --git a/lib/common/get_path.c b/lib/sqfs/dir_reader/get_path.c index 72ed1bd..bdd8317 100644 --- a/lib/common/get_path.c +++ b/lib/sqfs/dir_reader/get_path.c @@ -1,10 +1,11 @@ -/* SPDX-License-Identifier: GPL-3.0-or-later */ +/* SPDX-License-Identifier: LGPL-3.0-or-later */ /* * get_path.c * * Copyright (C) 2019 David Oberhollenzer <goliath@infraroot.at> */ -#include "common.h" +#define SQFS_BUILDING_DLL +#include "internal.h" #include <string.h> #include <stdlib.h> @@ -15,12 +16,8 @@ char *sqfs_tree_node_get_path(const sqfs_tree_node_t *node) char *str, *ptr; size_t len = 0; - if (node->parent == NULL) { - if (node->name[0] != '\0') - return strdup((const char *)node->name); - + if (node->parent == NULL) return strdup("/"); - } for (it = node; it != NULL && it->parent != NULL; it = it->parent) { len += strlen((const char *)it->name) + 1; |