--- rpl/src/instructions_r4.c 2010/03/06 18:29:07 1.5 +++ rpl/src/instructions_r4.c 2010/03/07 17:03:29 1.6 @@ -846,6 +846,8 @@ instruction_rewind(struct_processus *s_e void instruction_read(struct_processus *s_etat_processus) { + const char *queue; + logical1 indicateur_48; logical1 presence_chaine; logical1 presence_indicateur; @@ -860,6 +862,8 @@ instruction_read(struct_processus *s_eta socklen_t longueur_adresse; + sqlite3_stmt *ppStmt; + struct flock lock; struct sockaddr_un adresse_unix; @@ -871,11 +875,13 @@ instruction_read(struct_processus *s_eta struct_descripteur_fichier *descripteur; struct_objet *s_objet_adresse; - struct_objet *s_objet_argument; + struct_objet *s_objet_argument_1; + struct_objet *s_objet_argument_2; struct_objet *s_objet_resultat; struct_objet *s_objet_type; unsigned char caractere; + unsigned char *commande; unsigned char *tampon_lecture; unsigned char *tampon; @@ -899,9 +905,10 @@ instruction_read(struct_processus *s_eta printf("(read a record of a file)\n\n"); } - printf(" 1: %s, %s\n", d_FCH, d_SCK); - printf(" To be fixed !\n"); + printf(" 1: %s, %s\n\n", d_FCH, d_SCK); + printf(" 1: %s, %s\n", d_INT, d_CHN); + printf(" 1: %s\n", d_FCH); return; } else if ((*s_etat_processus).test_instruction == 'Y') @@ -912,23 +919,50 @@ instruction_read(struct_processus *s_eta if (test_cfsf(s_etat_processus, 31) == d_vrai) { - if (empilement_pile_last(s_etat_processus, 1) == d_erreur) + if ((*s_etat_processus).l_base_pile == NULL) { + (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } + + if ((*(*(*s_etat_processus).l_base_pile).donnee).type == FCH) + { + if ((*((struct_fichier *) (*(*(*s_etat_processus).l_base_pile) + .donnee).objet)).acces == 'S') + { + if (empilement_pile_last(s_etat_processus, 1) == d_erreur) + { + return; + } + } + else + { + if (empilement_pile_last(s_etat_processus, 2) == d_erreur) + { + return; + } + } + } + else + { + if (empilement_pile_last(s_etat_processus, 1) == d_erreur) + { + return; + } + } } if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), - &s_objet_argument) == d_erreur) + &s_objet_argument_1) == d_erreur) { (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } - if ((*s_objet_argument).type == FCH) + if ((*s_objet_argument_1).type == FCH) { if ((descripteur = descripteur_fichier(s_etat_processus, - (struct_fichier *) (*s_objet_argument).objet)) == NULL) + (struct_fichier *) (*s_objet_argument_1).objet)) == NULL) { return; } @@ -946,7 +980,7 @@ instruction_read(struct_processus *s_eta if (fcntl(fileno((*descripteur).descripteur_c), F_GETLK, &lock) == -1) { - liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_argument_1); (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; @@ -954,7 +988,7 @@ instruction_read(struct_processus *s_eta if (lock.l_type != F_UNLCK) { - liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_argument_1); (*s_etat_processus).erreur_execution = d_ex_fichier_verrouille; @@ -965,14 +999,15 @@ instruction_read(struct_processus *s_eta * Vérification de l'autorisation de lecture */ - if ((*((struct_fichier *) (*s_objet_argument).objet)).protection == 'W') + if ((*((struct_fichier *) (*s_objet_argument_1).objet)).protection + == 'W') { - liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_argument_1); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } - else if ((*((struct_fichier *) (*s_objet_argument).objet)).protection + else if ((*((struct_fichier *) (*s_objet_argument_1).objet)).protection == 'N') { if ((*descripteur).type == 'C') @@ -985,13 +1020,14 @@ instruction_read(struct_processus *s_eta } } - if ((*((struct_fichier *) (*s_objet_argument).objet)).binaire == 'N') + if ((*((struct_fichier *) (*s_objet_argument_1).objet)).binaire == 'N') { /* * Fichiers formatés */ - if ((*((struct_fichier *) (*s_objet_argument).objet)).acces == 'S') + if ((*((struct_fichier *) (*s_objet_argument_1).objet)).acces + == 'S') { /* * Fichiers séquentiels @@ -1045,7 +1081,7 @@ instruction_read(struct_processus *s_eta if (presence_indicateur == d_faux) { - liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_argument_1); free(tampon_lecture); (*s_etat_processus).erreur_execution = @@ -1060,7 +1096,7 @@ instruction_read(struct_processus *s_eta if (fseek((*descripteur).descripteur_c, position_finale, SEEK_SET) != 0) { - liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_argument_1); free(tampon_lecture); (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; @@ -1116,7 +1152,7 @@ instruction_read(struct_processus *s_eta if (presence_indicateur == d_faux) { - liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_argument_1); free(tampon_lecture); (*s_etat_processus).erreur_execution = @@ -1138,7 +1174,7 @@ instruction_read(struct_processus *s_eta if (fseek((*descripteur).descripteur_c, position_initiale, SEEK_SET) != 0) { - liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_argument_1); free(tampon_lecture); (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; @@ -1163,7 +1199,8 @@ instruction_read(struct_processus *s_eta transliteration(s_etat_processus, tampon_lecture, "UTF-8", d_locale)) == NULL) { - liberation(s_etat_processus, s_objet_argument); + (*s_etat_processus).instruction_courante = tampon; + liberation(s_etat_processus, s_objet_argument_1); free(tampon_lecture); return; } @@ -1176,11 +1213,19 @@ instruction_read(struct_processus *s_eta if ((*s_etat_processus).erreur_execution != d_ex) { + if (indicateur_48 == d_vrai) + { + sf(s_etat_processus, 48); + } + else + { + cf(s_etat_processus, 48); + } + (*s_etat_processus).instruction_courante = tampon; free(tampon_lecture); - liberation(s_etat_processus, s_objet_argument); - + liberation(s_etat_processus, s_objet_argument_1); return; } @@ -1196,15 +1241,167 @@ instruction_read(struct_processus *s_eta (*s_etat_processus).instruction_courante = tampon; free(tampon_lecture); } - else if ((*((struct_fichier *) (*s_objet_argument).objet)).acces + else if ((*((struct_fichier *) (*s_objet_argument_1).objet)).acces == 'D') { + BUG(((*descripteur).type != 'S'), uprintf("Bad filtype !\n")); + + if (depilement(s_etat_processus, &((*s_etat_processus) + .l_base_pile), &s_objet_argument_2) == d_erreur) + { + (*s_etat_processus).erreur_execution = d_ex_manque_argument; + return; + } + + if ((*s_objet_argument_2).type != INT) + { + liberation(s_etat_processus, s_objet_argument_1); + liberation(s_etat_processus, s_objet_argument_2); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_type_argument; + return; + } + + if (alsprintf(&commande, "select data from data where " + "id = %lld", (*((integer8 *) (*s_objet_argument_2) + .objet))) < 0) + { + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + return; + } + + if (sqlite3_prepare_v2((*descripteur).descripteur_sqlite, + commande, strlen(commande), &ppStmt, &queue) + != SQLITE_OK) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return; + } + + + switch(sqlite3_step(ppStmt)) + { + case SQLITE_ROW: + { + // Résultat attendu + break; + } + + case SQLITE_DONE: + { + // Aucun enregistrement + if (sqlite3_finalize(ppStmt) != SQLITE_OK) + { + (*s_etat_processus).erreur_systeme = + d_es_erreur_fichier; + return; + } + + free(commande); + + liberation(s_etat_processus, s_objet_argument_1); + liberation(s_etat_processus, s_objet_argument_2); + + (*s_etat_processus).erreur_execution = + d_ex_enregistrement_inexistant; + return; + } + + default: + { + (*s_etat_processus).erreur_systeme = + d_es_erreur_fichier; + return; + } + } + + if (sqlite3_column_type(ppStmt, 0) != SQLITE_TEXT) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return; + } + + tampon = (*s_etat_processus).instruction_courante; + + if ((tampon_lecture = (unsigned char *) + sqlite3_column_text(ppStmt, 0)) == NULL) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return; + } + + if (((*s_etat_processus).instruction_courante = + transliteration(s_etat_processus, tampon_lecture, + "UTF-8", d_locale)) == NULL) + { + (*s_etat_processus).instruction_courante = tampon; + + liberation(s_etat_processus, s_objet_argument_1); + liberation(s_etat_processus, s_objet_argument_2); + free(commande); + return; + } + + indicateur_48 = test_cfsf(s_etat_processus, 48); + cf(s_etat_processus, 48); + + recherche_type(s_etat_processus); + + if ((*s_etat_processus).erreur_execution != d_ex) + { + if (indicateur_48 == d_vrai) + { + sf(s_etat_processus, 48); + } + else + { + cf(s_etat_processus, 48); + } + + (*s_etat_processus).instruction_courante = tampon; + + liberation(s_etat_processus, s_objet_argument_1); + liberation(s_etat_processus, s_objet_argument_2); + + free((*s_etat_processus).instruction_courante); + free(commande); + return; + } + + if (indicateur_48 == d_vrai) + { + sf(s_etat_processus, 48); + } + else + { + cf(s_etat_processus, 48); + } + + free((*s_etat_processus).instruction_courante); + liberation(s_etat_processus, s_objet_argument_2); + (*s_etat_processus).instruction_courante = tampon; + + if (sqlite3_step(ppStmt) != SQLITE_DONE) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return; + } + + if (sqlite3_finalize(ppStmt) != SQLITE_OK) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return; + } + + free(commande); } else { } } - else if ((*((struct_fichier *) (*s_objet_argument).objet)).binaire + else if ((*((struct_fichier *) (*s_objet_argument_1).objet)).binaire == 'Y') { /* @@ -1218,15 +1415,16 @@ instruction_read(struct_processus *s_eta */ } } - else if ((*s_objet_argument).type == SCK) + else if ((*s_objet_argument_1).type == SCK) { /* * Vérification de l'autorisation de lecture */ - if ((*((struct_socket *) (*s_objet_argument).objet)).protection == 'W') + if ((*((struct_socket *) (*s_objet_argument_1).objet)).protection + == 'W') { - liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_argument_1); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; @@ -1236,21 +1434,22 @@ instruction_read(struct_processus *s_eta * Vérification de l'écoute de la socket si celle-ci est connectée */ - if ((strcmp((*((struct_socket *) (*s_objet_argument).objet)).type, + if ((strcmp((*((struct_socket *) (*s_objet_argument_1).objet)).type, "STREAM") == 0) || (strcmp((*((struct_socket *) - (*s_objet_argument).objet)).type, "SEQUENTIAL DATAGRAM") == 0)) + (*s_objet_argument_1).objet)).type, "SEQUENTIAL DATAGRAM") + == 0)) { - if ((*((struct_socket *) (*s_objet_argument).objet)) + if ((*((struct_socket *) (*s_objet_argument_1).objet)) .socket_en_ecoute == 'Y') { - liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_argument_1); (*s_etat_processus).erreur_execution = d_ex_socket_en_ecoute; return; } } - if ((*((struct_socket *) (*s_objet_argument).objet)).binaire == 'N') + if ((*((struct_socket *) (*s_objet_argument_1).objet)).binaire == 'N') { // Socket formatée longueur_questure = 256; @@ -1272,32 +1471,32 @@ instruction_read(struct_processus *s_eta for(;;) { - if ((*((struct_socket *) (*s_objet_argument).objet)).domaine - == PF_UNIX) + if ((*((struct_socket *) (*s_objet_argument_1).objet)) + .domaine == PF_UNIX) { longueur_adresse = sizeof(adresse_unix); longueur_effective = recvfrom((*((struct_socket *) - (*s_objet_argument).objet)).socket, + (*s_objet_argument_1).objet)).socket, tampon_lecture, longueur_questure, MSG_PEEK | MSG_DONTWAIT, (struct sockaddr *) &adresse_unix, &longueur_adresse); } - else if ((*((struct_socket *) (*s_objet_argument).objet)) + else if ((*((struct_socket *) (*s_objet_argument_1).objet)) .domaine == PF_INET) { longueur_adresse = sizeof(adresse_ipv4); longueur_effective = recvfrom((*((struct_socket *) - (*s_objet_argument).objet)).socket, + (*s_objet_argument_1).objet)).socket, tampon_lecture, longueur_questure, MSG_PEEK | MSG_DONTWAIT, (struct sockaddr *) &adresse_ipv4, &longueur_adresse); } - else if ((*((struct_socket *) (*s_objet_argument).objet)) + else if ((*((struct_socket *) (*s_objet_argument_1).objet)) .domaine == PF_INET6) { longueur_adresse = sizeof(adresse_ipv6); longueur_effective = recvfrom((*((struct_socket *) - (*s_objet_argument).objet)).socket, + (*s_objet_argument_1).objet)).socket, tampon_lecture, longueur_questure, MSG_PEEK | MSG_DONTWAIT, (struct sockaddr *) &adresse_ipv6, &longueur_adresse); @@ -1305,7 +1504,7 @@ instruction_read(struct_processus *s_eta else { free(tampon_lecture); - liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_argument_1); while(sem_wait(&((*s_etat_processus) .semaphore_fork)) == -1) @@ -1357,14 +1556,14 @@ instruction_read(struct_processus *s_eta */ free(tampon_lecture); - liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_argument_1); return; } if (longueur_effective == -1) { free(tampon_lecture); - liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_argument_1); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; @@ -1431,7 +1630,7 @@ instruction_read(struct_processus *s_eta { if (longueur_effective < longueur_questure) { - liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_argument_1); free(tampon_lecture); (*s_etat_processus).erreur_execution = @@ -1459,8 +1658,7 @@ instruction_read(struct_processus *s_eta (*s_etat_processus).instruction_courante = tampon; free(tampon_lecture); - liberation(s_etat_processus, s_objet_argument); - + liberation(s_etat_processus, s_objet_argument_1); return; } @@ -1529,26 +1727,26 @@ instruction_read(struct_processus *s_eta * Dans tous les autres cas, on renvoie une liste vide. */ - if (((*((struct_socket *) (*s_objet_argument).objet)).domaine + if (((*((struct_socket *) (*s_objet_argument_1).objet)).domaine == PF_UNIX) || (strcmp((*((struct_socket *) - (*s_objet_argument).objet)).type, "STREAM") == 0) || - (strcmp((*((struct_socket *) (*s_objet_argument).objet)) + (*s_objet_argument_1).objet)).type, "STREAM") == 0) || + (strcmp((*((struct_socket *) (*s_objet_argument_1).objet)) .type, "SEQUENTIAL DATAGRAM") == 0)) { longueur_adresse = 0; recvfrom((*((struct_socket *) - (*s_objet_argument).objet)).socket, tampon_lecture, + (*s_objet_argument_1).objet)).socket, tampon_lecture, position_finale, MSG_DONTWAIT, NULL, &longueur_adresse); (*s_objet_adresse).objet = NULL; } - else if ((*((struct_socket *) (*s_objet_argument).objet)) + else if ((*((struct_socket *) (*s_objet_argument_1).objet)) .domaine == PF_INET) { longueur_adresse = sizeof(adresse_ipv4); recvfrom((*((struct_socket *) - (*s_objet_argument).objet)).socket, tampon_lecture, + (*s_objet_argument_1).objet)).socket, tampon_lecture, position_finale, MSG_DONTWAIT, (struct sockaddr *) &adresse_ipv4, &longueur_adresse); @@ -1616,18 +1814,18 @@ instruction_read(struct_processus *s_eta } (*((integer8 *) (*(*(*((struct_liste_chainee *) - (*s_objet_adresse) .objet)).suivant).donnee).objet)) = + (*s_objet_adresse).objet)).suivant).donnee).objet)) = (integer8) ntohs(adresse_ipv4.sin_port); (*(*((struct_liste_chainee *) (*s_objet_adresse).objet)) .suivant).suivant = NULL; } - else if ((*((struct_socket *) (*s_objet_argument).objet)) + else if ((*((struct_socket *) (*s_objet_argument_1).objet)) .domaine == PF_INET6) { longueur_adresse = sizeof(adresse_ipv6); recvfrom((*((struct_socket *) - (*s_objet_argument).objet)).socket, tampon_lecture, + (*s_objet_argument_1).objet)).socket, tampon_lecture, position_finale, MSG_DONTWAIT, (struct sockaddr *) &adresse_ipv6, &longueur_adresse); @@ -1686,7 +1884,7 @@ instruction_read(struct_processus *s_eta } (*((integer8 *) (*(*(*((struct_liste_chainee *) - (*s_objet_adresse) .objet)).suivant).donnee).objet)) = + (*s_objet_adresse).objet)).suivant).donnee).objet)) = (integer8) ntohs(adresse_ipv6.sin6_port); (*(*((struct_liste_chainee *) (*s_objet_adresse).objet)) @@ -1696,7 +1894,7 @@ instruction_read(struct_processus *s_eta { longueur_adresse = 0; recvfrom((*((struct_socket *) - (*s_objet_argument).objet)).socket, tampon_lecture, + (*s_objet_argument_1).objet)).socket, tampon_lecture, position_finale, MSG_DONTWAIT, NULL, &longueur_adresse); } @@ -1720,7 +1918,7 @@ instruction_read(struct_processus *s_eta return; } - liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_argument_1); return; }