Xavier, jeudi 21 février 2008, 00:00:09 CET
>[…] 
> Question bonus :
> 
> Le caractère '/' est-il autorisé pour un nom de fichier en
> ext3 ? Est-ce que ça a du sens vu que / sépare les dossiers ?
> Et si oui, comment créer un fichier nommé '/' ?

  C’est impossible pour tout programme qui utilise les appels
système fournis par le noyau Linux pour accéder au système de
fichiers.

  Explication : la notation des chemins est une convention du
système (Unix, même). Les '/' ne font pas partie du FS, seuls
les noms des répertoires et des fichiers y sont stockés. Les
'/' servent juste à représenter la hiérarchisation.
  Le chemin est décodé par le noyau au niveau du système de
fichiers virtuel et le trajet qu’il décrit est appliqué au
système de fichier par le biais de fonctions de base (« est-ce
que tu connais le répertoire “truc” », « va dans “truc” », etc.,
où “truc” ne contient pas de '/').
  En fait, ce décodage est fait par la fonction __link_path_walk
(non, je ne connais pas par cœur, j’ai cherché un peu).

  Cette fonction est définie dans le fichier fs/namei.c et on y
trouve :
        while (*name=='/')
                name++;
,
               } while (c && (c != '/'));
ou encore
                 while (*++name == '/');

  Ce qui prouve que '/' est :
— « codé en dur » (ouh, c’est vilain) ;
— le seul et unique séparateur de répertoires.

  Accessoirement, ça dit aussi que plusieurs « / » sont
équivalents à un seul (citations 1 et 3 : on avance dans le nom
tant qu’on a des barres obliques).

  On trouve aussi (au moins deux fois (ouh, c’est vilain)) :
               if (this.name[0] == '.') switch (this.len) {
                        default:
                                break;
                        case 2:
                                if (this.name[1] != '.')
                                        break;
                                follow_dotdot(nd);
                                inode = nd->dentry->d_inode;
                                /* fallthrough */
                        case 1:
                                continue;
                }
qui est le traitement de « . » et « .. ».

  Donc '/' est le seul caractère spécial pour Linux et « . » et
« .. » les deux seuls noms spéciaux (on a le droit à « ... »
p.ex.).

-- 
 Sylvain Sauvage

Répondre à