--- rpl/src/instructions_r4.c 2013/03/18 10:32:41 1.75 +++ rpl/src/instructions_r4.c 2013/04/04 07:51:56 1.79 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.1.13 + RPL/2 (R) version 4.1.14 Copyright (C) 1989-2013 Dr. BERTRAND Joël This file is part of RPL/2. @@ -96,8 +96,8 @@ instruction_r_vers_b(struct_processus *s } else { - (*((logical8 *) (*s_objet_resultat).objet)) = (*((integer8 *) - (*s_objet_argument).objet)); + (*((logical8 *) (*s_objet_resultat).objet)) = (logical8) + (*((integer8 *) (*s_objet_argument).objet)); } } else @@ -855,6 +855,8 @@ instruction_read(struct_processus *s_eta integer8 i; integer8 id; integer8 position_clef; + integer8 longueur; + integer8 longueur_effective; integer8 longueur_enregistrement; integer8 longueur_questure; @@ -869,8 +871,6 @@ instruction_read(struct_processus *s_eta logical1 presence_indicateur; logical1 trame_complete; - long longueur; - socklen_t longueur_adresse; sqlite3_stmt *ppStmt; @@ -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; @@ -1053,7 +1051,7 @@ instruction_read(struct_processus *s_eta longueur_questure = 4096; - if ((tampon_lecture = malloc(longueur_questure * + if ((tampon_lecture = malloc(((size_t) longueur_questure) * sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = @@ -1072,8 +1070,8 @@ instruction_read(struct_processus *s_eta do { - longueur_effective = fread(tampon_lecture, - (size_t) sizeof(unsigned char), longueur_questure, + longueur_effective = (integer8) fread(tampon_lecture, + sizeof(unsigned char), (size_t) longueur_questure, (*descripteur).descripteur_c); pointeur = 0; @@ -1111,7 +1109,7 @@ instruction_read(struct_processus *s_eta presence_chaine = d_faux; niveau = 1; - if (fseek((*descripteur).descripteur_c, position_finale, + if (fseek((*descripteur).descripteur_c, (long) position_finale, SEEK_SET) != 0) { liberation(s_etat_processus, s_objet_argument_1); @@ -1123,8 +1121,8 @@ instruction_read(struct_processus *s_eta do { - longueur_effective = fread(tampon_lecture, - (size_t) sizeof(unsigned char), longueur_questure, + longueur_effective = (integer8) fread(tampon_lecture, + sizeof(unsigned char), (size_t) longueur_questure, (*descripteur).descripteur_c); pointeur = 0; @@ -1192,7 +1190,8 @@ instruction_read(struct_processus *s_eta free(tampon_lecture); longueur_enregistrement = position_finale - position_initiale; - if ((tampon_lecture = malloc((longueur_enregistrement + 1) * + if ((tampon_lecture = malloc(((size_t) + (longueur_enregistrement + 1)) * sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = @@ -1200,8 +1199,8 @@ instruction_read(struct_processus *s_eta return; } - if (fseek((*descripteur).descripteur_c, position_initiale, - SEEK_SET) != 0) + if (fseek((*descripteur).descripteur_c, + (long) position_initiale, SEEK_SET) != 0) { liberation(s_etat_processus, s_objet_argument_1); free(tampon_lecture); @@ -1210,9 +1209,8 @@ instruction_read(struct_processus *s_eta return; } - longueur_effective = fread(tampon_lecture, - (size_t) sizeof(unsigned char), - (size_t) longueur_enregistrement, + longueur_effective = (integer8) fread(tampon_lecture, + sizeof(unsigned char), (size_t) longueur_enregistrement, (*descripteur).descripteur_c); if (longueur_effective != longueur_enregistrement) @@ -1302,7 +1300,7 @@ instruction_read(struct_processus *s_eta } if (sqlite3_prepare_v2((*descripteur).descripteur_sqlite, - commande, strlen(commande), &ppStmt, &queue) + commande, (int) strlen(commande), &ppStmt, &queue) != SQLITE_OK) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; @@ -1473,7 +1471,7 @@ instruction_read(struct_processus *s_eta } if (sqlite3_prepare_v2((*descripteur).descripteur_sqlite, - commande, strlen(commande), &ppStmt, &queue) + commande, (int) strlen(commande), &ppStmt, &queue) != SQLITE_OK) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; @@ -1547,7 +1545,7 @@ instruction_read(struct_processus *s_eta } if (sqlite3_prepare_v2((*descripteur).descripteur_sqlite, - commande, strlen(commande), &ppStmt, &queue) + commande, (int) strlen(commande), &ppStmt, &queue) != SQLITE_OK) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; @@ -1640,7 +1638,7 @@ instruction_read(struct_processus *s_eta } if (sqlite3_prepare_v2((*descripteur).descripteur_sqlite, - commande, strlen(commande), &ppStmt, &queue) + commande, (int) strlen(commande), &ppStmt, &queue) != SQLITE_OK) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; @@ -2028,7 +2026,7 @@ instruction_read(struct_processus *s_eta return; } - longueur = strlen(format_chaine); + longueur = (integer8) strlen(format_chaine); if (format_chaine[longueur - 1] != ')') { @@ -2052,7 +2050,7 @@ instruction_read(struct_processus *s_eta // Détermination de la longueur format_degenere = d_faux; - if (sscanf(&(format_chaine[8]), "%ld", &longueur) != 1) + if (sscanf(&(format_chaine[8]), "%lld", &longueur) != 1) { liberation(s_etat_processus, s_objet_argument_1); liberation(s_etat_processus, s_objet_resultat); @@ -2075,7 +2073,7 @@ instruction_read(struct_processus *s_eta } while((c != '\n') && (c != EOF)); if (fseek((*descripteur).descripteur_c, - position_initiale, SEEK_SET) != 0) + (long) position_initiale, SEEK_SET) != 0) { liberation(s_etat_processus, s_objet_argument_1); liberation(s_etat_processus, s_objet_resultat); @@ -2090,16 +2088,17 @@ instruction_read(struct_processus *s_eta longueur_enregistrement = longueur; } - if ((tampon_lecture = malloc((longueur_enregistrement) - * sizeof(unsigned char))) == NULL) + if ((tampon_lecture = malloc(((size_t) + longueur_enregistrement) * sizeof(unsigned char))) + == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } - longueur_effective = fread(tampon_lecture, - (size_t) sizeof(unsigned char), + longueur_effective = (integer8) fread(tampon_lecture, + sizeof(unsigned char), (size_t) longueur_enregistrement, (*descripteur).descripteur_c); @@ -2233,7 +2232,7 @@ instruction_read(struct_processus *s_eta presence_indicateur = d_faux; if ((tampon_lecture = realloc(tampon_lecture, - (longueur_effective + longueur_questure + 1) + ((size_t) (longueur_effective + longueur_questure + 1)) * sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = @@ -2258,10 +2257,10 @@ instruction_read(struct_processus *s_eta do { - ios = recvfrom((*((struct_socket *) + ios = (int) recvfrom((*((struct_socket *) (*s_objet_argument_1).objet)).socket, - tampon_lecture, - longueur_effective + longueur_questure, + tampon_lecture, (size_t) (longueur_effective + + longueur_questure), MSG_PEEK | MSG_DONTWAIT, (struct sockaddr *) &adresse_unix, &longueur_adresse); } while((ios == -1) && (errno == EINTR)); @@ -2273,10 +2272,10 @@ instruction_read(struct_processus *s_eta do { - ios = recvfrom((*((struct_socket *) + ios = (int) recvfrom((*((struct_socket *) (*s_objet_argument_1).objet)).socket, - tampon_lecture, - longueur_effective + longueur_questure, + tampon_lecture, (size_t) (longueur_effective + + longueur_questure), MSG_PEEK | MSG_DONTWAIT, (struct sockaddr *) &adresse_ipv4, &longueur_adresse); } while((ios == -1) && (errno == EINTR)); @@ -2289,10 +2288,10 @@ instruction_read(struct_processus *s_eta do { - ios = recvfrom((*((struct_socket *) + ios = (int) recvfrom((*((struct_socket *) (*s_objet_argument_1).objet)).socket, - tampon_lecture, - longueur_effective + longueur_questure, + tampon_lecture, (size_t) (longueur_effective + + longueur_questure), MSG_PEEK | MSG_DONTWAIT, (struct sockaddr *) &adresse_ipv6, &longueur_adresse); } while((ios == -1) && (errno == EINTR)); @@ -2444,7 +2443,8 @@ instruction_read(struct_processus *s_eta longueur_adresse = sizeof(adresse_unix); recvfrom((*((struct_socket *) (*s_objet_argument_1).objet)).socket, - tampon_lecture, longueur_effective, + tampon_lecture, + (size_t) longueur_effective, 0, (struct sockaddr *) &adresse_unix, &longueur_adresse); } while((ios == -1) && (errno == EINTR)); @@ -2457,7 +2457,8 @@ instruction_read(struct_processus *s_eta longueur_adresse = sizeof(adresse_ipv4); recvfrom((*((struct_socket *) (*s_objet_argument_1).objet)).socket, - tampon_lecture, longueur_effective, + tampon_lecture, + (size_t) longueur_effective, 0, (struct sockaddr *) &adresse_ipv4, &longueur_adresse); } while((ios == -1) && (errno == EINTR)); @@ -2471,7 +2472,8 @@ instruction_read(struct_processus *s_eta longueur_adresse = sizeof(adresse_ipv6); recvfrom((*((struct_socket *) (*s_objet_argument_1).objet)).socket, - tampon_lecture, longueur_effective, + tampon_lecture, + (size_t) longueur_effective, 0, (struct sockaddr *) &adresse_ipv6, &longueur_adresse); } while((ios == -1) && (errno == EINTR)); @@ -2494,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; } } } @@ -2836,7 +2867,7 @@ instruction_read(struct_processus *s_eta longueur_adresse = 0; recvfrom((*((struct_socket *) (*s_objet_argument_1).objet)).socket, tampon_lecture, - position_finale, MSG_DONTWAIT, + (size_t) position_finale, MSG_DONTWAIT, NULL, &longueur_adresse); } @@ -2867,7 +2898,7 @@ instruction_read(struct_processus *s_eta presence_indicateur = d_faux; if ((tampon_lecture = realloc(tampon_lecture, - (longueur_effective + longueur_questure + 1) + ((size_t) (longueur_effective + longueur_questure) + 1) * sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = @@ -2892,10 +2923,10 @@ instruction_read(struct_processus *s_eta do { - ios = recvfrom((*((struct_socket *) + ios = (int) recvfrom((*((struct_socket *) (*s_objet_argument_1).objet)).socket, - tampon_lecture, - longueur_effective + longueur_questure, + tampon_lecture, (size_t) + (longueur_effective + longueur_questure), MSG_PEEK | MSG_DONTWAIT, (struct sockaddr *) &adresse_unix, &longueur_adresse); } while((ios == -1) && (errno == EINTR)); @@ -2907,10 +2938,10 @@ instruction_read(struct_processus *s_eta do { - ios = recvfrom((*((struct_socket *) + ios = (int) recvfrom((*((struct_socket *) (*s_objet_argument_1).objet)).socket, - tampon_lecture, - longueur_effective + longueur_questure, + tampon_lecture, (size_t) + (longueur_effective + longueur_questure), MSG_PEEK | MSG_DONTWAIT, (struct sockaddr *) &adresse_ipv4, &longueur_adresse); } while((ios == -1) && (errno == EINTR)); @@ -2923,10 +2954,10 @@ instruction_read(struct_processus *s_eta do { - ios = recvfrom((*((struct_socket *) + ios = (int) recvfrom((*((struct_socket *) (*s_objet_argument_1).objet)).socket, - tampon_lecture, - longueur_effective + longueur_questure, + tampon_lecture, (size_t) + (longueur_effective + longueur_questure), MSG_PEEK | MSG_DONTWAIT, (struct sockaddr *) &adresse_ipv6, &longueur_adresse); } while((ios == -1) && (errno == EINTR)); @@ -3012,7 +3043,7 @@ instruction_read(struct_processus *s_eta longueur_adresse = sizeof(adresse_unix); recvfrom((*((struct_socket *) (*s_objet_argument_1).objet)).socket, - tampon_lecture, longueur_effective, + tampon_lecture, (size_t) longueur_effective, 0, (struct sockaddr *) &adresse_unix, &longueur_adresse); } while((ios == -1) && (errno == EINTR)); @@ -3025,7 +3056,7 @@ instruction_read(struct_processus *s_eta longueur_adresse = sizeof(adresse_ipv4); recvfrom((*((struct_socket *) (*s_objet_argument_1).objet)).socket, - tampon_lecture, longueur_effective, + tampon_lecture, (size_t) longueur_effective, 0, (struct sockaddr *) &adresse_ipv4, &longueur_adresse); } while((ios == -1) && (errno == EINTR)); @@ -3039,7 +3070,7 @@ instruction_read(struct_processus *s_eta longueur_adresse = sizeof(adresse_ipv6); recvfrom((*((struct_socket *) (*s_objet_argument_1).objet)).socket, - tampon_lecture, longueur_effective, + tampon_lecture, (size_t) longueur_effective, 0, (struct sockaddr *) &adresse_ipv6, &longueur_adresse); } while((ios == -1) && (errno == EINTR)); @@ -3321,7 +3352,7 @@ instruction_read(struct_processus *s_eta longueur_adresse = 0; recvfrom((*((struct_socket *) (*s_objet_argument_1).objet)).socket, tampon_lecture, - position_finale, MSG_DONTWAIT, + (size_t) position_finale, MSG_DONTWAIT, NULL, &longueur_adresse); }