Преглед на файлове

Modify dosfstools to support the dummy 8.3 short filename values
used by Linux systems with the VFAT_FS_DUALNAMES option disabled.

See http://lkml.org/lkml/2009/6/26/313 and
http://lkml.org/lkml/2009/6/26/314 for more information.

Signed-off-by: Daniel Baumann <mail@daniel-baumann.ch>

Andrew Tridgell преди 15 години
родител
ревизия
b9f37a61a6
променени са 1 файла, в които са добавени 9 реда и са изтрити 4 реда
  1. 9 4
      src/check.c

+ 9 - 4
src/check.c

@@ -250,16 +250,21 @@ static char *file_stat(DOS_FILE *file)
 }
 
 
-static int bad_name(unsigned char *name)
+static int bad_name(DOS_FILE *file)
 {
     int i, spc, suspicious = 0;
     char *bad_chars = atari_format ? "*?\\/:" : "*?<>|\"\\/:";
+    char *name = file->dir_ent.name;
 
     /* Do not complain about (and auto-correct) the extended attribute files
      * of OS/2. */
     if (strncmp(name,"EA DATA  SF",11) == 0 ||
         strncmp(name,"WP ROOT  SF",11) == 0) return 0;
 
+    /* don't complain about the dummy 11 bytes used by patched Linux
+       kernels */
+    if (file->lfn && name[0] == ' ') return 0;
+
     for (i = 0; i < 8; i++) {
 	if (name[i] < ' ' || name[i] == 0x7f) return 1;
 	if (name[i] > 0x7f) ++suspicious;
@@ -590,7 +595,7 @@ static int check_dir(DOS_FS *fs,DOS_FILE **root,int dots)
     parent = (*root)->parent;
     good = bad = 0;
     for (walk = root; *walk; walk = &(*walk)->next)
-	if (bad_name((*walk)->dir_ent.name)) bad++;
+	if (bad_name(*walk)) bad++;
 	else good++;
     if (*root && parent && good+bad > 4 && bad > good/2) {
 	printf("%s\n  Has a large number of bad entries. (%d/%d)\n",
@@ -617,7 +622,7 @@ static int check_dir(DOS_FS *fs,DOS_FILE **root,int dots)
 	    else dotdot++;
 	}
 	if (!((*walk)->dir_ent.attr & ATTR_VOLUME) &&
-	    bad_name((*walk)->dir_ent.name)) {
+	    bad_name(*walk)) {
 	    printf("%s\n  Bad file name.\n",path_name(*walk));
 	    if (interactive)
 		printf("1) Drop file\n2) Rename file\n3) Auto-rename\n"
@@ -647,7 +652,7 @@ static int check_dir(DOS_FS *fs,DOS_FILE **root,int dots)
 	    skip = 0;
 	    while (*scan && !skip) {
 		if (!((*scan)->dir_ent.attr & ATTR_VOLUME) &&
-		    !strncmp((*walk)->dir_ent.name,(*scan)->dir_ent.name,MSDOS_NAME)) {
+		    !memcmp((*walk)->dir_ent.name,(*scan)->dir_ent.name,MSDOS_NAME)) {
 		    printf("%s\n  Duplicate directory entry.\n  First  %s\n",
 			   path_name(*walk),file_stat(*walk));
 		    printf("  Second %s\n",file_stat(*scan));