--- rpl/src/instructions_c4.c 2010/03/04 17:42:46 1.5 +++ rpl/src/instructions_c4.c 2010/03/09 10:18:45 1.8 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.0.12 + RPL/2 (R) version 4.0.13 Copyright (C) 1989-2010 Dr. BERTRAND Joël This file is part of RPL/2. @@ -472,6 +472,7 @@ instruction_convert(struct_processus *s_ struct_objet *s_objet_argument_3; unsigned char *commande; + unsigned char *executable_candidat; unsigned char ligne[1024 + 1]; unsigned char *tampon_instruction; @@ -560,6 +561,29 @@ instruction_convert(struct_processus *s_ sprintf(commande, ds_rplconvert_commande, d_exec_path, d_exec_path, (unsigned char *) (*s_objet_argument_2).objet, (unsigned char *) (*s_objet_argument_1).objet); + + if (alsprintf(&executable_candidat, "%s/bin/rplconvert", + d_exec_path) < 0) + { + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return; + } + + if (controle(s_etat_processus, executable_candidat, "md5", + rplconvert_md5) != d_vrai) + { + (*s_etat_processus).erreur_systeme = d_es_somme_controle; + return; + } + + if (controle(s_etat_processus, executable_candidat, "sha1", + rplconvert_sha1) != d_vrai) + { + (*s_etat_processus).erreur_systeme = d_es_somme_controle; + return; + } + + free(executable_candidat); } else { @@ -579,6 +603,29 @@ instruction_convert(struct_processus *s_ (*s_etat_processus).rpl_home, (*s_etat_processus).rpl_home, (unsigned char *) (*s_objet_argument_2).objet, (unsigned char *) (*s_objet_argument_1).objet); + + if (alsprintf(&executable_candidat, "%s/bin/rplconvert", + (*s_etat_processus).rpl_home) < 0) + { + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return; + } + + if (controle(s_etat_processus, executable_candidat, "md5", + rplconvert_md5) != d_vrai) + { + (*s_etat_processus).erreur_systeme = d_es_somme_controle; + return; + } + + if (controle(s_etat_processus, executable_candidat, "sha1", + rplconvert_sha1) != d_vrai) + { + (*s_etat_processus).erreur_systeme = d_es_somme_controle; + return; + } + + free(executable_candidat); } if ((pipe = popen(commande, "r")) == NULL) @@ -706,12 +753,16 @@ instruction_convert(struct_processus *s_ void instruction_close(struct_processus *s_etat_processus) { - file *descripteur; + const char *queue; int socket; logical1 socket_connectee; + sqlite3_stmt *ppStmt; + + struct_descripteur_fichier *descripteur; + struct_liste_chainee *l_element_courant; struct_liste_chainee *l_element_precedent; @@ -789,8 +840,8 @@ instruction_close(struct_processus *s_et (*((struct_descripteur_fichier *) (*l_element_courant) .donnee)).tid) != 0)) { - descripteur = (*((struct_descripteur_fichier *) - (*l_element_courant).donnee)).descripteur; + descripteur = (struct_descripteur_fichier *) + (*l_element_courant).donnee; if (l_element_precedent == NULL) { @@ -809,7 +860,6 @@ instruction_close(struct_processus *s_et free((*((struct_descripteur_fichier *) (*l_element_courant).donnee)).nom); - free((*l_element_courant).donnee); free(l_element_courant); break; @@ -832,14 +882,57 @@ instruction_close(struct_processus *s_et * Fermeture du fichier */ - if (fclose(descripteur) != 0) + if (fclose((*descripteur).descripteur_c) != 0) { + free(descripteur); liberation(s_etat_processus, s_objet_argument); (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } + if ((*descripteur).type != 'C') + { + if (sqlite3_prepare_v2((*descripteur).descripteur_sqlite, + "vacuum", 7, &ppStmt, &queue) != SQLITE_OK) + { + free(descripteur); + liberation(s_etat_processus, s_objet_argument); + + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return; + } + + if (sqlite3_step(ppStmt) != SQLITE_DONE) + { + free(descripteur); + liberation(s_etat_processus, s_objet_argument); + + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return; + } + + if (sqlite3_finalize(ppStmt) != SQLITE_OK) + { + free(descripteur); + liberation(s_etat_processus, s_objet_argument); + + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return; + } + + if (sqlite3_close((*descripteur).descripteur_sqlite) != SQLITE_OK) + { + free(descripteur); + liberation(s_etat_processus, s_objet_argument); + + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return; + } + + free(descripteur); + } + if ((*((struct_fichier *) (*s_objet_argument).objet)).ouverture == 'S') { if (destruction_fichier((*((struct_fichier *) @@ -976,6 +1069,8 @@ instruction_create(struct_processus *s_e struct_objet *s_objet_argument; + unsigned char *nom; + unsigned long unite; (*s_etat_processus).erreur_execution = d_ex; @@ -1020,28 +1115,38 @@ instruction_create(struct_processus *s_e if ((*s_objet_argument).type == CHN) { - erreur = caracteristiques_fichier(s_etat_processus, (unsigned char *) - (*s_objet_argument).objet, &existence, &ouverture, &unite); + if ((nom = transliteration(s_etat_processus, (unsigned char *) + (*s_objet_argument).objet, d_locale, "UTF-8")) == NULL) + { + liberation(s_etat_processus, s_objet_argument); + return; + } + + erreur = caracteristiques_fichier(s_etat_processus, nom, + &existence, &ouverture, &unite); if ((erreur != d_absence_erreur) || (existence == d_vrai)) { liberation(s_etat_processus, s_objet_argument); + free(nom); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } - if ((fichier = fopen((unsigned char *) (*s_objet_argument).objet, "w")) - == NULL) + if ((fichier = fopen(nom, "w")) == NULL) { liberation(s_etat_processus, s_objet_argument); + free(nom); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } + free(nom); + if (fclose(fichier) != 0) { liberation(s_etat_processus, s_objet_argument);