[Kos-dev] [FAT] Mes remarques sur le travail de Thomas

Hervé Poussineau kos-dev@enix.org
Mon, 25 Feb 2002 14:31:34 +0100


    Salut Thomas (et les autres, bien entendu)

J'ai relu le remarquable travail que tu as fait sur la FAT, et j'ai quelques
remarques :

* [fat] Name/extension is too long : impossible for FAT16
(_fat_analyze_name)
Pas du tout : FAT12, 16, 32 sont le nombre de bits utilisés pour coder le
numéro d'un cluster ; les noms longs peuvent se trouver sur ces trois types
de filesystem, grâce à la VFAT. (pour info, les noms longs sont stockés dans
des entrées de répertoire dont l'attribut est 0xf, que tu sautes déjà). Les
limites des noms longs sont name < 255 caractères, ext < 255 caractères et
name+'.'+ext < 255 caracteres.

* parcours du répertoire (fat_open_file)
Ta boucle est for(i = 0; direntry[i].filename[0] != 0; i++) { ... }
Tu auras des erreurs si le répertoire tient sur plus d'un cluster et que ce
n'est pas le répertoire racine. Je te propose plutôt le code suivant :
  cluster = adresse du 1er cluster du répertoire (attention; pas calculé de
la même manière si répertoire racine ou sous-répertoire)
  répéter
    direntry[] = hd_read(cluster, sectors_per_cluster)
    for(i = 0; direntry[i].filename[0] != 0 && i < 32*sectors_per_cluster;
i++)
      {
        si fichier trouvé { ... ; terminé = TRUE; break; }
        if(direntry[i].filename[0] == 0) { terminé = TRUE; break; }
      }
    if (lecture_du_repertoire_racine == TRUE)
      cluster++;
    else
      cluster = next_cluster(cluster)
  jusqu'à (terminé == TRUE || cluster >= 0xfff8)

* vérification si c'est la bonne entrée de répertoire (fat_open_file)
  if( (!strncmp(direntry[i].filename, name, 8)) &&
      (!strncmp(direntry[i].extension, ext, 3)))
    {
      ...
    }
Tu devrais également vérifier que cette entrée n'est pas un répertoire...

* int _fat_init(void)
Tu fais la détection grâce à :
  if(countclusters < 4085)
    fat_data->type = FAT12;
  else if(countclusters < 65525)
    fat_data->type = FAT16;
  else
    fat_data->type = FAT32;
Ces valeurs sont des valeurs maximales, et ne sont pas toujours respectées
(surtout près des limite, ou après le redimensionnement de partitions). La
méthode préconisée est de regarder la valeur de  bs_filsystype[8].
  if (!memcmp((fat16_bpb_t *)boot_sector->bs_filsystype, "FAT12   ", 8)
    fat_data->type = FAT12;
  else if (!memcmp((fat16_bpb_t *)boot_sector->bs_filsystype, "FAT16   ", 8)
    fat_data->type = FAT16;
  else if (!memcmp((fat32_bpb_t *)boot_sector->bs_filsystype, "FAT32   ", 8)
    fat_data->type = FAT32;
  else
    puts("Error !");


@+

Hervé