--- rpl/src/instructions_i3.c 2010/03/04 10:17:51 1.4 +++ rpl/src/instructions_i3.c 2010/03/06 18:29:07 1.5 @@ -48,6 +48,8 @@ instruction_inquire(struct_processus *s_ long position_courante; + struct_descripteur_fichier *dfichier; + struct flock lock; struct_objet *s_objet_argument_1; @@ -55,6 +57,7 @@ instruction_inquire(struct_processus *s_ struct_objet *s_objet_resultat; unsigned char caractere; + unsigned char *nom; unsigned char *requete; unsigned char verrou; @@ -190,13 +193,24 @@ instruction_inquire(struct_processus *s_ * du fichier mais à un défaut d'enregistrement. */ - if ((fichier = descripteur_fichier(s_etat_processus, + if ((dfichier = descripteur_fichier(s_etat_processus, (struct_fichier *) (*s_objet_argument_2).objet)) == NULL) { return; } - if ((position_courante = ftell(fichier)) == -1) + if ((*dfichier).type != 'C') + { + liberation(s_etat_processus, s_objet_argument_1); + liberation(s_etat_processus, s_objet_argument_2); + + free(requete); + + (*s_etat_processus).erreur_execution = d_ex_erreur_type_fichier; + return; + } + + if ((position_courante = ftell((*dfichier).descripteur_c)) == -1) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; @@ -204,10 +218,10 @@ instruction_inquire(struct_processus *s_ fin_fichier = d_vrai; - while(feof(fichier) == 0) + while(feof((*dfichier).descripteur_c) == 0) { if (fread(&caractere, sizeof(unsigned char), (size_t) 1, - fichier) > 0) + (*dfichier).descripteur_c) > 0) { if (caractere == '{') { @@ -217,7 +231,8 @@ instruction_inquire(struct_processus *s_ } } - if (fseek(fichier, position_courante, SEEK_SET) != 0) + if (fseek((*dfichier).descripteur_c, position_courante, SEEK_SET) + != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; @@ -430,14 +445,23 @@ instruction_inquire(struct_processus *s_ * La question porte sur un fichier fermé. */ + if ((nom = transliteration(s_etat_processus, + (unsigned char *) (*s_objet_argument_2).objet, + d_locale, "UTF-8")) == NULL) + { + liberation(s_etat_processus, s_objet_argument_1); + liberation(s_etat_processus, s_objet_argument_2); + return; + } + if (strcmp(requete, "EXISTENCE") == 0) { - erreur = caracteristiques_fichier(s_etat_processus, - (unsigned char *) (*s_objet_argument_2).objet, + erreur = caracteristiques_fichier(s_etat_processus, nom, &existence, &ouverture, &unite); if (erreur != d_absence_erreur) { + free(nom); free(requete); liberation(s_etat_processus, s_objet_argument_1); @@ -474,13 +498,13 @@ instruction_inquire(struct_processus *s_ } else if (strcmp(requete, "LOCK") == 0) { - erreur = caracteristiques_fichier(s_etat_processus, - (unsigned char *) (*s_objet_argument_2).objet, + erreur = caracteristiques_fichier(s_etat_processus, nom, &existence, &ouverture, &unite); if (erreur != d_absence_erreur) { free(requete); + free(nom); liberation(s_etat_processus, s_objet_argument_1); liberation(s_etat_processus, s_objet_argument_2); @@ -504,6 +528,7 @@ instruction_inquire(struct_processus *s_ */ free(requete); + free(nom); liberation(s_etat_processus, s_objet_argument_1); liberation(s_etat_processus, s_objet_argument_2); @@ -519,10 +544,10 @@ instruction_inquire(struct_processus *s_ * Fichier existant */ - if ((fichier = fopen((unsigned char *) - (*s_objet_argument_2).objet, "r+")) == NULL) + if ((fichier = fopen(nom, "r+")) == NULL) { free(requete); + free(nom); liberation(s_etat_processus, s_objet_argument_1); liberation(s_etat_processus, s_objet_argument_2); @@ -541,6 +566,8 @@ instruction_inquire(struct_processus *s_ if (fcntl(fileno(fichier), F_GETLK, &lock) == -1) { + free(nom); + if (fclose(fichier) != 0) { free(requete); @@ -580,6 +607,8 @@ instruction_inquire(struct_processus *s_ if (fcntl(fileno(fichier), F_GETLK, &lock) == -1) { + free(nom); + if (fclose(fichier) != 0) { free(requete); @@ -668,6 +697,7 @@ instruction_inquire(struct_processus *s_ if (fclose(fichier) != 0) { free(requete); + free(nom); liberation(s_etat_processus, s_objet_argument_1); liberation(s_etat_processus, s_objet_argument_2); @@ -680,6 +710,7 @@ instruction_inquire(struct_processus *s_ } else { + free(nom); free(requete); liberation(s_etat_processus, s_objet_argument_1); @@ -688,6 +719,8 @@ instruction_inquire(struct_processus *s_ (*s_etat_processus).erreur_execution = d_ex_erreur_requete_fichier; return; } + + free(nom); } else {