mkdir : droits récursifs ?

mkdir : droits récursifs ? - C - Programmation

Marsh Posté le 03-09-2008 à 09:37:19    

Bonjour,
Il existe l'équivalent de mkdir dans le C.
Très bien.
J'ai utilisé mkdir pour créer un dossier avec un mode int que j'ai fixé à 755.
Le problème est que le répertoire créé (que le processus utilise allègrement) m'est accessible mais pas les fichiers que j'ai mis dedans !!
 
Je crois que je n'ai pas bien compris cette phrase dans l'explication de mkdir
 

Citation :

Le répertoire nouvellement créé aura pour propriétaire l'UID effectif du processus. Si le répertoire au-dessus du nouveau répertoire a son bit Set-GID à 1, ou si le système de fichier est monté avec une sémantique de groupe BSD, le nouveau répertoire héritera de l'appartenance au groupe de son parent. Sinon il appartiendra au groupe correspondant au GID effectif du processus.
Si le répertoire parent a son bit Set-GID à 1, le nouveau répertoire aura aussi son bit Set-GID à 1.


Source
 
 
D'après ce charabia, on dirait que mon 755 n'est pas récursif.
 
Voici un morceau du code
 

Code :
  1. char dir_final[150];
  2. strcat(dir_final,"/home/toto/filstoto/" ); /* Toto Existe déjà*/
  3. /*C'est fils toto qui n'existe pas et qu'on veut créer*/
  4. int mode = 755;
  5. mkdir(dir_final,mode);
  6. strcat(dir_final,"Mon_texte.dat" );
  7. fopen(dir_final);
  8. /* etc etc ... */
  9. ...

Reply

Marsh Posté le 03-09-2008 à 09:37:19   

Reply

Marsh Posté le 03-09-2008 à 12:34:47    

Avec 777, il n'y aurait aucune restriction.
Mais je ne suis pas certain que le problème vienne des droits du répertoire.
Je n'ai jamais crée de répertoire dont le nom se termine par un slash. Donc, j'ai un doute à ce sujet.
J'aurais plutôt écrit :

Code :
  1. char dir_final[150], mon_texte[200]; FILE *fp;
  2. strcat(dir_final,"/home/toto/filstoto" ); /* Toto Existe déjà*/
  3. /*C'est fils toto qui n'existe pas et qu'on veut créer*/
  4. mkdir(dir_final, 755);
  5. sprintf(mon_texte, "%s/%s", dir_final, "Mon_texte.dat" );
  6. fp = fopen(mon_texte, "ab" );
  7. if (fp == NULL) {
  8.    fprintf(stderr, "Error: Cannot open %s\n", mon_texte);
  9.    return -1;
  10. }
  11. /* etc etc ... */

N.B. J'ai créé une variable mon_texte parce que c'est plus lisible pour la maintenance de ne pas mettre deux choses différentes (un nom de répertoire et un nom de fichier) dans la même variable. Par contre j'ai supprimé la variable mode, qui n'a pas vraiment d'intérêt, parce qu'il est peu probable qu'elle soit utilisée ailleurs. J'ai ajouté le mode d'ouverture "ab" (ou "at" si c'est du texte) ou "rb", etc. J'ai ajouté le test pour savoir si l'ouverture se passe bien.

Reply

Marsh Posté le 03-09-2008 à 23:37:40    

Tu veux dire quoi quand tu dis que les fichiers que tu créé dans le répertoire ne te sont pas accessibles ? Montre un ls -ld /home/toto/filstoto et un ls -l /home/toto/filstoto/Mon_texte.dat

Reply

Marsh Posté le 04-09-2008 à 01:02:39    

755 != 0755 ...

Reply

Marsh Posté le 04-09-2008 à 09:50:31    

Merci pour vos réponses :  
@olivthill,
J'ai le même résultat avec ta méthode. J'ai l'impression que le processus créé le répertoire, peut l'utiliser à sa guise et après avoir fini, il bloque l'accès à ces fichiers.
 
@matafan,
ls -ld /home/toto/filstoto donne d-wxr-l--x
ls -l donne filstoto/ " permission denied total 2
 
C'est quoi ce l ???
 
NB : j'ai réussi à arranger le problème (mon programme C lance à la fin un shell). Dans ce shell, j'ai ajouté les droits à la mano (chmod -R 755 /home/toto/filstoto). Et ça a marché.
 
Je reste sceptique quand même ...  :o  


Message édité par LaTex_man le 04-09-2008 à 10:02:07
Reply

Marsh Posté le 04-09-2008 à 11:32:21    

Taz t'as donné la réponse juste au dessus.
Les droits sont octaux, pas décimaux.
 
C'est donc 0755 que tu dois donner à mkdir et non 755.
 

Reply

Marsh Posté le 04-09-2008 à 11:53:04    

LaTex_man a écrit :

D'après ce charabia, on dirait que mon 755 n'est pas récursif.


Un mode n'est jamais récursif. Quand tu crées un fichier de façon neutre (vi fichier, echo >fichier, etc), le fichier est créé avec des droits par défaut qui sont
777 - umask - droit "x" si le fichier n'est pas répertoire.
 
Donc quand tu crées un répertoire aved des droits, pour peu que ces droits aient bien été écrits (c'est à dire en octal et non en décimal) ce répertoire est créé avec les droits demandés.
Ensuite, quand tu créeras, dans ce répertoire, d'autres répertoires ou fichiers, si tu ne spécifies pas de droit particulier, ces répertoires et fichiers seront créés avec la règle ci-dessus.
 

LaTex_man a écrit :

Je crois que je n'ai pas bien compris cette phrase dans l'explication de mkdir
 

Citation :

Le répertoire nouvellement créé aura pour propriétaire l'UID effectif du processus. Si le répertoire au-dessus du nouveau répertoire a son bit Set-GID à 1, ou si le système de fichier est monté avec une sémantique de groupe BSD, le nouveau répertoire héritera de l'appartenance au groupe de son parent. Sinon il appartiendra au groupe correspondant au GID effectif du processus.
Si le répertoire parent a son bit Set-GID à 1, le nouveau répertoire aura aussi son bit Set-GID à 1.


Source


 
Ca n'a pas de rapport avec les droits mais avec le phénomène setuid/setgid. Quand un setuid est positionné sur un répertoire, alors tout fichier (et donc tout répertoire car un répertoire n'est qu'un fichier particulier) créé dans ce répertoire là appartiendra au propriétaire du répertoire en question (et non à celui qui le crée comme c'est le cas par défaut).
Et quand un setgid est positionné sur un répertoire, alors tout fichier créé dans ce répertoire là sera du même groupe que le groupe du répertoire en question (et non du groupe de celui qui le crée comme c'est le cas par défaut).
 


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 05-09-2008 à 22:03:27    

Taz a écrit :

755 != 0755 ...


Ah oui bien vu, tout le monde c'est fait avoir un jour :lol:

Reply

Marsh Posté le 06-09-2008 à 08:27:28    

matafan a écrit :


Ah oui bien vu, tout le monde c'est fait avoir un jour :lol:


Exact  :ange:  


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed