--- rpl/src/instructions_r4.c 2013/04/01 15:29:37 1.78 +++ rpl/src/instructions_r4.c 2013/04/04 07:51:56 1.79 @@ -883,8 +883,6 @@ instruction_read(struct_processus *s_eta struct sockaddr_in6 adresse_ipv6; # endif - struct pollfd poll_fd; - struct timespec attente; struct_descripteur_fichier *descripteur; @@ -2498,45 +2496,74 @@ instruction_read(struct_processus *s_eta } 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; + // Si on a lu toute une trame et qu'on n'a pas + // réussi à en trouver la structure, on remonte + // une erreur de syntaxe. - while((ios = poll(&poll_fd, 1, 10000)) <= 0) + if (longueur_effective == ios) { - // La fin de la trame n'est pas atteinte. - - switch(ios) + if ((*((struct_socket *) (*s_objet_argument_1) + .objet)).domaine == PF_UNIX) { - case EINTR: + do { - if ((*s_etat_processus) - .var_volatile_requete_arret == -1) - { - liberation(s_etat_processus, - s_objet_argument_1); - free(tampon_lecture); - return; - } - - break; + longueur_adresse = sizeof(adresse_unix); + recvfrom((*((struct_socket *) + (*s_objet_argument_1).objet)) + .socket, tampon_lecture, + (size_t) 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) + { + do + { + longueur_adresse = sizeof(adresse_ipv4); + recvfrom((*((struct_socket *) + (*s_objet_argument_1).objet)) + .socket, tampon_lecture, + (size_t) longueur_effective, + 0, (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 + do + { + longueur_adresse = sizeof(adresse_ipv6); + recvfrom((*((struct_socket *) + (*s_objet_argument_1).objet)) + .socket, tampon_lecture, + (size_t) 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"); } - - case 0: + else { - liberation(s_etat_processus, - s_objet_argument_1); - free(tampon_lecture); - - (*s_etat_processus).erreur_execution = - d_ex_fin_de_fichier_atteinte; - return; + printf("+++Warning : IPv6 support " + "unavailable\n"); } + +# endif } + + liberation(s_etat_processus, s_objet_argument_1); + free(tampon_lecture); + + (*s_etat_processus).erreur_execution = d_ex_syntaxe; + return; } } }