From 69cf28db0dfa175884c9c41fc3f329b051e0a9c5 Mon Sep 17 00:00:00 2001 From: David Oberhollenzer Date: Sun, 14 May 2023 17:00:33 +0200 Subject: libio: remove device number from dir_iterator_t, add flag field Signed-off-by: David Oberhollenzer --- include/io/dir_iterator.h | 24 +++++++++++------------- lib/io/src/dir_tree_iterator.c | 3 +-- lib/io/src/unix/dir_iterator.c | 8 ++++++-- 3 files changed, 18 insertions(+), 17 deletions(-) diff --git a/include/io/dir_iterator.h b/include/io/dir_iterator.h index b7212b3..0de135a 100644 --- a/include/io/dir_iterator.h +++ b/include/io/dir_iterator.h @@ -10,6 +10,12 @@ #include "sqfs/predef.h" #include "io/istream.h" +typedef enum { + DIR_ENTRY_FLAG_MOUNT_POINT = 0x0001, + + DIR_ENTRY_FLAG_HARD_LINK = 0x0002, +} DIR_ENTRY_FLAG; + /** * @struct dir_entry_t * @@ -60,6 +66,11 @@ typedef struct { */ sqfs_u16 mode; + /** + * @brief Combination of DIR_ENTRY_FLAG values + */ + sqfs_u16 flags; + /** * @brief Name of the entry * @@ -77,19 +88,6 @@ typedef struct { typedef struct dir_iterator_t { sqfs_object_t obj; - /** - * @brief A device number for detecting mount points and hard links. - * - * On Unix-like systems this exposes the underlying device number - * backing this directory. Each entry returned by the iterator also - * has a device number and if it is different, you found a mount point. - * - * The device number, combined with inode number, are also needed to - * detect hard links. Entries with same device and inode number point - * to the same file. - */ - sqfs_u64 dev; - /** * @brief Read the next entry and update internal state relating to it * diff --git a/lib/io/src/dir_tree_iterator.c b/lib/io/src/dir_tree_iterator.c index 67d33c3..51d289a 100644 --- a/lib/io/src/dir_tree_iterator.c +++ b/lib/io/src/dir_tree_iterator.c @@ -59,7 +59,7 @@ static bool should_skip(const dir_tree_iterator_t *dir, const dir_entry_t *ent) return true; if ((dir->cfg.flags & DIR_SCAN_ONE_FILESYSTEM)) { - if (ent->dev != ((const dir_iterator_t *)dir)->dev) + if (ent->flags & DIR_ENTRY_FLAG_MOUNT_POINT) return true; } @@ -310,7 +310,6 @@ dir_iterator_t *dir_tree_iterator_create(const char *path, } sqfs_object_init(it, destroy, NULL); - ((dir_iterator_t *)it)->dev = it->top->dir->dev; ((dir_iterator_t *)it)->next = next; ((dir_iterator_t *)it)->read_link = read_link; ((dir_iterator_t *)it)->open_subdir = open_subdir; diff --git a/lib/io/src/unix/dir_iterator.c b/lib/io/src/unix/dir_iterator.c index 8d30b3f..d6a7454 100644 --- a/lib/io/src/unix/dir_iterator.c +++ b/lib/io/src/unix/dir_iterator.c @@ -20,6 +20,7 @@ typedef struct { struct dirent *ent; struct stat sb; + dev_t device; int state; DIR *dir; } unix_dir_iterator_t; @@ -117,6 +118,9 @@ static int dir_next(dir_iterator_t *base, dir_entry_t **out) decoded->gid = it->sb.st_gid; decoded->mode = it->sb.st_mode; + if (decoded->dev != it->device) + decoded->flags |= DIR_ENTRY_FLAG_MOUNT_POINT; + *out = decoded; return it->state; } @@ -168,7 +172,7 @@ static int dir_open_subdir(dir_iterator_t *base, dir_iterator_t **out) } sqfs_object_init(sub, dir_destroy, NULL); - ((dir_iterator_t *)sub)->dev = sub->sb.st_dev; + sub->device = sub->sb.st_dev; ((dir_iterator_t *)sub)->next = dir_next; ((dir_iterator_t *)sub)->read_link = dir_read_link; ((dir_iterator_t *)sub)->open_subdir = dir_open_subdir; @@ -209,7 +213,7 @@ dir_iterator_t *dir_iterator_create(const char *path) } sqfs_object_init(it, dir_destroy, NULL); - ((dir_iterator_t *)it)->dev = it->sb.st_dev; + it->device = it->sb.st_dev; ((dir_iterator_t *)it)->next = dir_next; ((dir_iterator_t *)it)->read_link = dir_read_link; ((dir_iterator_t *)it)->open_subdir = dir_open_subdir; -- cgit v1.2.3