--- rpl/src/rpl.c 2010/08/18 12:56:55 1.41 +++ rpl/src/rpl.c 2010/12/10 16:08:28 1.54 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.0.18 + RPL/2 (R) version 4.0.20 Copyright (C) 1989-2010 Dr. BERTRAND Joël This file is part of RPL/2. @@ -23,7 +23,7 @@ #define MAIN_RPL #include "rpl-conv.h" -#ifdef SEMAPHORES_SYSV +#ifdef IPCS_SYSV #ifndef OS2 unsigned char *chemin_semaphores_SysV; #endif @@ -189,8 +189,6 @@ rplinit(int argc, char *argv[], unsigned (*s_etat_processus).rpl_home = rpl_home; - insertion_thread(s_etat_processus, d_vrai); - pthread_mutexattr_init(&attributs_mutex); pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_NORMAL); pthread_mutex_init(&((*s_etat_processus).mutex), &attributs_mutex); @@ -242,7 +240,7 @@ rplinit(int argc, char *argv[], unsigned (*s_etat_processus).chemin_fichiers_temporaires = recherche_chemin_fichiers_temporaires(s_etat_processus); -# ifdef SEMAPHORES_SYSV +# ifdef IPCS_SYSV # ifndef OS2 chemin_semaphores_SysV = (*s_etat_processus).chemin_fichiers_temporaires; # endif @@ -250,14 +248,38 @@ rplinit(int argc, char *argv[], unsigned # ifdef _BROKEN_SIGINFO creation_fifos_signaux(s_etat_processus); - # ifdef return # undef return # endif # define return destruction_fifos_signaux(s_etat_processus); return # endif + insertion_thread(s_etat_processus, d_vrai); + +# ifndef OS2 localisation_courante(s_etat_processus); +# else + if ((*s_etat_processus).erreur_systeme != d_es) + { + if (((*s_etat_processus).localisation = malloc((strlen(d_locale) + 1) * + sizeof(unsigned char))) == NULL) + { + if ((*s_etat_processus).langue == 'F') + { + uprintf("+++Système : Mémoire insuffisante\n"); + } + else + { + uprintf("+++System : Not enough memory\n"); + } + + return(EXIT_FAILURE); + } + + strcpy((*s_etat_processus).localisation, d_locale); + } +# endif + (*s_etat_processus).erreur_systeme = d_es; if ((*s_etat_processus).localisation == NULL) @@ -416,6 +438,23 @@ rplinit(int argc, char *argv[], unsigned return(EXIT_FAILURE); } + if (sigaction(SIGTERM, &action, NULL) != 0) + { + erreur = d_es_signal; + + if ((*s_etat_processus).langue == 'F') + { + printf("+++Système : Initialisation des signaux POSIX " + "impossible\n"); + } + else + { + printf("+++System : Initialization of POSIX signals failed\n"); + } + + return(EXIT_FAILURE); + } + # ifndef _BROKEN_SIGINFO action.sa_sigaction = interruption2; # else @@ -443,6 +482,7 @@ rplinit(int argc, char *argv[], unsigned # else action.sa_handler = interruption4; # endif + // SIGCONT ne doit pas pouvoir être appelé depuis son gestionnaire. action.sa_flags = SA_ONSTACK | SA_SIGINFO; if (sigaction(SIGSTART, &action, NULL) != 0) @@ -576,7 +616,7 @@ rplinit(int argc, char *argv[], unsigned # else action.sa_handler = interruption6; # endif - action.sa_flags = SA_ONSTACK | SA_SIGINFO; + action.sa_flags = SA_ONSTACK | SA_SIGINFO | SA_NODEFER; if (sigaction(SIGINJECT, &action, NULL) != 0) { @@ -600,7 +640,7 @@ rplinit(int argc, char *argv[], unsigned # else action.sa_handler = interruption9; # endif - action.sa_flags = SA_ONSTACK | SA_SIGINFO; + action.sa_flags = SA_ONSTACK | SA_SIGINFO | SA_NODEFER; if (sigaction(SIGABORT, &action, NULL) != 0) { @@ -1797,6 +1837,7 @@ rplinit(int argc, char *argv[], unsigned (*s_etat_processus).autorisation_empilement_programme = 'N'; (*s_etat_processus).requete_arret = 'N'; (*s_etat_processus).evaluation_forcee = 'N'; + (*s_etat_processus).recherche_type = 'N'; (*s_etat_processus).constante_symbolique = 'N'; (*s_etat_processus).traitement_symbolique = 'N'; @@ -1952,6 +1993,7 @@ rplinit(int argc, char *argv[], unsigned (*s_etat_processus).pid_processus_pere = getpid(); (*s_etat_processus).processus_detache = d_vrai; (*s_etat_processus).var_volatile_processus_pere = -1; + (*s_etat_processus).var_volatile_processus_racine = -1; (*s_etat_processus).var_volatile_traitement_retarde_stop = 0; (*s_etat_processus).var_volatile_alarme = 0; (*s_etat_processus).var_volatile_requete_arret = 0;