--- rpl/src/instructions_r4.c 2012/06/19 09:59:34 1.56 +++ rpl/src/instructions_r4.c 2012/06/21 16:07:25 1.58 @@ -867,6 +867,7 @@ instruction_read(struct_processus *s_eta logical1 indicateur_48; logical1 presence_chaine; logical1 presence_indicateur; + logical1 trame_complete; socklen_t longueur_adresse; @@ -2070,7 +2071,7 @@ printf("L=%d\n", longueur_enregistrement return; } - if ((tampon_lecture = malloc((longueur_enregistrement + 1) + if ((tampon_lecture = malloc((longueur_enregistrement) * sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = @@ -2080,7 +2081,7 @@ printf("L=%d\n", longueur_enregistrement longueur_effective = fread(tampon_lecture, (size_t) sizeof(unsigned char), - (size_t) longueur_enregistrement, + (size_t) longueur_enregistrement - 1, (*descripteur).descripteur_c); if ((s_objet_resultat = allocation(s_etat_processus, LST)) @@ -2110,52 +2111,14 @@ printf("L=%d\n", longueur_enregistrement return; } - longueur_enregistrement = 1; - - for(i = 0; i < longueur_effective; i++) - { - if (isprint(tampon_lecture[i]) != 0) - { - longueur_enregistrement += 4; - } - else - { - longueur_enregistrement++; - } - } - - if ((tampon = malloc(longueur_enregistrement * - sizeof(unsigned char))) == NULL) + if ((((*(*((struct_liste_chainee *) (*s_objet_resultat).objet)) + .donnee)).objet = analyse_flux(s_etat_processus, + tampon_lecture, longueur_enregistrement - 1)) == NULL) { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; return; } - ptr = tampon; - - for(i = 0; i < longueur_effective; i++) - { - if (isprint(tampon_lecture[i]) != 0) - { - (*ptr) = tampon_lecture[i]; - ptr++; - } - else - { - (*ptr) = '\\'; - ptr++; - (*ptr) = 'x'; - ptr++; - sprintf(ptr, "%02X", tampon_lecture[i]); - ptr += 2; - } - } - - (*ptr) = d_code_fin_chaine; free(tampon_lecture); - ((*(*((struct_liste_chainee *) (*s_objet_resultat).objet)) - .donnee)).objet = tampon; if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile), @@ -2217,12 +2180,16 @@ printf("L=%d\n", longueur_enregistrement attente.tv_sec = 0; attente.tv_nsec = GRANULARITE_us * 1000; + trame_complete = d_faux; + position_initiale = 0; + position_finale = 0; + do { presence_indicateur = d_faux; if ((tampon_lecture = realloc(tampon_lecture, - (longueur_effective + longueur_questure) + (longueur_effective + longueur_questure + 1) * sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = @@ -2244,35 +2211,47 @@ printf("L=%d\n", longueur_enregistrement .domaine == PF_UNIX) { longueur_adresse = sizeof(adresse_unix); - ios = recvfrom((*((struct_socket *) - (*s_objet_argument_1).objet)).socket, - tampon_lecture + longueur_effective, - longueur_questure, - MSG_PEEK | MSG_DONTWAIT, (struct sockaddr *) - &adresse_unix, &longueur_adresse); + + do + { + ios = recvfrom((*((struct_socket *) + (*s_objet_argument_1).objet)).socket, + tampon_lecture + longueur_effective, + longueur_questure, + MSG_PEEK | 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); - ios = recvfrom((*((struct_socket *) - (*s_objet_argument_1).objet)).socket, - tampon_lecture + longueur_effective, - longueur_questure, - MSG_PEEK | MSG_DONTWAIT, (struct sockaddr *) - &adresse_ipv4, &longueur_adresse); + + do + { + ios = recvfrom((*((struct_socket *) + (*s_objet_argument_1).objet)).socket, + tampon_lecture + longueur_effective, + longueur_questure, + MSG_PEEK | 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); - ios = recvfrom((*((struct_socket *) - (*s_objet_argument_1).objet)).socket, - tampon_lecture + longueur_effective, - longueur_questure, - MSG_PEEK | MSG_DONTWAIT, (struct sockaddr *) - &adresse_ipv6, &longueur_adresse); + + do + { + ios = recvfrom((*((struct_socket *) + (*s_objet_argument_1).objet)).socket, + tampon_lecture + longueur_effective, + longueur_questure, + MSG_PEEK | MSG_DONTWAIT, (struct sockaddr *) + &adresse_ipv6, &longueur_adresse); + } while((ios == -1) && (errno == EINTR)); # else if ((*s_etat_processus).langue == 'F') { @@ -2385,6 +2364,7 @@ printf("L=%d\n", longueur_enregistrement if (niveau == 0) { presence_indicateur = d_vrai; + trame_complete = d_vrai; break; } @@ -2399,35 +2379,50 @@ printf("L=%d\n", longueur_enregistrement .domaine == PF_UNIX) { longueur_adresse = sizeof(adresse_unix); - ios = recvfrom((*((struct_socket *) - (*s_objet_argument_1).objet)).socket, - poubelle, position_finale - - ancienne_longueur_effective, - MSG_DONTWAIT, (struct sockaddr *) - &adresse_unix, &longueur_adresse); + + 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); - ios = recvfrom((*((struct_socket *) - (*s_objet_argument_1).objet)).socket, - poubelle, position_finale - - ancienne_longueur_effective, - MSG_DONTWAIT, (struct sockaddr *) - &adresse_ipv4, &longueur_adresse); + + 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); - ios = recvfrom((*((struct_socket *) - (*s_objet_argument_1).objet)).socket, - poubelle, position_finale - - ancienne_longueur_effective, - MSG_DONTWAIT, (struct sockaddr *) - &adresse_ipv6, &longueur_adresse); + + do + { + 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') { @@ -2514,7 +2509,7 @@ printf("L=%d\n", longueur_enregistrement d_ex_erreur_acces_fichier; return; } - } while(presence_indicateur == d_faux); + } while(trame_complete == d_faux); tampon_lecture[++position_finale] = d_code_fin_chaine; tampon = (*s_etat_processus).instruction_courante; @@ -2531,6 +2526,20 @@ printf("L=%d\n", longueur_enregistrement (*s_etat_processus).instruction_courante = tampon; free(tampon_lecture); + if (indicateur_48 == d_vrai) + { + sf(s_etat_processus, 48); + } + else + { + cf(s_etat_processus, 48); + } + + if ((*s_etat_processus).var_volatile_requete_arret == -1) + { + (*s_etat_processus).erreur_execution = d_ex; + } + liberation(s_etat_processus, s_objet_argument_1); return; }