aboutsummaryrefslogtreecommitdiff
path: root/bin/gensquashfs/src/mkfs.h
blob: 8e69fc1bf5f0c16121657cd08e6949e7f500f19f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
/* SPDX-License-Identifier: GPL-3.0-or-later */
/*
 * mkfs.h
 *
 * Copyright (C) 2019 David Oberhollenzer <goliath@infraroot.at>
 * Copyright (C) 2022 Enno Boland <mail@eboland.de>
 */
#ifndef MKFS_H
#define MKFS_H

#include "config.h"

#include "common.h"
#include "dir_tree_iterator.h"
#include "util/util.h"
#include "util/parse.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 <stdio.h>
#include <errno.h>
#include <ctype.h>

typedef struct {
	sqfs_writer_cfg_t cfg;
	unsigned int dirscan_flags;
	const char *infile;
	const char *selinux;
	const char *xattr_file;
	const char *sortfile;
	bool no_tail_packing;

	/* copied from command line or constructed from infile argument
	   if not specified. Must be free'd. */
	char *packdir;

	unsigned int force_uid_value;
	unsigned int force_gid_value;

	bool scan_xattr;
} options_t;

struct XattrMapPattern {
	char *path;
	sqfs_xattr_t *entries;
	struct XattrMapPattern *next;
};

struct XattrMap {
	struct XattrMapPattern *patterns;
};

void process_command_line(options_t *opt, int argc, char **argv);

int apply_xattrs(fstree_t *fs, const options_t *opt, void *selinux_handle,
		 void *xattr_map, sqfs_xattr_writer_t *xwr);

void *xattr_open_map_file(const char *path);

int
xattr_apply_map_file(char *path, void *map, sqfs_xattr_writer_t *xwr);

void xattr_close_map_file(void *xattr_map);

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);

/*
  Parses the file format accepted by gensquashfs and produce a file system
  tree from it. File input paths are interpreted as relative to the current
  working directory.

  On failure, an error report with filename and line number is written
  to stderr.

  Returns 0 on success.
 */
int fstree_from_file(fstree_t *fs, const char *filename, const options_t *opt);

int fstree_from_file_stream(fstree_t *fs, sqfs_istream_t *file,
			    const options_t *opt);

int fstree_sort_files(fstree_t *fs, sqfs_istream_t *sortfile);

int scan_directory(fstree_t *fs, sqfs_dir_iterator_t *dir,
		   size_t prefix_len, const char *file_prefix);

int glob_files(fstree_t *fs, const char *filename, size_t line_num,
	       const sqfs_dir_entry_t *ent,
	       const char *basepath, unsigned int glob_flags,
	       split_line_t *extra);

#endif /* MKFS_H */