aboutsummaryrefslogtreecommitdiff
path: root/mkfs
diff options
context:
space:
mode:
authorDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2020-04-27 11:59:02 +0200
committerDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2020-04-27 11:59:02 +0200
commit20b0d509f67dea802706cd6b80b5e20d14988931 (patch)
tree3a87ea358b1206f6823777693d109896d6908283 /mkfs
parent9e332a2d3eddcc262476ac263e03df021b3c44b4 (diff)
Cleanup directory structure of the binary programs
Instead of having the binary programs in randomly named subdirectories, move all of them to a "bin" subdirectory, similar to the utility libraries that have subdirectories within "lib" and give the subdirectories the propper names (e.g. have gensquashfs source in a directory *actually* named "gensquashfs"). Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
Diffstat (limited to 'mkfs')
-rw-r--r--mkfs/Makemodule.am13
-rw-r--r--mkfs/dirscan.c321
-rw-r--r--mkfs/mkfs.c216
-rw-r--r--mkfs/mkfs.h72
-rw-r--r--mkfs/options.c289
-rw-r--r--mkfs/selinux.c78
6 files changed, 0 insertions, 989 deletions
diff --git a/mkfs/Makemodule.am b/mkfs/Makemodule.am
deleted file mode 100644
index 34f3d76..0000000
--- a/mkfs/Makemodule.am
+++ /dev/null
@@ -1,13 +0,0 @@
-gensquashfs_SOURCES = mkfs/mkfs.c mkfs/mkfs.h mkfs/options.c
-gensquashfs_SOURCES += mkfs/dirscan.c mkfs/selinux.c
-gensquashfs_LDADD = libcommon.a libsquashfs.la libfstree.a
-gensquashfs_LDADD += libcompat.a $(LIBSELINUX_LIBS) $(LZO_LIBS)
-gensquashfs_LDADD += $(PTHREAD_LIBS)
-gensquashfs_CPPFLAGS = $(AM_CPPFLAGS)
-gensquashfs_CFLAGS = $(AM_CFLAGS) $(LIBSELINUX_CFLAGS) $(PTHREAD_CFLAGS)
-
-if WITH_SELINUX
-gensquashfs_CPPFLAGS += -DWITH_SELINUX
-endif
-
-bin_PROGRAMS += gensquashfs
diff --git a/mkfs/dirscan.c b/mkfs/dirscan.c
deleted file mode 100644
index dbc862c..0000000
--- a/mkfs/dirscan.c
+++ /dev/null
@@ -1,321 +0,0 @@
-/* SPDX-License-Identifier: GPL-3.0-or-later */
-/*
- * fstree_from_dir.c
- *
- * Copyright (C) 2019 David Oberhollenzer <goliath@infraroot.at>
- */
-#include "mkfs.h"
-
-#ifdef HAVE_SYS_XATTR_H
-static char *get_full_path(const char *prefix, tree_node_t *node)
-{
- char *path = NULL, *new = NULL;
- size_t path_len, prefix_len;
- int ret;
-
- path = fstree_get_path(node);
- if (path == NULL)
- goto fail;
-
- ret = canonicalize_name(path);
- assert(ret == 0);
-
- path_len = strlen(path);
- prefix_len = strlen(prefix);
-
- while (prefix_len > 0 && prefix[prefix_len - 1] == '/')
- --prefix_len;
-
- if (prefix_len > 0) {
- new = realloc(path, path_len + prefix_len + 2);
- if (new == NULL)
- goto fail;
-
- path = new;
-
- memmove(path + prefix_len + 1, path, path_len + 1);
- memcpy(path, prefix, prefix_len);
- path[prefix_len] = '/';
- }
-
- return path;
-fail:
- perror("getting full path for xattr scan");
- free(path);
- return NULL;
-}
-
-static int xattr_from_path(sqfs_xattr_writer_t *xwr, const char *path)
-{
- char *key, *value = NULL, *buffer = NULL;
- ssize_t buflen, vallen, keylen;
- int ret;
-
- buflen = llistxattr(path, NULL, 0);
- if (buflen < 0) {
- fprintf(stderr, "llistxattr %s: %s", path, strerror(errno));
- return -1;
- }
-
- if (buflen == 0)
- return 0;
-
- buffer = malloc(buflen);
- if (buffer == NULL) {
- perror("xattr name buffer");
- return -1;
- }
-
- buflen = llistxattr(path, buffer, buflen);
- if (buflen == -1) {
- fprintf(stderr, "llistxattr %s: %s", path, strerror(errno));
- goto fail;
- }
-
- key = buffer;
- while (buflen > 0) {
- vallen = lgetxattr(path, key, NULL, 0);
- if (vallen == -1) {
- fprintf(stderr, "lgetxattr %s: %s",
- path, strerror(errno));
- goto fail;
- }
-
- if (vallen > 0) {
- value = calloc(1, vallen);
- if (value == NULL) {
- perror("allocating xattr value buffer");
- goto fail;
- }
-
- vallen = lgetxattr(path, key, value, vallen);
- if (vallen == -1) {
- fprintf(stderr, "lgetxattr %s: %s\n",
- path, strerror(errno));
- goto fail;
- }
-
- ret = sqfs_xattr_writer_add(xwr, key, value, vallen);
- if (ret) {
- sqfs_perror(path,
- "storing xattr key-value pairs",
- ret);
- goto fail;
- }
-
- free(value);
- value = NULL;
- }
-
- keylen = strlen(key) + 1;
- buflen -= keylen;
- key += keylen;
- }
-
- free(buffer);
- return 0;
-fail:
- free(value);
- free(buffer);
- return -1;
-}
-#endif
-
-#ifdef _WIN32
-int fstree_from_dir(fstree_t *fs, const char *path, void *selinux_handle,
- sqfs_xattr_writer_t *xwr, unsigned int flags)
-{
- (void)fs; (void)path; (void)selinux_handle; (void)xwr; (void)flags;
- fputs("Packing a directory is not supported on Windows.\n", stderr);
- return -1;
-}
-#else
-static int xattr_xcan_dfs(const char *path_prefix, void *selinux_handle,
- sqfs_xattr_writer_t *xwr, unsigned int flags,
- tree_node_t *node)
-{
- char *path;
- int ret;
-
- ret = sqfs_xattr_writer_begin(xwr);
- if (ret) {
- sqfs_perror(node->name, "recoding xattr key-value pairs\n",
- ret);
- return -1;
- }
-
-#ifdef HAVE_SYS_XATTR_H
- if (flags & DIR_SCAN_READ_XATTR) {
- path = get_full_path(path_prefix, node);
- if (path == NULL)
- return -1;
-
- ret = xattr_from_path(xwr, path);
- free(path);
-
- if (ret)
- return -1;
- }
-#else
- (void)path_prefix;
-#endif
-
- if (selinux_handle != NULL) {
- path = fstree_get_path(node);
- if (path == NULL) {
- perror("reconstructing absolute path");
- return -1;
- }
-
- ret = selinux_relable_node(selinux_handle, xwr, node, path);
- free(path);
-
- if (ret)
- return -1;
- }
-
- if (sqfs_xattr_writer_end(xwr, &node->xattr_idx)) {
- sqfs_perror(node->name, "completing xattr key-value pairs",
- ret);
- return -1;
- }
-
- if (S_ISDIR(node->mode)) {
- node = node->data.dir.children;
-
- while (node != NULL) {
- if (xattr_xcan_dfs(path_prefix, selinux_handle, xwr,
- flags, node)) {
- return -1;
- }
-
- node = node->next;
- }
- }
-
- return 0;
-}
-
-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, void *selinux_handle,
- sqfs_xattr_writer_t *xwr, 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;
- }
-
- if (populate_dir(fd, fs, fs->root, sb.st_dev, flags))
- return -1;
-
- if (xwr != NULL && (selinux_handle != NULL ||
- (flags & DIR_SCAN_READ_XATTR))) {
- if (xattr_xcan_dfs(path, selinux_handle, xwr, flags, fs->root))
- return -1;
- }
-
- return 0;
-}
-#endif
diff --git a/mkfs/mkfs.c b/mkfs/mkfs.c
deleted file mode 100644
index 9ffbb94..0000000
--- a/mkfs/mkfs.c
+++ /dev/null
@@ -1,216 +0,0 @@
-/* SPDX-License-Identifier: GPL-3.0-or-later */
-/*
- * mkfs.c
- *
- * Copyright (C) 2019 David Oberhollenzer <goliath@infraroot.at>
- */
-#include "mkfs.h"
-
-static int set_working_dir(options_t *opt)
-{
- const char *ptr;
- char *path;
-
- if (opt->packdir != NULL) {
- if (chdir(opt->packdir)) {
- perror(opt->packdir);
- return -1;
- }
- return 0;
- }
-
- ptr = strrchr(opt->infile, '/');
- if (ptr == NULL)
- return 0;
-
- path = strndup(opt->infile, ptr - opt->infile);
- if (path == NULL) {
- perror("constructing input directory path");
- return -1;
- }
-
- if (chdir(path)) {
- perror(path);
- free(path);
- return -1;
- }
-
- free(path);
- return 0;
-}
-
-static int pack_files(sqfs_block_processor_t *data, fstree_t *fs,
- options_t *opt)
-{
- sqfs_inode_generic_t **inode_ptr;
- sqfs_u64 filesize;
- sqfs_file_t *file;
- tree_node_t *node;
- const char *path;
- char *node_path;
- file_info_t *fi;
- int flags;
- int ret;
-
- if (set_working_dir(opt))
- return -1;
-
- for (fi = fs->files; fi != NULL; fi = fi->next) {
- if (fi->input_file == NULL) {
- node = container_of(fi, tree_node_t, data.file);
-
- node_path = fstree_get_path(node);
- if (node_path == NULL) {
- perror("reconstructing file path");
- return -1;
- }
-
- ret = canonicalize_name(node_path);
- assert(ret == 0);
-
- path = node_path;
- } else {
- node_path = NULL;
- path = fi->input_file;
- }
-
- if (!opt->cfg.quiet)
- printf("packing %s\n", path);
-
- file = sqfs_open_file(path, SQFS_FILE_OPEN_READ_ONLY);
- if (file == NULL) {
- perror(path);
- free(node_path);
- return -1;
- }
-
- flags = 0;
- filesize = file->get_size(file);
-
- if (opt->no_tail_packing && filesize > opt->cfg.block_size)
- flags |= SQFS_BLK_DONT_FRAGMENT;
-
- inode_ptr = (sqfs_inode_generic_t **)&fi->user_ptr;
-
- ret = write_data_from_file(path, data, inode_ptr, file, flags);
- sqfs_destroy(file);
- free(node_path);
-
- if (ret)
- return -1;
- }
-
- return 0;
-}
-
-static int relabel_tree_dfs(const char *filename, sqfs_xattr_writer_t *xwr,
- tree_node_t *n, void *selinux_handle)
-{
- char *path = fstree_get_path(n);
- int ret;
-
- if (path == NULL) {
- perror("getting absolute node path for SELinux relabeling");
- return -1;
- }
-
- ret = sqfs_xattr_writer_begin(xwr);
- if (ret) {
- sqfs_perror(filename, "recording xattr key-value pairs", ret);
- return -1;
- }
-
- if (selinux_relable_node(selinux_handle, xwr, n, path)) {
- free(path);
- return -1;
- }
-
- ret = sqfs_xattr_writer_end(xwr, &n->xattr_idx);
- if (ret) {
- sqfs_perror(filename, "flushing completed key-value pairs",
- ret);
- return -1;
- }
-
- free(path);
-
- if (S_ISDIR(n->mode)) {
- for (n = n->data.dir.children; n != NULL; n = n->next) {
- if (relabel_tree_dfs(filename, xwr, n, selinux_handle))
- return -1;
- }
- }
-
- return 0;
-}
-
-static int read_fstree(fstree_t *fs, options_t *opt, sqfs_xattr_writer_t *xwr,
- void *selinux_handle)
-{
- FILE *fp;
- int ret;
-
- if (opt->infile == NULL) {
- return fstree_from_dir(fs, opt->packdir, selinux_handle,
- xwr, opt->dirscan_flags);
- }
-
- fp = fopen(opt->infile, "rb");
- if (fp == NULL) {
- perror(opt->infile);
- return -1;
- }
-
- ret = fstree_from_file(fs, opt->infile, fp);
- fclose(fp);
-
- if (ret == 0 && selinux_handle != NULL)
- ret = relabel_tree_dfs(opt->cfg.filename, xwr,
- fs->root, selinux_handle);
-
- return ret;
-}
-
-int main(int argc, char **argv)
-{
- int status = EXIT_FAILURE;
- void *sehnd = NULL;
- sqfs_writer_t sqfs;
- options_t opt;
-
- process_command_line(&opt, argc, argv);
-
- if (sqfs_writer_init(&sqfs, &opt.cfg))
- return EXIT_FAILURE;
-
- if (opt.selinux != NULL) {
- sehnd = selinux_open_context_file(opt.selinux);
- if (sehnd == NULL)
- goto out;
- }
-
- if (read_fstree(&sqfs.fs, &opt, sqfs.xwr, sehnd)) {
- if (sehnd != NULL)
- selinux_close_context_file(sehnd);
- goto out;
- }
-
- if (sehnd != NULL) {
- selinux_close_context_file(sehnd);
- sehnd = NULL;
- }
-
- if (fstree_post_process(&sqfs.fs))
- goto out;
-
- if (pack_files(sqfs.data, &sqfs.fs, &opt))
- goto out;
-
- if (sqfs_writer_finish(&sqfs, &opt.cfg))
- goto out;
-
- status = EXIT_SUCCESS;
-out:
- sqfs_writer_cleanup(&sqfs, status);
- return status;
-}
diff --git a/mkfs/mkfs.h b/mkfs/mkfs.h
deleted file mode 100644
index 1b767aa..0000000
--- a/mkfs/mkfs.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/* SPDX-License-Identifier: GPL-3.0-or-later */
-/*
- * mkfs.h
- *
- * Copyright (C) 2019 David Oberhollenzer <goliath@infraroot.at>
- */
-#ifndef MKFS_H
-#define MKFS_H
-
-#include "config.h"
-
-#include "common.h"
-#include "fstree.h"
-
-#ifdef HAVE_SYS_XATTR_H
-#include <sys/xattr.h>
-
-#if defined(__APPLE__) && defined(__MACH__)
-#define llistxattr(path, list, size) \
- listxattr(path, list, size, XATTR_NOFOLLOW)
-
-#define lgetxattr(path, name, value, size) \
- getxattr(path, name, value, size, 0, XATTR_NOFOLLOW)
-#endif
-#endif
-
-#ifdef WITH_SELINUX
-#include <selinux/selinux.h>
-#include <selinux/label.h>
-#endif
-
-#include <getopt.h>
-#include <assert.h>
-#include <stdlib.h>
-#include <string.h>
-#include <limits.h>
-#include <dirent.h>
-#include <stdio.h>
-#include <errno.h>
-#include <ctype.h>
-
-typedef struct {
- sqfs_writer_cfg_t cfg;
- unsigned int dirscan_flags;
- const char *infile;
- const char *packdir;
- const char *selinux;
- bool no_tail_packing;
-} options_t;
-
-enum {
- DIR_SCAN_KEEP_TIME = 0x01,
-
- DIR_SCAN_ONE_FILESYSTEM = 0x02,
-
- DIR_SCAN_READ_XATTR = 0x04,
-};
-
-void process_command_line(options_t *opt, int argc, char **argv);
-
-int fstree_from_dir(fstree_t *fs, const char *path, void *selinux_handle,
- sqfs_xattr_writer_t *xwr, unsigned int flags);
-
-
-void *selinux_open_context_file(const char *filename);
-
-int selinux_relable_node(void *sehnd, sqfs_xattr_writer_t *xwr,
- tree_node_t *node, const char *path);
-
-void selinux_close_context_file(void *sehnd);
-
-#endif /* MKFS_H */
diff --git a/mkfs/options.c b/mkfs/options.c
deleted file mode 100644
index 2369787..0000000
--- a/mkfs/options.c
+++ /dev/null
@@ -1,289 +0,0 @@
-/* SPDX-License-Identifier: GPL-3.0-or-later */
-/*
- * options.c
- *
- * Copyright (C) 2019 David Oberhollenzer <goliath@infraroot.at>
- */
-#include "mkfs.h"
-
-static struct option long_opts[] = {
- { "compressor", required_argument, NULL, 'c' },
- { "block-size", required_argument, NULL, 'b' },
- { "dev-block-size", required_argument, NULL, 'B' },
- { "defaults", required_argument, NULL, 'd' },
- { "comp-extra", required_argument, NULL, 'X' },
- { "pack-file", required_argument, NULL, 'F' },
- { "pack-dir", required_argument, NULL, 'D' },
- { "num-jobs", required_argument, NULL, 'j' },
- { "queue-backlog", required_argument, NULL, 'Q' },
- { "keep-time", no_argument, NULL, 'k' },
-#ifdef HAVE_SYS_XATTR_H
- { "keep-xattr", no_argument, NULL, 'x' },
-#endif
- { "one-file-system", no_argument, NULL, 'o' },
- { "exportable", no_argument, NULL, 'e' },
- { "no-tail-packing", no_argument, NULL, 'T' },
- { "force", no_argument, NULL, 'f' },
- { "quiet", no_argument, NULL, 'q' },
-#ifdef WITH_SELINUX
- { "selinux", required_argument, NULL, 's' },
-#endif
- { "version", no_argument, NULL, 'V' },
- { "help", no_argument, NULL, 'h' },
- { NULL, 0, NULL, 0 },
-};
-
-static const char *short_opts = "F:D:X:c:b:B:d:j:Q:kxoefqThV"
-#ifdef WITH_SELINUX
-"s:"
-#endif
-#ifdef HAVE_SYS_XATTR_H
-"x"
-#endif
-;
-
-static const char *help_string =
-"Usage: gensquashfs [OPTIONS...] <squashfs-file>\n"
-"\n"
-"Possible options:\n"
-"\n"
-" --pack-file, -F <file> Use a `gen_init_cpio` style description file.\n"
-" The file format is specified below.\n"
-" If --pack-dir is used, input file paths are\n"
-" relative to the pack directory, otherwise\n"
-" they are relative to the directory the pack\n"
-" file is in.\n"
-" --pack-dir, -D <directory> If --pack-file is used, this is the root path\n"
-" relative to which to read files. If no pack\n"
-" file is specified, pack the contents of the\n"
-" given directory into a SquashFS image. The\n"
-" directory becomes the root of the file\n"
-" system.\n"
-"\n"
-" --compressor, -c <name> Select the compressor to use.\n"
-" A list of available compressors is below.\n"
-" --comp-extra, -X <options> A comma separated list of extra options for\n"
-" the selected compressor. Specify 'help' to\n"
-" get a list of available options.\n"
-" --num-jobs, -j <count> Number of compressor jobs to create.\n"
-" --queue-backlog, -Q <count> Maximum number of data blocks in the thread\n"
-" worker queue before the packer starts waiting\n"
-" for the block processors to catch up.\n"
-" Defaults to 10 times the number of jobs.\n"
-" --block-size, -b <size> Block size to use for Squashfs image.\n"
-" Defaults to %u.\n"
-" --dev-block-size, -B <size> Device block size to padd the image to.\n"
-" Defaults to %u.\n"
-" --defaults, -d <options> A comma separated list of default values for\n"
-" implicitly created directories.\n"
-"\n"
-" Possible options:\n"
-" uid=<value> 0 if not set.\n"
-" gid=<value> 0 if not set.\n"
-" mode=<value> 0755 if not set.\n"
-" mtime=<value> 0 if not set.\n"
-"\n"
-#ifdef WITH_SELINUX
-" --selinux, -s <file> Specify an SELinux label file to get context\n"
-" attributes from.\n"
-#endif
-" --keep-time, -k When using --pack-dir only, use the timestamps\n"
-" from the input files instead of setting\n"
-" defaults on all input paths.\n"
-" --keep-xattr, -x When using --pack-dir only, read and pack the\n"
-" extended attributes from the input files.\n"
-" --one-file-system, -o When using --pack-dir only, stay in local file\n"
-" system and do not cross mount points.\n"
-" --exportable, -e Generate an export table for NFS support.\n"
-" --no-tail-packing, -T Do not perform tail end packing on files that\n"
-" are larger than block size.\n"
-" --force, -f Overwrite the output file if it exists.\n"
-" --quiet, -q Do not print out progress reports.\n"
-" --help, -h Print help text and exit.\n"
-" --version, -V Print version information and exit.\n"
-"\n";
-
-const char *help_details =
-"When using the pack file option, the given file is expected to contain\n"
-"newline separated entries that describe the files to be included in the\n"
-"SquashFS image. The following entry types can be specified:\n"
-"\n"
-"# a comment\n"
-"file <path> <mode> <uid> <gid> [<location>]\n"
-"dir <path> <mode> <uid> <gid>\n"
-"nod <path> <mode> <uid> <gid> <dev_type> <maj> <min>\n"
-"slink <path> <mode> <uid> <gid> <target>\n"
-"link <path> <dummy> <dummy> <dummy> <target>\n"
-"pipe <path> <mode> <uid> <gid>\n"
-"sock <path> <mode> <uid> <gid>\n"
-"\n"
-"<path> Absolute path of the entry in the image. Can be put in quotes\n"
-" if some components contain spaces.\n"
-"<location> If given, location of the input file. Either absolute or relative\n"
-" to the description file. If omitted, the image path is used,\n"
-" relative to the description file.\n"
-"<target> Symlink or hardlink target.\n"
-"<mode> Mode/permissions of the entry.\n"
-"<uid> Numeric user id.\n"
-"<gid> Numeric group id.\n"
-"<dev_type> Device type (b=block, c=character).\n"
-"<maj> Major number of a device special file.\n"
-"<min> Minor number of a device special file.\n"
-"\n"
-"Example:\n"
-" # A simple squashfs image\n"
-" dir /dev 0755 0 0\n"
-" nod /dev/console 0600 0 0 c 5 1\n"
-" dir /root 0700 0 0\n"
-" dir /sbin 0755 0 0\n"
-" \n"
-" # Add a file. Input is relative to listing or pack dir.\n"
-" file /sbin/init 0755 0 0 ../init/sbin/init\n"
-" \n"
-" # Read bin/bash, relative to listing or pack dir.\n"
-" # Implicitly create /bin.\n"
-" file /bin/bash 0755 0 0\n"
-" \n"
-" # file name with a space in it.\n"
-" file \"/opt/my app/\\\"special\\\"/data\" 0600 0 0\n"
-"\n\n";
-
-void process_command_line(options_t *opt, int argc, char **argv)
-{
- bool have_compressor;
- int i, ret;
-
- memset(opt, 0, sizeof(*opt));
- sqfs_writer_cfg_init(&opt->cfg);
-
- for (;;) {
- i = getopt_long(argc, argv, short_opts, long_opts, NULL);
- if (i == -1)
- break;
-
- switch (i) {
- case 'T':
- opt->no_tail_packing = true;
- break;
- case 'c':
- have_compressor = true;
- ret = sqfs_compressor_id_from_name(optarg);
-
- if (ret < 0) {
- have_compressor = false;
-#ifdef WITH_LZO
- if (opt->cfg.comp_id == SQFS_COMP_LZO)
- have_compressor = true;
-#endif
- }
-
- if (!have_compressor) {
- fprintf(stderr, "Unsupported compressor '%s'\n",
- optarg);
- exit(EXIT_FAILURE);
- }
-
- opt->cfg.comp_id = ret;
- break;
- case 'b':
- if (parse_size("Block size", &opt->cfg.block_size,
- optarg, 0)) {
- exit(EXIT_FAILURE);
- }
- break;
- case 'j':
- opt->cfg.num_jobs = strtol(optarg, NULL, 0);
- break;
- case 'Q':
- opt->cfg.max_backlog = strtol(optarg, NULL, 0);
- break;
- case 'B':
- if (parse_size("Device block size",
- &opt->cfg.devblksize, optarg, 0)) {
- exit(EXIT_FAILURE);
- }
- if (opt->cfg.devblksize < 1024) {
- fputs("Device block size must be at "
- "least 1024\n", stderr);
- exit(EXIT_FAILURE);
- }
- break;
- case 'd':
- opt->cfg.fs_defaults = optarg;
- break;
- case 'k':
- opt->dirscan_flags |= DIR_SCAN_KEEP_TIME;
- break;
-#ifdef HAVE_SYS_XATTR_H
- case 'x':
- opt->dirscan_flags |= DIR_SCAN_READ_XATTR;
- break;
-#endif
- case 'o':
- opt->dirscan_flags |= DIR_SCAN_ONE_FILESYSTEM;
- break;
- case 'e':
- opt->cfg.exportable = true;
- break;
- case 'f':
- opt->cfg.outmode |= SQFS_FILE_OPEN_OVERWRITE;
- break;
- case 'q':
- opt->cfg.quiet = true;
- break;
- case 'X':
- opt->cfg.comp_extra = optarg;
- break;
- case 'F':
- opt->infile = optarg;
- break;
- case 'D':
- opt->packdir = optarg;
- break;
-#ifdef WITH_SELINUX
- case 's':
- opt->selinux = optarg;
- break;
-#endif
- case 'h':
- printf(help_string,
- SQFS_DEFAULT_BLOCK_SIZE, SQFS_DEVBLK_SIZE);
- fputs(help_details, stdout);
- compressor_print_available();
- exit(EXIT_SUCCESS);
- case 'V':
- print_version("gensquashfs");
- exit(EXIT_SUCCESS);
- default:
- goto fail_arg;
- }
- }
-
- if (opt->cfg.num_jobs < 1)
- opt->cfg.num_jobs = 1;
-
- if (opt->cfg.max_backlog < 1)
- opt->cfg.max_backlog = 10 * opt->cfg.num_jobs;
-
- if (opt->cfg.comp_extra != NULL &&
- strcmp(opt->cfg.comp_extra, "help") == 0) {
- compressor_print_help(opt->cfg.comp_id);
- exit(EXIT_SUCCESS);
- }
-
- if (opt->infile == NULL && opt->packdir == NULL) {
- fputs("No input file or directory specified.\n", stderr);
- goto fail_arg;
- }
-
- if (optind >= argc) {
- fputs("No output file specified.\n", stderr);
- goto fail_arg;
- }
-
- opt->cfg.filename = argv[optind++];
- return;
-fail_arg:
- fputs("Try `gensquashfs --help' for more information.\n", stderr);
- exit(EXIT_FAILURE);
-}
diff --git a/mkfs/selinux.c b/mkfs/selinux.c
deleted file mode 100644
index 678723b..0000000
--- a/mkfs/selinux.c
+++ /dev/null
@@ -1,78 +0,0 @@
-/* SPDX-License-Identifier: GPL-3.0-or-later */
-/*
- * selinux.c
- *
- * Copyright (C) 2019 David Oberhollenzer <goliath@infraroot.at>
- */
-#include "mkfs.h"
-
-#define XATTR_NAME_SELINUX "security.selinux"
-#define XATTR_VALUE_SELINUX "system_u:object_r:unlabeled_t:s0"
-
-#ifdef WITH_SELINUX
-int selinux_relable_node(void *sehnd, sqfs_xattr_writer_t *xwr,
- tree_node_t *node, const char *path)
-{
- char *context = NULL;
- int ret;
-
- if (selabel_lookup(sehnd, &context, path, node->mode) < 0) {
- context = strdup(XATTR_VALUE_SELINUX);
- if (context == NULL)
- goto fail;
- }
-
- ret = sqfs_xattr_writer_add(xwr, XATTR_NAME_SELINUX,
- context, strlen(context));
- free(context);
-
- if (ret)
- sqfs_perror(node->name, "storing SELinux xattr", ret);
-
- return ret;
-fail:
- perror("relabeling files");
- return -1;
-}
-
-void *selinux_open_context_file(const char *filename)
-{
- struct selabel_handle *sehnd;
- struct selinux_opt seopts[] = {
- { SELABEL_OPT_PATH, filename },
- };
-
- sehnd = selabel_open(SELABEL_CTX_FILE, seopts, 1);
- if (sehnd == NULL)
- perror(filename);
-
- return sehnd;
-}
-
-void selinux_close_context_file(void *sehnd)
-{
- selabel_close(sehnd);
-}
-#else
-int selinux_relable_node(void *sehnd, sqfs_xattr_writer_t *xwr,
- tree_node_t *node, const char *path)
-{
- (void)sehnd; (void)xwr; (void)node; (void)path;
- fputs("Built without SELinux support, cannot add SELinux labels\n",
- stderr);
- return -1;
-}
-
-void *selinux_open_context_file(const char *filename)
-{
- (void)filename;
- fputs("Built without SELinux support, cannot open contexts file\n",
- stderr);
- return NULL;
-}
-
-void selinux_close_context_file(void *sehnd)
-{
- (void)sehnd;
-}
-#endif