--- rpl/src/instructions_w1.c 2019/02/09 13:36:41 1.115 +++ rpl/src/instructions_w1.c 2023/11/24 09:12:57 1.128 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.31 - Copyright (C) 1989-2019 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.35 + Copyright (C) 1989-2023 Dr. BERTRAND Joël This file is part of RPL/2. @@ -1361,10 +1361,9 @@ instruction_write(struct_processus *s_et return; } - if (fwrite(chaine, sizeof(unsigned char), - (size_t) longueur_effective, - (*descripteur).descripteur_c) != - (size_t) longueur_effective) + if (write(fileno((*descripteur).descripteur_c), + chaine, (size_t) longueur_effective) != + (ssize_t) longueur_effective) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; @@ -1584,10 +1583,9 @@ instruction_write(struct_processus *s_et if ((format_degenere == d_vrai) || (longueur_effective < longueur)) { - if (fwrite(chaine, sizeof(unsigned char), - (size_t) longueur_effective, - (*descripteur).descripteur_c) != - (size_t) longueur_effective) + if (write(fileno((*descripteur).descripteur_c), + chaine, (size_t) longueur_effective) + != (ssize_t) longueur_effective) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; @@ -1596,10 +1594,9 @@ instruction_write(struct_processus *s_et } else { - if (fwrite(chaine, sizeof(unsigned char), - (size_t) longueur_effective, - (*descripteur).descripteur_c) != - (size_t) longueur) + if (write(fileno((*descripteur).descripteur_c), + chaine, (size_t) longueur_effective) + != (ssize_t) longueur) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; @@ -1611,8 +1608,8 @@ instruction_write(struct_processus *s_et if (format_oriente_ligne == d_vrai) { - if (fwrite("\n", 1, 1, (*descripteur).descripteur_c) - != 1) + if (write(fileno((*descripteur).descripteur_c), + "\n", 1) != 1) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; @@ -1732,32 +1729,32 @@ instruction_write(struct_processus *s_et (*s_objet_argument_1).objet)).type, "SEQUENTIAL DATAGRAM") == 0)) { // Sockets connectées - - action.sa_handler = SIG_IGN; - action.sa_flags = 0; - - if (sigaction(SIGPIPE, &action, ®istre) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_signal; - return; - } - # ifndef SEMAPHORES_NOMMES if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) # else if (sem_post((*s_etat_processus).semaphore_fork) != 0) # endif { - if (sigaction(SIGPIPE, ®istre, NULL) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_signal; - return; - } + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + if (pthread_mutex_lock(&mutex_sigaction) != 0) + { (*s_etat_processus).erreur_systeme = d_es_processus; return; } + action.sa_handler = SIG_IGN; + action.sa_flags = 0; + + if (sigaction(SIGPIPE, &action, ®istre) != 0) + { + pthread_mutex_unlock(&mutex_sigaction); + (*s_etat_processus).erreur_systeme = d_es_signal; + return; + } + if (send((*((struct_socket *) (*s_objet_argument_1).objet)) .socket, chaine, (size_t) longueur_effective, 0) < 0) { @@ -1765,10 +1762,17 @@ instruction_write(struct_processus *s_et if (sigaction(SIGPIPE, ®istre, NULL) != 0) { + pthread_mutex_unlock(&mutex_sigaction); (*s_etat_processus).erreur_systeme = d_es_signal; return; } + if (pthread_mutex_unlock(&mutex_sigaction) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + # ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) # else @@ -1793,6 +1797,41 @@ instruction_write(struct_processus *s_et return; } + if (sigaction(SIGPIPE, ®istre, NULL) != 0) + { + pthread_mutex_unlock(&mutex_sigaction); + +# ifndef SEMAPHORES_NOMMES + while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) +# else + while(sem_wait((*s_etat_processus).semaphore_fork) != 0) +# endif + { + if (errno != EINTR) + { + if (sigaction(SIGPIPE, ®istre, NULL) != 0) + { + pthread_mutex_unlock(&mutex_sigaction); + (*s_etat_processus).erreur_systeme = d_es_signal; + return; + } + + pthread_mutex_unlock(&mutex_sigaction); + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + } + + (*s_etat_processus).erreur_systeme = d_es_signal; + return; + } + + if (pthread_mutex_unlock(&mutex_sigaction) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + # ifndef SEMAPHORES_NOMMES while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) # else @@ -1811,12 +1850,6 @@ instruction_write(struct_processus *s_et return; } } - - if (sigaction(SIGPIPE, ®istre, NULL) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_signal; - return; - } } else { // Sockets non connectées @@ -2292,29 +2325,6 @@ instruction_wflock(struct_processus *s_e return; } -# ifndef SEMAPHORES_NOMMES - if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) -# else - if (sem_post((*s_etat_processus).semaphore_fork) != 0) -# endif - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } - -# ifndef SEMAPHORES_NOMMES - while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) -# else - while(sem_wait((*s_etat_processus).semaphore_fork) != 0) -# endif - { - if (errno != EINTR) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } - } - if (lock.l_type == F_UNLCK) { drapeau = d_vrai; @@ -2350,10 +2360,34 @@ instruction_wflock(struct_processus *s_e registre_instruction_valide; } - nanosleep(&attente, NULL); scrutation_injection(s_etat_processus); +# ifndef SEMAPHORES_NOMMES + if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) +# else + if (sem_post((*s_etat_processus).semaphore_fork) != 0) +# endif + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + + nanosleep(&attente, NULL); + INCR_GRANULARITE(attente.tv_nsec); + +# ifndef SEMAPHORES_NOMMES + while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) +# else + while(sem_wait((*s_etat_processus).semaphore_fork) != 0) +# endif + { + if (errno != EINTR) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + } } } while((drapeau == d_faux) && ((*s_etat_processus) .var_volatile_requete_arret != -1)); @@ -3068,12 +3102,10 @@ instruction_wfdata(struct_processus *s_e static inline logical1 options_sockets(struct_processus *s_etat_processus, struct_socket *s_socket) { - int drapeau; - if (((*s_socket).options & (1 << d_BROADCAST)) != 0) { - if (setsockopt((*s_socket).socket, SOL_SOCKET, SO_BROADCAST, &drapeau, - sizeof(drapeau)) != 0) + if (setsockopt((*s_socket).socket, SOL_SOCKET, SO_BROADCAST, NULL, 0) + != 0) { return(d_erreur); } @@ -3081,8 +3113,8 @@ options_sockets(struct_processus *s_etat if (((*s_socket).options & (1 << d_DONT_ROUTE)) != 0) { - if (setsockopt((*s_socket).socket, SOL_SOCKET, SO_DONTROUTE, &drapeau, - sizeof(drapeau)) != 0) + if (setsockopt((*s_socket).socket, SOL_SOCKET, SO_DONTROUTE, NULL, 0) + != 0) { return(d_erreur); } @@ -3090,8 +3122,8 @@ options_sockets(struct_processus *s_etat if (((*s_socket).options & (1 << d_KEEP_ALIVE)) != 0) { - if (setsockopt((*s_socket).socket, SOL_SOCKET, SO_KEEPALIVE, &drapeau, - sizeof(drapeau)) != 0) + if (setsockopt((*s_socket).socket, SOL_SOCKET, SO_KEEPALIVE, NULL, 0) + != 0) { return(d_erreur); } @@ -3248,7 +3280,7 @@ instruction_wfsock(struct_processus *s_e (*s_objet_argument).objet)).type, "SEQUENTIAL DATAGRAM") != 0)) { // Mode non connecté : l'attente se fait sur un poll() - +#define DEBUG_RETURN if ((s_objet_resultat = copie_objet(s_etat_processus, s_objet_argument, 'P')) == NULL) { @@ -3892,7 +3924,30 @@ instruction_wfswi(struct_processus *s_et } else { +# ifndef SEMAPHORES_NOMMES + if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) +# else + if (sem_post((*s_etat_processus).semaphore_fork) != 0) +# endif + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } nanosleep(&attente, NULL); + +# ifndef SEMAPHORES_NOMMES + while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) +# else + while(sem_wait((*s_etat_processus).semaphore_fork) != 0) +# endif + { + if (errno != EINTR) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + } + scrutation_injection(s_etat_processus); INCR_GRANULARITE(attente.tv_nsec); }