1*4882a593SmuzhiyunUpstream-Status: Pending
2*4882a593Smuzhiyun
3*4882a593SmuzhiyunIndex: git/jffsX-utils/mkfs.jffs2.c
4*4882a593Smuzhiyun===================================================================
5*4882a593Smuzhiyun--- git.orig/jffsX-utils/mkfs.jffs2.c
6*4882a593Smuzhiyun+++ git/jffsX-utils/mkfs.jffs2.c
7*4882a593Smuzhiyun@@ -100,6 +100,11 @@ struct filesystem_entry {
8*4882a593Smuzhiyun 	struct rb_node hardlink_rb;
9*4882a593Smuzhiyun };
10*4882a593Smuzhiyun
11*4882a593Smuzhiyun+struct ignorepath_entry {
12*4882a593Smuzhiyun+	struct ignorepath_entry* next;  /* Points to the next ignorepath element */
13*4882a593Smuzhiyun+	char name[PATH_MAX];        /* Name of the entry */
14*4882a593Smuzhiyun+};
15*4882a593Smuzhiyun+static struct ignorepath_entry* ignorepath = 0;
16*4882a593Smuzhiyun struct rb_root hardlinks;
17*4882a593Smuzhiyun static int out_fd = -1;
18*4882a593Smuzhiyun static int in_fd = -1;
19*4882a593Smuzhiyun@@ -309,7 +314,7 @@ static struct filesystem_entry *recursiv
20*4882a593Smuzhiyun 	char *hpath, *tpath;
21*4882a593Smuzhiyun 	struct dirent *dp, **namelist;
22*4882a593Smuzhiyun 	struct filesystem_entry *entry;
23*4882a593Smuzhiyun-
24*4882a593Smuzhiyun+	struct ignorepath_entry* element = ignorepath;
25*4882a593Smuzhiyun
26*4882a593Smuzhiyun 	if (lstat(hostpath, &sb)) {
27*4882a593Smuzhiyun 		sys_errmsg_die("%s", hostpath);
28*4882a593Smuzhiyun@@ -318,6 +323,15 @@ static struct filesystem_entry *recursiv
29*4882a593Smuzhiyun 	entry = add_host_filesystem_entry(targetpath, hostpath,
30*4882a593Smuzhiyun 			sb.st_uid, sb.st_gid, sb.st_mode, 0, parent);
31*4882a593Smuzhiyun
32*4882a593Smuzhiyun+	while ( element ) {
33*4882a593Smuzhiyun+		if ( strcmp( element->name, targetpath ) == 0 ) {
34*4882a593Smuzhiyun+			printf( "Note: ignoring directories below '%s'\n", targetpath );
35*4882a593Smuzhiyun+			return entry;
36*4882a593Smuzhiyun+			break;
37*4882a593Smuzhiyun+		}
38*4882a593Smuzhiyun+		element = element->next;
39*4882a593Smuzhiyun+	}
40*4882a593Smuzhiyun+
41*4882a593Smuzhiyun 	n = scandir(hostpath, &namelist, 0, alphasort);
42*4882a593Smuzhiyun 	if (n < 0) {
43*4882a593Smuzhiyun 		sys_errmsg_die("opening directory %s", hostpath);
44*4882a593Smuzhiyun@@ -1359,6 +1373,7 @@ static struct option long_options[] = {
45*4882a593Smuzhiyun 	{"root", 1, NULL, 'r'},
46*4882a593Smuzhiyun 	{"pagesize", 1, NULL, 's'},
47*4882a593Smuzhiyun 	{"eraseblock", 1, NULL, 'e'},
48*4882a593Smuzhiyun+	{"ignore", 1, NULL, 'I'},
49*4882a593Smuzhiyun 	{"output", 1, NULL, 'o'},
50*4882a593Smuzhiyun 	{"help", 0, NULL, 'h'},
51*4882a593Smuzhiyun 	{"verbose", 0, NULL, 'v'},
52*4882a593Smuzhiyun@@ -1409,6 +1424,7 @@ static const char helptext[] =
53*4882a593Smuzhiyun "  -L, --list-compressors  Show the list of the available compressors\n"
54*4882a593Smuzhiyun "  -t, --test-compression  Call decompress and compare with the original (for test)\n"
55*4882a593Smuzhiyun "  -n, --no-cleanmarkers   Don't add a cleanmarker to every eraseblock\n"
56*4882a593Smuzhiyun+"  -I, --ignore=PATH       Ignore sub directory and file tree below PATH when recursing over the file system\n"
57*4882a593Smuzhiyun "  -o, --output=FILE       Output to FILE (default: stdout)\n"
58*4882a593Smuzhiyun "  -l, --little-endian     Create a little-endian filesystem\n"
59*4882a593Smuzhiyun "  -b, --big-endian        Create a big-endian filesystem\n"
60*4882a593Smuzhiyun@@ -1566,6 +1582,7 @@ int main(int argc, char **argv)
61*4882a593Smuzhiyun 	char *compr_name = NULL;
62*4882a593Smuzhiyun 	int compr_prior  = -1;
63*4882a593Smuzhiyun 	int warn_page_size = 0;
64*4882a593Smuzhiyun+	struct ignorepath_entry* element = ignorepath;
65*4882a593Smuzhiyun
66*4882a593Smuzhiyun 	page_size = sysconf(_SC_PAGESIZE);
67*4882a593Smuzhiyun 	if (page_size < 0) /* System doesn't know so ... */
68*4882a593Smuzhiyun@@ -1576,7 +1593,7 @@ int main(int argc, char **argv)
69*4882a593Smuzhiyun 	jffs2_compressors_init();
70*4882a593Smuzhiyun
71*4882a593Smuzhiyun 	while ((opt = getopt_long(argc, argv,
72*4882a593Smuzhiyun-					"D:d:r:s:o:qUPfh?vVe:lbp::nc:m:x:X:Lty:i:", long_options, &c)) >= 0)
73*4882a593Smuzhiyun+					"D:d:r:s:I:o:qUPfh?vVe:lbp::nc:m:x:X:Lty:i:", long_options, &c)) >= 0)
74*4882a593Smuzhiyun 	{
75*4882a593Smuzhiyun 		switch (opt) {
76*4882a593Smuzhiyun 			case 'D':
77*4882a593Smuzhiyun@@ -1600,6 +1617,28 @@ int main(int argc, char **argv)
78*4882a593Smuzhiyun 				warn_page_size = 0; /* set by user, so don't need to warn */
79*4882a593Smuzhiyun 				break;
80*4882a593Smuzhiyun
81*4882a593Smuzhiyun+			case 'I':
82*4882a593Smuzhiyun+				printf( "Note: Adding '%s' to ignore Path\n", optarg );
83*4882a593Smuzhiyun+				element = ignorepath;
84*4882a593Smuzhiyun+				if ( !ignorepath ) {
85*4882a593Smuzhiyun+					ignorepath = xmalloc( sizeof( struct ignorepath_entry ) );
86*4882a593Smuzhiyun+					ignorepath->next = 0;
87*4882a593Smuzhiyun+					strcpy( &ignorepath->name[0], optarg );
88*4882a593Smuzhiyun+				} else {
89*4882a593Smuzhiyun+					while ( element->next ) element = element->next;
90*4882a593Smuzhiyun+					element->next = xmalloc( sizeof( struct ignorepath_entry ) );
91*4882a593Smuzhiyun+ 					element->next->next = 0;
92*4882a593Smuzhiyun+					strcpy( &element->next->name[0], optarg );
93*4882a593Smuzhiyun+				}
94*4882a593Smuzhiyun+				printf( "--------- Dumping ignore path list ----------------\n" );
95*4882a593Smuzhiyun+				element = ignorepath;
96*4882a593Smuzhiyun+				while ( element ) {
97*4882a593Smuzhiyun+					printf( "  * '%s'\n", &element->name[0] );
98*4882a593Smuzhiyun+					element = element->next;
99*4882a593Smuzhiyun+				}
100*4882a593Smuzhiyun+				printf( "---------------------------------------------------\n" );
101*4882a593Smuzhiyun+				break;
102*4882a593Smuzhiyun+
103*4882a593Smuzhiyun 			case 'o':
104*4882a593Smuzhiyun 				if (out_fd != -1) {
105*4882a593Smuzhiyun 					errmsg_die("output filename specified more than once");
106