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
| #include <stdlib.h>
#include <stdio.h>
#include <limits.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
int main(int argc, char* argv[])
{
char droit[15]; /*Permet de stocker les "mode" de la commande access*/
int i, status;
int verbose=0, r=0, x=0, w=0;
/*Cette boucle for permet de récupérer les arguments
excepte le dernier, puisque dans une commande correctement
ecrite, celui-ci est le nom du fichier*/
for(i=2; i<(argc-1); i++){
if(!strcmp(argv[i],"-v")){
verbose=1;
}else if(!strcmp(argv[i],"-r")){
if(!r){
sprintf(droit, "%s%s", droit, "R_OK|");
r=1;
}
}else if(!strcmp(argv[i],"-w")){
if(!w){
sprintf(droit, "%s%s", droit, "W_OK|");
w=1;
}
}else if(!strcmp(argv[i],"-x")){
if(!x){
sprintf(droit, "%s%s", droit, "X_OK|");
x=1;
}
}else{
exit(EXIT_FAILURE);
}
}
/*Cette boucle permet de changer le dernier OU binaire, en "\0" */
if(verbose){
droit[((argc-3)*4*(sizeof(char)))]='\0';
} else {
droit[((argc-2)*4*(sizeof(char)))]='\0';
}
status=access(argv[argc-1], (int)droit);
/*Cette boucle gere les erreurs*/
if ((status)&&(verbose)) {
if(errno==EACCES){
printf("%s \n","erreur 4 : Une des composantes du nom du fichier est trop longue");
} else if(errno==ELOOP){
printf("%s \n","erreur 6 : Le nom du fichier comporte trop de liens symboliques");
}else if(errno==ENAMETOOLONG){
printf("%s \n","erreur 5 : Le nom du fichier est trop long");
}else if(errno==ENOENT){
printf("%s \n","erreur 2 : Le fichier n'existe pas");
}else if (errno==ENOTDIR){
printf("%s \n","erreur 3 : Une des composantes du nom de fichier n'est pas un repertoire");
}else if(errno==EROFS){
printf("%s \n","erreur 1 : Le droit d'accès demandé au fichier n'est pas positionne");
}else{
printf("%s \n","erreur 7 : Autre"); /*Les cas ou access PEUT echouer */
}
}
return status;
} |
Partager