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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
---
mkfs.jffs2.c | 44 ++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 42 insertions(+), 2 deletions(-)
--- git.orig/mkfs.jffs2.c
+++ git/mkfs.jffs2.c
@@ -98,10 +98,16 @@ struct filesystem_entry {
struct filesystem_entry *next; /* Only relevant to non-directories */
struct filesystem_entry *files; /* Only relevant to directories */
struct rb_node hardlink_rb;
};
+struct ignorepath_entry {
+ struct ignorepath_entry* next; /* Points to the next ignorepath element */
+ char name[PATH_MAX]; /* Name of the entry */
+};
+
+static struct ignorepath_entry* ignorepath = 0;
struct rb_root hardlinks;
static int out_fd = -1;
static int in_fd = -1;
static char default_rootdir[] = ".";
static char *rootdir = default_rootdir;
@@ -404,19 +410,28 @@ static struct filesystem_entry *recursiv
int i, n;
struct stat sb;
char *hpath, *tpath;
struct dirent *dp, **namelist;
struct filesystem_entry *entry;
-
+ struct ignorepath_entry* element = ignorepath;
if (lstat(hostpath, &sb)) {
perror_msg_and_die("%s", hostpath);
}
entry = add_host_filesystem_entry(targetpath, hostpath,
sb.st_uid, sb.st_gid, sb.st_mode, 0, parent);
+ while ( element ) {
+ if ( strcmp( element->name, targetpath ) == 0 ) {
+ printf( "Note: ignoring directories below '%s'\n", targetpath );
+ return entry;
+ break;
+ }
+ element = element->next;
+ }
+
n = scandir(hostpath, &namelist, 0, alphasort);
if (n < 0) {
perror_msg_and_die("opening directory %s", hostpath);
}
@@ -1446,10 +1461,11 @@ static void create_target_filesystem(str
static struct option long_options[] = {
{"pad", 2, NULL, 'p'},
{"root", 1, NULL, 'r'},
{"pagesize", 1, NULL, 's'},
{"eraseblock", 1, NULL, 'e'},
+ {"ignore", 1, NULL, 'I'},
{"output", 1, NULL, 'o'},
{"help", 0, NULL, 'h'},
{"verbose", 0, NULL, 'v'},
{"version", 0, NULL, 'V'},
{"big-endian", 0, NULL, 'b'},
@@ -1493,10 +1509,11 @@ static char *helptext =
" -y, --compressor-priority=PRIORITY:COMPRESSOR_NAME\n"
" Set the priority of a compressor\n"
" -L, --list-compressors Show the list of the avaiable compressors\n"
" -t, --test-compression Call decompress and compare with the original (for test)\n"
" -n, --no-cleanmarkers Don't add a cleanmarker to every eraseblock\n"
+" -I, --ignore=PATH Ignore sub directory and file tree below PATH when recursing over the file system\n"
" -o, --output=FILE Output to FILE (default: stdout)\n"
" -l, --little-endian Create a little-endian filesystem\n"
" -b, --big-endian Create a big-endian filesystem\n"
" -D, --devtable=FILE Use the named FILE as a device table file\n"
" -f, --faketime Change all file times to '0' for regression testing\n"
@@ -1659,21 +1676,22 @@ int main(int argc, char **argv)
FILE *devtable = NULL;
struct filesystem_entry *root;
char *compr_name = NULL;
int compr_prior = -1;
int warn_page_size = 0;
+ struct ignorepath_entry* element = ignorepath;
jffs2_compressors_init();
page_size = sysconf(_SC_PAGESIZE);
if (page_size < 0) /* System doesn't know so ... */
page_size = 4096; /* ... we make an educated guess */
if (page_size != 4096)
warn_page_size = 1; /* warn user if page size not 4096 */
while ((opt = getopt_long(argc, argv,
- "D:d:r:s:o:qUPfh?vVe:lbp::nc:m:x:X:Lty:i:", long_options, &c)) >= 0)
+ "D:d:r:s:I:o:qUPfh?vVe:lbp::nc:m:x:X:Lty:i:", long_options, &c)) >= 0)
{
switch (opt) {
case 'D':
devtable = xfopen(optarg, "r");
if (fstat(fileno(devtable), &sb) < 0)
@@ -1693,10 +1711,32 @@ int main(int argc, char **argv)
case 's':
page_size = strtol(optarg, NULL, 0);
warn_page_size = 0; /* set by user, so don't need to warn */
break;
+ case 'I':
+ printf( "Note: Adding '%s' to ignore Path\n", optarg );
+ element = ignorepath;
+ if ( !ignorepath ) {
+ ignorepath = xmalloc( sizeof( struct ignorepath_entry ) );
+ ignorepath->next = 0;
+ strcpy( &ignorepath->name[0], optarg );
+ } else {
+ while ( element->next ) element = element->next;
+ element->next = xmalloc( sizeof( struct ignorepath_entry ) );
+ element->next->next = 0;
+ strcpy( &element->next->name[0], optarg );
+ }
+ printf( "--------- Dumping ignore path list ----------------\n" );
+ element = ignorepath;
+ while ( element ) {
+ printf( " * '%s'\n", &element->name[0] );
+ element = element->next;
+ }
+ printf( "---------------------------------------------------\n" );
+ break;
+
case 'o':
if (out_fd != -1) {
error_msg_and_die("output filename specified more than once");
}
out_fd = open(optarg, O_CREAT | O_TRUNC | O_RDWR, 0644);
|