Diff for /rpl/src/instructions_r4.c between versions 1.56 and 1.86

version 1.56, 2012/06/19 09:59:34 version 1.86, 2013/12/03 09:36:14
Line 1 Line 1
 /*  /*
 ================================================================================  ================================================================================
   RPL/2 (R) version 4.1.9    RPL/2 (R) version 4.1.17
   Copyright (C) 1989-2012 Dr. BERTRAND Joël    Copyright (C) 1989-2013 Dr. BERTRAND Joël
   
   This file is part of RPL/2.    This file is part of RPL/2.
   
Line 96  instruction_r_vers_b(struct_processus *s Line 96  instruction_r_vers_b(struct_processus *s
         }          }
         else          else
         {          {
             (*((logical8 *) (*s_objet_resultat).objet)) = (*((integer8 *)              (*((logical8 *) (*s_objet_resultat).objet)) = (logical8)
                     (*s_objet_argument).objet));                      (*((integer8 *) (*s_objet_argument).objet));
         }          }
     }      }
     else      else
Line 850  instruction_read(struct_processus *s_eta Line 850  instruction_read(struct_processus *s_eta
   
     int                             c;      int                             c;
     int                             ios;      int                             ios;
       int                             timeout;
   
     integer8                        ancienne_longueur_effective;  
     integer8                        element;      integer8                        element;
     integer8                        i;      integer8                        i;
     integer8                        id;      integer8                        id;
       integer8                        index;
       integer8                        longueur;
     integer8                        position_clef;      integer8                        position_clef;
   
     integer8                        longueur_effective;      integer8                        longueur_effective;
     integer8                        longueur_enregistrement;      integer8                        longueur_enregistrement;
     integer8                        longueur_questure;      integer8                        longueur_questure;
Line 864  instruction_read(struct_processus *s_eta Line 867  instruction_read(struct_processus *s_eta
     integer8                        position_finale;      integer8                        position_finale;
     integer8                        position_initiale;      integer8                        position_initiale;
   
       logical1                        device;
       logical1                        format_degenere;
     logical1                        indicateur_48;      logical1                        indicateur_48;
     logical1                        presence_chaine;      logical1                        presence_chaine;
     logical1                        presence_indicateur;      logical1                        presence_indicateur;
       logical1                        trame_complete;
   
     socklen_t                       longueur_adresse;      socklen_t                       longueur_adresse;
   
Line 874  instruction_read(struct_processus *s_eta Line 880  instruction_read(struct_processus *s_eta
   
     struct flock                    lock;      struct flock                    lock;
   
     struct pollfd                   poll_fd;      struct pollfd                   fds[1];
   
     struct sockaddr_un              adresse_unix;      struct sockaddr_un              adresse_unix;
     struct sockaddr_in              adresse_ipv4;      struct sockaddr_in              adresse_ipv4;
Line 882  instruction_read(struct_processus *s_eta Line 888  instruction_read(struct_processus *s_eta
     struct sockaddr_in6             adresse_ipv6;      struct sockaddr_in6             adresse_ipv6;
 #   endif  #   endif
   
       struct termios                  tc;
   
     struct timespec                 attente;      struct timespec                 attente;
   
     struct_descripteur_fichier      *descripteur;      struct_descripteur_fichier      *descripteur;
   
     struct_liste_chainee            *l_element_courant;      struct_liste_chainee            *l_element_courant;
       struct_liste_chainee            *l_element_courant_format;
     struct_liste_chainee            *l_element_inclus;      struct_liste_chainee            *l_element_inclus;
     struct_liste_chainee            *l_element_suivant;  
   
     struct_objet                    *s_objet_adresse;      struct_objet                    *s_objet_adresse;
     struct_objet                    *s_objet_argument_1;      struct_objet                    *s_objet_argument_1;
     struct_objet                    *s_objet_argument_2;      struct_objet                    *s_objet_argument_2;
     struct_objet                    *s_objet_element;  
     struct_objet                    *s_objet_resultat;      struct_objet                    *s_objet_resultat;
     struct_objet                    *s_objet_type;      struct_objet                    *s_objet_type;
   
     unsigned char                   caractere;      unsigned char                   caractere;
     unsigned char                   *clef_utf8;      unsigned char                   *clef_utf8;
     unsigned char                   *commande;      unsigned char                   *commande;
     unsigned char                   poubelle[256];      unsigned char                   *format_chaine;
     unsigned char                   *ptr;      unsigned char                   *ptr;
     unsigned char                   *tampon_lecture;      unsigned char                   *tampon_lecture;
     unsigned char                   *tampon;      unsigned char                   *tampon;
     unsigned char                   *tampon2;      unsigned char                   *tampon2;
     unsigned char                   type_enregistrement;      unsigned char                   *tampon3;
   
       int                             vitesses[] =
                           {
                               50, 75, 110, 134, 150, 200, 300, 600,
                               1200, 1800, 2400, 4800, 9600, 19200, 38400,
   #ifdef B57600
                               57600,
   #endif
   #ifdef B115200
                               115200,
   #endif
   #ifdef B230400
                               230400,
   #endif
                               0
                           };
   
       tcflag_t                        vitesses_constantes[] =
                           {
                               B50, B75, B110, B134, B150, B200, B300, B600,
                               B1200, B1800, B2400, B4800, B9600, B19200, B38400,
   #ifdef B57600
                               B57600,
   #endif
   #ifdef B115200
                               B115200,
   #endif
   #ifdef B230400
                               B230400,
   #endif
                               0
                           };
   
     (*s_etat_processus).erreur_execution = d_ex;      (*s_etat_processus).erreur_execution = d_ex;
   
Line 1050  instruction_read(struct_processus *s_eta Line 1089  instruction_read(struct_processus *s_eta
                  * Fichiers séquentiels                   * Fichiers séquentiels
                  */                   */
   
                 longueur_questure = 256;                  longueur_questure = 4096;
   
                 if ((tampon_lecture = malloc(longueur_questure *                  if ((tampon_lecture = malloc(((size_t) longueur_questure) *
                         sizeof(unsigned char))) == NULL)                          sizeof(unsigned char))) == NULL)
                 {                  {
                     (*s_etat_processus).erreur_systeme =                      (*s_etat_processus).erreur_systeme =
Line 1071  instruction_read(struct_processus *s_eta Line 1110  instruction_read(struct_processus *s_eta
   
                 do                  do
                 {                  {
                     longueur_effective = fread(tampon_lecture,                      longueur_effective = (integer8) fread(tampon_lecture,
                             (size_t) sizeof(unsigned char), longueur_questure,                              sizeof(unsigned char), (size_t) longueur_questure,
                             (*descripteur).descripteur_c);                              (*descripteur).descripteur_c);
   
                     pointeur = 0;                      pointeur = 0;
Line 1110  instruction_read(struct_processus *s_eta Line 1149  instruction_read(struct_processus *s_eta
                 presence_chaine = d_faux;                  presence_chaine = d_faux;
                 niveau = 1;                  niveau = 1;
   
                 if (fseek((*descripteur).descripteur_c, position_finale,                  if (fseek((*descripteur).descripteur_c, (long) position_finale,
                         SEEK_SET) != 0)                          SEEK_SET) != 0)
                 {                  {
                     liberation(s_etat_processus, s_objet_argument_1);                      liberation(s_etat_processus, s_objet_argument_1);
Line 1122  instruction_read(struct_processus *s_eta Line 1161  instruction_read(struct_processus *s_eta
   
                 do                  do
                 {                  {
                     longueur_effective = fread(tampon_lecture,                      longueur_effective = (integer8) fread(tampon_lecture,
                             (size_t) sizeof(unsigned char), longueur_questure,                              sizeof(unsigned char), (size_t) longueur_questure,
                             (*descripteur).descripteur_c);                              (*descripteur).descripteur_c);
   
                     pointeur = 0;                      pointeur = 0;
Line 1191  instruction_read(struct_processus *s_eta Line 1230  instruction_read(struct_processus *s_eta
                 free(tampon_lecture);                  free(tampon_lecture);
                 longueur_enregistrement = position_finale - position_initiale;                  longueur_enregistrement = position_finale - position_initiale;
   
                 if ((tampon_lecture = malloc((longueur_enregistrement + 1) *                  if ((tampon_lecture = malloc(((size_t)
                           (longueur_enregistrement + 1)) *
                         sizeof(unsigned char))) == NULL)                          sizeof(unsigned char))) == NULL)
                 {                  {
                     (*s_etat_processus).erreur_systeme =                      (*s_etat_processus).erreur_systeme =
Line 1199  instruction_read(struct_processus *s_eta Line 1239  instruction_read(struct_processus *s_eta
                     return;                      return;
                 }                  }
   
                 if (fseek((*descripteur).descripteur_c, position_initiale,                  if (fseek((*descripteur).descripteur_c,
                         SEEK_SET) != 0)                          (long) position_initiale, SEEK_SET) != 0)
                 {                  {
                     liberation(s_etat_processus, s_objet_argument_1);                      liberation(s_etat_processus, s_objet_argument_1);
                     free(tampon_lecture);                      free(tampon_lecture);
Line 1209  instruction_read(struct_processus *s_eta Line 1249  instruction_read(struct_processus *s_eta
                     return;                      return;
                 }                  }
   
                 longueur_effective = fread(tampon_lecture,                  longueur_effective = (integer8) fread(tampon_lecture,
                         (size_t) sizeof(unsigned char),                          sizeof(unsigned char), (size_t) longueur_enregistrement,
                         (size_t) longueur_enregistrement,  
                         (*descripteur).descripteur_c);                          (*descripteur).descripteur_c);
   
                 if (longueur_effective != longueur_enregistrement)                  if (longueur_effective != longueur_enregistrement)
Line 1301  instruction_read(struct_processus *s_eta Line 1340  instruction_read(struct_processus *s_eta
                 }                  }
   
                 if (sqlite3_prepare_v2((*descripteur).descripteur_sqlite,                  if (sqlite3_prepare_v2((*descripteur).descripteur_sqlite,
                         commande, strlen(commande), &ppStmt, &queue)                          commande, (int) strlen(commande), &ppStmt, &queue)
                         != SQLITE_OK)                          != SQLITE_OK)
                 {                  {
                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;                      (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                     return;                      return;
                 }                  }
                   
                 switch(sqlite3_step(ppStmt))                  attente.tv_sec = 0;
                   attente.tv_nsec = GRANULARITE_us * 1000;
   
                   do
                 {                  {
                     case SQLITE_ROW:                      ios = sqlite3_step(ppStmt);
                     {  
                         // Résultat attendu  
                         break;  
                     }  
   
                     case SQLITE_DONE:                      switch(ios)
                     {                      {
                         // Aucun enregistrement                          case SQLITE_ROW:
                         if (sqlite3_finalize(ppStmt) != SQLITE_OK)  
                         {                          {
                             (*s_etat_processus).erreur_systeme =                              // Résultat attendu
                                     d_es_erreur_fichier;                              break;
                             return;  
                         }                          }
   
                         free(commande);                          case SQLITE_DONE:
                           {
                               // Aucun enregistrement
                               if (sqlite3_finalize(ppStmt) != SQLITE_OK)
                               {
                                   (*s_etat_processus).erreur_systeme =
                                           d_es_erreur_fichier;
                                   return;
                               }
   
                         liberation(s_etat_processus, s_objet_argument_1);                              free(commande);
                         liberation(s_etat_processus, s_objet_argument_2);  
   
                         (*s_etat_processus).erreur_execution =                              liberation(s_etat_processus, s_objet_argument_1);
                                 d_ex_enregistrement_inexistant;                              liberation(s_etat_processus, s_objet_argument_2);
                         return;  
                     }  
   
                     default:                              (*s_etat_processus).erreur_execution =
                     {                                      d_ex_enregistrement_inexistant;
                         (*s_etat_processus).erreur_systeme =                              return;
                                 d_es_erreur_fichier;                          }
                         return;  
                           case SQLITE_BUSY:
                           case SQLITE_LOCKED:
                           {
                               nanosleep(&attente, NULL);
                               INCR_GRANULARITE(attente.tv_nsec);
                               break;
                           }
   
                           default:
                           {
                               (*s_etat_processus).erreur_systeme =
                                       d_es_erreur_fichier;
                               return;
                           }
                     }                      }
                 }                  } while(ios != SQLITE_ROW);
   
                 if (sqlite3_column_type(ppStmt, 0) != SQLITE_TEXT)                  if (sqlite3_column_type(ppStmt, 0) != SQLITE_TEXT)
                 {                  {
Line 1456  instruction_read(struct_processus *s_eta Line 1511  instruction_read(struct_processus *s_eta
                 }                  }
   
                 if (sqlite3_prepare_v2((*descripteur).descripteur_sqlite,                  if (sqlite3_prepare_v2((*descripteur).descripteur_sqlite,
                         commande, strlen(commande), &ppStmt, &queue)                          commande, (int) strlen(commande), &ppStmt, &queue)
                         != SQLITE_OK)                          != SQLITE_OK)
                 {                  {
                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;                      (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                     return;                      return;
                 }                  }
   
                 if (sqlite3_step(ppStmt) != SQLITE_ROW)                  attente.tv_sec = 0;
                   attente.tv_nsec = GRANULARITE_us * 1000;
   
                   do
                 {                  {
                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;                      ios = sqlite3_step(ppStmt);
                     return;  
                 }                      if (ios == SQLITE_ROW)
                       {
                           break;
                       }
                       else if ((ios == SQLITE_BUSY) || (ios == SQLITE_LOCKED))
                       {
                           nanosleep(&attente, NULL);
                           INCR_GRANULARITE(attente.tv_nsec);
                       }
                       else
                       {
                           (*s_etat_processus).erreur_systeme =
                                   d_es_erreur_fichier;
                           return;
                       }
                   } while(ios != SQLITE_ROW);
   
                 if (sqlite3_column_type(ppStmt, 0) != SQLITE_INTEGER)                  if (sqlite3_column_type(ppStmt, 0) != SQLITE_INTEGER)
                 {                  {
Line 1512  instruction_read(struct_processus *s_eta Line 1585  instruction_read(struct_processus *s_eta
                 }                  }
   
                 if (sqlite3_prepare_v2((*descripteur).descripteur_sqlite,                  if (sqlite3_prepare_v2((*descripteur).descripteur_sqlite,
                         commande, strlen(commande), &ppStmt, &queue)                          commande, (int) strlen(commande), &ppStmt, &queue)
                         != SQLITE_OK)                          != SQLITE_OK)
                 {                  {
                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;                      (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                     return;                      return;
                 }                  }
   
                 switch(sqlite3_step(ppStmt))                  attente.tv_sec = 0;
                   attente.tv_nsec = GRANULARITE_us * 1000;
   
                   do
                 {                  {
                     case SQLITE_ROW:                      ios = sqlite3_step(ppStmt);
                     {  
                         // Résultat attendu : une clef correspond.  
                         break;  
                     }  
   
                     case SQLITE_DONE:                      switch(ios)
                     {                      {
                         // Aucun enregistrement                          case SQLITE_ROW:
                         if (sqlite3_finalize(ppStmt) != SQLITE_OK)  
                         {                          {
                             (*s_etat_processus).erreur_systeme =                              // Résultat attendu : une clef correspond.
                                     d_es_erreur_fichier;                              break;
                             return;  
                         }                          }
   
                         free(clef_utf8);                          case SQLITE_DONE:
                         free(commande);                          {
                               // Aucun enregistrement
                               if (sqlite3_finalize(ppStmt) != SQLITE_OK)
                               {
                                   (*s_etat_processus).erreur_systeme =
                                           d_es_erreur_fichier;
                                   return;
                               }
   
                               free(clef_utf8);
                               free(commande);
   
                         liberation(s_etat_processus, s_objet_argument_1);                              liberation(s_etat_processus, s_objet_argument_1);
                         liberation(s_etat_processus, s_objet_argument_2);                              liberation(s_etat_processus, s_objet_argument_2);
   
                         (*s_etat_processus).erreur_execution =                              (*s_etat_processus).erreur_execution =
                                 d_ex_enregistrement_inexistant;                                      d_ex_enregistrement_inexistant;
                         return;                              return;
                     }                          }
   
                     default:                          case SQLITE_BUSY:
                     {                          case SQLITE_LOCKED:
                         (*s_etat_processus).erreur_systeme =                          {
                                 d_es_erreur_fichier;                              nanosleep(&attente, NULL);
                         return;                              INCR_GRANULARITE(attente.tv_nsec);
                               break;
                           }
   
                           default:
                           {
                               (*s_etat_processus).erreur_systeme =
                                       d_es_erreur_fichier;
                               return;
                           }
                     }                      }
                 }                  } while(ios != SQLITE_ROW);
   
                 if (sqlite3_column_type(ppStmt, 0) != SQLITE_INTEGER)                  if (sqlite3_column_type(ppStmt, 0) != SQLITE_INTEGER)
                 {                  {
Line 1589  instruction_read(struct_processus *s_eta Line 1678  instruction_read(struct_processus *s_eta
                 }                  }
   
                 if (sqlite3_prepare_v2((*descripteur).descripteur_sqlite,                  if (sqlite3_prepare_v2((*descripteur).descripteur_sqlite,
                         commande, strlen(commande), &ppStmt, &queue)                          commande, (int) strlen(commande), &ppStmt, &queue)
                         != SQLITE_OK)                          != SQLITE_OK)
                 {                  {
                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;                      (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
Line 1598  instruction_read(struct_processus *s_eta Line 1687  instruction_read(struct_processus *s_eta
   
                 element = 1;                  element = 1;
   
                   attente.tv_sec = 0;
                   attente.tv_nsec = GRANULARITE_us * 1000;
   
                 do                  do
                 {                  {
                     switch(ios = sqlite3_step(ppStmt))                      switch(ios = sqlite3_step(ppStmt))
Line 1776  instruction_read(struct_processus *s_eta Line 1868  instruction_read(struct_processus *s_eta
                             break;                              break;
                         }                          }
   
                           case SQLITE_BUSY:
                           case SQLITE_LOCKED:
                           {
                               nanosleep(&attente, NULL);
                               INCR_GRANULARITE(attente.tv_nsec);
                               break;
                           }
   
                         default:                          default:
                         {                          {
                             (*s_etat_processus).erreur_systeme =                              (*s_etat_processus).erreur_systeme =
Line 1783  instruction_read(struct_processus *s_eta Line 1883  instruction_read(struct_processus *s_eta
                             return;                              return;
                         }                          }
                     }                      }
   
                 } while(ios != SQLITE_DONE);                  } while(ios != SQLITE_DONE);
   
                 if (sqlite3_finalize(ppStmt) != SQLITE_OK)                  if (sqlite3_finalize(ppStmt) != SQLITE_OK)
Line 1884  instruction_read(struct_processus *s_eta Line 1983  instruction_read(struct_processus *s_eta
   
                 BUG(((*descripteur).type != 'C'), uprintf("Bad filtype !\n"));                  BUG(((*descripteur).type != 'C'), uprintf("Bad filtype !\n"));
   
                 if (fread(&type_enregistrement, (size_t) sizeof(unsigned char),                  if ((s_objet_resultat = lecture_fichier_non_formate(
                         1, (*descripteur).descripteur_c) != 1)                          s_etat_processus, (*descripteur).descripteur_c, -1,
                           d_faux)) == NULL)
                 {                  {
                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;  
                     return;                      return;
                 }                  }
   
                 if ((type_enregistrement & 0xF0) != 0x40)                  if (empilement(s_etat_processus,
                           &((*s_etat_processus).l_base_pile),
                           s_objet_resultat) == d_erreur)
                 {                  {
                     // L'enregistrement trouvé n'est pas une liste.  
                     // Tout porte à croire que le fichier est corrompu.  
                     (*s_etat_processus).erreur_execution =  
                             d_ex_fichier_corrompu;  
                     return;                      return;
                 }                  }
               }
           }
           else
           {
               /*
                * Fichiers de type FLOW
                */
   
                 switch(type_enregistrement)              if ((*((struct_fichier *) (*s_objet_argument_1).objet)).acces
                 {                      == 'S')
                     unsigned char       taille_enregistrement[8];              {
                   /*
                     case 0x48:                   * Fichiers séquentiels
                     {                   */
                         if (fread(taille_enregistrement,  
                                 (size_t) sizeof(unsigned char),  
                                 1, (*descripteur).descripteur_c) != 1)  
                         {  
                             (*s_etat_processus).erreur_systeme =  
                                     d_es_erreur_fichier;  
                             return;  
                         }  
   
                         longueur_enregistrement = taille_enregistrement[0];  
                         break;  
                     }  
   
                     case 0x49:  
                     {  
                         if (fread(taille_enregistrement,  
                                 (size_t) sizeof(unsigned char),  
                                 2, (*descripteur).descripteur_c) != 2)  
                         {  
                             (*s_etat_processus).erreur_systeme =  
                                     d_es_erreur_fichier;  
                             return;  
                         }  
   
 // A FAIRE conversion de taille_enregistrement en longueur_enregistrement  
                         break;  
                     }  
   
                     case 0x4A:                  BUG(((*descripteur).type != 'C'), uprintf("Bad filtype !\n"));
                     {                  longueur_enregistrement = 0;
                         if (fread(taille_enregistrement,  
                                 (size_t) sizeof(unsigned char),  
                                 4, (*descripteur).descripteur_c) != 4)  
                         {  
                             (*s_etat_processus).erreur_systeme =  
                                     d_es_erreur_fichier;  
                             return;  
                         }  
   
 // A FAIRE conversion de taille_enregistrement en longueur_enregistrement                  device = d_faux;
                         break;  
                     }  
   
                     case 0x4B:                  if ((position_initiale = ftell((*descripteur).descripteur_c))
                           == -1)
                   {
                       if (errno == ESPIPE)
                     {                      {
                         if (fread(taille_enregistrement,                          device = d_vrai;
                                 (size_t) sizeof(unsigned char),  
                                 8, (*descripteur).descripteur_c) != 8)  
                         {  
                             (*s_etat_processus).erreur_systeme =  
                                     d_es_erreur_fichier;  
                             return;  
                         }  
   
 // A FAIRE conversion de taille_enregistrement en longueur_enregistrement  
                         break;  
                     }                      }
                       else
                     default:  
                     {                      {
                         longueur_enregistrement = type_enregistrement & 0x07;                          (*s_etat_processus).erreur_systeme =
                                   d_es_erreur_fichier;
                           return;
                     }                      }
                 }                  }
   
 printf("L=%d\n", longueur_enregistrement);                  l_element_courant_format = (struct_liste_chainee *)
                 // La variable longueur_enregistrement contient le nombre                          (*(*((struct_fichier *) (*s_objet_argument_1).objet))
                 // d'éléments à lire dans le fichier pour générer la liste                          .format).objet;
                 // contenant l'enregistrement.                  l_element_courant = NULL;
   
                 if ((s_objet_resultat = allocation(s_etat_processus, LST))                  if ((s_objet_resultat = allocation(s_etat_processus, LST))
                         == NULL)                          == NULL)
Line 1983  printf("L=%d\n", longueur_enregistrement Line 2044  printf("L=%d\n", longueur_enregistrement
                     return;                      return;
                 }                  }
   
                 for(i = 0; i < longueur_enregistrement; i++)                  while(l_element_courant_format != NULL)
                 {                  {
                     /* A FAIRE                      if ((*(*l_element_courant_format).donnee).type != CHN)
                     s_objet_element = decodage_enregistrement(s_etat_processus,                      {
                             (*descripteur).descripteur_c);                          liberation(s_etat_processus, s_objet_argument_1);
                             */                          liberation(s_etat_processus, s_objet_resultat);
                     s_objet_element = NULL;  
                           (*s_etat_processus).erreur_execution =
                                   d_ex_erreur_type_argument;
                           return;
                       }
   
                     if (s_objet_element == NULL)                      if ((format_chaine = conversion_majuscule((unsigned char *)
                               (*(*l_element_courant_format).donnee).objet))
                               == NULL)
                     {                      {
                           (*s_etat_processus).erreur_systeme =
                                   d_es_allocation_memoire;
                           return;
                       }
   
                       if (strncmp("LENGTH*(", format_chaine, 8) != 0)
                       {
                           liberation(s_etat_processus, s_objet_argument_1);
                         liberation(s_etat_processus, s_objet_resultat);                          liberation(s_etat_processus, s_objet_resultat);
                           free(format_chaine);
   
                           (*s_etat_processus).erreur_execution =
                                   d_ex_erreur_format_fichier;
                         return;                          return;
                     }                      }
   
                     if ((*s_objet_resultat).objet == NULL)                      longueur = (integer8) strlen(format_chaine);
   
                       if (format_chaine[longueur - 1] != ')')
                     {                      {
                         if (((*s_objet_resultat).objet = allocation_maillon(                          liberation(s_etat_processus, s_objet_argument_1);
                                 s_etat_processus)) == NULL)                          liberation(s_etat_processus, s_objet_resultat);
                         {                          free(format_chaine);
                             (*s_etat_processus).erreur_systeme =  
                                     d_es_allocation_memoire;  
                             return;  
                         }  
   
                         (*((struct_liste_chainee *) (*s_objet_resultat).objet))                          (*s_etat_processus).erreur_execution =
                                 .donnee = s_objet_element;                                  d_ex_erreur_format_fichier;
                         l_element_courant = (*s_objet_resultat).objet;                          return;
                       }
   
                       format_chaine[longueur] = d_code_fin_chaine;
   
                       if (format_chaine[8] == '*')
                       {
                           format_degenere = d_vrai;
                     }                      }
                     else                      else
                     {                      {
                         if ((l_element_suivant = allocation_maillon(                          // Détermination de la longueur
                                 s_etat_processus)) == NULL)                          format_degenere = d_faux;
   
                           if (sscanf(&(format_chaine[8]), "%lld", &longueur) != 1)
                         {                          {
                             (*s_etat_processus).erreur_systeme =                              liberation(s_etat_processus, s_objet_argument_1);
                                     d_es_allocation_memoire;                              liberation(s_etat_processus, s_objet_resultat);
                               free(format_chaine);
   
                               (*s_etat_processus).erreur_execution =
                                       d_ex_erreur_format_fichier;
                             return;                              return;
                         }                          }
   
                         (*l_element_courant).suivant = l_element_suivant;  
                         (*l_element_suivant).donnee = s_objet_element;  
                         l_element_courant = l_element_suivant;  
                     }                      }
                 }  
   
                 // On saute les caractère des gestion de la commande                      free(format_chaine);
                 // BACKSPACE.                      tampon3 = NULL;
                 // A FAIRE  
             }  
         }  
         else  
         {  
             /*  
              * Fichiers de type FLOW  
              */  
   
             if ((*((struct_fichier *) (*s_objet_argument_1).objet)).acces                      if (format_degenere == d_vrai)
                     == 'S')                      {
             {                          if (device == d_vrai)
                 /*                          {
                  * Fichiers séquentiels                              longueur_questure = 4096;
                  */                              index = 0;
   
                 BUG(((*descripteur).type != 'C'), uprintf("Bad filtype !\n"));                              if ((tampon3 = malloc(((size_t) longueur_questure) *
                 longueur_enregistrement = 0;                                      sizeof(unsigned char))) == NULL)
                               {
                                   (*s_etat_processus).erreur_systeme =
                                           d_es_allocation_memoire;
                                   return;
                               }
   
                 if ((position_initiale = ftell((*descripteur).descripteur_c))                              tampon3[index] = d_code_fin_chaine;
                         == -1)  
                 {  
                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;  
                     return;  
                 }  
   
                 do                              fds[0].fd = fileno((*descripteur).descripteur_c);
                 {                              fds[0].events = POLLIN;
                     c = getc((*descripteur).descripteur_c);                              fds[0].revents = 0;
                     longueur_enregistrement++;  
                 } while((c != '\n') && (c != EOF));  
   
                 if (fseek((*descripteur).descripteur_c, position_initiale,                              tcgetattr(fileno((*descripteur).descripteur_c),
                         SEEK_SET) != 0)                                      &tc);
                 {                              timeout = 0;
                     liberation(s_etat_processus, s_objet_argument_1);  
   
                     (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;                              for(i = 0; vitesses[i] != 0; i++)
                     return;                              {
                 }                                  if (cfgetispeed(&tc) == vitesses_constantes[i])
                                   {
                                       // La durée entre deux caractères sur le
                                       // périphérique série ne doit pas dépasser
                                       // la moitié de la durée de transmission
                                       // d'un caractère complet.
   
                                       timeout = (int) (((double) 1000) /
                                               (((double) vitesses_constantes[i]) /
                                               4));
                                       break;
                                   }
                               }
                           }
   
                 if ((tampon_lecture = malloc((longueur_enregistrement + 1)                          do
                         * sizeof(unsigned char))) == NULL)                          {
                 {                              if (device == d_vrai)
                     (*s_etat_processus).erreur_systeme =                              {
                             d_es_allocation_memoire;                                  if (poll(fds, 1, timeout) == 0)
                     return;                                  {
                 }                                      break;
                                   }
                               }
   
                 longueur_effective = fread(tampon_lecture,                              c = getc((*descripteur).descripteur_c);
                         (size_t) sizeof(unsigned char),                              longueur_enregistrement++;
                         (size_t) longueur_enregistrement,  
                         (*descripteur).descripteur_c);  
   
                 if ((s_objet_resultat = allocation(s_etat_processus, LST))                              if (device == d_vrai)
                         == NULL)                              {
                 {                                  if (longueur_enregistrement >=
                     (*s_etat_processus).erreur_systeme =                                          longueur_questure)
                             d_es_allocation_memoire;                                  {
                     return;                                      if ((tampon3 = realloc(tampon3,
                 }                                              (size_t) (longueur_questure *= 2)))
                                               == NULL)
                                       {
                                           (*s_etat_processus).erreur_systeme =
                                                   d_es_allocation_memoire;
                                           return;
                                       }
                                   }
   
                 if (((*s_objet_resultat).objet =                                  tampon3[index++] = (unsigned char) c;
                         allocation_maillon(s_etat_processus)) == NULL)                              }
                 {                          } while(c != EOF);
                     (*s_etat_processus).erreur_systeme =  
                             d_es_allocation_memoire;  
                     return;  
                 }  
   
                 (*((struct_liste_chainee *) (*s_objet_resultat).objet))                          if (device == d_faux)
                         .suivant = NULL;                          {
                               if (fseek((*descripteur).descripteur_c,
                                       (long) position_initiale, SEEK_SET) != 0)
                               {
                                   liberation(s_etat_processus,
                                           s_objet_argument_1);
                                   liberation(s_etat_processus, s_objet_resultat);
   
                 if (((*((struct_liste_chainee *) (*s_objet_resultat).objet))                                  (*s_etat_processus).erreur_systeme =
                         .donnee = allocation(s_etat_processus, CHN)) == NULL)                                          d_es_erreur_fichier;
                 {                                  return;
                     (*s_etat_processus).erreur_systeme =                              }
                             d_es_allocation_memoire;                          }
                     return;                      }
                 }                      else
                       {
                           longueur_enregistrement = longueur;
                       }
   
                       if ((device == d_vrai) && (format_degenere == d_vrai))
                       {
                           longueur_effective = longueur_enregistrement;
                           tampon_lecture = tampon3;
                       }
                       else
                       {
                           if ((tampon_lecture = malloc(((size_t)
                                   longueur_enregistrement) *
                                   sizeof(unsigned char))) == NULL)
                           {
                               (*s_etat_processus).erreur_systeme =
                                       d_es_allocation_memoire;
                               return;
                           }
   
                 longueur_enregistrement = 1;                          longueur_effective = (integer8) fread(tampon_lecture,
                                   sizeof(unsigned char),
                                   (size_t) longueur_enregistrement,
                                   (*descripteur).descripteur_c);
                       }
   
                 for(i = 0; i < longueur_effective; i++)                      if (l_element_courant == NULL)
                 {  
                     if (isprint(tampon_lecture[i]) != 0)  
                     {                      {
                         longueur_enregistrement += 4;                          // Premier maillon de la liste
                           if (((*s_objet_resultat).objet =
                                   allocation_maillon(s_etat_processus)) == NULL)
                           {
                               (*s_etat_processus).erreur_systeme =
                                       d_es_allocation_memoire;
                               return;
                           }
   
                           l_element_courant = (*s_objet_resultat).objet;
                     }                      }
                     else                      else
                     {                      {
                         longueur_enregistrement++;                          if (((*l_element_courant).suivant =
                                   allocation_maillon(s_etat_processus)) == NULL)
                           {
                               (*s_etat_processus).erreur_systeme =
                                       d_es_allocation_memoire;
                               return;
                           }
   
                           l_element_courant = (*l_element_courant).suivant;
                     }                      }
                 }  
   
                 if ((tampon = malloc(longueur_enregistrement *                      (*l_element_courant).suivant = NULL;
                         sizeof(unsigned char))) == NULL)  
                 {  
                     (*s_etat_processus).erreur_systeme =  
                             d_es_allocation_memoire;  
                     return;  
                 }  
   
                 ptr = tampon;                      if (((*l_element_courant).donnee =
                               allocation(s_etat_processus, CHN)) == NULL)
                       {
                           (*s_etat_processus).erreur_systeme =
                                   d_es_allocation_memoire;
                           return;
                       }
   
                 for(i = 0; i < longueur_effective; i++)                      if (format_degenere == d_vrai)
                 {  
                     if (isprint(tampon_lecture[i]) != 0)  
                     {                      {
                         (*ptr) = tampon_lecture[i];                          if (device == d_faux)
                         ptr++;                          {
                               if (((*(*l_element_courant).donnee).objet =
                                   analyse_flux(s_etat_processus, tampon_lecture,
                                   longueur_enregistrement - 1)) == NULL)
                               {
                                   return;
                               }
                           }
                           else
                           {
                               if (((*(*l_element_courant).donnee).objet =
                                   analyse_flux(s_etat_processus, tampon_lecture,
                                   longueur_enregistrement)) == NULL)
                               {
                                   return;
                               }
                           }
                     }                      }
                     else                      else
                     {                      {
                         (*ptr) = '\\';                          if (((*(*l_element_courant).donnee).objet =
                         ptr++;                              analyse_flux(s_etat_processus, tampon_lecture,
                         (*ptr) = 'x';                              longueur_enregistrement)) == NULL)
                         ptr++;                          {
                         sprintf(ptr, "%02X", tampon_lecture[i]);                              return;
                         ptr += 2;                          }
                     }                      }
                 }  
   
                 (*ptr) = d_code_fin_chaine;                      free(tampon_lecture);
                 free(tampon_lecture);  
                 ((*(*((struct_liste_chainee *) (*s_objet_resultat).objet))                      l_element_courant_format =
                         .donnee)).objet = tampon;                              (*l_element_courant_format).suivant;
                   }
   
                 if (empilement(s_etat_processus,                  if (empilement(s_etat_processus,
                         &((*s_etat_processus).l_base_pile),                          &((*s_etat_processus).l_base_pile),
Line 2210  printf("L=%d\n", longueur_enregistrement Line 2357  printf("L=%d\n", longueur_enregistrement
   
         if ((*((struct_socket *) (*s_objet_argument_1).objet)).binaire == 'N')          if ((*((struct_socket *) (*s_objet_argument_1).objet)).binaire == 'N')
         { // Socket formatée          { // Socket formatée
             longueur_questure = 256;              longueur_questure = 4096;
             longueur_effective = 0;              longueur_effective = 0;
             tampon_lecture = NULL;              tampon_lecture = NULL;
   
             attente.tv_sec = 0;              attente.tv_sec = 0;
             attente.tv_nsec = GRANULARITE_us * 1000;              attente.tv_nsec = GRANULARITE_us * 1000;
   
               trame_complete = d_faux;
               position_initiale = 0;
               position_finale = 0;
   
             do              do
             {              {
                 presence_indicateur = d_faux;                  presence_indicateur = d_faux;
   
                 if ((tampon_lecture = realloc(tampon_lecture,                  if ((tampon_lecture = realloc(tampon_lecture,
                         (longueur_effective + longueur_questure)                          ((size_t) (longueur_effective + longueur_questure + 1))
                         * sizeof(unsigned char))) == NULL)                          * sizeof(unsigned char))) == NULL)
                 {                  {
                     (*s_etat_processus).erreur_systeme =                      (*s_etat_processus).erreur_systeme =
Line 2244  printf("L=%d\n", longueur_enregistrement Line 2395  printf("L=%d\n", longueur_enregistrement
                         .domaine == PF_UNIX)                          .domaine == PF_UNIX)
                 {                  {
                     longueur_adresse = sizeof(adresse_unix);                      longueur_adresse = sizeof(adresse_unix);
                     ios = recvfrom((*((struct_socket *)  
                             (*s_objet_argument_1).objet)).socket,                      do
                             tampon_lecture + longueur_effective,                      {
                             longueur_questure,                          ios = (int) recvfrom((*((struct_socket *)
                             MSG_PEEK | MSG_DONTWAIT, (struct sockaddr *)                                  (*s_objet_argument_1).objet)).socket,
                             &adresse_unix, &longueur_adresse);                                  tampon_lecture, (size_t) (longueur_effective +
                                   longueur_questure),
                                   MSG_PEEK | MSG_DONTWAIT, (struct sockaddr *)
                                   &adresse_unix, &longueur_adresse);
                       } while((ios == -1) && (errno == EINTR));
                 }                  }
                 else if ((*((struct_socket *) (*s_objet_argument_1).objet))                  else if ((*((struct_socket *) (*s_objet_argument_1).objet))
                         .domaine == PF_INET)                          .domaine == PF_INET)
                 {                  {
                     longueur_adresse = sizeof(adresse_ipv4);                      longueur_adresse = sizeof(adresse_ipv4);
                     ios = recvfrom((*((struct_socket *)  
                             (*s_objet_argument_1).objet)).socket,                      do
                             tampon_lecture + longueur_effective,                      {
                             longueur_questure,                          ios = (int) recvfrom((*((struct_socket *)
                             MSG_PEEK | MSG_DONTWAIT, (struct sockaddr *)                                  (*s_objet_argument_1).objet)).socket,
                             &adresse_ipv4, &longueur_adresse);                                  tampon_lecture, (size_t) (longueur_effective +
                                   longueur_questure),
                                   MSG_PEEK | MSG_DONTWAIT, (struct sockaddr *)
                                   &adresse_ipv4, &longueur_adresse);
                       } while((ios == -1) && (errno == EINTR));
                 }                  }
                 else if ((*((struct_socket *) (*s_objet_argument_1).objet))                  else if ((*((struct_socket *) (*s_objet_argument_1).objet))
                         .domaine == PF_INET6)                          .domaine == PF_INET6)
                 {                  {
 #                   ifdef IPV6  #                   ifdef IPV6
                     longueur_adresse = sizeof(adresse_ipv6);                      longueur_adresse = sizeof(adresse_ipv6);
                     ios = recvfrom((*((struct_socket *)                      
                             (*s_objet_argument_1).objet)).socket,                      do
                             tampon_lecture + longueur_effective,                      {
                             longueur_questure,                          ios = (int) recvfrom((*((struct_socket *)
                             MSG_PEEK | MSG_DONTWAIT, (struct sockaddr *)                                  (*s_objet_argument_1).objet)).socket,
                             &adresse_ipv6, &longueur_adresse);                                  tampon_lecture, (size_t) (longueur_effective +
                                   longueur_questure),
                                   MSG_PEEK | MSG_DONTWAIT, (struct sockaddr *)
                                   &adresse_ipv6, &longueur_adresse);
                       } while((ios == -1) && (errno == EINTR));
 #                   else  #                   else
                     if ((*s_etat_processus).langue == 'F')                      if ((*s_etat_processus).langue == 'F')
                     {                      {
Line 2312  printf("L=%d\n", longueur_enregistrement Line 2475  printf("L=%d\n", longueur_enregistrement
                     return;                      return;
                 }                  }
   
                 if (ios < 0)                  if (ios <= 0)
                 {                  {
                     nanosleep(&attente, NULL);                      nanosleep(&attente, NULL);
                     INCR_GRANULARITE(attente.tv_nsec);                      INCR_GRANULARITE(attente.tv_nsec);
                     scrutation_injection(s_etat_processus);  
                 }                  }
                 else                  else
                 {                  {
Line 2324  printf("L=%d\n", longueur_enregistrement Line 2486  printf("L=%d\n", longueur_enregistrement
                     attente.tv_nsec = GRANULARITE_us * 1000;                      attente.tv_nsec = GRANULARITE_us * 1000;
                 }                  }
   
                   scrutation_injection(s_etat_processus);
   
                 if ((*s_etat_processus).var_volatile_requete_arret == -1)                  if ((*s_etat_processus).var_volatile_requete_arret == -1)
                 {                  {
                     longueur_effective += ios;                      if (ios >= 0)
                       {
                           longueur_effective = ios;
                       }
   
                     break;                      break;
                 }                  }
   
Line 2334  printf("L=%d\n", longueur_enregistrement Line 2502  printf("L=%d\n", longueur_enregistrement
   
                 if (ios >= 0)                  if (ios >= 0)
                 {                  {
                     ancienne_longueur_effective = longueur_effective;                      longueur_effective = ios;
                     longueur_effective += ios;  
                     position_initiale = 0;                      position_initiale = 0;
                     presence_indicateur = d_faux;                      presence_indicateur = d_faux;
   
Line 2363  printf("L=%d\n", longueur_enregistrement Line 2530  printf("L=%d\n", longueur_enregistrement
   
                             if (caractere == '"')                              if (caractere == '"')
                             {                              {
                                 presence_chaine =                                  if (position_finale > 0)
                                         (presence_chaine == d_vrai)                                  {
                                         ? d_faux : d_vrai;                                      if (tampon_lecture[position_finale - 1]
                                               != '\\')
                                       {
                                           presence_chaine = (presence_chaine ==
                                                   d_vrai) ? d_faux : d_vrai;
                                       }
                                   }
                                   else
                                   {
                                       presence_chaine =
                                               (presence_chaine == d_vrai)
                                               ? d_faux : d_vrai;
                                   }
                             }                              }
                             else                              else
                             {                              {
Line 2385  printf("L=%d\n", longueur_enregistrement Line 2564  printf("L=%d\n", longueur_enregistrement
                             if (niveau == 0)                              if (niveau == 0)
                             {                              {
                                 presence_indicateur = d_vrai;                                  presence_indicateur = d_vrai;
                                   trame_complete = d_vrai;
                                 break;                                  break;
                             }                              }
   
Line 2392  printf("L=%d\n", longueur_enregistrement Line 2572  printf("L=%d\n", longueur_enregistrement
                         }                          }
                     }                      }
   
                     // On retire du buffer position_finale -                      // On retire une trame du buffer.
                     // ancienne_longueur_effective octets.  
   
                     if ((*((struct_socket *) (*s_objet_argument_1).objet))                      if (trame_complete == d_vrai)
                             .domaine == PF_UNIX)  
                     {  
                         longueur_adresse = sizeof(adresse_unix);  
                         ios = recvfrom((*((struct_socket *)  
                                 (*s_objet_argument_1).objet)).socket,  
                                 poubelle, position_finale  
                                 - ancienne_longueur_effective,  
                                 MSG_DONTWAIT, (struct sockaddr *)  
                                 &adresse_unix, &longueur_adresse);  
                     }  
                     else if ((*((struct_socket *) (*s_objet_argument_1)  
                             .objet)).domaine == PF_INET)  
                     {  
                         longueur_adresse = sizeof(adresse_ipv4);  
                         ios = recvfrom((*((struct_socket *)  
                                 (*s_objet_argument_1).objet)).socket,  
                                 poubelle, position_finale  
                                 - ancienne_longueur_effective,  
                                 MSG_DONTWAIT, (struct sockaddr *)  
                                 &adresse_ipv4, &longueur_adresse);  
                     }  
                     else if ((*((struct_socket *) (*s_objet_argument_1)  
                             .objet)) .domaine == PF_INET6)  
                     {                      {
 #                       ifdef IPV6                          if ((*((struct_socket *) (*s_objet_argument_1).objet))
                         longueur_adresse = sizeof(adresse_ipv6);                                  .domaine == PF_UNIX)
                         ios = recvfrom((*((struct_socket *)  
                                 (*s_objet_argument_1).objet)).socket,  
                                 poubelle, position_finale  
                                 - ancienne_longueur_effective,  
                                 MSG_DONTWAIT, (struct sockaddr *)  
                                 &adresse_ipv6, &longueur_adresse);  
 #                       else  
                         if ((*s_etat_processus).langue == 'F')  
                         {                          {
                             printf("+++Attention : Support du protocole"                              do
                                     " IPv6 indisponible\n");                              {
                                   longueur_adresse = sizeof(adresse_unix);
                                   recvfrom((*((struct_socket *)
                                           (*s_objet_argument_1).objet)).socket,
                                           tampon_lecture,
                                           (size_t) longueur_effective,
                                           0, (struct sockaddr *)
                                           &adresse_unix, &longueur_adresse);
                               } while((ios == -1) && (errno == EINTR));
                         }                          }
                         else                          else if ((*((struct_socket *) (*s_objet_argument_1)
                                   .objet)).domaine == PF_INET)
                         {                          {
                             printf("+++Warning : IPv6 support "                              do
                                     "unavailable\n");                              {
                                   longueur_adresse = sizeof(adresse_ipv4);
                                   recvfrom((*((struct_socket *)
                                           (*s_objet_argument_1).objet)).socket,
                                           tampon_lecture,
                                           (size_t) longueur_effective,
                                           0, (struct sockaddr *)
                                           &adresse_ipv4, &longueur_adresse);
                               } while((ios == -1) && (errno == EINTR));
                           }
                           else if ((*((struct_socket *) (*s_objet_argument_1)
                                   .objet)) .domaine == PF_INET6)
                           {
   #                           ifdef IPV6
                               do
                               {
                                   longueur_adresse = sizeof(adresse_ipv6);
                                   recvfrom((*((struct_socket *)
                                           (*s_objet_argument_1).objet)).socket,
                                           tampon_lecture,
                                           (size_t) longueur_effective,
                                           0, (struct sockaddr *)
                                           &adresse_ipv6, &longueur_adresse);
                               } while((ios == -1) && (errno == EINTR));
   #                           else
                               if ((*s_etat_processus).langue == 'F')
                               {
                                   printf("+++Attention : Support du protocole"
                                           " IPv6 indisponible\n");
                               }
                               else
                               {
                                   printf("+++Warning : IPv6 support "
                                           "unavailable\n");
                               }
   
   #                           endif
                         }                          }
   
                         longueur_adresse = 0;                          longueur_effective = ios;
 #                       endif  
                     }                      }
                       else
                     if (presence_indicateur == d_faux)  
                     {                      {
                         poll_fd.fd = (*((struct_socket *)                          // Si on a lu toute une trame et qu'on n'a pas
                                 (*s_objet_argument_1).objet)).socket;                          // réussi à en trouver la structure, on remonte
                         poll_fd.events = POLLIN;                          // une erreur de syntaxe.
   
                         while((ios = poll(&poll_fd, 1, 100)) <= 0)                          if (longueur_effective == ios)
                         {                          {
                             // La fin de la trame n'est pas atteinte                              if ((*((struct_socket *) (*s_objet_argument_1)
                             // et il reste quelque chose à lire.                                      .objet)).domaine == PF_UNIX)
   
                             switch(ios)  
                             {                              {
                                 case EINTR:                                  do
                                 {                                  {
                                     break;                                      longueur_adresse = sizeof(adresse_unix);
                                       recvfrom((*((struct_socket *)
                                               (*s_objet_argument_1).objet))
                                               .socket, tampon_lecture,
                                               (size_t) longueur_effective,
                                               0, (struct sockaddr *)
                                               &adresse_unix, &longueur_adresse);
                                   } while((ios == -1) && (errno == EINTR));
                               }
                               else if ((*((struct_socket *) (*s_objet_argument_1)
                                       .objet)).domaine == PF_INET)
                               {
                                   do
                                   {
                                       longueur_adresse = sizeof(adresse_ipv4);
                                       recvfrom((*((struct_socket *)
                                               (*s_objet_argument_1).objet))
                                               .socket, tampon_lecture,
                                               (size_t) longueur_effective,
                                               0, (struct sockaddr *)
                                               &adresse_ipv4, &longueur_adresse);
                                   } while((ios == -1) && (errno == EINTR));
                               }
                               else if ((*((struct_socket *) (*s_objet_argument_1)
                                       .objet)) .domaine == PF_INET6)
                               {
   #                               ifdef IPV6
                                   do
                                   {
                                       longueur_adresse = sizeof(adresse_ipv6);
                                       recvfrom((*((struct_socket *)
                                               (*s_objet_argument_1).objet))
                                               .socket, tampon_lecture,
                                               (size_t) longueur_effective,
                                               0, (struct sockaddr *)
                                               &adresse_ipv6, &longueur_adresse);
                                   } while((ios == -1) && (errno == EINTR));
   #                               else
                                   if ((*s_etat_processus).langue == 'F')
                                   {
                                       printf("+++Attention : Support du protocole"
                                               " IPv6 indisponible\n");
                                 }                                  }
                                   else
                                 case 0:  
                                 {                                  {
                                     liberation(s_etat_processus,                                      printf("+++Warning : IPv6 support "
                                             s_objet_argument_1);                                              "unavailable\n");
                                     free(tampon_lecture);  
   
                                     (*s_etat_processus).erreur_execution =  
                                             d_ex_fin_de_fichier_atteinte;  
                                     return;  
                                 }                                  }
   
   #                               endif
                             }                              }
   
                               liberation(s_etat_processus, s_objet_argument_1);
                               free(tampon_lecture);
   
                               (*s_etat_processus).erreur_execution = d_ex_syntaxe;
                               return;
                         }                          }
                     }                      }
                 }                  }
Line 2514  printf("L=%d\n", longueur_enregistrement Line 2746  printf("L=%d\n", longueur_enregistrement
                             d_ex_erreur_acces_fichier;                              d_ex_erreur_acces_fichier;
                     return;                      return;
                 }                  }
             } while(presence_indicateur == d_faux);              } while(trame_complete == d_faux);
   
             tampon_lecture[++position_finale] = d_code_fin_chaine;              tampon_lecture[++position_finale] = d_code_fin_chaine;
             tampon = (*s_etat_processus).instruction_courante;              tampon = (*s_etat_processus).instruction_courante;
             (*s_etat_processus).instruction_courante = &(tampon_lecture              (*s_etat_processus).instruction_courante = tampon_lecture;
                     [position_initiale]);  
   
             indicateur_48 = test_cfsf(s_etat_processus, 48);              indicateur_48 = test_cfsf(s_etat_processus, 48);
             cf(s_etat_processus, 48);              cf(s_etat_processus, 48);
Line 2531  printf("L=%d\n", longueur_enregistrement Line 2762  printf("L=%d\n", longueur_enregistrement
                 (*s_etat_processus).instruction_courante = tampon;                  (*s_etat_processus).instruction_courante = tampon;
                 free(tampon_lecture);                  free(tampon_lecture);
                                   
                   if (indicateur_48 == d_vrai)
                   {
                       sf(s_etat_processus, 48);
                   }
                   else
                   {
                       cf(s_etat_processus, 48);
                   }
   
                   if ((*s_etat_processus).var_volatile_requete_arret == -1)
                   {
                       (*s_etat_processus).erreur_execution = d_ex;
                   }
   
                 liberation(s_etat_processus, s_objet_argument_1);                  liberation(s_etat_processus, s_objet_argument_1);
                 return;                  return;
             }              }
Line 2763  printf("L=%d\n", longueur_enregistrement Line 3008  printf("L=%d\n", longueur_enregistrement
                 longueur_adresse = 0;                  longueur_adresse = 0;
                 recvfrom((*((struct_socket *)                  recvfrom((*((struct_socket *)
                         (*s_objet_argument_1).objet)).socket, tampon_lecture,                          (*s_objet_argument_1).objet)).socket, tampon_lecture,
                         position_finale, MSG_DONTWAIT,                          (size_t) position_finale, MSG_DONTWAIT,
                         NULL, &longueur_adresse);                          NULL, &longueur_adresse);
             }              }
   
Line 2777  printf("L=%d\n", longueur_enregistrement Line 3022  printf("L=%d\n", longueur_enregistrement
         }          }
         else if ((*((struct_socket *) (*s_objet_argument_1).objet)).binaire          else if ((*((struct_socket *) (*s_objet_argument_1).objet)).binaire
                 == 'Y')                  == 'Y')
         { // UNFORMATTED          { // socket non formatée
               longueur_questure = 4096;
               longueur_effective = 0;
               tampon_lecture = NULL;
   
               attente.tv_sec = 0;
               attente.tv_nsec = GRANULARITE_us * 1000;
   
               trame_complete = d_faux;
               position_initiale = 0;
               position_finale = 0;
   
               do
               {
                   presence_indicateur = d_faux;
   
                   if ((tampon_lecture = realloc(tampon_lecture,
                           ((size_t) (longueur_effective + longueur_questure) + 1)
                           * sizeof(unsigned char))) == NULL)
                   {
                       (*s_etat_processus).erreur_systeme =
                               d_es_allocation_memoire;
                       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;
                   }
   
                   if ((*((struct_socket *) (*s_objet_argument_1).objet))
                           .domaine == PF_UNIX)
                   {
                       longueur_adresse = sizeof(adresse_unix);
   
                       do
                       {
                           ios = (int) recvfrom((*((struct_socket *)
                                   (*s_objet_argument_1).objet)).socket,
                                   tampon_lecture, (size_t)
                                   (longueur_effective + longueur_questure),
                                   MSG_PEEK | MSG_DONTWAIT, (struct sockaddr *)
                                   &adresse_unix, &longueur_adresse);
                       } while((ios == -1) && (errno == EINTR));
                   }
                   else if ((*((struct_socket *) (*s_objet_argument_1).objet))
                           .domaine == PF_INET)
                   {
                       longueur_adresse = sizeof(adresse_ipv4);
   
                       do
                       {
                           ios = (int) recvfrom((*((struct_socket *)
                                   (*s_objet_argument_1).objet)).socket,
                                   tampon_lecture, (size_t)
                                   (longueur_effective + longueur_questure),
                                   MSG_PEEK | MSG_DONTWAIT, (struct sockaddr *)
                                   &adresse_ipv4, &longueur_adresse);
                       } while((ios == -1) && (errno == EINTR));
                   }
                   else if ((*((struct_socket *) (*s_objet_argument_1).objet))
                           .domaine == PF_INET6)
                   {
   #                   ifdef IPV6
                       longueur_adresse = sizeof(adresse_ipv6);
                       
                       do
                       {
                           ios = (int) recvfrom((*((struct_socket *)
                                   (*s_objet_argument_1).objet)).socket,
                                   tampon_lecture, (size_t)
                                   (longueur_effective + longueur_questure),
                                   MSG_PEEK | MSG_DONTWAIT, (struct sockaddr *)
                                   &adresse_ipv6, &longueur_adresse);
                       } while((ios == -1) && (errno == EINTR));
   #                   else
                       if ((*s_etat_processus).langue == 'F')
                       {
                           printf("+++Attention : Support du protocole"
                                   " IPv6 indisponible\n");
                       }
                       else
                       {
                           printf("+++Warning : IPv6 support "
                                   "unavailable\n");
                       }
   
                       longueur_adresse = 0;
                       longueur_effective = 0;
                       ios = 0;
   #                   endif
                   }
                   else
                   {
                       free(tampon_lecture);
                       liberation(s_etat_processus, s_objet_argument_1);
   
   #                   ifndef SEMAPHORES_NOMMES
                           while(sem_wait(&((*s_etat_processus)
                                   .semaphore_fork)) != 0)
   #                   else
                           while(sem_wait((*s_etat_processus)
                                   .semaphore_fork) != 0)
   #                   endif
                       {
                           (*s_etat_processus).erreur_systeme =
                                   d_es_processus;
                       }
   
                       (*s_etat_processus).erreur_execution =
                               d_ex_erreur_acces_fichier;
                       return;
                   }
   
                   if (ios <= 0)
                   {
                       nanosleep(&attente, NULL);
                       INCR_GRANULARITE(attente.tv_nsec);
                   }
                   else
                   {
                       attente.tv_sec = 0;
                       attente.tv_nsec = GRANULARITE_us * 1000;
                   }
   
                   scrutation_injection(s_etat_processus);
   
                   if ((*s_etat_processus).var_volatile_requete_arret == -1)
                   {
                       if (ios >= 0)
                       {
                           longueur_effective += ios;
                       }
   
                       break;
                   }
   
                   // Une donnée a été reçue.
   
                   if (ios == (longueur_effective + longueur_questure))
                   {
                       longueur_effective = ios;
                       position_initiale = 0;
                       presence_indicateur = d_faux;
                   }
                   else if (ios > 0)
                   {
                       // On retire une trame du buffer.
   
                       if ((*((struct_socket *) (*s_objet_argument_1).objet))
                               .domaine == PF_UNIX)
                       {
                           do
                           {
                               longueur_adresse = sizeof(adresse_unix);
                               recvfrom((*((struct_socket *)
                                       (*s_objet_argument_1).objet)).socket,
                                       tampon_lecture, (size_t) longueur_effective,
                                       0, (struct sockaddr *)
                                       &adresse_unix, &longueur_adresse);
                           } while((ios == -1) && (errno == EINTR));
                       }
                       else if ((*((struct_socket *) (*s_objet_argument_1)
                               .objet)).domaine == PF_INET)
                       {
                           do
                           {
                               longueur_adresse = sizeof(adresse_ipv4);
                               recvfrom((*((struct_socket *)
                                       (*s_objet_argument_1).objet)).socket,
                                       tampon_lecture, (size_t) longueur_effective,
                                       0, (struct sockaddr *)
                                       &adresse_ipv4, &longueur_adresse);
                           } while((ios == -1) && (errno == EINTR));
                       }
                       else if ((*((struct_socket *) (*s_objet_argument_1)
                               .objet)) .domaine == PF_INET6)
                       {
   #                       ifdef IPV6
                           do
                           {
                               longueur_adresse = sizeof(adresse_ipv6);
                               recvfrom((*((struct_socket *)
                                       (*s_objet_argument_1).objet)).socket,
                                       tampon_lecture, (size_t) longueur_effective,
                                       0, (struct sockaddr *)
                                       &adresse_ipv6, &longueur_adresse);
                           } while((ios == -1) && (errno == EINTR));
   #                       else
                           if ((*s_etat_processus).langue == 'F')
                           {
                               printf("+++Attention : Support du protocole"
                                       " IPv6 indisponible\n");
                           }
                           else
                           {
                               printf("+++Warning : IPv6 support "
                                       "unavailable\n");
                           }
   #                       endif
                       }
   
                       longueur_effective = ios;
                       trame_complete = d_vrai;
                   }
   
   #               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 ((*s_etat_processus).var_volatile_requete_arret == -1)
                   {
   
                       /*
                        * Si le père tue le processus courant grâce au signal
                        * SIGFSTOP, on ne renvoie pas d'erreur. Ce fonctionnement
                        * correspond à l'utilisation de STOP sur le processus
                        * en cours. La variable longueur_effective vaut '-1'.
                        */
   
                       free(tampon_lecture);
                       liberation(s_etat_processus, s_objet_argument_1);
                       return;
                   }
   
                   if (longueur_effective == -1)
                   {
                       free(tampon_lecture);
                       liberation(s_etat_processus, s_objet_argument_1);
   
                       (*s_etat_processus).erreur_execution =
                               d_ex_erreur_acces_fichier;
                       return;
                   }
               } while(trame_complete == d_faux);
   
               /*
                * Création de la liste de sortie
                */
   
               ptr = tampon_lecture;
   
               if ((s_objet_type = lecture_fichier_non_formate(s_etat_processus,
                       &ptr, longueur_effective, d_faux)) == NULL)
               {
                   free(tampon_lecture);
   
                   (*s_etat_processus).erreur_execution = d_ex_syntaxe;
                   return;
               }
   
               if ((s_objet_resultat = allocation(s_etat_processus, LST))
                       == NULL)
               {
                   (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                   return;
               }
   
               if (((*s_objet_resultat).objet =
                       allocation_maillon(s_etat_processus)) == NULL)
               {
                   (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                   return;
               }
   
               (*((struct_liste_chainee *) (*s_objet_resultat).objet))
                       .donnee = s_objet_type;
   
               if (((*((struct_liste_chainee *) (*s_objet_resultat).objet))
                       .suivant = allocation_maillon(s_etat_processus)) == NULL)
               {
                   (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                   return;
               }
   
               (*(*((struct_liste_chainee *) (*s_objet_resultat).objet)).suivant)
                       .suivant = NULL;
   
               if ((s_objet_adresse = allocation(s_etat_processus, LST))
                       == NULL)
               {
                   (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                   return;
               }
   
               (*(*((struct_liste_chainee *) (*s_objet_resultat).objet)).suivant)
                       .donnee = s_objet_adresse;
   
               /*
                * Les informations concernant la cible sont valides si
                * la socket est non connectée et des domaines INET ou INET6.
                * Dans tous les autres cas, on renvoie une liste vide.
                */
   
               if (((*((struct_socket *) (*s_objet_argument_1).objet)).domaine
                       == PF_UNIX) || (strcmp((*((struct_socket *)
                       (*s_objet_argument_1).objet)).type, "STREAM") == 0) ||
                       (strcmp((*((struct_socket *) (*s_objet_argument_1).objet))
                       .type, "SEQUENTIAL DATAGRAM") == 0))
               {
                   (*s_objet_adresse).objet = NULL;
               }
               else if ((*((struct_socket *) (*s_objet_argument_1).objet))
                       .domaine == PF_INET)
               {
                   if (((*s_objet_adresse).objet =
                           allocation_maillon(s_etat_processus)) == NULL)
                   {
                       (*s_etat_processus).erreur_systeme =
                               d_es_allocation_memoire;
                       return;
                   }
   
                   if (((*((struct_liste_chainee *) (*s_objet_adresse).objet))
                           .donnee = allocation(s_etat_processus, VIN)) == NULL)
                   {
                       (*s_etat_processus).erreur_systeme =
                               d_es_allocation_memoire;
                       return;
                   }
   
                   (*((struct_vecteur *) (*(*((struct_liste_chainee *)
                           (*s_objet_adresse).objet)).donnee).objet)).taille = 4;
   
                   if (((*((struct_vecteur *) (*(*((struct_liste_chainee *)
                           (*s_objet_adresse).objet)).donnee).objet)).tableau =
                           malloc(4 * sizeof(integer8))) == NULL)
                   {
                       (*s_etat_processus).erreur_systeme =
                               d_es_allocation_memoire;
                       return;
                   }
   
                   ((integer8 *) (*((struct_vecteur *)
                           (*(*((struct_liste_chainee *) (*s_objet_adresse)
                           .objet)).donnee).objet)).tableau)[0] =
                           (ntohl(adresse_ipv4.sin_addr.s_addr) >> 24) & 0xFF;
                   ((integer8 *) (*((struct_vecteur *)
                           (*(*((struct_liste_chainee *) (*s_objet_adresse)
                           .objet)).donnee).objet)).tableau)[1] =
                           (ntohl(adresse_ipv4.sin_addr.s_addr) >> 16) & 0xFF;
                   ((integer8 *) (*((struct_vecteur *)
                           (*(*((struct_liste_chainee *) (*s_objet_adresse)
                           .objet)).donnee).objet)).tableau)[2] =
                           (ntohl(adresse_ipv4.sin_addr.s_addr) >> 8) & 0xFF;
                   ((integer8 *) (*((struct_vecteur *)
                           (*(*((struct_liste_chainee *) (*s_objet_adresse)
                           .objet)).donnee).objet)).tableau)[3] =
                           ntohl(adresse_ipv4.sin_addr.s_addr) & 0xFF;
   
                   if (((*((struct_liste_chainee *) (*s_objet_adresse).objet))
                           .suivant = allocation_maillon(s_etat_processus))
                           == NULL)
                   {
                       (*s_etat_processus).erreur_systeme =
                               d_es_allocation_memoire;
                       return;
                   }
   
                   if (((*(*((struct_liste_chainee *) (*s_objet_adresse).objet))
                           .suivant).donnee = allocation(s_etat_processus, INT))
                           == NULL)
                   {
                       (*s_etat_processus).erreur_systeme =
                               d_es_allocation_memoire;
                       return;
                   }
   
                   (*((integer8 *) (*(*(*((struct_liste_chainee *)
                           (*s_objet_adresse).objet)).suivant).donnee).objet)) =
                           (integer8) ntohs(adresse_ipv4.sin_port);
   
                   (*(*((struct_liste_chainee *) (*s_objet_adresse).objet))
                           .suivant).suivant = NULL;
               }
               else if ((*((struct_socket *) (*s_objet_argument_1).objet))
                       .domaine == PF_INET6)
               {
   #               ifdef IPV6
                   if (((*s_objet_adresse).objet =
                           allocation_maillon(s_etat_processus)) == NULL)
                   {
                       (*s_etat_processus).erreur_systeme =
                               d_es_allocation_memoire;
                       return;
                   }
   
                   if (((*((struct_liste_chainee *) (*s_objet_adresse).objet))
                           .donnee = allocation(s_etat_processus, VIN)) == NULL)
                   {
                       (*s_etat_processus).erreur_systeme =
                               d_es_allocation_memoire;
                       return;
                   }
   
                   (*((struct_vecteur *) (*(*((struct_liste_chainee *)
                           (*s_objet_adresse).objet)).donnee).objet)).taille = 16;
   
                   if (((*((struct_vecteur *) (*(*((struct_liste_chainee *)
                           (*s_objet_adresse).objet)).donnee).objet)).tableau =
                           malloc(16 * sizeof(integer8))) == NULL)
                   {
                       (*s_etat_processus).erreur_systeme =
                               d_es_allocation_memoire;
                       return;
                   }
   
                   for(i = 0; i < 16; i++)
                   {
                       ((integer8 *) (*((struct_vecteur *)
                               (*(*((struct_liste_chainee *) (*s_objet_adresse)
                               .objet)).donnee).objet)).tableau)[0] =
                               adresse_ipv6.sin6_addr.s6_addr[i];
                   }
   
                   if (((*((struct_liste_chainee *) (*s_objet_adresse).objet))
                           .suivant = allocation_maillon(s_etat_processus))
                           == NULL)
                   {
                       (*s_etat_processus).erreur_systeme =
                               d_es_allocation_memoire;
                       return;
                   }
   
                   if (((*(*((struct_liste_chainee *) (*s_objet_adresse).objet))
                           .suivant).donnee = allocation(s_etat_processus, INT))
                           == NULL)
                   {
                       (*s_etat_processus).erreur_systeme =
                               d_es_allocation_memoire;
                       return;
                   }
   
                   (*((integer8 *) (*(*(*((struct_liste_chainee *)
                           (*s_objet_adresse).objet)).suivant).donnee).objet)) =
                           (integer8) ntohs(adresse_ipv6.sin6_port);
   
                   (*(*((struct_liste_chainee *) (*s_objet_adresse).objet))
                           .suivant).suivant = NULL;
   #               else
                   if ((*s_etat_processus).langue == 'F')
                   {
                       printf("+++Attention : Support du protocole"
                               " IPv6 indisponible\n");
                   }
                   else
                   {
                       printf("+++Warning : IPv6 support "
                               "unavailable\n");
                   }
   #               endif
               }
               else
               {
                   longueur_adresse = 0;
                   recvfrom((*((struct_socket *)
                           (*s_objet_argument_1).objet)).socket, tampon_lecture,
                           (size_t) position_finale, MSG_DONTWAIT,
                           NULL, &longueur_adresse);
               }
   
               free(tampon_lecture);
   
               if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                       s_objet_resultat) == d_erreur)
               {
                   return;
               }
         }          }
         else          else
         { // FLOW          { // FLOW
   #if 0
             longueur_questure = 256;              longueur_questure = 256;
   
             do              do
Line 3230  printf("L=%d\n", longueur_enregistrement Line 3957  printf("L=%d\n", longueur_enregistrement
             {              {
                 return;                  return;
             }              }
   #endif
         }          }
     }      }
     else      else

Removed from v.1.56  
changed lines
  Added in v.1.86


CVSweb interface <joel.bertrand@systella.fr>