Commande Chmod en ugoa?

Voir le sujet précédent Voir le sujet suivant Aller en bas

Commande Chmod en ugoa?

Message  asm le Ven 22 Jan 2010 - 1:52

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 !

asm

Messages : 2
Date d'inscription : 22/01/2010

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Commande Chmod en ugoa?

Message  -ed- le Ven 22 Jan 2010 - 18:23

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 !
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).
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.

_________________
C is a sharp tool !

-ed-
Admin
Admin

Messages : 289
Date d'inscription : 26/05/2008
Age : 60
Localisation : Paris 6eme arrondissement (75, France)

Voir le profil de l'utilisateur http://bien-programmer.fr

Revenir en haut Aller en bas

décalage de bit foncction val_binaire

Message  asm le Lun 10 Mai 2010 - 22:27

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

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

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Commande Chmod en ugoa?

Message  -ed- le Mar 11 Mai 2010 - 0:01

Visiblement, il manque des choses dans ce code ...
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
Même en ajoutant quelques entêtes,

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
Ce qui est beaucoup. Il faudrait déjà corriger tous ces bugs, qu'on y voit clair.

_________________
C is a sharp tool !

-ed-
Admin
Admin

Messages : 289
Date d'inscription : 26/05/2008
Age : 60
Localisation : Paris 6eme arrondissement (75, France)

Voir le profil de l'utilisateur http://bien-programmer.fr

Revenir en haut Aller en bas

Re: Commande Chmod en ugoa?

Message  Contenu sponsorisé Aujourd'hui à 21:18


Contenu sponsorisé


Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum