aboutsummaryrefslogtreecommitdiff
path: root/bin/gensquashfs
diff options
context:
space:
mode:
authorDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2020-12-10 16:00:44 +0100
committerDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2020-12-10 16:00:44 +0100
commitf138e4a24919682cf477cf93ae47b9a89bb5a3f0 (patch)
tree300147af5d6d6c9a2e0cf9b49674ec9edf58f0fb /bin/gensquashfs
parentca61276fe9676670afe657c863257c01274c111a (diff)
Move fstree dirscan code back to libfstree
Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
Diffstat (limited to 'bin/gensquashfs')
-rw-r--r--bin/gensquashfs/Makemodule.am2
-rw-r--r--bin/gensquashfs/dirscan.c129
-rw-r--r--bin/gensquashfs/dirscan_xattr.c12
-rw-r--r--bin/gensquashfs/mkfs.c2
-rw-r--r--bin/gensquashfs/mkfs.h15
-rw-r--r--bin/gensquashfs/options.c2
6 files changed, 12 insertions, 150 deletions
diff --git a/bin/gensquashfs/Makemodule.am b/bin/gensquashfs/Makemodule.am
index e030009..11a3535 100644
--- a/bin/gensquashfs/Makemodule.am
+++ b/bin/gensquashfs/Makemodule.am
@@ -1,6 +1,6 @@
gensquashfs_SOURCES = bin/gensquashfs/mkfs.c bin/gensquashfs/mkfs.h
gensquashfs_SOURCES += bin/gensquashfs/options.c bin/gensquashfs/selinux.c
-gensquashfs_SOURCES += bin/gensquashfs/dirscan.c bin/gensquashfs/dirscan_xattr.c
+gensquashfs_SOURCES += bin/gensquashfs/dirscan_xattr.c
gensquashfs_LDADD = libcommon.a libsquashfs.la libfstree.a libfstream.a
gensquashfs_LDADD += libcompat.a $(LZO_LIBS) $(PTHREAD_LIBS)
gensquashfs_CPPFLAGS = $(AM_CPPFLAGS)
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
diff --git a/bin/gensquashfs/dirscan_xattr.c b/bin/gensquashfs/dirscan_xattr.c
index 5ed3c9c..65f7f5c 100644
--- a/bin/gensquashfs/dirscan_xattr.c
+++ b/bin/gensquashfs/dirscan_xattr.c
@@ -122,7 +122,7 @@ fail:
#endif
static int xattr_xcan_dfs(const char *path_prefix, void *selinux_handle,
- sqfs_xattr_writer_t *xwr, unsigned int flags,
+ sqfs_xattr_writer_t *xwr, bool scan_xattr,
tree_node_t *node)
{
char *path;
@@ -136,7 +136,7 @@ static int xattr_xcan_dfs(const char *path_prefix, void *selinux_handle,
}
#ifdef HAVE_SYS_XATTR_H
- if (flags & DIR_SCAN_READ_XATTR) {
+ if (scan_xattr) {
path = get_full_path(path_prefix, node);
if (path == NULL)
return -1;
@@ -176,7 +176,7 @@ static int xattr_xcan_dfs(const char *path_prefix, void *selinux_handle,
while (node != NULL) {
if (xattr_xcan_dfs(path_prefix, selinux_handle, xwr,
- flags, node)) {
+ scan_xattr, node)) {
return -1;
}
@@ -188,13 +188,13 @@ static int xattr_xcan_dfs(const char *path_prefix, void *selinux_handle,
}
int xattrs_from_dir(fstree_t *fs, const char *path, void *selinux_handle,
- sqfs_xattr_writer_t *xwr, unsigned int flags)
+ sqfs_xattr_writer_t *xwr, bool scan_xattr)
{
if (xwr == NULL)
return 0;
- if (selinux_handle == NULL && !(flags & DIR_SCAN_READ_XATTR))
+ if (selinux_handle == NULL && !scan_xattr)
return 0;
- return xattr_xcan_dfs(path, selinux_handle, xwr, flags, fs->root);
+ return xattr_xcan_dfs(path, selinux_handle, xwr, scan_xattr, fs->root);
}
diff --git a/bin/gensquashfs/mkfs.c b/bin/gensquashfs/mkfs.c
index ce23e6f..6f26d56 100644
--- a/bin/gensquashfs/mkfs.c
+++ b/bin/gensquashfs/mkfs.c
@@ -206,7 +206,7 @@ int main(int argc, char **argv)
if (opt.infile == NULL) {
if (xattrs_from_dir(&sqfs.fs, opt.packdir, sehnd,
- sqfs.xwr, opt.dirscan_flags)) {
+ sqfs.xwr, opt.scan_xattr)) {
goto out;
}
}
diff --git a/bin/gensquashfs/mkfs.h b/bin/gensquashfs/mkfs.h
index 6aa0c87..e1e4e1b 100644
--- a/bin/gensquashfs/mkfs.h
+++ b/bin/gensquashfs/mkfs.h
@@ -34,7 +34,6 @@
#include <stdlib.h>
#include <string.h>
#include <limits.h>
-#include <dirent.h>
#include <stdio.h>
#include <errno.h>
#include <ctype.h>
@@ -51,22 +50,14 @@ typedef struct {
unsigned int force_gid_value;
bool force_uid;
bool force_gid;
-} options_t;
-
-enum {
- DIR_SCAN_KEEP_TIME = 0x01,
-
- DIR_SCAN_ONE_FILESYSTEM = 0x02,
- DIR_SCAN_READ_XATTR = 0x04,
-};
+ bool scan_xattr;
+} options_t;
void process_command_line(options_t *opt, int argc, char **argv);
-int fstree_from_dir(fstree_t *fs, const char *path, unsigned int flags);
-
int xattrs_from_dir(fstree_t *fs, const char *path, void *selinux_handle,
- sqfs_xattr_writer_t *xwr, unsigned int flags);
+ sqfs_xattr_writer_t *xwr, bool scan_xattr);
void *selinux_open_context_file(const char *filename);
diff --git a/bin/gensquashfs/options.c b/bin/gensquashfs/options.c
index b432a46..9153265 100644
--- a/bin/gensquashfs/options.c
+++ b/bin/gensquashfs/options.c
@@ -245,7 +245,7 @@ void process_command_line(options_t *opt, int argc, char **argv)
break;
#ifdef HAVE_SYS_XATTR_H
case 'x':
- opt->dirscan_flags |= DIR_SCAN_READ_XATTR;
+ opt->scan_xattr = true;
break;
#endif
case 'o':