Bonjour à tous,

J'ai un TP à faire en C consistant à modifier la commande access(), en ignorant le F_OK. Je dois seulement gérer les 3 cas R_OK, W_OK, X_OK, pour en faire une commande console utilisable sous la forme :

access -r -w fichier

On doit de plus ajouter un autre argument "-v", permettant de donner une phrase expliquant l'erreur de access le cas échéant.

Voici donc le code que j'ai pondu...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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;	
}
Bon alors, pour compiler, ça compile. Mais ça me renvoie donne tout le temps "l'erreur 7"... Et je ne comprends pas pourquoi. N'étant pas familier de la commande access et des constantes POSIX, j'avoue que je ne suis pas à l'aise.

Merci de votre aide en tout cas!
Veuillez agréer, des bisous.

PS : La dernière partie de mon code, sert à comparer la valeur de errno avec les constantes d'erreurs définies par la norme POSIX... Enfin si j'ai bien compris...