--- rpl/src/rpl.h 2010/08/17 14:15:20 1.58 +++ rpl/src/rpl.h 2010/08/30 14:14:07 1.65 @@ -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. @@ -101,6 +101,9 @@ # ifndef SEMAPHORES_SYSV # include # else +# include +# include + # ifdef OS2 # define INCL_DOSSEMAPHORES # define INCL_DOSMEMMGR @@ -117,9 +120,12 @@ ULONG allocated; } sem_t; # else -# include -# include - typedef int sem_t; + typedef struct + { + int sem; + unsigned char *path; + pid_t pid; + } sem_t; # endif # define SEM_FAILED NULL @@ -187,11 +193,19 @@ #include "librplprototypes.h" -#ifndef UNIX_PATH_MAX - struct sockaddr_un sizecheck; -# define UNIX_PATH_MAX sizeof(sizecheck.sun_path) +#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 @@ -199,26 +213,47 @@ # endif # define SA_SIGINFO 0 -# define kill(pid, signal) rpl_kill(pid, signal) -# define pthread_kill(tid, signal) rpl_pthread_kill(tid, signal) - int rpl_kill(pid_t pid, int signal); - int rpl_pthread_kill(pthread_t tid, int signal); +# 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 -#define ftok(path, proj) \ - ({ \ - key_t key; \ - struct stat s; \ - while(stat(path, &s) != 0); \ - errno = 0; \ - key = ftok(path, proj); \ - if (key != -1) \ - key |= ((((key_t) s.st_dev) & 0xFF) << 8) | \ - ((((key_t) s.st_ino) & 0xFFFF) << 16); \ - key; \ - }) +#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 + /* ================================================================================ @@ -711,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) ufprintf(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 @@ -725,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) @@ -738,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 /* @@ -803,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) @@ -1994,6 +2039,7 @@ typedef struct processus volatile sig_atomic_t var_volatile_traitement_retarde_stop; volatile sig_atomic_t var_volatile_traitement_sigint; + volatile sig_atomic_t var_volatile_processus_racine; volatile sig_atomic_t var_volatile_processus_pere; volatile sig_atomic_t var_volatile_recursivite;