IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Modification commande access(), problême à l'éxécution.


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2010
    Messages : 119
    Par défaut Modification commande access(), problême à l'éxécution.
    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...

  2. #2
    Membre émérite
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Par défaut
    D'après le man, access peut positionner errno avec d'autres valeurs. Je te conseillerais de tester einval, parce que ta manière d'envoyer l'argument mode me semble suspecte...
    Sinon, tu peux toujours utiliser la fonction perror qui affiche la description de la valeur actuelle de errno sur stderr.
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2010
    Messages : 119
    Par défaut
    Bah mon prof nous avait dit de passer les arguments de access comme ça...
    Les constantes W_OK etc, séparées par un OU binaire...

    Je vais déjà changé ce code dégueulasse avec un switch sur errno... Je sais pas bien pourquoi j'ai fait ça comme ça.

  4. #4
    Membre émérite
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Par défaut
    C'est possible, mais avant les conclusions on constate. Je n'ai pas d'ordis à disposition, je ne peux donc pas tester si c'est bon de ce côté. Au risque de me répéter, donne-nous le résultat d'un perror après l'appel de access.
    Une fois qu'on aura déterminé la réelle erreur, on pourra essayer de la résoudre.
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2010
    Messages : 119
    Par défaut
    Je fais ça rapidement!
    Je connaissais pas perror()...

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2010
    Messages : 119
    Par défaut
    ... Bon je crois que tu as tout bon.
    J'obtiens :
    $ ./maccess -r -x -v main.c
    acess : invalid argument
    erreur 7 : Autre

    ... Mais alors que passer en paramètre de access?...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [vb6 et access] problème de modification de contenu de champ
    Par dj_tess dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 22/12/2005, 19h26
  2. [MS Access] Problème de jointure
    Par Erakis dans le forum Langage SQL
    Réponses: 3
    Dernier message: 07/02/2005, 21h15
  3. Réponses: 3
    Dernier message: 11/10/2004, 17h26
  4. [Access]Problème de sript avec LIKE
    Par Oberown dans le forum ASP
    Réponses: 3
    Dernier message: 06/10/2004, 17h55
  5. [MFC] problème d'éxécution
    Par ben_iap dans le forum MFC
    Réponses: 2
    Dernier message: 15/03/2004, 10h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo