diff options
author | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2020-12-10 16:00:44 +0100 |
---|---|---|
committer | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2020-12-10 16:00:44 +0100 |
commit | f138e4a24919682cf477cf93ae47b9a89bb5a3f0 (patch) | |
tree | 300147af5d6d6c9a2e0cf9b49674ec9edf58f0fb /bin/gensquashfs/dirscan.c | |
parent | ca61276fe9676670afe657c863257c01274c111a (diff) |
Move fstree dirscan code back to libfstree
Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
Diffstat (limited to 'bin/gensquashfs/dirscan.c')
-rw-r--r-- | bin/gensquashfs/dirscan.c | 129 |
1 files changed, 0 insertions, 129 deletions
diff --git a/bin/gensquashfs/dirscan.c b/bin/gensquashfs/dirscan.c deleted file mode 100644 index bb6d2c3..0000000 --- a/bin/gensquashfs/dirscan.c +++ /dev/null @@ -1,129 +0,0 @@ -/* SPDX-License-Identifier: GPL-3.0-or-later */ -/* - * dirscan.c - * - * Copyright (C) 2019 David Oberhollenzer <goliath@infraroot.at> - */ -#include "mkfs.h" - -#ifdef _WIN32 -int fstree_from_dir(fstree_t *fs, const char *path, unsigned int flags) -{ - (void)fs; (void)path; (void)flags; - fputs("Packing a directory is not supported on Windows.\n", stderr); - return -1; -} -#else -static int populate_dir(int dir_fd, fstree_t *fs, tree_node_t *root, - dev_t devstart, unsigned int flags) -{ - char *extra = NULL; - struct dirent *ent; - struct stat sb; - tree_node_t *n; - int childfd; - DIR *dir; - - dir = fdopendir(dir_fd); - if (dir == NULL) { - perror("fdopendir"); - close(dir_fd); - return -1; - } - - /* XXX: fdopendir can dup and close dir_fd internally - and still be compliant with the spec. */ - dir_fd = dirfd(dir); - - for (;;) { - errno = 0; - ent = readdir(dir); - - if (ent == NULL) { - if (errno) { - perror("readdir"); - goto fail; - } - break; - } - - if (!strcmp(ent->d_name, "..") || !strcmp(ent->d_name, ".")) - continue; - - if (fstatat(dir_fd, ent->d_name, &sb, AT_SYMLINK_NOFOLLOW)) { - perror(ent->d_name); - goto fail; - } - - if ((flags & DIR_SCAN_ONE_FILESYSTEM) && sb.st_dev != devstart) - continue; - - if (S_ISLNK(sb.st_mode)) { - extra = calloc(1, sb.st_size + 1); - if (extra == NULL) - goto fail_rdlink; - - if (readlinkat(dir_fd, ent->d_name, - extra, sb.st_size) < 0) { - goto fail_rdlink; - } - - extra[sb.st_size] = '\0'; - } - - if (!(flags & DIR_SCAN_KEEP_TIME)) - sb.st_mtime = fs->defaults.st_mtime; - - n = fstree_mknode(root, ent->d_name, strlen(ent->d_name), - extra, &sb); - if (n == NULL) { - perror("creating tree node"); - goto fail; - } - - free(extra); - extra = NULL; - - if (S_ISDIR(n->mode)) { - childfd = openat(dir_fd, n->name, O_DIRECTORY | - O_RDONLY | O_CLOEXEC); - if (childfd < 0) { - perror(n->name); - goto fail; - } - - if (populate_dir(childfd, fs, n, devstart, flags)) - goto fail; - } - } - - closedir(dir); - return 0; -fail_rdlink: - perror("readlink"); -fail: - closedir(dir); - free(extra); - return -1; -} - -int fstree_from_dir(fstree_t *fs, const char *path, unsigned int flags) -{ - struct stat sb; - int fd; - - fd = open(path, O_DIRECTORY | O_RDONLY | O_CLOEXEC); - if (fd < 0) { - perror(path); - return -1; - } - - if (fstat(fd, &sb)) { - perror(path); - close(fd); - return -1; - } - - return populate_dir(fd, fs, fs->root, sb.st_dev, flags); -} -#endif |