Diff for /rpl/src/instructions_w1.c between versions 1.91 and 1.110

version 1.91, 2014/07/17 08:07:25 version 1.110, 2018/06/01 09:57:28
Line 1 Line 1
 /*  /*
 ================================================================================  ================================================================================
   RPL/2 (R) version 4.1.19    RPL/2 (R) version 4.1.29
   Copyright (C) 1989-2014 Dr. BERTRAND Joël    Copyright (C) 1989-2018 Dr. BERTRAND Joël
   
   This file is part of RPL/2.    This file is part of RPL/2.
   
Line 410  instruction_write(struct_processus *s_et Line 410  instruction_write(struct_processus *s_et
     integer8                            recursivite;      integer8                            recursivite;
   
     logical1                            format_degenere;      logical1                            format_degenere;
       logical1                            format_oriente_ligne;
     logical1                            mise_a_jour;      logical1                            mise_a_jour;
   
   
     sqlite3_stmt                        *ppStmt;      sqlite3_stmt                        *ppStmt;
   
     ssize_t                             ios;      ssize_t                             ios;
Line 712  instruction_write(struct_processus *s_et Line 712  instruction_write(struct_processus *s_et
   
                 free(chaine);                  free(chaine);
   
                 if (alsprintf(&commande, "insert or replace into data "                  if (alsprintf(s_etat_processus, &commande,
                           "insert or replace into data "
                         "(id, data) values (%lld, '%s')", (*((integer8 *)                          "(id, data) values (%lld, '%s')", (*((integer8 *)
                         (*s_objet_argument_2).objet)), chaine_utf8) < 0)                          (*s_objet_argument_2).objet)), chaine_utf8) < 0)
                 {                  {
Line 762  instruction_write(struct_processus *s_et Line 763  instruction_write(struct_processus *s_et
   
                 // Récupération de la position de la clef                  // Récupération de la position de la clef
   
                 if (alsprintf(&commande, "select key from control "                  if (alsprintf(s_etat_processus, &commande,
                         "where id = 1") < 0)                          "select key from control where id = 1") < 0)
                 {                  {
                     (*s_etat_processus).erreur_systeme =                      (*s_etat_processus).erreur_systeme =
                             d_es_allocation_memoire;                              d_es_allocation_memoire;
Line 939  instruction_write(struct_processus *s_et Line 940  instruction_write(struct_processus *s_et
   
                 // Récupération de l'identifiant de la clef                  // Récupération de l'identifiant de la clef
   
                 if (alsprintf(&commande, "select id from key where key = "                  if (alsprintf(s_etat_processus, &commande,
                         "'%s'", clef_utf8) < 0)                          "select id from key where key = '%s'", clef_utf8) < 0)
                 {                  {
                     (*s_etat_processus).erreur_systeme =                      (*s_etat_processus).erreur_systeme =
                             d_es_allocation_memoire;                              d_es_allocation_memoire;
Line 985  instruction_write(struct_processus *s_et Line 986  instruction_write(struct_processus *s_et
   
                             free(commande);                              free(commande);
   
                             if (alsprintf(&commande, "insert into key "                              if (alsprintf(s_etat_processus, &commande,
                                     "(key) values ('%s')", clef_utf8) < 0)                                      "insert into key (key) values ('%s')",
                                       clef_utf8) < 0)
                             {                              {
                                 (*s_etat_processus).erreur_systeme =                                  (*s_etat_processus).erreur_systeme =
                                         d_es_allocation_memoire;                                          d_es_allocation_memoire;
Line 1019  instruction_write(struct_processus *s_et Line 1021  instruction_write(struct_processus *s_et
   
                             free(commande);                              free(commande);
   
                             if (alsprintf(&commande, "select id from key "                              if (alsprintf(s_etat_processus, &commande,
                                     "where key = '%s'", clef_utf8) < 0)                                      "select id from key where key = '%s'",
                                       clef_utf8) < 0)
                             {                              {
                                 (*s_etat_processus).erreur_systeme =                                  (*s_etat_processus).erreur_systeme =
                                         d_es_allocation_memoire;                                          d_es_allocation_memoire;
Line 1083  instruction_write(struct_processus *s_et Line 1086  instruction_write(struct_processus *s_et
   
                 if (mise_a_jour == d_vrai)                  if (mise_a_jour == d_vrai)
                 {                  {
                     if (alsprintf(&commande, "update key set key = '%s' where "                      if (alsprintf(s_etat_processus, &commande,
                             "id = %lld", clef_utf8, id) < 0)                              "update key set key = '%s' where id = %lld",
                               clef_utf8, id) < 0)
                     {                      {
                         (*s_etat_processus).erreur_systeme =                          (*s_etat_processus).erreur_systeme =
                                 d_es_allocation_memoire;                                  d_es_allocation_memoire;
Line 1119  instruction_write(struct_processus *s_et Line 1123  instruction_write(struct_processus *s_et
   
                 // Effacement de l'enregistrement existant                  // Effacement de l'enregistrement existant
   
                 if (alsprintf(&commande, "delete from data where "                  if (alsprintf(s_etat_processus, &commande,
                         "key_id = %lld", id) < 0)                          "delete from data where key_id = %lld", id) < 0)
                 {                  {
                     (*s_etat_processus).erreur_systeme =                      (*s_etat_processus).erreur_systeme =
                             d_es_allocation_memoire;                              d_es_allocation_memoire;
Line 1254  instruction_write(struct_processus *s_et Line 1258  instruction_write(struct_processus *s_et
   
                     free(chaine);                      free(chaine);
   
                     if (alsprintf(&commande, "insert into data "                      if (alsprintf(s_etat_processus, &commande,
                             "(data, key_id, sequence) values "                              "insert into data (data, key_id, sequence) values "
                             "('%s', %lld, %lld)", chaine_utf8, id, ordre) < 0)                              "('%s', %lld, %lld)", chaine_utf8, id, ordre) < 0)
                     {                      {
                         (*s_etat_processus).erreur_systeme =                          (*s_etat_processus).erreur_systeme =
Line 1494  instruction_write(struct_processus *s_et Line 1498  instruction_write(struct_processus *s_et
                         return;                          return;
                     }                      }
   
                     if ((format_chaine = conversion_majuscule((unsigned char *)                      if ((format_chaine = conversion_majuscule(s_etat_processus,
                             (*(*l_element_courant_format).donnee).objet))                              (unsigned char *) (*(*l_element_courant_format)
                             == NULL)                              .donnee).objet)) == NULL)
                     {                      {
                         (*s_etat_processus).erreur_systeme =                          (*s_etat_processus).erreur_systeme =
                                 d_es_allocation_memoire;                                  d_es_allocation_memoire;
                         return;                          return;
                     }                      }
   
                     if (strncmp("LENGTH*(", format_chaine, 8) != 0)                      if (strcmp("LINE*(*)", format_chaine) == 0)
                     {                      {
                         free(format_chaine);                          format_oriente_ligne = d_vrai;
                           format_degenere = d_vrai;
                         liberation(s_etat_processus, s_objet_argument_2);  
                         liberation(s_etat_processus, s_objet_argument_1);  
   
                         (*s_etat_processus).erreur_execution =  
                                 d_ex_erreur_format_fichier;  
                         return;  
                     }                      }
                       else
                     longueur = (integer8) strlen(format_chaine);  
   
                     if (format_chaine[longueur - 1] != ')')  
                     {                      {
                         free(format_chaine);                          format_oriente_ligne = d_faux;
                           
                         liberation(s_etat_processus, s_objet_argument_2);                          if (strncmp("LENGTH*(", format_chaine, 8) != 0)
                         liberation(s_etat_processus, s_objet_argument_1);                          {
                               free(format_chaine);
   
                         (*s_etat_processus).erreur_execution =                              liberation(s_etat_processus, s_objet_argument_2);
                                 d_ex_erreur_format_fichier;                              liberation(s_etat_processus, s_objet_argument_1);
                         return;  
                     }  
   
                     format_chaine[longueur] = d_code_fin_chaine;                              (*s_etat_processus).erreur_execution =
                                       d_ex_erreur_format_fichier;
                               return;
                           }
   
                     if (format_chaine[8] == '*')                          longueur = (integer8) strlen(format_chaine);
                     {  
                         format_degenere = d_vrai;  
                     }  
                     else  
                     {  
                         // Détermination de la longueur  
                         format_degenere = d_faux;  
   
                         if (sscanf(&(format_chaine[8]), "%lld", &longueur) != 1)                          if (format_chaine[longueur - 1] != ')')
                         {                          {
                             free(format_chaine);                              free(format_chaine);
   
Line 1551  instruction_write(struct_processus *s_et Line 1541  instruction_write(struct_processus *s_et
                                     d_ex_erreur_format_fichier;                                      d_ex_erreur_format_fichier;
                             return;                              return;
                         }                          }
   
                           format_chaine[longueur] = d_code_fin_chaine;
   
                           if (format_chaine[8] == '*')
                           {
                               format_degenere = d_vrai;
                           }
                           else
                           {
                               // Détermination de la longueur
                               format_degenere = d_faux;
   
                               if (sscanf(&(format_chaine[8]), "%lld", &longueur)
                                       != 1)
                               {
                                   free(format_chaine);
   
                                   liberation(s_etat_processus,
                                           s_objet_argument_2);
                                   liberation(s_etat_processus,
                                           s_objet_argument_1);
   
                                   (*s_etat_processus).erreur_execution =
                                           d_ex_erreur_format_fichier;
                                   return;
                               }
                           }
                     }                      }
   
                     free(format_chaine);                      free(format_chaine);
Line 1592  instruction_write(struct_processus *s_et Line 1609  instruction_write(struct_processus *s_et
   
                     free(chaine);                      free(chaine);
   
                       if (format_oriente_ligne == d_vrai)
                       {
                           if (fwrite("\n", 1, 1, (*descripteur).descripteur_c)
                                   != 1)
                           {
                               (*s_etat_processus).erreur_systeme =
                                       d_es_erreur_fichier;
                               return;
                           }
                       }
   
                     l_element_courant = (*l_element_courant).suivant;                      l_element_courant = (*l_element_courant).suivant;
                     l_element_courant_format = (*l_element_courant_format)                      l_element_courant_format = (*l_element_courant_format)
                             .suivant;                              .suivant;
Line 2211  instruction_wflock(struct_processus *s_e Line 2239  instruction_wflock(struct_processus *s_e
   
         do          do
         {          {
             if ((chaine = conversion_majuscule((unsigned char *)              if ((chaine = conversion_majuscule(s_etat_processus,
                     (*s_objet_argument_1).objet)) == NULL)                      (unsigned char *) (*s_objet_argument_1).objet)) == NULL)
             {              {
                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;                  (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                 return;                  return;
Line 2518  instruction_wfproc(struct_processus *s_e Line 2546  instruction_wfproc(struct_processus *s_e
                 {                  {
                     if (envoi_signal_processus((*(*((struct_processus_fils *)                      if (envoi_signal_processus((*(*((struct_processus_fils *)
                             (*(*l_element_courant).donnee).objet)).thread).pid,                              (*(*l_element_courant).donnee).objet)).thread).pid,
                             rpl_signull) != 0)                              rpl_signull, d_faux) != 0)
                     {                      {
                         drapeau_fin = d_vrai;                          drapeau_fin = d_vrai;
                     }                      }
Line 3037  instruction_wfdata(struct_processus *s_e Line 3065  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)
           {
               return(d_erreur);
           }
       }
   
       if (((*s_socket).options & (1 << d_DONT_ROUTE)) != 0)
       {
           if (setsockopt((*s_socket).socket, SOL_SOCKET, SO_DONTROUTE, &drapeau,
                   sizeof(drapeau)) != 0)
           {
               return(d_erreur);
           }
       }
   
       if (((*s_socket).options & (1 << d_KEEP_ALIVE)) != 0)
       {
           if (setsockopt((*s_socket).socket, SOL_SOCKET, SO_KEEPALIVE, &drapeau,
                   sizeof(drapeau)) != 0)
           {
               return(d_erreur);
           }
       }
   
   #   ifdef SO_PRIORITY
       if (((*s_socket).options & (1 << d_PRIORITY)) != 0)
       {
           if (setsockopt((*s_socket).socket, SOL_SOCKET, SO_PRIORITY,
                   &((*s_socket).priorite), sizeof((*s_socket).priorite)) != 0)
           {
               return(d_erreur);
           }
       }
   #   endif
   
       // Les deux options suivantes ne peuvent être positionnées simultanément.
   
       if (((*s_socket).options & (1 << d_RECEIVE_BUFFER)) != 0)
       {
           if (setsockopt((*s_socket).socket, SOL_SOCKET, SO_RCVBUF,
                   &((*s_socket).buffer_reception),
                   sizeof((*s_socket).buffer_reception)) != 0)
           {
               return(d_erreur);
           }
       }
   
   #   ifdef SO_RCVBUFFORCE
       if (((*s_socket).options & (1 << d_FORCE_RECEIVE_BUFFER)) != 0)
       {
           if (setsockopt((*s_socket).socket, SOL_SOCKET, SO_RCVBUFFORCE,
                   &((*s_socket).buffer_reception),
                   sizeof((*s_socket).buffer_reception)) != 0)
           {
               return(d_erreur);
           }
       }
   #   endif
   
       // Même remarque
   
       if (((*s_socket).options & (1 << d_SEND_BUFFER)) != 0)
       {
           if (setsockopt((*s_socket).socket, SOL_SOCKET, SO_SNDBUF,
                   &((*s_socket).buffer_emission),
                   sizeof((*s_socket).buffer_emission)) != 0)
           {
               return(d_erreur);
           }
       }
   
   #   ifdef SO_SNDBUFFORCE
       if (((*s_socket).options & (1 << d_FORCE_SEND_BUFFER)) != 0)
       {
           if (setsockopt((*s_socket).socket, SOL_SOCKET, SO_SNDBUFFORCE,
                   &((*s_socket).buffer_emission),
                   sizeof((*s_socket).buffer_emission)) != 0)
           {
               return(d_erreur);
           }
       }
   #   endif
   
       if (((*s_socket).options & (1 << d_RECEIVING_TIMEOUT)) != 0)
       {
           if (setsockopt((*s_socket).socket, SOL_SOCKET, SO_RCVTIMEO,
                   &((*s_socket).timeout_emission),
                   sizeof((*s_socket).timeout_emission)) != 0)
           {
               return(d_erreur);
           }
       }
   
       if (((*s_socket).options & (1 << d_SENDING_TIMEOUT)) != 0)
       {
           if (setsockopt((*s_socket).socket, SOL_SOCKET, SO_SNDTIMEO,
                   &((*s_socket).timeout_emission),
                   sizeof((*s_socket).timeout_emission)) != 0)
           {
               return(d_erreur);
           }
       }
   
       return(d_absence_erreur);;
   }
   
   
 void  void
 instruction_wfsock(struct_processus *s_etat_processus)  instruction_wfsock(struct_processus *s_etat_processus)
 {  {
Line 3222  instruction_wfsock(struct_processus *s_e Line 3365  instruction_wfsock(struct_processus *s_e
                 {                  {
                     drapeau = d_vrai;                      drapeau = d_vrai;
   
 #               ifndef SEMAPHORES_NOMMES  #                   ifndef SEMAPHORES_NOMMES
                         if (sem_post(&((*s_etat_processus).semaphore_fork))                          if (sem_post(&((*s_etat_processus).semaphore_fork))
                                 != 0)                                  != 0)
 #               else  #                   else
                         if (sem_post((*s_etat_processus).semaphore_fork) != 0)                          if (sem_post((*s_etat_processus).semaphore_fork) != 0)
 #               endif  #                   endif
                     {                      {
                         (*s_etat_processus).erreur_systeme = d_es_processus;                          (*s_etat_processus).erreur_systeme = d_es_processus;
                         return;                          return;
Line 3242  instruction_wfsock(struct_processus *s_e Line 3385  instruction_wfsock(struct_processus *s_e
                         erreur = errno;                          erreur = errno;
   
 #                       ifndef SEMAPHORES_NOMMES  #                       ifndef SEMAPHORES_NOMMES
                         while(sem_wait(&((*s_etat_processus)                              while(sem_wait(&((*s_etat_processus)
                                 .semaphore_fork)) != 0)                                      .semaphore_fork)) != 0)
 #                       else  #                       else
                         while(sem_wait((*s_etat_processus).semaphore_fork)                              while(sem_wait((*s_etat_processus).semaphore_fork)
                                 != 0)                                      != 0)
 #                       endif  #                       endif
                         {                          {
                             if (errno != EINTR)                              if (errno != EINTR)
Line 3280  instruction_wfsock(struct_processus *s_e Line 3423  instruction_wfsock(struct_processus *s_e
                     }                      }
                     else                      else
                     {                      {
 #                   ifndef SEMAPHORES_NOMMES  #                       ifndef SEMAPHORES_NOMMES
                             while(sem_wait(&((*s_etat_processus)                              while(sem_wait(&((*s_etat_processus)
                                     .semaphore_fork)) != 0)                                      .semaphore_fork)) != 0)
 #                   else  #                       else
                             while(sem_wait((*s_etat_processus).semaphore_fork)                              while(sem_wait((*s_etat_processus).semaphore_fork)
                                     != 0)                                      != 0)
 #                   endif  #                       endif
                         {                          {
                             if (errno != EINTR)                              if (errno != EINTR)
                             {                              {
Line 3295  instruction_wfsock(struct_processus *s_e Line 3438  instruction_wfsock(struct_processus *s_e
                                 return;                                  return;
                             }                              }
                         }                          }
   
                           if (options_sockets(s_etat_processus,
                                   (*s_objet_resultat).objet) != d_absence_erreur)
                           {
                               liberation(s_etat_processus, s_objet_argument);
                               liberation(s_etat_processus, s_objet_resultat);
   
                               (*s_etat_processus).erreur_execution =
                                       d_ex_erreur_parametre_fichier;
                               return;
                           }
                     }                      }
                 } while(drapeau == d_faux);                  } while(drapeau == d_faux);
   
Line 3325  instruction_wfsock(struct_processus *s_e Line 3479  instruction_wfsock(struct_processus *s_e
                 {                  {
                     drapeau = d_vrai;                      drapeau = d_vrai;
   
 #               ifndef SEMAPHORES_NOMMES  #                   ifndef SEMAPHORES_NOMMES
                         if (sem_post(&((*s_etat_processus).semaphore_fork))                          if (sem_post(&((*s_etat_processus).semaphore_fork))
                                 != 0)                                  != 0)
 #               else  #                   else
                         if (sem_post((*s_etat_processus).semaphore_fork) != 0)                          if (sem_post((*s_etat_processus).semaphore_fork) != 0)
 #               endif  #                   endif
                     {                      {
                         (*s_etat_processus).erreur_systeme = d_es_processus;                          (*s_etat_processus).erreur_systeme = d_es_processus;
                         return;                          return;
Line 3343  instruction_wfsock(struct_processus *s_e Line 3497  instruction_wfsock(struct_processus *s_e
                     {                      {
                         erreur = errno;                          erreur = errno;
   
 #                   ifndef SEMAPHORES_NOMMES  #                       ifndef SEMAPHORES_NOMMES
                             while(sem_wait(&((*s_etat_processus)                              while(sem_wait(&((*s_etat_processus)
                                     .semaphore_fork)) != 0)                                      .semaphore_fork)) != 0)
 #                   else  #                       else
                             while(sem_wait((*s_etat_processus).semaphore_fork)                              while(sem_wait((*s_etat_processus).semaphore_fork)
                                     != 0)                                      != 0)
 #                   endif  #                       endif
                         {                          {
                             if (errno != EINTR)                              if (errno != EINTR)
                             {                              {
Line 3382  instruction_wfsock(struct_processus *s_e Line 3536  instruction_wfsock(struct_processus *s_e
                     }                      }
                     else                      else
                     {                      {
 #                   ifndef SEMAPHORES_NOMMES  #                       ifndef SEMAPHORES_NOMMES
                             while(sem_wait(&((*s_etat_processus)                              while(sem_wait(&((*s_etat_processus)
                                     .semaphore_fork)) != 0)                                      .semaphore_fork)) != 0)
 #                   else  #                       else
                             while(sem_wait((*s_etat_processus).semaphore_fork)                              while(sem_wait((*s_etat_processus).semaphore_fork)
                                     != 0)                                      != 0)
 #                   endif  #                       endif
                         {                          {
                             if (errno != EINTR)                              if (errno != EINTR)
                             {                              {
Line 3397  instruction_wfsock(struct_processus *s_e Line 3551  instruction_wfsock(struct_processus *s_e
                                 return;                                  return;
                             }                              }
                         }                          }
   
                           if (options_sockets(s_etat_processus,
                                   (*s_objet_resultat).objet) != d_absence_erreur)
                           {
                               liberation(s_etat_processus, s_objet_argument);
                               liberation(s_etat_processus, s_objet_resultat);
   
                               (*s_etat_processus).erreur_execution =
                                       d_ex_erreur_parametre_fichier;
                               return;
                           }
                     }                      }
                 } while(drapeau == d_faux);                  } while(drapeau == d_faux);
   
Line 3447  instruction_wfsock(struct_processus *s_e Line 3612  instruction_wfsock(struct_processus *s_e
                 {                  {
                     drapeau = d_vrai;                      drapeau = d_vrai;
   
 #               ifndef SEMAPHORES_NOMMES  #                   ifndef SEMAPHORES_NOMMES
                         if (sem_post(&((*s_etat_processus).semaphore_fork))                          if (sem_post(&((*s_etat_processus).semaphore_fork))
                                 != 0)                                  != 0)
 #               else  #                   else
                         if (sem_post((*s_etat_processus).semaphore_fork) != 0)                          if (sem_post((*s_etat_processus).semaphore_fork) != 0)
 #               endif  #                   endif
                     {                      {
                         (*s_etat_processus).erreur_systeme = d_es_processus;                          (*s_etat_processus).erreur_systeme = d_es_processus;
                         return;                          return;
Line 3465  instruction_wfsock(struct_processus *s_e Line 3630  instruction_wfsock(struct_processus *s_e
                     {                      {
                         erreur = errno;                          erreur = errno;
   
 #                   ifndef SEMAPHORES_NOMMES  #                       ifndef SEMAPHORES_NOMMES
                             while(sem_wait(&((*s_etat_processus)                              while(sem_wait(&((*s_etat_processus)
                                     .semaphore_fork)) != 0)                                      .semaphore_fork)) != 0)
 #                   else  #                       else
                             while(sem_wait((*s_etat_processus).semaphore_fork)                              while(sem_wait((*s_etat_processus).semaphore_fork)
                                     != 0)                                      != 0)
 #                   endif  #                       endif
                         {                          {
                             if (errno != EINTR)                              if (errno != EINTR)
                             {                              {
Line 3504  instruction_wfsock(struct_processus *s_e Line 3669  instruction_wfsock(struct_processus *s_e
                     }                      }
                     else                      else
                     {                      {
 #                   ifndef SEMAPHORES_NOMMES  #                       ifndef SEMAPHORES_NOMMES
                             while(sem_wait(&((*s_etat_processus)                              while(sem_wait(&((*s_etat_processus)
                                     .semaphore_fork)) != 0)                                      .semaphore_fork)) != 0)
 #                   else  #                       else
                             while(sem_wait((*s_etat_processus).semaphore_fork)                              while(sem_wait((*s_etat_processus).semaphore_fork)
                                     != 0)                                      != 0)
 #                   endif  #                       endif
                         {                          {
                             if (errno != EINTR)                              if (errno != EINTR)
                             {                              {
Line 3519  instruction_wfsock(struct_processus *s_e Line 3684  instruction_wfsock(struct_processus *s_e
                                 return;                                  return;
                             }                              }
                         }                          }
   
                           if (options_sockets(s_etat_processus,
                                   (*s_objet_resultat).objet) != d_absence_erreur)
                           {
                               liberation(s_etat_processus, s_objet_argument);
                               liberation(s_etat_processus, s_objet_resultat);
   
                               (*s_etat_processus).erreur_execution =
                                       d_ex_erreur_parametre_fichier;
                               return;
                           }
                     }                      }
                 } while(drapeau == d_faux);                  } while(drapeau == d_faux);
             }              }

Removed from v.1.91  
changed lines
  Added in v.1.110


CVSweb interface <joel.bertrand@systella.fr>