Obtenir le nom "canonique" d'un répertoire

Le
rixed
Bonjour !

Dans un programme (en C) j'aimerai pouvoir reconnaître si deux noms
de répertoires sont en fait les mêmes répertoires.

Par exemple, reconnaitre que "/usr/bin" et "/usr/../usr/bin" sont le
même répertoire.

Je pourrais regarder l'inode, mais il me semble que les inodes sont
uniques par systèmes de fichier uniquement, donc ce n'est surement pas
la solution ultime. Je pourrais aussi remplacer les "/../" par des "/"
mais ça ne règle pas la question des liens symbolique (et c'est laid).

Je me demandais s'il n'y avait pas un truc bien connu, genre un appel
système, pour résoudre ce problème. Qu'en dites vous ?
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
rixed
Le #7093021
J'ai posté avant de réfléchir, désolé pour le bruit.
Il faut évidement utiliser comme clef l'inode et
l'identifiant du device.

Donc, voilà.
:)
Stephane CHAZELAS
Le #7093121
2008-06-25, 07:40(+00), :
J'ai posté avant de réfléchir, désolé pour le bruit.
Il faut évidement utiliser comme clef l'inode et
l'identifiant du device.


[...]

Sinon, pour repondre a la question dans l'objet de l'enfilade
(le subject du thread): realpath(3)

--
Stéphane
Paul Gaborit
Le #7094881
À (at) Wed, 25 Jun 2008 07:53:04 +0000 (UTC),
Stephane CHAZELAS
Sinon, pour repondre a la question dans l'objet de l'enfilade
(le subject du thread): realpath(3)



Je ne connaissais pas cette fonction... mais après avoir vu la doc et
surtout la section "BUGS", je n'en conseillerais pas l'utilisation !

Petit extrait (en français en plus) :

N'utilisez jamais cette fonction. Sa conception est erronée (à moins
d'utiliser la caractéristique non standard resolved_path == NULL)
car elle ne permet pas de connaître la taille nécessaire pour le
tampon de sortie resolved_path. D'après POSIX, un tampon de taille
PATH_MAX suffit, mais PATH_MAX n'est pas nécessairement une
constante définie et peut être obtenue avec pathconf(3). En outre,
interroger pathconf(3) n'aide pas vraiment, car d'une part POSIX
prévient que les résultats de pathconf(3) peuvent être immenses et
inappropriés pour allouer de la mémoire et d'autre part pathconf(3)
peut renvoyer -1 indiquant que PATH_MAX est illimité.

--
Paul Gaborit -
Stephane CHAZELAS
Le #7095161
2008-06-25, 13:46(+02), Paul Gaborit:

À (at) Wed, 25 Jun 2008 07:53:04 +0000 (UTC),
Stephane CHAZELAS
Sinon, pour repondre a la question dans l'objet de l'enfilade
(le subject du thread): realpath(3)



Je ne connaissais pas cette fonction... mais après avoir vu la doc et
surtout la section "BUGS", je n'en conseillerais pas l'utilisation !

Petit extrait (en français en plus) :

N'utilisez jamais cette fonction. Sa conception est erronée (à moins
d'utiliser la caractéristique non standard resolved_path == NULL)



Cette /caractéristique/ ne sera apparemment plus non-standard
quand la prochaine de version de SUS sortira car elle est dans
le draft courant.

car elle ne permet pas de connaître la taille nécessaire pour le
tampon de sortie resolved_path. D'après POSIX, un tampon de taille
PATH_MAX suffit, mais PATH_MAX n'est pas nécessairement une
constante définie et peut être obtenue avec pathconf(3). En outre,
interroger pathconf(3) n'aide pas vraiment, car d'une part POSIX
prévient que les résultats de pathconf(3) peuvent être immenses et
inappropriés pour allouer de la mémoire et d'autre part pathconf(3)
peut renvoyer -1 indiquant que PATH_MAX est illimité.





--
Stéphane
rixed
Le #7097541
On 2008-06-25, Paul Gaborit
D'après POSIX, un tampon de taille
PATH_MAX suffit, mais PATH_MAX n'est pas nécessairement une
constante définie et peut être obtenue avec pathconf(3). En outre,
interroger pathconf(3) n'aide pas vraiment, car d'une part POSIX
prévient que les résultats de pathconf(3) peuvent être immenses et
inappropriés pour allouer de la mémoire et d'autre part pathconf(3)
peut renvoyer -1 indiquant que PATH_MAX est illimité.



On en apprend des choses ! Je me sert tous les jours de PATH_MAX.

J'espère que je ne coderais plus qu'en lisp le jour où PATH_MAX vaudra
quelquechose qui ne tient pas sur la pile :-)

