Commande Chmod en ugoa?

asm7777 Messages postés 2 Date d'inscription mardi 25 décembre 2007 Statut Membre Dernière intervention 10 mai 2010 - 27 janv. 2010 à 18:30
asm7777 Messages postés 2 Date d'inscription mardi 25 décembre 2007 Statut Membre Dernière intervention 10 mai 2010 - 10 mai 2010 à 21:16
Bonjour,

J'aimerai faire un exercice dont voici l'ennoncé :

Implémenter dans un programme la commande chmod avec les notations en lettres ([ugoa][[+-=][rwx])
mais pas celle en octale.
exemple de lancement du programme : Monprog u+x fichier1

Le programme devra changer les droits du fichier passé en argument (il en acceptera meme plusieur de fichier)

A première vu j'essayerai de parcourir les lettres des droits et de les identifiers puis de changer les droit en fonction d'une valeur attribuer a chacune des lettres ... exemple r 4 , w 2 , x = 1 ...

Une aide me serai bien utile !

Merci d'avance !

2 réponses

cptpingu Messages postés 3835 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 1 novembre 2022 124
27 janv. 2010 à 21:03
Ton raisonnement est le bon, mais:

Quelle est la question précise ?
Ou bloques-tu dans ton code ? Poste l'extrait de code qui te pose problème.

_____________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
0
asm7777 Messages postés 2 Date d'inscription mardi 25 décembre 2007 Statut Membre Dernière intervention 10 mai 2010
10 mai 2010 à 21:16
La fonction décalage de bit n'est pas utilisé mais elle le devrai l'être je ne sais pas à quel endroit . Aussi le programme doit pouvoir changer les droits de plusieurs fichiers passés en paramètres
//Fonction qui retourne les droits en octal. La chaine droits contient au plus 3 caracteres (du type "rw" ou "r" ou "rwx", etc.). 
//Cette fonction est deja code dans le code que je vous ai renvoye. 
int retourneDroitsOctal(char* droits)
{

//On initialise val à 0
int val=0, i;

for(i=0; i <strlen(droits); i++)
{
switch(droits[i])  //MODIFIER
{
//AB: On rajoute 4 a val si r est dans la chaine 'droits'
case 'r': val += 4;  
break;
//AB: On rajoute 2 a val si w est dans la chaine 'droits'
case 'w': val += 2;  
break;
//AB: On rajoute 1 a val si x est dans la chaine 'droits'
case 'x': val += 1;  
break;
default: fprintf(stderr,"Argument invalide : %s",droits);
exit(1);
break;
}
}

return val;
}

//Fonction qui change les droits (le mode) pour un utilisateur particulier. 
//Cet utilisateur est designe par le caractere 'qui' qui vaut 'u' ou 'g' ou 'o' mais ne peut pas valoir 'a'.
//'type' designe si on ajoute ou retire les droits, les valeurs possibles sont '+' ou '-' ou '='.
//Cette fonction est deja aussi plus ou moins deja code dans le programme que vous m'avez envoye. 
//Renvoi -1 en cas d'erreur.
int changeDroitQui(const char* qui, char type, int droitOctal, const char* nomFichier)
{
 int val;
int mask;
struct stat buf;
int pval;
if((lstat(nomFichier, &buf)) == -1)
{
perror("Impossible de donnée les droits : ");
}


pval = buf.st_mode; // récupérer les droits
switch(*qui)
{
case 'u': val = 6;  
break;
case 'g': val = 3;  
break;
case 'o': val = 0;  
break;
//AB: Pour a c'est tous il faut donc modifier les droits pour 'g', 'o' et 'u'.
case 'a': val = 3;
break;
default: perror("1er argument faux : ");
break;
}


switch(type)
{
case '+': val = pval | (droitOctal << val);  // rwx --> droitoctal  puiss --> val
break;
case '-': mask = pval & (droitOctal << val);
  val = pval-mask;  
break;
//case '=': val = modif(pval, droitOctal, val);   Test mis en commentaire fonction modif manquante
//break;
default: perror("2ieme argument faux : ");
break;
}

//val = 0;
return val;	

}


//// Fonction de décalage de bit val --> pval
void val_binaire(int val)
{

int i, q, r;
int gr = 0;
int *pt = NULL;
int voir;

voir = val;
pt = (int *)malloc(4*sizeof(int));
while(q != 0  )
{
q= voir/2;
voir/=2;
gr++;
}

pt = (int *)malloc((gr+1)*sizeof(int));
gr = 0;
q=1;

while(q != 0  )
{
q= val/2;
r=val%2;
val/=2;
pt[gr] = r;
gr++;
}

printf("|| ");
for(i=gr-1; i>=0; i--)
{
printf("%d", pt[i]);
if((i)%3 == 0) printf(" ");
}

printf("|| \n");
}
////



//Fonction qui change les droits pour l'ensemble des utilisateurs specifie. Je vous donne le code.
void changeDroit(const char* argument, const char* nomFichier)
{
int i,j, droitOctal;
char qui[4], type, droits[4], c; 

i=0;j=0;
if(strlen(argument)<3){
fprintf(stderr,"Erreur argument invalide (%s)\n",argument);	
exit(2);
}

//Mise a jour de la liste des utilisateurs a qui on change les droits (aoug, etc.) 
while(i<3){
c=argument[i];
if((c=='a')||(c=='o')||(c=='u')||(c=='g')){
qui[i]=c;
i++;
}else{
if((i>=1)&&(c=='-')||(c=='+')||(c=='=')) break;
fprintf(stderr,"Erreur argument: %s n'est pas un argument correcte\n",argument);
exit(2);
}
}//fin du for sur i

//On n'oublie pas le caractere de fin de chaine
qui[i]='\0';

//Mise a jour du type d'assignation ('+', '-' ou '=')
c=argument[i];
if((c=='-')||(c=='+')||(c=='=')) type=c;
else{
fprintf(stderr,"Erreur argument: %s n'est pas un argument correcte (+)\n",argument);
exit(2);
}

//A vous de remplir correctement la chaine "droits" sur le meme principe...

///////AJOUTER
//Mise a jour de la liste des droits pour le(s) utilisateur(s) (rwx, etc.)

printf("avant i : %d \n",i);
i++; // Incrémentation du compteur sur la première lettre des droits ( r , w , x)
printf("apres i : %d \n",i);

while(j<3){
c=argument[i];
if((c=='r')||(c=='w')||(c=='x')){
droits[j]=c;
i++;j++;
}else{ 
if((j>=1)&&(c=='\0')) break;
fprintf(stderr,"Erreur argument: %s n'est pas un argument correcte (rwx) \n",argument);
exit(2);
}
} //Fin du while

//On n'oublie pas le caractere de fin de chaine
droits[j]='\0';


//DEBUG (il faudra retirer les deux lignes du dessous).
//strcpy(droits,"");
fprintf(stderr,"droits=%s qui=%s type=%c fichier=%s\n",droits,qui,type,nomFichier);

//Il n'y a plus qu'a faire le changement de droit
droitOctal=retourneDroitsOctal(droits);
if(changeDroitQui(qui, type, droitOctal, nomFichier)==-1){
fprintf(stderr,"Erreur changeDroitQui()\n");
exit(1);
}


}

int main(int argc, char* argv[])
{

//Verification du nombre d'arguments
if (argc < 2) perror ("erreur du nombre d'argument : doit être supérieur ou égal à 3");

//Appel de la fonction changeDroit sur tous les fichiers specifies..
//changeDroit(


//MODIFIER  A VOIR RECUPERER LES DROITS
fic = buf.st_mode; // récupérer les droits


//La ligne du dessous sert au debug, il faut la modifier
changeDroit(argv[1],"teste.txt");

return(0);
}
0