summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2022-07-04 20:01:59 +0200
committerDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2022-07-08 19:17:35 +0200
commit3946cf086183f8dd4d5d115f52ba1b87560b7ce4 (patch)
tree2659b940b757d1bd177d00562bf8e41a333ef12e
parent8c0aa2504199036eaaa09673ea93dcdcd79606ef (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.c4
-rw-r--r--bin/rdsquashfs/fill_files.c4
-rw-r--r--bin/rdsquashfs/restore_fstree.c6
-rw-r--r--bin/sqfs2tar/write_tree.c16
-rw-r--r--bin/sqfsdiff/node_compare.c6
-rw-r--r--bin/sqfsdiff/util.c2
-rw-r--r--include/common.h2
-rw-r--r--include/sqfs/dir_reader.h21
-rw-r--r--lib/common/Makemodule.am2
-rw-r--r--lib/common/hardlink.c2
-rw-r--r--lib/sqfs/Makemodule.am1
-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;