Diff for /rpl/src/instructions_w1.c between versions 1.112 and 1.130

version 1.112, 2018/12/24 15:56:32 version 1.130, 2024/01/17 16:57:17
Line 1 Line 1
 /*  /*
 ================================================================================  ================================================================================
   RPL/2 (R) version 4.1.30    RPL/2 (R) version 4.1.36
   Copyright (C) 1989-2018 Dr. BERTRAND Joël    Copyright (C) 1989-2024 Dr. BERTRAND Joël
   
   This file is part of RPL/2.    This file is part of RPL/2.
   
Line 1361  instruction_write(struct_processus *s_et Line 1361  instruction_write(struct_processus *s_et
                     return;                      return;
                 }                  }
   
                 if (fwrite(chaine, sizeof(unsigned char),                  if (write(fileno((*descripteur).descripteur_c),
                         (size_t) longueur_effective,                          chaine, (size_t) longueur_effective) !=
                         (*descripteur).descripteur_c) !=                          (ssize_t) longueur_effective)
                         (size_t) longueur_effective)  
                 {                  {
                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;                      (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                     return;                      return;
Line 1584  instruction_write(struct_processus *s_et Line 1583  instruction_write(struct_processus *s_et
                     if ((format_degenere == d_vrai) ||                      if ((format_degenere == d_vrai) ||
                             (longueur_effective < longueur))                              (longueur_effective < longueur))
                     {                      {
                         if (fwrite(chaine, sizeof(unsigned char),                          if (write(fileno((*descripteur).descripteur_c),
                                 (size_t) longueur_effective,                                  chaine, (size_t) longueur_effective)
                                 (*descripteur).descripteur_c) !=                                  != (ssize_t) longueur_effective)
                                 (size_t) longueur_effective)  
                         {                          {
                             (*s_etat_processus).erreur_systeme =                              (*s_etat_processus).erreur_systeme =
                                     d_es_erreur_fichier;                                      d_es_erreur_fichier;
Line 1596  instruction_write(struct_processus *s_et Line 1594  instruction_write(struct_processus *s_et
                     }                      }
                     else                      else
                     {                      {
                         if (fwrite(chaine, sizeof(unsigned char),                          if (write(fileno((*descripteur).descripteur_c),
                                 (size_t) longueur_effective,                                  chaine, (size_t) longueur_effective)
                                 (*descripteur).descripteur_c) !=                                  != (ssize_t) longueur)
                                 (size_t) longueur)  
                         {                          {
                             (*s_etat_processus).erreur_systeme =                              (*s_etat_processus).erreur_systeme =
                                     d_es_erreur_fichier;                                      d_es_erreur_fichier;
Line 1611  instruction_write(struct_processus *s_et Line 1608  instruction_write(struct_processus *s_et
   
                     if (format_oriente_ligne == d_vrai)                      if (format_oriente_ligne == d_vrai)
                     {                      {
                         if (fwrite("\n", 1, 1, (*descripteur).descripteur_c)                          if (write(fileno((*descripteur).descripteur_c),
                                 != 1)                                  "\n", 1) != 1)
                         {                          {
                             (*s_etat_processus).erreur_systeme =                              (*s_etat_processus).erreur_systeme =
                                     d_es_erreur_fichier;                                      d_es_erreur_fichier;
Line 1732  instruction_write(struct_processus *s_et Line 1729  instruction_write(struct_processus *s_et
                 (*s_objet_argument_1).objet)).type,                  (*s_objet_argument_1).objet)).type,
                 "SEQUENTIAL DATAGRAM") == 0))                  "SEQUENTIAL DATAGRAM") == 0))
         { // Sockets connectées          { // Sockets connectées
   
             action.sa_handler = SIG_IGN;  
             action.sa_flags = SA_ONSTACK;  
   
             if (sigaction(SIGPIPE, &action, &registre) != 0)  
             {  
                 (*s_etat_processus).erreur_systeme = d_es_signal;  
                 return;  
             }  
   
 #           ifndef SEMAPHORES_NOMMES  #           ifndef SEMAPHORES_NOMMES
                 if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)                  if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
 #           else  #           else
                 if (sem_post((*s_etat_processus).semaphore_fork) != 0)                  if (sem_post((*s_etat_processus).semaphore_fork) != 0)
 #           endif  #           endif
             {              {
                 if (sigaction(SIGPIPE, &registre, NULL) != 0)                  (*s_etat_processus).erreur_systeme = d_es_processus;
                 {                  return;
                     (*s_etat_processus).erreur_systeme = d_es_signal;              }
                     return;  
                 }  
   
               if (pthread_mutex_lock(&mutex_sigaction) != 0)
               {
                 (*s_etat_processus).erreur_systeme = d_es_processus;                  (*s_etat_processus).erreur_systeme = d_es_processus;
                 return;                  return;
             }              }
   
               action.sa_handler = SIG_IGN;
               action.sa_flags = 0;
   
               if (sigaction(SIGPIPE, &action, &registre) != 0)
               {
                   pthread_mutex_unlock(&mutex_sigaction);
                   (*s_etat_processus).erreur_systeme = d_es_signal;
                   return;
               }
   
             if (send((*((struct_socket *) (*s_objet_argument_1).objet))              if (send((*((struct_socket *) (*s_objet_argument_1).objet))
                     .socket, chaine, (size_t) longueur_effective, 0) < 0)                      .socket, chaine, (size_t) longueur_effective, 0) < 0)
             {              {
Line 1765  instruction_write(struct_processus *s_et Line 1762  instruction_write(struct_processus *s_et
   
                 if (sigaction(SIGPIPE, &registre, NULL) != 0)                  if (sigaction(SIGPIPE, &registre, NULL) != 0)
                 {                  {
                       pthread_mutex_unlock(&mutex_sigaction);
                     (*s_etat_processus).erreur_systeme = d_es_signal;                      (*s_etat_processus).erreur_systeme = d_es_signal;
                     return;                      return;
                 }                  }
   
                   if (pthread_mutex_unlock(&mutex_sigaction) != 0)
                   {
                       (*s_etat_processus).erreur_systeme = d_es_processus;
                       return;
                   }
   
 #               ifndef SEMAPHORES_NOMMES  #               ifndef SEMAPHORES_NOMMES
                     while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)                      while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
 #               else  #               else
Line 1793  instruction_write(struct_processus *s_et Line 1797  instruction_write(struct_processus *s_et
                 return;                  return;
             }              }
   
               if (sigaction(SIGPIPE, &registre, 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, &registre, 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  #           ifndef SEMAPHORES_NOMMES
                 while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)                  while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
 #           else  #           else
Line 1811  instruction_write(struct_processus *s_et Line 1850  instruction_write(struct_processus *s_et
                     return;                      return;
                 }                  }
             }              }
   
             if (sigaction(SIGPIPE, &registre, NULL) != 0)  
             {  
                 (*s_etat_processus).erreur_systeme = d_es_signal;  
                 return;  
             }  
         }          }
         else          else
         { // Sockets non connectées          { // Sockets non connectées
Line 2292  instruction_wflock(struct_processus *s_e Line 2325  instruction_wflock(struct_processus *s_e
                 return;                  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)              if (lock.l_type == F_UNLCK)
             {              {
                 drapeau = d_vrai;                  drapeau = d_vrai;
Line 2350  instruction_wflock(struct_processus *s_e Line 2360  instruction_wflock(struct_processus *s_e
                             registre_instruction_valide;                              registre_instruction_valide;
                 }                  }
   
                 nanosleep(&attente, NULL);  
                 scrutation_injection(s_etat_processus);                  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);                  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)          } while((drapeau == d_faux) && ((*s_etat_processus)
                 .var_volatile_requete_arret != -1));                  .var_volatile_requete_arret != -1));
Line 3068  instruction_wfdata(struct_processus *s_e Line 3102  instruction_wfdata(struct_processus *s_e
 static inline logical1  static inline logical1
 options_sockets(struct_processus *s_etat_processus, struct_socket *s_socket)  options_sockets(struct_processus *s_etat_processus, struct_socket *s_socket)
 {  {
     int                         drapeau;  
   
     if (((*s_socket).options & (1 << d_BROADCAST)) != 0)      if (((*s_socket).options & (1 << d_BROADCAST)) != 0)
     {      {
         if (setsockopt((*s_socket).socket, SOL_SOCKET, SO_BROADCAST, &drapeau,          if (setsockopt((*s_socket).socket, SOL_SOCKET, SO_BROADCAST, NULL, 0)
                 sizeof(drapeau)) != 0)                  != 0)
         {          {
             return(d_erreur);              return(d_erreur);
         }          }
Line 3081  options_sockets(struct_processus *s_etat Line 3113  options_sockets(struct_processus *s_etat
   
     if (((*s_socket).options & (1 << d_DONT_ROUTE)) != 0)      if (((*s_socket).options & (1 << d_DONT_ROUTE)) != 0)
     {      {
         if (setsockopt((*s_socket).socket, SOL_SOCKET, SO_DONTROUTE, &drapeau,          if (setsockopt((*s_socket).socket, SOL_SOCKET, SO_DONTROUTE, NULL, 0)
                 sizeof(drapeau)) != 0)                  != 0)
         {          {
             return(d_erreur);              return(d_erreur);
         }          }
Line 3090  options_sockets(struct_processus *s_etat Line 3122  options_sockets(struct_processus *s_etat
   
     if (((*s_socket).options & (1 << d_KEEP_ALIVE)) != 0)      if (((*s_socket).options & (1 << d_KEEP_ALIVE)) != 0)
     {      {
         if (setsockopt((*s_socket).socket, SOL_SOCKET, SO_KEEPALIVE, &drapeau,          if (setsockopt((*s_socket).socket, SOL_SOCKET, SO_KEEPALIVE, NULL, 0)
                 sizeof(drapeau)) != 0)                  != 0)
         {          {
             return(d_erreur);              return(d_erreur);
         }          }
Line 3248  instruction_wfsock(struct_processus *s_e Line 3280  instruction_wfsock(struct_processus *s_e
                 (*s_objet_argument).objet)).type, "SEQUENTIAL DATAGRAM") != 0))                  (*s_objet_argument).objet)).type, "SEQUENTIAL DATAGRAM") != 0))
         {          {
             // Mode non connecté : l'attente se fait sur un poll()              // Mode non connecté : l'attente se fait sur un poll()
   #define DEBUG_RETURN
             if ((s_objet_resultat = copie_objet(s_etat_processus,              if ((s_objet_resultat = copie_objet(s_etat_processus,
                     s_objet_argument, 'P')) == NULL)                      s_objet_argument, 'P')) == NULL)
             {              {
Line 3892  instruction_wfswi(struct_processus *s_et Line 3924  instruction_wfswi(struct_processus *s_et
             }              }
             else              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);                  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);                  scrutation_injection(s_etat_processus);
                 INCR_GRANULARITE(attente.tv_nsec);                  INCR_GRANULARITE(attente.tv_nsec);
             }              }

Removed from v.1.112  
changed lines
  Added in v.1.130


CVSweb interface <joel.bertrand@systella.fr>