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);
}