--- rpl/src/instructions_r4.c 2013/02/27 17:11:44 1.70 +++ rpl/src/instructions_r4.c 2013/03/01 09:29:30 1.71 @@ -851,7 +851,6 @@ instruction_read(struct_processus *s_eta int c; int ios; - integer8 ancienne_longueur_effective; integer8 element; integer8 i; integer8 id; @@ -878,14 +877,14 @@ instruction_read(struct_processus *s_eta struct flock lock; - struct pollfd poll_fd; - struct sockaddr_un adresse_unix; struct sockaddr_in adresse_ipv4; # ifdef IPV6 struct sockaddr_in6 adresse_ipv6; # endif + struct pollfd poll_fd; + struct timespec attente; struct_descripteur_fichier *descripteur; @@ -906,7 +905,6 @@ instruction_read(struct_processus *s_eta unsigned char *clef_utf8; unsigned char *commande; unsigned char *format_chaine; - unsigned char poubelle[256]; unsigned char *ptr; unsigned char *tampon_lecture; unsigned char *tampon; @@ -2355,7 +2353,7 @@ printf("L=%d\n", longueur_enregistrement if ((*((struct_socket *) (*s_objet_argument_1).objet)).binaire == 'N') { // Socket formatée - longueur_questure = 256; + longueur_questure = 4096; longueur_effective = 0; tampon_lecture = NULL; @@ -2398,8 +2396,8 @@ printf("L=%d\n", longueur_enregistrement { ios = recvfrom((*((struct_socket *) (*s_objet_argument_1).objet)).socket, - tampon_lecture + longueur_effective, - longueur_questure, + tampon_lecture, + longueur_effective + longueur_questure, MSG_PEEK | MSG_DONTWAIT, (struct sockaddr *) &adresse_unix, &longueur_adresse); } while((ios == -1) && (errno == EINTR)); @@ -2413,8 +2411,8 @@ printf("L=%d\n", longueur_enregistrement { ios = recvfrom((*((struct_socket *) (*s_objet_argument_1).objet)).socket, - tampon_lecture + longueur_effective, - longueur_questure, + tampon_lecture, + longueur_effective + longueur_questure, MSG_PEEK | MSG_DONTWAIT, (struct sockaddr *) &adresse_ipv4, &longueur_adresse); } while((ios == -1) && (errno == EINTR)); @@ -2429,8 +2427,8 @@ printf("L=%d\n", longueur_enregistrement { ios = recvfrom((*((struct_socket *) (*s_objet_argument_1).objet)).socket, - tampon_lecture + longueur_effective, - longueur_questure, + tampon_lecture, + longueur_effective + longueur_questure, MSG_PEEK | MSG_DONTWAIT, (struct sockaddr *) &adresse_ipv6, &longueur_adresse); } while((ios == -1) && (errno == EINTR)); @@ -2499,7 +2497,6 @@ printf("L=%d\n", longueur_enregistrement if (ios >= 0) { - ancienne_longueur_effective = longueur_effective; longueur_effective += ios; position_initiale = 0; presence_indicateur = d_faux; @@ -2570,80 +2567,79 @@ printf("L=%d\n", longueur_enregistrement } } - // On retire du buffer position_finale - - // ancienne_longueur_effective octets. + // On retire une trame du buffer. - if ((*((struct_socket *) (*s_objet_argument_1).objet)) - .domaine == PF_UNIX) + if (trame_complete == d_vrai) { - longueur_adresse = sizeof(adresse_unix); - - do - { - ios = recvfrom((*((struct_socket *) - (*s_objet_argument_1).objet)).socket, - poubelle, position_finale - - ancienne_longueur_effective, - MSG_DONTWAIT, (struct sockaddr *) - &adresse_unix, &longueur_adresse); - } while((ios == -1) && (errno == EINTR)); - } - else if ((*((struct_socket *) (*s_objet_argument_1) - .objet)).domaine == PF_INET) - { - longueur_adresse = sizeof(adresse_ipv4); - - do - { - ios = recvfrom((*((struct_socket *) - (*s_objet_argument_1).objet)).socket, - poubelle, position_finale - - ancienne_longueur_effective, - MSG_DONTWAIT, (struct sockaddr *) - &adresse_ipv4, &longueur_adresse); - } while((ios == -1) && (errno == EINTR)); - } - else if ((*((struct_socket *) (*s_objet_argument_1) - .objet)) .domaine == PF_INET6) - { -# ifdef IPV6 - longueur_adresse = sizeof(adresse_ipv6); - - do + if ((*((struct_socket *) (*s_objet_argument_1).objet)) + .domaine == PF_UNIX) { - ios = recvfrom((*((struct_socket *) - (*s_objet_argument_1).objet)).socket, - poubelle, position_finale - - ancienne_longueur_effective, - MSG_DONTWAIT, (struct sockaddr *) - &adresse_ipv6, &longueur_adresse); - } while((ios == -1) && (errno == EINTR)); -# else - if ((*s_etat_processus).langue == 'F') + do + { + longueur_adresse = sizeof(adresse_unix); + recvfrom((*((struct_socket *) + (*s_objet_argument_1).objet)).socket, + tampon_lecture, longueur_effective, + 0, (struct sockaddr *) + &adresse_unix, &longueur_adresse); + } while((ios == -1) && (errno == EINTR)); + } + else if ((*((struct_socket *) (*s_objet_argument_1) + .objet)).domaine == PF_INET) { - printf("+++Attention : Support du protocole" - " IPv6 indisponible\n"); + do + { + longueur_adresse = sizeof(adresse_ipv4); + recvfrom((*((struct_socket *) + (*s_objet_argument_1).objet)).socket, + tampon_lecture, longueur_effective, + 0, (struct sockaddr *) + &adresse_ipv4, &longueur_adresse); + } while((ios == -1) && (errno == EINTR)); } - else + else if ((*((struct_socket *) (*s_objet_argument_1) + .objet)) .domaine == PF_INET6) { - printf("+++Warning : IPv6 support " - "unavailable\n"); +# ifdef IPV6 + do + { + longueur_adresse = sizeof(adresse_ipv6); + recvfrom((*((struct_socket *) + (*s_objet_argument_1).objet)).socket, + tampon_lecture, longueur_effective, + 0, (struct sockaddr *) + &adresse_ipv6, &longueur_adresse); + } while((ios == -1) && (errno == EINTR)); +# else + if ((*s_etat_processus).langue == 'F') + { + printf("+++Attention : Support du protocole" + " IPv6 indisponible\n"); + } + else + { + printf("+++Warning : IPv6 support " + "unavailable\n"); + } + +# endif } - longueur_adresse = 0; -# endif + longueur_effective = ios; } - - if (presence_indicateur == d_faux) + else { + // Installation d'un timeout pour sortir de + // l'instruction dans le cas où la transmission serait + // invalide et que la trame reçue serait erronée. + poll_fd.fd = (*((struct_socket *) (*s_objet_argument_1).objet)).socket; poll_fd.events = POLLIN; while((ios = poll(&poll_fd, 1, 10000)) <= 0) { - // La fin de la trame n'est pas atteinte - // et il reste quelque chose à lire. + // La fin de la trame n'est pas atteinte. switch(ios) { @@ -2717,8 +2713,7 @@ printf("L=%d\n", longueur_enregistrement tampon_lecture[++position_finale] = d_code_fin_chaine; tampon = (*s_etat_processus).instruction_courante; - (*s_etat_processus).instruction_courante = &(tampon_lecture - [position_initiale]); + (*s_etat_processus).instruction_courante = tampon_lecture; indicateur_48 = test_cfsf(s_etat_processus, 48); cf(s_etat_processus, 48);