--- rpl/src/rpl.h 2010/08/09 13:51:48 1.53 +++ rpl/src/rpl.h 2010/08/26 19:07:42 1.64 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.0.18 + RPL/2 (R) version 4.0.19 Copyright (C) 1989-2010 Dr. BERTRAND Joël This file is part of RPL/2. @@ -31,6 +31,10 @@ # define _DARWIN_C_SOURCE #endif +#ifdef OpenBSD +# define _BSD_SOURCE +#endif + #ifdef OS2 # define _BSD_SOURCE # define _XOPEN_SOURCE 600 @@ -40,13 +44,10 @@ # define SHUT_RD SHUT_RD # define SHUT_WR SHUT_WR # define SHUT_RDWR SHUT_RDWR -# undef IPV6 # include "getaddrinfo-conv.h" # define sched_yield(arg) -#else -# define IPV6 #endif @@ -67,11 +68,11 @@ #ifndef RPLARGS # include +# include # include # include # include # include -# include # include # include # include @@ -92,20 +93,43 @@ # include +# ifdef _BROKEN_SIGINFO +# include +# include +# endif + # ifndef SEMAPHORES_SYSV # include # else +# include # include -# define SEM_FAILED NULL - typedef int sem_t; -# ifndef SEM_A -# define SEM_A 0200 -# endif -# ifndef SEM_R -# define SEM_R 0400 +# ifdef OS2 +# define INCL_DOSSEMAPHORES +# define INCL_DOSMEMMGR +# define INCL_DOSERRORS +# include + + typedef struct _OS2SEM + { + HMTX hmtx; + HEV hev; + ULONG shared; + ULONG *cnt; + ULONG *nopened; + ULONG allocated; + } sem_t; +# else + typedef struct + { + int sem; + unsigned char *path; + pid_t pid; + } sem_t; # endif +# define SEM_FAILED NULL + sem_t *sem_open_SysV(const char *nom, int oflag, ...); int sem_init_SysV(sem_t *sem, int shared, unsigned int value); int sem_close_SysV(sem_t *sem); @@ -169,6 +193,67 @@ #include "librplprototypes.h" +#ifndef RPLARGS +# ifndef UNIX_PATH_MAX + struct sockaddr_un sizecheck; +# define UNIX_PATH_MAX sizeof(sizecheck.sun_path) +# endif +#endif + +/* +================================================================================ + Bugs spécifiques +================================================================================ +*/ + +#ifdef _BROKEN_SIGINFO +# define SIGHANDLER_ARGS int signal +# ifdef SA_SIGINFO +# undef SA_SIGINFO +# endif +# define SA_SIGINFO 0 + +# ifndef __BROKEN_SIGINFO_ROUTINES__ + +// pthread_kill() est une macro sous OS/2. +# ifdef pthread_kill +# undef pthread_kill +# endif + +# define kill(a, b) kill_broken_siginfo(a, b) +# define pthread_kill(a, b) pthread_kill_broken_siginfo(a, b) +# endif + + int kill_broken_siginfo(pid_t pid, int signal); + int pthread_kill_broken_siginfo(pthread_t tid, int signal); + pid_t origine_signal(int signal); + int queue_in(pid_t pid, int signal); +#else +# define SIGHANDLER_ARGS int signal, siginfo_t *siginfo, void *context +#endif + +#ifdef OpenBSD +# ifdef PTHREAD_SCOPE_SYSTEM +# undef PTHREAD_SCOPE_SYSTEM +# endif +# define PTHREAD_SCOPE_SYSTEM 0 +#endif + +#ifdef OS2 +# define readline(s) readline_wrapper(s) + unsigned char readline_wrapper(unsigned char *s); +#endif + +#if ! defined(UNION_SEMUN) && defined(SEMAPHORES_SYSV) +union semun +{ + int val; + struct semid_ds *buf; + unsigned short *array; + struct seminfo *__buf; +}; +#endif + /* ================================================================================ @@ -196,9 +281,14 @@ */ #ifndef RPLARGS -# if defined(Darwin) -# define SIGPOLL SIGINFO -# endif + +// Signaux utilisés par défaut : +// SIGINT +// SIGTSTP +// SIGCONT +// SIGURG +// SIGPIPE +// SIGALRM // Arrêt par STOP # define SIGFSTOP SIGUSR1 @@ -207,9 +297,19 @@ // Injection de données # define SIGINJECT SIGQUIT // Arrêt général -# define SIGABORT SIGPROF +# ifndef OpenBSD +// La libpthread d'OpenBSD utilise SIGPROF +# define SIGABORT SIGPROF +# else +# define SIGABORT SIGTHR +# endif // Arrêt d'un processus fils depuis autre chose que STOP -# define SIGFABORT SIGPOLL +# if defined(Darwin) || defined(OpenBSD) +# define SIGFABORT SIGINFO +# else +# define SIGFABORT SIGPOLL +# endif + // Nombre d'interruptions disponibles # define d_NOMBRE_INTERRUPTIONS 64 #endif @@ -274,7 +374,12 @@ typedef unsigned char t_8_bits; # ifdef SEMAPHORES_NOMMES # define LONGUEUR_NOM_SEMAPHORE 64 # endif + # ifndef MAIN_RPL +# ifdef _BROKEN_SIGINFO + extern int *fifos_signaux; +# endif + extern jmp_buf contexte; extern jmp_buf contexte_initial; @@ -311,6 +416,10 @@ typedef unsigned char t_8_bits; extern sem_t *semaphores_nommes[4]; # endif # else +# ifdef _BROKEN_SIGINFO + int *fifos_signaux; +# endif + jmp_buf contexte; jmp_buf contexte_initial; @@ -637,13 +746,22 @@ pid_t debug_fork(); #ifdef DEBUG_ERREURS # ifdef MESSAGES # define __erreur(i) i +# define __erreur_(i) i # else +# undef _ERREURS_VARIABLES +# ifdef _ERREURS_VARIABLES +# define __erreur_(i) __erreur(i) +# else +# define __erreur_(i) i +# endif # define __erreur(i) ({ if (strstr(__FUNCTION__, "recherche_variable") \ - == NULL) fprintf(stderr, "ERROR %d AT %s() LINE %d\n", \ - i, __FUNCTION__, __LINE__); i; }) + == NULL) ufprintf(stderr, \ + "ERROR %d AT %s() FROM %s LINE %d\n", \ + i, __FUNCTION__, __FILE__, __LINE__); i; }) # endif #else # define __erreur(i) i +# define __erreur_(i) i #endif @@ -651,7 +769,7 @@ pid_t debug_fork(); #ifndef RPLARGS # define d_es 2000 # define d_es_allocation_memoire __erreur(2001) -# define d_es_variable_introuvable __erreur(2002) +# define d_es_variable_introuvable __erreur_(2002) # define d_es_pile_vide __erreur(2003) # define d_es_end_incoherent __erreur(2004) # define d_es_peripherique_stdin __erreur(2005) @@ -664,6 +782,7 @@ pid_t debug_fork(); # define d_es_interruption_invalide __erreur(2012) # define d_es_contexte __erreur(2013) # define d_es_somme_controle __erreur(2014) +# define d_es_semaphore __erreur(2015) #endif /* @@ -729,7 +848,7 @@ pid_t debug_fork(); # define d_ex_absence_graphique_courant __erreur(9) # define d_ex_erreur_traitement_condition __erreur(10) # define d_ex_erreur_traitement_boucle __erreur(11) -# define d_ex_variable_non_definie __erreur(12) +# define d_ex_variable_non_definie __erreur_(12) # define d_ex_drapeau_inexistant __erreur(13) # define d_ex_nom_invalide __erreur(14) # define d_ex_element_inexistant __erreur(15) @@ -815,6 +934,42 @@ pid_t debug_fork(); -------------------------------------------------------------------------------- */ +#ifdef MIN +# undef MIN +#endif + +#ifdef MAX +# undef MAX +#endif + +#define ADR __RPL_ADR +#define ALG __RPL_ALG +#define BIN __RPL_BIN +#define CHN __RPL_CHN +#define CPL __RPL_CPL +#define FCH __RPL_FCH +#define FCT __RPL_FCT +#define INT __RPL_INT +#define LST __RPL_LST +#define MCX __RPL_MCX +#define MIN __RPL_MIN +#define MRL __RPL_MRL +#define MTX __RPL_MTX +#define NOM __RPL_NOM +#define NON __RPL_NON +#define PRC __RPL_PRC +#define REL __RPL_REL +#define RPN __RPL_RPN +#define SCK __RPL_SCK +#define SLB __RPL_SLB +#define SPH __RPL_SPH +#define SQL __RPL_SQL +#define TBL __RPL_TBL +#define VCX __RPL_VCX +#define VIN __RPL_VIN +#define VRL __RPL_VRL + + enum t_type { ADR = 0, ALG, BIN, CHN, CPL, FCH, FCT, INT, LST, MCX, MIN, MRL, MTX, NOM, NON, PRC, REL, RPN, SCK, SLB, SPH, SQL, TBL, VCX, VIN, VRL }; @@ -1600,7 +1755,14 @@ typedef struct processus pthread_t thread_surveille_par_fusible; # if !defined(Cygwin) +# if !(OpenBSD) stack_t pile_signal; +# else +# ifdef SA_ONSTACK +# undef SA_ONSTACK +# endif +# define SA_ONSTACK 0 +# endif # else # define SA_ONSTACK 0 # define RTLD_LOCAL 0 @@ -2645,17 +2807,17 @@ void insertion_thread_surveillance(struc void integrale_romberg(struct_processus *s_etat_processus, struct_objet *s_expression, unsigned char *variable, real8 a, real8 b, real8 precision); -void interruption1(int signal, siginfo_t *siginfo, void *context); -void interruption2(int signal, siginfo_t *siginfo, void *context); -void interruption3(int signal, siginfo_t *siginfo, void *context); -void interruption4(int signal, siginfo_t *siginfo, void *context); -void interruption5(int signal, siginfo_t *siginfo, void *context); -void interruption6(int signal, siginfo_t *siginfo, void *context); -void interruption7(int signal, siginfo_t *siginfo, void *context); -void interruption8(int signal, siginfo_t *siginfo, void *context); -void interruption9(int signal, siginfo_t *siginfo, void *context); -void interruption10(int signal, siginfo_t *siginfo, void *context); -void interruption11(int signal, siginfo_t *siginfo, void *context); +void interruption1(SIGHANDLER_ARGS); +void interruption2(SIGHANDLER_ARGS); +void interruption3(SIGHANDLER_ARGS); +void interruption4(SIGHANDLER_ARGS); +void interruption5(SIGHANDLER_ARGS); +void interruption6(SIGHANDLER_ARGS); +void interruption7(SIGHANDLER_ARGS); +void interruption8(SIGHANDLER_ARGS); +void interruption9(SIGHANDLER_ARGS); +void interruption10(SIGHANDLER_ARGS); +void interruption11(SIGHANDLER_ARGS); void inversion_matrice(struct_processus *s_etat_processus, struct_matrice *s_matrice); void lancement_daemon(struct_processus *s_etat_processus); @@ -2714,6 +2876,14 @@ void valeurs_singulieres(struct_processu void verrouillage_threads_concurrents(struct_processus *s_etat_processus); #endif +#ifndef RPLARGS +#ifdef _BROKEN_SIGINFO +void creation_fifos_signaux(struct_processus *s_etat_processus); +void destruction_fifos_signaux(struct_processus *s_etat_processus); +void liberation_fifos_signaux(struct_processus *s_etat_processus); +#endif +#endif + /* -------------------------------------------------------------------------------- Fonctions de sommation de vecteur dans perte de précision