--- rpl/src/rpl.h 2012/10/14 21:37:11 1.184 +++ rpl/src/rpl.h 2013/03/01 09:29:30 1.201 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.11 - Copyright (C) 1989-2012 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.13 + Copyright (C) 1989-2013 Dr. BERTRAND Joël This file is part of RPL/2. @@ -165,6 +165,40 @@ # include "iconv.h" # include "openssl/evp.h" +# ifndef OPENSSL_NO_MD2 +# include "openssl/md2.h" +# endif +# ifndef OPENSSL_NO_MD4 +# include "openssl/md4.h" +# endif +# ifndef OPENSSL_NO_MD5 +# include "openssl/md5.h" +# endif +# ifndef OPENSSL_NO_MDC2 +# include "openssl/mdc2.h" +# endif +# ifndef OPENSSL_NO_RIPEMD +# include "openssl/ripemd.h" +# endif +# ifndef OPENSSL_NO_SHA +# include "openssl/sha.h" +# endif +# ifndef OPENSSL_NO_WHIRLPOOL +# include "openssl/whrlpool.h" +# endif +# ifndef OPENSSL_NO_AES +# include "openssl/aes.h" +# endif +# ifndef OPENSSL_NO_CAMELLIA +# include "openssl/camellia.h" +# endif +# ifndef OPENSSL_NO_RC2 +# include "openssl/rc2.h" +# endif +# ifndef OPENSSL_NO_IDEA +# include "openssl/idea.h" +# endif + # include "sqlite3.h" # include "sigsegv.h" # ifdef OS2 @@ -445,7 +479,10 @@ union semun __STATIC_MUTEX_INITIALIZATION__; __EXTERN__ pthread_mutex_t mutex_gestionnaires_signaux_atomique __STATIC_MUTEX_INITIALIZATION__; + __EXTERN__ pthread_mutex_t mutex_creation_variable_partagee + __STATIC_MUTEX_INITIALIZATION__; __EXTERN__ pthread_mutex_t mutex_sections_critiques; + __EXTERN__ pthread_mutex_t mutex_liste_variables_partagees; __EXTERN__ sem_t __PTR__ semaphore_gestionnaires_signaux; @@ -926,6 +963,10 @@ pid_t debug_fork(); # define d_ex_mutex_acquis_autre_thread __erreur(86) # define d_ex_expression_reguliere __erreur(87) # define d_ex_instruction_indisponible __erreur(88) +# define d_ex_chiffrement __erreur(89) +# define d_ex_chiffrement_indisponible __erreur(90) +# define d_ex_longueur_clef_chiffrement __erreur(91) +# define d_ex_taille_message __erreur(92) #endif @@ -1224,6 +1265,7 @@ typedef struct connecteur_sql # ifdef POSTGRESQL_SUPPORT PGconn *postgresql; # endif + sqlite3 *sqlite; } descripteur; } struct_connecteur_sql; #endif @@ -1237,6 +1279,10 @@ typedef struct connecteur_sql "POSTGRESQL") == 0) \ postgresqlclose((*((struct_connecteur_sql *) (*s_objet).objet)) \ .descripteur); \ + else if (strcmp((*((struct_connecteur_sql *) (*s_objet).objet)).type, \ + "SQLITE") == 0) \ + sqlite3_close((*((struct_connecteur_sql *) (*s_objet).objet)) \ + .descripteur.sqlite); \ else \ BUG(1, uprintf("SQL type '%s' not allowed!", \ (*((struct_connecteur_sql *) (*s_objet).objet)).type)); @@ -1553,19 +1599,9 @@ typedef struct variable_partage union_position_variable variable_partagee; struct_objet *objet; -} struct_variable_partagee; - -typedef struct table_variables_partagees -{ - pthread_mutex_t mutex; - - volatile struct_variable_partagee *table; - volatile unsigned long nombre_variables; - volatile unsigned long nombre_variables_allouees; - - unsigned long position_variable; -} struct_table_variables_partagees; + pthread_mutex_t mutex; +} struct_variable_partagee; #endif @@ -1750,6 +1786,32 @@ typedef struct arbre_variables struct liste_variables_statiques *feuille_statique; } struct_arbre_variables; +typedef struct arbre_variables_partagees +{ + unsigned int noeuds_utilises; + // Nombre de noeuds utilisés dans le + // tableau **noeuds + signed int indice_tableau_pere; + // Position de la structure dans le + // tableau **noeuds du père + + struct arbre_variables_partagees *noeud_pere; + struct arbre_variables_partagees **noeuds; + + struct liste_variables_partagees *feuille; + + pthread_mutex_t mutex_feuille; +} struct_arbre_variables_partagees; + +#define INITIALISATION_MUTEX(mutex) \ + do { \ + pthread_mutexattr_t attributs_mutex; \ + pthread_mutexattr_init(&attributs_mutex); \ + pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_NORMAL); \ + pthread_mutex_init(&(mutex), &attributs_mutex); \ + pthread_mutexattr_destroy(&attributs_mutex); \ + } while(0) + typedef struct tableau_variables { unsigned char origine; @@ -1793,6 +1855,17 @@ typedef struct liste_variables_statiques struct_arbre_variables *feuille; struct_variable_statique *variable; } struct_liste_variables_statiques; + +typedef struct liste_variables_partagees +{ + struct liste_variables_partagees *suivant; + struct liste_variables_partagees *precedent; + struct liste_variables_partagees *reference; + struct_arbre_variables_partagees *feuille; + struct_variable_partagee *variable; + pthread_t tid; + pid_t pid; +} struct_liste_variables_partagees; #endif /* @@ -1912,14 +1985,18 @@ typedef struct processus struct_liste_variables *l_liste_variables_par_niveau; struct_liste_variables_statiques *l_liste_variables_statiques; - struct_table_variables_partagees - *s_liste_variables_partagees; + + struct_arbre_variables_partagees + **s_arbre_variables_partagees; + struct_liste_variables_partagees + **l_liste_variables_partagees; logical1 niveau_supprime; struct_variable *pointeur_variable_courante; struct_liste_variables *pointeur_feuille_courante; struct_variable_statique *pointeur_variable_statique_courante; + struct_variable_partagee *pointeur_variable_partagee_courante; int *pointeurs_caracteres_variables; int nombre_caracteres_variables; @@ -2294,6 +2371,10 @@ typedef struct processus struct_arbre_variables *variables_noeud[TAILLE_CACHE]; int pointeur_variables_noeud; + struct_arbre_variables_partagees + *variables_partagees_noeud[TAILLE_CACHE]; + int pointeur_variables_partagees_noeud; + struct_liste_variables *variables_feuille[TAILLE_CACHE]; int pointeur_variables_feuille; @@ -2302,6 +2383,11 @@ typedef struct processus struct_arbre_variables **variables_tableau_noeuds[TAILLE_CACHE]; int pointeur_variables_tableau_noeuds; + + struct_arbre_variables_partagees + **variables_tableau_noeuds_partages + [TAILLE_CACHE]; + int pointeur_variables_tableau_noeuds_partages; } struct_processus; #endif @@ -2376,6 +2462,7 @@ void instruction_ceil(struct_processus * void instruction_centr(struct_processus *s_etat_processus); void instruction_cf(struct_processus *s_etat_processus); void instruction_chr(struct_processus *s_etat_processus); +void instruction_cipher(struct_processus *s_etat_processus); void instruction_clear(struct_processus *s_etat_processus); void instruction_cllcd(struct_processus *s_etat_processus); void instruction_clmf(struct_processus *s_etat_processus); @@ -2436,6 +2523,7 @@ void instruction_detach(struct_processus void instruction_dft(struct_processus *s_etat_processus); void instruction_dgtiz(struct_processus *s_etat_processus); void instruction_diag_fleche(struct_processus *s_etat_processus); +void instruction_digest(struct_processus *s_etat_processus); void instruction_disp(struct_processus *s_etat_processus); void instruction_division(struct_processus *s_etat_processus); void instruction_do(struct_processus *s_etat_processus); @@ -2981,8 +3069,12 @@ void liberation_arbre_instructions(struc struct_instruction *arbre); void liberation_arbre_variables(struct_processus *s_etat_processus, struct_arbre_variables *arbre, logical1 definitions); +void liberation_arbre_variables_partagees(struct_processus *s_etat_processus, + struct_arbre_variables_partagees *arbre); void liberation_contexte_cas(struct_processus *s_etat_processus); void liberation_generateur_aleatoire(struct_processus *s_etat_processus); +void liberation_mutexes_arbre_variables_partagees(struct_processus + *s_etat_processus, struct_arbre_variables_partagees *l_element_courant); void liberation_threads(struct_processus *s_etat_processus); void liberation_profil(struct_processus *s_etat_processus); void localisation_courante(struct_processus *s_etat_processus); @@ -3127,8 +3219,11 @@ unsigned char *analyse_algebrique(struct unsigned char *chaine_algebrique, struct_liste_chainee **l_base_liste); unsigned char *analyse_flux(struct_processus *s_etat_processus, unsigned char *flux, long longueur); -unsigned char *recherche_chemin_fichiers_temporaires(struct_processus - *s_etat_processus); +unsigned char *chiffrement(const EVP_CIPHER *type_chiffrement, + logical1 encodage, unsigned char *message, unsigned int + longueur_message, unsigned char *clef, unsigned int longueur_clef, + unsigned char *vecteur_initialisation, + unsigned int *longueur_message_chiffre); unsigned char *compactage(unsigned char *chaine); unsigned char *conversion_majuscule(unsigned char *chaine); unsigned char *creation_nom_fichier(struct_processus *s_etat_processus, @@ -3161,6 +3256,8 @@ unsigned char *messages(struct_processus unsigned char *pointeur_ieme_caractere(struct_processus *s_etat_processus, unsigned char *chaine, integer8 position); unsigned char *purification_chaine(unsigned char *chaine); +unsigned char *recherche_chemin_fichiers_temporaires(struct_processus + *s_etat_processus); unsigned char *reencodage(struct_processus *s_etat_processus, unsigned char *chaine_entree, unsigned char *codage_entree, unsigned char *codage_sortie); @@ -3215,10 +3312,12 @@ logical1 retrait_variable(struct_process logical1 retrait_variables_par_niveau(struct_processus *s_etat_processus); logical1 retrait_variable_partagee(struct_processus *s_etat_processus, unsigned char *nom_variable, union_position_variable position); -logical1 retrait_variables_statiques_locales( +logical1 retrait_variables_partagees_locales( struct_processus *s_etat_processus); logical1 retrait_variable_statique(struct_processus *s_etat_processus, unsigned char *nom_variable, union_position_variable position); +logical1 retrait_variables_statiques_locales( + struct_processus *s_etat_processus); logical1 sequenceur(struct_processus *s_etat_processus); logical1 sequenceur_optimise(struct_processus *s_etat_processus); #endif @@ -3241,9 +3340,6 @@ logical1 recherche_variable(struct_proce unsigned char *nom_variable); logical1 recherche_variable_globale(struct_processus *s_etat_processus, unsigned char *nom_variable); -logical1 recherche_variable_partagee(struct_processus *s_etat_processus, - unsigned char *nom_variable, union_position_variable position, - unsigned char origine); logical1 test_cfsf(struct_processus *s_etat_processus, unsigned char indice_drapeau); logical1 test_expression_rpn(unsigned char *chaine); @@ -3274,10 +3370,8 @@ int alsprintf(unsigned char **strp, cons int interruption_violation_access(void *adresse_fautive, int gravite); #ifndef RPLARGS int liste_variables(struct_processus *s_etat_processus, - struct_tableau_variables *tableau, int position, - struct_arbre_variables *l_element_courant); -int nombre_variables(struct_processus *s_etat_processus, - struct_arbre_variables *l_element_courant); + struct_tableau_variables *tableau); +int nombre_variables(struct_processus *s_etat_processus); int readline_analyse_syntaxique(int count, int key); int readline_effacement(int count, int key); #endif @@ -3382,13 +3476,16 @@ struct_arbre_variables **allocation_tabl /* -------------------------------------------------------------------------------- Fonctions renvoyant un pointeur sur une *struct_liste_variables_statiques + ou *struct_liste_variables_partagees -------------------------------------------------------------------------------- */ struct_liste_variables_statiques *recherche_variable_statique(struct_processus *s_etat_processus, unsigned char *nom_variable, - union_position_variable position, - unsigned char origine); + union_position_variable position, unsigned char origine); +struct_liste_variables_partagees *recherche_variable_partagee(struct_processus + *s_etat_processus, unsigned char *nom_variable, + union_position_variable position, unsigned char origine); #endif /*