1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
|
/* a prendre par exemple
** car ca ne n'est qu'un referenciel
** des fonctions de droits sur les fichiers
** en tout cas coment tester les valeurs
*/
#define _POSIX_C_SOURCE 1
// tout programme n'a droit d'exister que si il respecte une des normes
// en C les deux normes les plus courrantes sont ANSI-C et POSIX
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
// les definitions :
static int construire_modes(char * nom_du_fichier);
static void traiter(int bit, char c1, char c2);
// appeler une variable lettre+numero c'est pas bien !!!!!
// utilises un vrai nom (minimum 3 lettres ) !!!!
// sinon t'es un porc :-) comme moi
static char modes[10]= {'\0',};
static int indices_modes ; // qui comme son nom l'indique....
int main(int argc, char *argv[])
{
int i ; // c'est pas bien comme nomage !!!!
if (argc < 2 )
{
fprintf(stderr,"\nusage : %s fichier\n",argv[0]);
exit(EXIT_FAILURE);
// gerer la stupiditee de l'utilisateur qui
// a oublier de mettre le parametre
}
for (i=1;i<argc;i++)
{
//pour tout les fichiers en parametres autrement dit....
if (construire_modes(argv[i]))
{
// si la construction du message a retourner a l'utilisatuer est ok
printf("\n%s : %s\n",argv[i],modes);
}
}
return EXIT_SUCCESS;
// je devrais normalement tester plus les hoses mais comme c'est juste pour l'exemple
// je zappe
}
static int construire_modes(char *nom_du_fichier)
{
struct stat bufstat ; // un buffer quoi pour la structure stat du fichier
mode_t mode ;
if(stat(nom_du_fichier, &bufstat)==-1)
{
// si le nom de fichier est errone par exemple
perror(nom_du_fichier);
return 0;
}
mode=bufstat.st_mode;
indices_modes=0;
traiter(mode & S_IRUSR, 'r', '-');
traiter(mode & S_IRUSR, 'w', '-');
if (mode & S_ISUID)
traiter(mode & S_IXUSR, 'S', 's');
else
traiter(mode & S_IRUSR, 'x', '-');
traiter(mode & S_IRGRP, 'r', '-');
traiter(mode & S_IRGRP, 'w', '-');
if (mode & S_ISGID)
traiter(mode & S_IXGRP, 'S', 's');
else
traiter(mode & S_IRGRP, 'x', '-');
traiter(mode & S_IROTH, 'r', '-');
traiter(mode & S_IROTH, 'w', '-');
traiter(mode & S_IROTH, 'x', '-');
return 1;
// je commente pas mais bon c'est clair comme ca
// je remonte juste les baleurs user,group.other
}
static void traiter(int bit, char c1, char c2)
{
// fait la comparaison
if (bit)
modes[indices_modes]=c1;
else
modes[indices_modes]=c2;
indices_modes++;
} |
Partager