--- rpl/src/instructions_c4.c 2010/01/27 22:22:12 1.2 +++ rpl/src/instructions_c4.c 2010/03/05 11:20:08 1.6 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.0.10 + RPL/2 (R) version 4.0.12 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; @@ -543,21 +544,89 @@ instruction_convert(struct_processus *s_ (((*s_objet_argument_3).type == INT) || ((*s_objet_argument_3).type == REL))) { - longueur_chaine = strlen(ds_rplconvert_commande) - 9 - + strlen((unsigned char *) (*s_objet_argument_1).objet) - + strlen((unsigned char *) (*s_objet_argument_2).objet) - + (2 * strlen(d_exec_path)); - - if ((commande = malloc((longueur_chaine + 1) * sizeof(unsigned char))) - == NULL) + if ((*s_etat_processus).rpl_home == NULL) { - (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; - return; + longueur_chaine = strlen(ds_rplconvert_commande) - 9 + + strlen((unsigned char *) (*s_objet_argument_1).objet) + + strlen((unsigned char *) (*s_objet_argument_2).objet) + + (2 * strlen(d_exec_path)); + + if ((commande = malloc((longueur_chaine + 1) * + sizeof(unsigned char))) == NULL) + { + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return; + } + + 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 + { + longueur_chaine = strlen(ds_rplconvert_commande) - 9 + + strlen((unsigned char *) (*s_objet_argument_1).objet) + + strlen((unsigned char *) (*s_objet_argument_2).objet) + + (2 * strlen((*s_etat_processus).rpl_home)); - 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 ((commande = malloc((longueur_chaine + 1) * + sizeof(unsigned char))) == NULL) + { + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return; + } + + sprintf(commande, ds_rplconvert_commande, + (*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) {