--- rpl/src/instructions_w1.c 2010/03/04 10:17:54 1.4 +++ rpl/src/instructions_w1.c 2010/03/06 18:29:07 1.5 @@ -374,8 +374,6 @@ instruction_wireframe(struct_processus * void instruction_write(struct_processus *s_etat_processus) { - file *descripteur; - int adresse[16]; int port; @@ -384,6 +382,8 @@ instruction_write(struct_processus *s_et ssize_t ios; + struct_descripteur_fichier *descripteur; + struct_objet *s_objet_argument_2; struct_objet *s_objet_argument_1; @@ -399,6 +399,7 @@ instruction_write(struct_processus *s_et uint32_t calcul_adresse; unsigned char *chaine; + unsigned char *chaine_utf8; unsigned long i; @@ -455,6 +456,12 @@ instruction_write(struct_processus *s_et if (((*s_objet_argument_2).type == LST) && ((*s_objet_argument_1).type == FCH)) { + if ((descripteur = descripteur_fichier(s_etat_processus, + (struct_fichier *) (*s_objet_argument_1).objet)) == NULL) + { + return; + } + /* * Vérification des verrous */ @@ -466,13 +473,8 @@ instruction_write(struct_processus *s_et lock.l_pid = getpid(); recursivite = 0; - if ((descripteur = descripteur_fichier(s_etat_processus, - (struct_fichier *) (*s_objet_argument_1).objet)) == NULL) - { - return; - } - - if (fcntl(fileno(descripteur), F_GETLK, &lock) == -1) + if (fcntl(fileno((*descripteur).descripteur_c), F_GETLK, &lock) + == -1) { liberation(s_etat_processus, s_objet_argument_2); liberation(s_etat_processus, s_objet_argument_1); @@ -525,7 +527,10 @@ instruction_write(struct_processus *s_et if ((*((struct_fichier *) (*s_objet_argument_1).objet)).acces == 'S') { - if (fseek(descripteur, (long) 0, SEEK_END) != 0) + BUG(((*descripteur).type != 'C'), uprintf("Bad filetype !\n")); + + if (fseek((*descripteur).descripteur_c, (long) 0, SEEK_END) + != 0) { liberation(s_etat_processus, s_objet_argument_2); liberation(s_etat_processus, s_objet_argument_1); @@ -534,11 +539,24 @@ instruction_write(struct_processus *s_et return; } - if (fprintf(descripteur, "%s\n", chaine) < 0) + if ((chaine_utf8 = transliteration(s_etat_processus, + chaine, d_locale, "UTF-8")) == NULL) + { + liberation(s_etat_processus, s_objet_argument_2); + liberation(s_etat_processus, s_objet_argument_1); + + return; + } + + if (fprintf((*descripteur).descripteur_c, "%s\n", chaine) < 0) { + free(chaine_utf8); + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } + + free(chaine_utf8); } else if ((*((struct_fichier *) (*s_objet_argument_1).objet)).acces == 'D') @@ -572,7 +590,10 @@ instruction_write(struct_processus *s_et if ((*((struct_fichier *) (*s_objet_argument_1).objet)).acces == 'S') { - if (fseek(descripteur, (long) 0, SEEK_END) != 0) + BUG(((*descripteur).type != 'C'), uprintf("Bad filetype !\n")); + + if (fseek((*descripteur).descripteur_c, (long) 0, SEEK_END) + != 0) { liberation(s_etat_processus, s_objet_argument_2); liberation(s_etat_processus, s_objet_argument_1); @@ -582,7 +603,8 @@ instruction_write(struct_processus *s_et } if (fwrite(chaine, sizeof(unsigned char), longueur_effective, - descripteur) != (size_t) longueur_effective) + (*descripteur).descripteur_c) != + (size_t) longueur_effective) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; @@ -982,14 +1004,14 @@ instruction_write(struct_processus *s_et void instruction_wflock(struct_processus *s_etat_processus) { - file *descripteur; - logical1 drapeau; struct flock lock; struct timespec attente; + struct_descripteur_fichier *descripteur; + struct_objet *s_objet_argument_1; struct_objet *s_objet_argument_2; @@ -1100,7 +1122,8 @@ instruction_wflock(struct_processus *s_e return; } - if (fcntl(fileno(descripteur), F_GETLK, &lock) == -1) + if (fcntl(fileno((*descripteur).descripteur_c), F_GETLK, &lock) + == -1) { liberation(s_etat_processus, s_objet_argument_1); liberation(s_etat_processus, s_objet_argument_2);