diff options
-rw-r--r-- | lib/sqfs/Makemodule.am | 5 | ||||
-rw-r--r-- | lib/sqfs/dir_reader/dir_reader.c (renamed from lib/sqfs/dir_reader.c) | 105 | ||||
-rw-r--r-- | lib/sqfs/dir_reader/find_by_path.c | 82 | ||||
-rw-r--r-- | lib/sqfs/dir_reader/internal.h | 42 | ||||
-rw-r--r-- | lib/sqfs/dir_reader/read_tree.c (renamed from lib/sqfs/read_tree.c) | 15 |
5 files changed, 130 insertions, 119 deletions
diff --git a/lib/sqfs/Makemodule.am b/lib/sqfs/Makemodule.am index df6e3ce..c37301b 100644 --- a/lib/sqfs/Makemodule.am +++ b/lib/sqfs/Makemodule.am @@ -18,7 +18,10 @@ libsquashfs_la_SOURCES += lib/sqfs/read_inode.c lib/sqfs/write_inode.c libsquashfs_la_SOURCES += lib/sqfs/dir_writer.c lib/sqfs/xattr/xattr_reader.c 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.c lib/sqfs/read_tree.c +libsquashfs_la_SOURCES += lib/sqfs/dir_reader/dir_reader.c +libsquashfs_la_SOURCES += lib/sqfs/dir_reader/find_by_path.c +libsquashfs_la_SOURCES += lib/sqfs/dir_reader/read_tree.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 libsquashfs_la_SOURCES += lib/sqfs/xattr/xattr_writer_record.c diff --git a/lib/sqfs/dir_reader.c b/lib/sqfs/dir_reader/dir_reader.c index f560069..969b71d 100644 --- a/lib/sqfs/dir_reader.c +++ b/lib/sqfs/dir_reader/dir_reader.c @@ -5,36 +5,7 @@ * Copyright (C) 2019 David Oberhollenzer <goliath@infraroot.at> */ #define SQFS_BUILDING_DLL -#include "config.h" - -#include "sqfs/meta_reader.h" -#include "sqfs/dir_reader.h" -#include "sqfs/compressor.h" -#include "sqfs/super.h" -#include "sqfs/inode.h" -#include "sqfs/error.h" -#include "sqfs/dir.h" -#include "util.h" - -#include <string.h> -#include <stdlib.h> - -struct sqfs_dir_reader_t { - sqfs_object_t base; - - sqfs_meta_reader_t *meta_dir; - sqfs_meta_reader_t *meta_inode; - const sqfs_super_t *super; - - sqfs_dir_header_t hdr; - sqfs_u64 dir_block_start; - size_t entries; - size_t size; - - size_t start_size; - sqfs_u16 dir_offset; - sqfs_u16 inode_offset; -}; +#include "internal.h" static void dir_reader_destroy(sqfs_object_t *obj) { @@ -259,77 +230,3 @@ int sqfs_dir_reader_get_root_inode(sqfs_dir_reader_t *rd, return sqfs_meta_reader_read_inode(rd->meta_inode, rd->super, block_start, offset, inode); } - -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/find_by_path.c b/lib/sqfs/dir_reader/find_by_path.c new file mode 100644 index 0000000..0cd800f --- /dev/null +++ b/lib/sqfs/dir_reader/find_by_path.c @@ -0,0 +1,82 @@ +/* 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/internal.h b/lib/sqfs/dir_reader/internal.h new file mode 100644 index 0000000..ff162ff --- /dev/null +++ b/lib/sqfs/dir_reader/internal.h @@ -0,0 +1,42 @@ +/* SPDX-License-Identifier: LGPL-3.0-or-later */ +/* + * internal.h + * + * Copyright (C) 2019 David Oberhollenzer <goliath@infraroot.at> + */ +#ifndef DIR_READER_INTERNAL_H +#define DIR_READER_INTERNAL_H + +#include "config.h" + +#include "sqfs/meta_reader.h" +#include "sqfs/dir_reader.h" +#include "sqfs/compressor.h" +#include "sqfs/id_table.h" +#include "sqfs/super.h" +#include "sqfs/inode.h" +#include "sqfs/error.h" +#include "sqfs/dir.h" +#include "util.h" + +#include <string.h> +#include <stdlib.h> + +struct sqfs_dir_reader_t { + sqfs_object_t base; + + sqfs_meta_reader_t *meta_dir; + sqfs_meta_reader_t *meta_inode; + const sqfs_super_t *super; + + sqfs_dir_header_t hdr; + sqfs_u64 dir_block_start; + size_t entries; + size_t size; + + size_t start_size; + sqfs_u16 dir_offset; + sqfs_u16 inode_offset; +}; + +#endif /* DIR_READER_INTERNAL_H */ diff --git a/lib/sqfs/read_tree.c b/lib/sqfs/dir_reader/read_tree.c index feda691..d173ef7 100644 --- a/lib/sqfs/read_tree.c +++ b/lib/sqfs/dir_reader/read_tree.c @@ -5,20 +5,7 @@ * Copyright (C) 2019 David Oberhollenzer <goliath@infraroot.at> */ #define SQFS_BUILDING_DLL -#include "config.h" - -#include "sqfs/meta_reader.h" -#include "sqfs/dir_reader.h" -#include "sqfs/compressor.h" -#include "sqfs/id_table.h" -#include "sqfs/super.h" -#include "sqfs/inode.h" -#include "sqfs/error.h" -#include "sqfs/dir.h" -#include "util.h" - -#include <string.h> -#include <stdlib.h> +#include "internal.h" static int should_skip(int type, unsigned int flags) { |