--- rpl/src/instructions_r4.c 2013/09/26 15:38:38 1.83 +++ rpl/src/instructions_r4.c 2013/09/27 10:41:47 1.84 @@ -850,12 +850,14 @@ instruction_read(struct_processus *s_eta int c; int ios; + int timeout; integer8 element; integer8 i; integer8 id; - integer8 position_clef; + integer8 index; integer8 longueur; + integer8 position_clef; integer8 longueur_effective; integer8 longueur_enregistrement; @@ -878,12 +880,16 @@ instruction_read(struct_processus *s_eta struct flock lock; + struct pollfd fds[1]; + struct sockaddr_un adresse_unix; struct sockaddr_in adresse_ipv4; # ifdef IPV6 struct sockaddr_in6 adresse_ipv6; # endif + struct termios tc; + struct timespec attente; struct_descripteur_fichier *descripteur; @@ -906,6 +912,39 @@ instruction_read(struct_processus *s_eta unsigned char *tampon_lecture; unsigned char *tampon; unsigned char *tampon2; + unsigned char *tampon3; + + int vitesses[] = + { + 50, 75, 110, 134, 150, 200, 300, 600, + 1200, 1800, 2400, 4800, 9600, 19200, 38400, +#ifdef B57600 + 57600, +#endif +#ifdef B115200 + 115200, +#endif +#ifdef B230400 + 230400, +#endif + 0 + }; + + tcflag_t vitesses_constantes[] = + { + B50, B75, B110, B134, B150, B200, B300, B600, + B1200, B1800, B2400, B4800, B9600, B19200, B38400, +#ifdef B57600 + B57600, +#endif +#ifdef B115200 + B115200, +#endif +#ifdef B230400 + B230400, +#endif + 0 + }; (*s_etat_processus).erreur_execution = d_ex; @@ -1974,6 +2013,7 @@ instruction_read(struct_processus *s_eta BUG(((*descripteur).type != 'C'), uprintf("Bad filtype !\n")); longueur_enregistrement = 0; + device = d_faux; if ((position_initiale = ftell((*descripteur).descripteur_c)) @@ -2073,14 +2113,81 @@ instruction_read(struct_processus *s_eta } free(format_chaine); + tampon3 = NULL; if (format_degenere == d_vrai) { + if (device == d_vrai) + { + longueur_questure = 4096; + index = 0; + + if ((tampon3 = malloc(((size_t) longueur_questure) * + sizeof(unsigned char))) == NULL) + { + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + return; + } + + tampon3[index] = d_code_fin_chaine; + + fds[0].fd = fileno((*descripteur).descripteur_c); + fds[0].events = POLLIN; + fds[0].revents = 0; + + tcgetattr(fileno((*descripteur).descripteur_c), + &tc); + timeout = 0; + + for(i = 0; vitesses[i] != 0; i++) + { + if (cfgetispeed(&tc) == vitesses_constantes[i]) + { + // La durée entre deux caractères sur le + // périphérique série ne doit pas dépasser + // la moitié de la durée de transmission + // d'un caractère complet. + + timeout = (int) (((double) 1000) / + (((double) vitesses_constantes[i]) / + 4)); + break; + } + } + } + do { + if (device == d_vrai) + { + if (poll(fds, 1, timeout) == 0) + { + break; + } + } + c = getc((*descripteur).descripteur_c); longueur_enregistrement++; - } while((c != '\n') && (c != EOF)); + + if (device == d_vrai) + { + if (longueur_enregistrement >= + longueur_questure) + { + if ((tampon3 = realloc(tampon3, + (size_t) (longueur_questure *= 2))) + == NULL) + { + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + return; + } + } + + tampon3[index++] = (unsigned char) c; + } + } while(c != EOF); if (device == d_faux) { @@ -2102,19 +2209,27 @@ instruction_read(struct_processus *s_eta longueur_enregistrement = longueur; } - if ((tampon_lecture = malloc(((size_t) - longueur_enregistrement) * sizeof(unsigned char))) - == NULL) + if ((device == d_vrai) && (format_degenere == d_vrai)) { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; - return; + longueur_effective = longueur_enregistrement; + tampon_lecture = tampon3; } + else + { + if ((tampon_lecture = malloc(((size_t) + longueur_enregistrement) * + sizeof(unsigned char))) == NULL) + { + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + return; + } - longueur_effective = (integer8) fread(tampon_lecture, - sizeof(unsigned char), - (size_t) longueur_enregistrement, - (*descripteur).descripteur_c); + longueur_effective = (integer8) fread(tampon_lecture, + sizeof(unsigned char), + (size_t) longueur_enregistrement, + (*descripteur).descripteur_c); + } if (l_element_courant == NULL) { @@ -2154,11 +2269,23 @@ instruction_read(struct_processus *s_eta if (format_degenere == d_vrai) { - if (((*(*l_element_courant).donnee).objet = - analyse_flux(s_etat_processus, tampon_lecture, - longueur_enregistrement - 1)) == NULL) + if (device == d_faux) { - return; + if (((*(*l_element_courant).donnee).objet = + analyse_flux(s_etat_processus, tampon_lecture, + longueur_enregistrement - 1)) == NULL) + { + return; + } + } + else + { + if (((*(*l_element_courant).donnee).objet = + analyse_flux(s_etat_processus, tampon_lecture, + longueur_enregistrement)) == NULL) + { + return; + } } } else