Commande Chmod en ugoa?
2 participants
Page 1 sur 1
Commande Chmod en ugoa?
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 !
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 !
asm- Messages : 2
Date d'inscription : 22/01/2010
Re: Commande Chmod en ugoa?
Je veux bien aider, mais tu as oublié de poster le code avec lequel tu as un problème (mais c'est bien d'avoir réfléchi à une solution qui semble correcte).asm a écrit:J'aimerai faire un exercice dont voici l'énoncé :
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 !
C'est principalement un exercice de maitrise des arguments de la ligne de commande. Il faut commencer par une définitions très précise de ces arguments, comment on les utilise, quelles sont les combinaisons autorisée (ou interdites si ça va plus vite ...). Bref, il faut partir sur des bases extrêmement solides.
décalage de bit foncction val_binaire
Voici le code complet, je n'arrive pas à faire le décalage de bit avec la fonction val_binaire , celle ci n'est pas utiliser mais devrai l'être je pense pour changer les droits. Pouvez vous m'aidez ? c'est urgent :(
Merci
Merci
- Code:
//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);
}
asm- Messages : 2
Date d'inscription : 22/01/2010
Re: Commande Chmod en ugoa?
Visiblement, il manque des choses dans ce code ...
il reste encore ceci :
- Code:
-------------- Build: Debug in hello ---------------
Compiling: main.c
Linking console executable: bin\Debug\hello.exe
C:\dev\hello\main.c: In function `retourneDroitsOctal':
C:\dev\hello\main.c:9: warning: implicit declaration of function `strlen'
C:\dev\hello\main.c:9: warning: comparison between signed and unsigned
C:\dev\hello\main.c:22: warning: implicit declaration of function `fprintf'
C:\dev\hello\main.c:22: error: `stderr' undeclared (first use in this function)
C:\dev\hello\main.c:22: error: (Each undeclared identifier is reported only once
C:\dev\hello\main.c:22: error: for each function it appears in.)
C:\dev\hello\main.c:23: warning: implicit declaration of function `exit'
C:\dev\hello\main.c: In function `changeDroitQui':
C:\dev\hello\main.c:40: error: storage size of 'buf' isn't known
C:\dev\hello\main.c:42: warning: implicit declaration of function `lstat'
C:\dev\hello\main.c:44: warning: implicit declaration of function `perror'
C:\dev\hello\main.c:40: warning: unused variable `buf'
C:\dev\hello\main.c: In function `val_binaire':
C:\dev\hello\main.c:90: error: `NULL' undeclared (first use in this function)
C:\dev\hello\main.c:94: warning: implicit declaration of function `malloc'
C:\dev\hello\main.c:115: warning: implicit declaration of function `printf'
C:\dev\hello\main.c: In function `changeDroit':
C:\dev\hello\main.c:136: error: `stderr' undeclared (first use in this function)
C:\dev\hello\main.c:147: warning: suggest parentheses around && within ||
C:\dev\hello\main.c: In function `main':
C:\dev\hello\main.c:214: error: `fic' undeclared (first use in this function)
C:\dev\hello\main.c:214: error: `buf' undeclared (first use in this function)
Process terminated with status 1 (0 minutes, 0 seconds)
8 errors, 10 warnings
- Spoiler:
- Code:
/* Standard */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
/* non standard */
#include <sys/stat.h>
/* 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 donner 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'arguments : 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;
}
il reste encore ceci :
- Code:
-------------- Build: Debug in hello ---------------
Compiling: main.c
Linking console executable: bin\Debug\hello.exe
C:\dev\hello\main.c: In function `retourneDroitsOctal':
C:\dev\hello\main.c:17: warning: comparison between signed and unsigned
C:\dev\hello\main.c: In function `changeDroitQui':
C:\dev\hello\main.c:55: warning: implicit declaration of function `lstat'
C:\dev\hello\main.c:51: warning: 'val' might be used uninitialized in this function
C:\dev\hello\main.c: In function `val_binaire':
C:\dev\hello\main.c:106: warning: 'q' might be used uninitialized in this function
C:\dev\hello\main.c: In function `changeDroit':
C:\dev\hello\main.c:171: warning: suggest parentheses around && within ||
C:\dev\hello\main.c: In function `main':
C:\dev\hello\main.c:254: error: `fic' undeclared (first use in this function)
C:\dev\hello\main.c:254: error: (Each undeclared identifier is reported only once
C:\dev\hello\main.c:254: error: for each function it appears in.)
C:\dev\hello\main.c:254: error: `buf' undeclared (first use in this function)
Process terminated with status 1 (0 minutes, 0 seconds)
4 errors, 5 warnings
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
|
|