diff options
Diffstat (limited to 'bin')
| -rw-r--r-- | bin/gensquashfs/Makemodule.am | 2 | ||||
| -rw-r--r-- | bin/gensquashfs/dirscan.c | 129 | ||||
| -rw-r--r-- | bin/gensquashfs/dirscan_xattr.c | 12 | ||||
| -rw-r--r-- | bin/gensquashfs/mkfs.c | 2 | ||||
| -rw-r--r-- | bin/gensquashfs/mkfs.h | 15 | ||||
| -rw-r--r-- | bin/gensquashfs/options.c | 2 | 
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': | 