Bon, je ne regrette pas d'avoir posé ma question finalement.
Cyrille Lefevre
Le #9291321
a écrit :
Bonjour !

Dans un programme (en C) j'aimerai pouvoir reconnaître si deux noms
de répertoires sont en fait les mêmes répertoires.

Par exemple, reconnaitre que "/usr/bin" et "/usr/../usr/bin" sont le
même répertoire.

Je pourrais regarder l'inode, mais il me semble que les inodes sont
uniques par systèmes de fichier uniquement, donc ce n'est surement pa s
la solution ultime. Je pourrais aussi remplacer les "/../" par des "/"
mais ça ne règle pas la question des liens symbolique (et c'est lai d).

Je me demandais s'il n'y avait pas un truc bien connu, genre un appel
système, pour résoudre ce problème. Qu'en dites vous ?





Bonjour,

il y a longtemps, j'ai écrit ça :)

http://groups.google.com/group/fr.comp.os.unix/browse_thread/thread/f2f45 9eb567b8044/6fc4708d29845bd6?lnk=st&q=#6fc4708d29845bd6

Cordialement,

Cyrille Lefevre.
--
mailto:Cyrille.Lefevre-news%
supprimer "%nospam% et ".invalid" pour me repondre.
Alain Montfranc
Le #9573221
a écrit
Bonjour !

Dans un programme (en C) j'aimerai pouvoir reconnaître si deux noms
de répertoires sont en fait les mêmes répertoires.

Par exemple, reconnaitre que "/usr/bin" et "/usr/../usr/bin" sont le
même répertoire.

Je pourrais regarder l'inode, mais il me semble que les inodes sont
uniques par systèmes de fichier uniquement, donc ce n'est surement pas
la solution ultime. Je pourrais aussi remplacer les "/../" par des "/"
mais ça ne règle pas la question des liens symbolique (et c'est laid).

Je me demandais s'il n'y avait pas un truc bien connu, genre un appel
système, pour résoudre ce problème. Qu'en dites vous ?



Sinon en quick and dirty :

if [ -d $dir }
then
(cd $dir; pwd)
else
echo "No such directory..." >&2
exit 1
fi
Matthieu Moy
Le #9649811
Cyrille Lefevre writes:

a écrit :
Bonjour !

Dans un programme (en C) j'aimerai pouvoir reconnaître si deux noms
de répertoires sont en fait les mêmes répertoires.

Par exemple, reconnaitre que "/usr/bin" et "/usr/../usr/bin" sont le
même répertoire.
[...]



Bonjour,

il y a longtemps, j'ai écrit ça :)

http://groups.google.com/group/fr.comp.os.unix/browse_thread/thread/f2f459eb567b8044/6fc4708d29845bd6?lnk=st&q=#6fc4708d29845bd6



Moi, je fais ça à coups de

x=$(cd -P "$x"; pwd)

(qui ne marche pas si "$x" n'existe pas ou n'est pas un répertoire)

--
Matthieu
fx [François-Xavier Peretmere]
Le #9668301
on the 27/06/08 8:37 Matthieu Moy wrote the following:
a écrit :





Dans un programme (en C) j'aimerai pouvoir reconnaître si deux noms
de répertoires sont en fait les mêmes répertoires.

Par exemple, reconnaitre que "/usr/bin" et "/usr/../usr/bin" sont le
même répertoire.






[...]
Moi, je fais ça à coups de

x=$(cd -P "$x"; pwd)

(qui ne marche pas si "$x" n'existe pas ou n'est pas un répertoire)



Mais x récupère alors la valeur du répertoir courant, non? Ne serait-ce pas
mieux ainsi :

x=$(cd -P "$x" && pwd)


Fx

--
"I haven't lost my mind... I have it backed up on tape somewhere."
-Keith Meidling
Stephane CHAZELAS
Le #9670201
2008-06-27, 11:39(+02), fx [François-Xavier Peretmere]:
[...]
x=$(cd -P "$x"; pwd)

(qui ne marche pas si "$x" n'existe pas ou n'est pas un répertoire)



Mais x récupère alors la valeur du répertoir courant, non? Ne serait-ce pas
mieux ainsi :

x=$(cd -P "$x" && pwd)


[...]

Et encore mieux avec:

x=$(cd -P -- "${x:?}" && pwd -P)

Le -P n'est en theorie pas necessaire pour "pwd" mais ca rend
les choses plus claires.

Qui ne marche pas si le chemin canonique se termine par des
linefeeds.

--
Stéphane
Publicité
Poster une réponse
Anonyme