hc
2023-05-26 a23f51ed7a39e452c1037343a84d7db1ca2c5bd7
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
Upstream-Status: Pending
 
Index: git/jffsX-utils/mkfs.jffs2.c
===================================================================
--- git.orig/jffsX-utils/mkfs.jffs2.c
+++ git/jffsX-utils/mkfs.jffs2.c
@@ -100,6 +100,11 @@ struct filesystem_entry {
     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;
@@ -309,7 +314,7 @@ static struct filesystem_entry *recursiv
     char *hpath, *tpath;
     struct dirent *dp, **namelist;
     struct filesystem_entry *entry;
-
+    struct ignorepath_entry* element = ignorepath;
 
     if (lstat(hostpath, &sb)) {
         sys_errmsg_die("%s", hostpath);
@@ -318,6 +323,15 @@ static struct filesystem_entry *recursiv
     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) {
         sys_errmsg_die("opening directory %s", hostpath);
@@ -1359,6 +1373,7 @@ static struct option long_options[] = {
     {"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'},
@@ -1409,6 +1424,7 @@ static const char helptext[] =
 "  -L, --list-compressors  Show the list of the available 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"
@@ -1566,6 +1582,7 @@ int main(int argc, char **argv)
     char *compr_name = NULL;
     int compr_prior  = -1;
     int warn_page_size = 0;
+    struct ignorepath_entry* element = ignorepath;
 
     page_size = sysconf(_SC_PAGESIZE);
     if (page_size < 0) /* System doesn't know so ... */
@@ -1576,7 +1593,7 @@ int main(int argc, char **argv)
     jffs2_compressors_init();
 
     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':
@@ -1600,6 +1617,28 @@ int main(int argc, char **argv)
                 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) {
                     errmsg_die("output filename specified more than once");