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