summaryrefslogtreecommitdiff
path: root/lib/sqfs/dir_reader
diff options
context:
space:
mode:
authorDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2022-06-01 14:21:56 +0200
committerDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2022-06-02 17:26:53 +0200
commit9d474f278d21ddc452d8a1a722b3735fae94115c (patch)
treea47560294e37160e358cfd533f93c33ff0cc5f31 /lib/sqfs/dir_reader
parent653e24411937f9200ddfae9080f904a1d16d3366 (diff)
Cleanup: libsqfs: sqfs_dir_reader_find_by_path
Split out several repated patterns into helper functions and move the rest of the code back into dir_reader.c Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
Diffstat (limited to 'lib/sqfs/dir_reader')
-rw-r--r--lib/sqfs/dir_reader/dir_reader.c61
-rw-r--r--lib/sqfs/dir_reader/find_by_path.c82
-rw-r--r--lib/sqfs/dir_reader/read_tree.c9
3 files changed, 62 insertions, 90 deletions
diff --git a/lib/sqfs/dir_reader/dir_reader.c b/lib/sqfs/dir_reader/dir_reader.c
index d09e901..4ac9829 100644
--- a/lib/sqfs/dir_reader/dir_reader.c
+++ b/lib/sqfs/dir_reader/dir_reader.c
@@ -7,6 +7,17 @@
#define SQFS_BUILDING_DLL
#include "internal.h"
+static int inode_copy(const sqfs_inode_generic_t *inode,
+ sqfs_inode_generic_t **out)
+{
+ *out = alloc_flex(sizeof(*inode), 1, inode->payload_bytes_used);
+ if (*out == NULL)
+ return SQFS_ERROR_ALLOC;
+
+ memcpy(*out, inode, sizeof(*inode) + inode->payload_bytes_used);
+ return 0;
+}
+
static int dcache_key_compare(const void *ctx, const void *l, const void *r)
{
sqfs_u32 lhs = *((const sqfs_u32 *)l), rhs = *((const sqfs_u32 *)r);
@@ -310,3 +321,53 @@ int sqfs_dir_reader_get_root_inode(sqfs_dir_reader_t *rd,
return dcache_add(rd, *inode, rd->super->root_inode_ref);
}
+
+int sqfs_dir_reader_find_by_path(sqfs_dir_reader_t *rd,
+ const sqfs_inode_generic_t *start,
+ const char *path, sqfs_inode_generic_t **out)
+{
+ sqfs_inode_generic_t *inode;
+ const char *ptr;
+ int ret = 0;
+ char *name;
+
+ if (start == NULL) {
+ ret = sqfs_dir_reader_get_root_inode(rd, &inode);
+ } else {
+ ret = inode_copy(start, &inode);
+ }
+
+ if (ret)
+ return ret;
+
+ for (; *path != '\0'; path = ptr) {
+ if (*path == '/') {
+ for (ptr = path; *ptr == '/'; ++ptr)
+ ;
+ continue;
+ }
+
+ ret = sqfs_dir_reader_open_dir(rd, inode, 0);
+ free(inode);
+ if (ret)
+ return ret;
+
+ ptr = strchrnul(path, '/');
+
+ name = strndup(path, ptr - path);
+ if (name == NULL)
+ return SQFS_ERROR_ALLOC;
+
+ ret = sqfs_dir_reader_find(rd, name);
+ free(name);
+ if (ret)
+ return ret;
+
+ ret = sqfs_dir_reader_get_inode(rd, &inode);
+ if (ret)
+ return ret;
+ }
+
+ *out = inode;
+ return 0;
+}
diff --git a/lib/sqfs/dir_reader/find_by_path.c b/lib/sqfs/dir_reader/find_by_path.c
deleted file mode 100644
index 0cd800f..0000000
--- a/lib/sqfs/dir_reader/find_by_path.c
+++ /dev/null
@@ -1,82 +0,0 @@
-/* SPDX-License-Identifier: LGPL-3.0-or-later */
-/*
- * find_by_path.c
- *
- * Copyright (C) 2019 David Oberhollenzer <goliath@infraroot.at>
- */
-#define SQFS_BUILDING_DLL
-#include "internal.h"
-
-int sqfs_dir_reader_find_by_path(sqfs_dir_reader_t *rd,
- const sqfs_inode_generic_t *start,
- const char *path, sqfs_inode_generic_t **out)
-{
- sqfs_inode_generic_t *inode;
- sqfs_dir_entry_t *ent;
- const char *ptr;
- int ret = 0;
-
- if (start == NULL) {
- ret = sqfs_dir_reader_get_root_inode(rd, &inode);
- } else {
- inode = alloc_flex(sizeof(*inode), 1,
- start->payload_bytes_used);
- if (inode == NULL) {
- ret = SQFS_ERROR_ALLOC;
- } else {
- memcpy(inode, start,
- sizeof(*start) + start->payload_bytes_used);
- }
- }
-
- if (ret)
- return ret;
-
- while (*path != '\0') {
- if (*path == '/') {
- while (*path == '/')
- ++path;
- continue;
- }
-
- ret = sqfs_dir_reader_open_dir(rd, inode, 0);
- free(inode);
- if (ret)
- return ret;
-
- ptr = strchr(path, '/');
- if (ptr == NULL) {
-
- if (ptr == NULL) {
- for (ptr = path; *ptr != '\0'; ++ptr)
- ;
- }
- }
-
- do {
- ret = sqfs_dir_reader_read(rd, &ent);
- if (ret < 0)
- return ret;
-
- if (ret == 0) {
- ret = strncmp((const char *)ent->name,
- path, ptr - path);
- if (ret == 0)
- ret = ent->name[ptr - path];
- free(ent);
- }
- } while (ret < 0);
-
- if (ret > 0)
- return SQFS_ERROR_NO_ENTRY;
-
- ret = sqfs_dir_reader_get_inode(rd, &inode);
- if (ret)
- return ret;
-
- path = ptr;
- }
-
- *out = inode;
- return 0;
-}
diff --git a/lib/sqfs/dir_reader/read_tree.c b/lib/sqfs/dir_reader/read_tree.c
index 7fa944a..91cc2c0 100644
--- a/lib/sqfs/dir_reader/read_tree.c
+++ b/lib/sqfs/dir_reader/read_tree.c
@@ -218,14 +218,7 @@ int sqfs_dir_reader_get_full_hierarchy(sqfs_dir_reader_t *rd,
if (ret)
goto fail;
- ptr = strchr(path, '/');
- if (ptr == NULL) {
-
- if (ptr == NULL) {
- for (ptr = path; *ptr != '\0'; ++ptr)
- ;
- }
- }
+ ptr = strchrnul(path, '/');
for (;;) {
ret = sqfs_dir_reader_read(rd, &ent);