File:  [local] / rpl / src / instructions_s8.c
Revision 1.15: download - view: text, annotated - select for diffs - revision graph
Fri Aug 6 15:26:50 2010 UTC (13 years, 8 months ago) by bertrand
Branches: MAIN
CVS tags: HEAD
Ajout du support pour OS/2.

    1: /*
    2: ================================================================================
    3:   RPL/2 (R) version 4.0.18
    4:   Copyright (C) 1989-2010 Dr. BERTRAND Joël
    5: 
    6:   This file is part of RPL/2.
    7: 
    8:   RPL/2 is free software; you can redistribute it and/or modify it
    9:   under the terms of the CeCILL V2 License as published by the french
   10:   CEA, CNRS and INRIA.
   11:  
   12:   RPL/2 is distributed in the hope that it will be useful, but WITHOUT
   13:   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
   14:   FITNESS FOR A PARTICULAR PURPOSE.  See the CeCILL V2 License
   15:   for more details.
   16:  
   17:   You should have received a copy of the CeCILL License
   18:   along with RPL/2. If not, write to info@cecill.info.
   19: ================================================================================
   20: */
   21: 
   22: 
   23: #include "rpl-conv.h"
   24: 
   25: 
   26: /*
   27: ================================================================================
   28:   Fonction 'splash'
   29: ================================================================================
   30:   Entrées :
   31: --------------------------------------------------------------------------------
   32:   Sorties :
   33: --------------------------------------------------------------------------------
   34:   Effets de bord : néant
   35: ================================================================================
   36: */
   37: 
   38: void
   39: instruction_splash(struct_processus *s_etat_processus)
   40: {
   41:     real8                       attente;
   42: 
   43:     struct_objet                *s_objet;
   44: 
   45:     (*s_etat_processus).erreur_execution = d_ex;
   46: 
   47:     if ((*s_etat_processus).affichage_arguments == 'Y')
   48:     {
   49:         printf("\n  SPLASH ");
   50: 
   51:         if ((*s_etat_processus).langue == 'F')
   52:         {
   53:             printf("(écran RPL/2)\n\n");
   54:         }
   55:         else
   56:         {
   57:             printf("(RPL/2 splash screen)\n\n");
   58:         }
   59: 
   60:         printf("    1: %s, %s\n", d_INT, d_REL);
   61: 
   62:         return;
   63:     }
   64:     else if ((*s_etat_processus).test_instruction == 'Y')
   65:     {
   66:         (*s_etat_processus).nombre_arguments = -1;
   67:         return;
   68:     }
   69:     
   70:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
   71:     {
   72:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
   73:         {
   74:             return;
   75:         }
   76:     }
   77: 
   78:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
   79:             &s_objet) == d_erreur)
   80:     {
   81:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
   82:         return;
   83:     }
   84: 
   85:     if (((*s_objet).type == INT) ||
   86:             ((*s_objet).type == REL))
   87:     {
   88:         if ((*s_objet).type == INT)
   89:         {
   90:             attente = (real8) (*((integer8 *) (*s_objet).objet));
   91:         }
   92:         else
   93:         {
   94:             attente = (*((real8 *) (*s_objet).objet));
   95:         }
   96: 
   97:         if (attente < 0)
   98:         {
   99:             liberation(s_etat_processus, s_objet);
  100: 
  101:             (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
  102:             return;
  103:         }
  104: 
  105:         encart(s_etat_processus, (unsigned long) (attente * 1E6));
  106:     }
  107:     else
  108:     {
  109:         liberation(s_etat_processus, s_objet);
  110: 
  111:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  112:         return;
  113:     }
  114: 
  115:     liberation(s_etat_processus, s_objet);
  116: 
  117:     return;
  118: }
  119: 
  120: 
  121: /*
  122: ================================================================================
  123:   Fonction 'send'
  124: ================================================================================
  125:   Entrées :
  126: --------------------------------------------------------------------------------
  127:   Sorties :
  128: --------------------------------------------------------------------------------
  129:   Effets de bord : néant
  130: ================================================================================
  131: */
  132: 
  133: void
  134: instruction_send(struct_processus *s_etat_processus)
  135: {
  136:     pid_t                       pid;
  137: 
  138:     pthread_t                   tid;
  139: 
  140:     sig_atomic_t                registre;
  141: 
  142:     ssize_t                     longueur_ecriture;
  143: 
  144:     struct_objet                *s_objet;
  145: 
  146:     struct timespec             attente;
  147: 
  148:     unsigned char               tampon;
  149: 
  150:     (*s_etat_processus).erreur_execution = d_ex;
  151: 
  152:     if ((*s_etat_processus).affichage_arguments == 'Y')
  153:     {
  154:         printf("\n  SEND ");
  155: 
  156:         if ((*s_etat_processus).langue == 'F')
  157:         {
  158:             printf("(envoi de données au processus père)\n\n");
  159:         }
  160:         else
  161:         {
  162:             printf("(send data to parent process)\n\n");
  163:         }
  164: 
  165:         printf("    1: %s, %s, %s, %s, %s, %s,\n"
  166:                 "       %s, %s, %s, %s, %s,\n"
  167:                 "       %s, %s, %s, %s, %s\n",
  168:                 d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
  169:                 d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_TAB);
  170: 
  171:         return;
  172:     }
  173:     else if ((*s_etat_processus).test_instruction == 'Y')
  174:     {
  175:         (*s_etat_processus).nombre_arguments = -1;
  176:         return;
  177:     }
  178:     
  179:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  180:     {
  181:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
  182:         {
  183:             return;
  184:         }
  185:     }
  186: 
  187:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  188:             &s_objet) == d_erreur)
  189:     {
  190:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  191:         return;
  192:     }
  193: 
  194:     if ((*s_etat_processus).presence_pipes == d_faux)
  195:     {
  196:         liberation(s_etat_processus, s_objet);
  197: 
  198:         (*s_etat_processus).erreur_execution = d_ex_absence_processus_pere;
  199:         return;
  200:     }
  201: 
  202:     if (((*s_objet).type != INT) &&
  203:             ((*s_objet).type != REL) &&
  204:             ((*s_objet).type != CPL) &&
  205:             ((*s_objet).type != VIN) &&
  206:             ((*s_objet).type != VRL) &&
  207:             ((*s_objet).type != VCX) &&
  208:             ((*s_objet).type != MIN) &&
  209:             ((*s_objet).type != MRL) &&
  210:             ((*s_objet).type != MCX) &&
  211:             ((*s_objet).type != BIN) &&
  212:             ((*s_objet).type != NOM) &&
  213:             ((*s_objet).type != CHN) &&
  214:             ((*s_objet).type != LST) &&
  215:             ((*s_objet).type != ALG) &&
  216:             ((*s_objet).type != RPN) &&
  217:             ((*s_objet).type != TBL))
  218:     {
  219:         liberation(s_etat_processus, s_objet);
  220: 
  221:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  222:         return;
  223:     }
  224: 
  225:     /*
  226:      * On signale au processus père qu'il y a un objet de plus
  227:      * dans le pipe de données.
  228:      */
  229: 
  230:     registre = (*s_etat_processus).var_volatile_traitement_retarde_stop;
  231:     (*s_etat_processus).var_volatile_traitement_retarde_stop = 1;
  232: 
  233:     if ((*s_etat_processus).processus_detache == d_vrai)
  234:     {
  235:         if ((*s_etat_processus).profilage == d_vrai)
  236:         {
  237:             profilage(s_etat_processus, "Interprocess communications (SEND)");
  238: 
  239:             if ((*s_etat_processus).erreur_systeme != d_es)
  240:             {
  241:                 return;
  242:             }
  243:         }
  244: 
  245:         pid = -3;
  246: 
  247:         attente.tv_sec = 0;
  248:         attente.tv_nsec = GRANULARITE_us * 1000;
  249: 
  250: #       ifndef SEMAPHORES_NOMMES
  251:         if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
  252:         {
  253:             (*s_etat_processus).erreur_systeme = d_es_processus;
  254:             return;
  255:         }
  256: #       else
  257:         if (sem_post((*s_etat_processus).semaphore_fork) != 0)
  258:         {
  259:             (*s_etat_processus).erreur_systeme = d_es_processus;
  260:             return;
  261:         }
  262: #       endif
  263: 
  264:         while((longueur_ecriture = write_atomic(s_etat_processus,
  265:                 (*s_etat_processus).pipe_nombre_objets_attente,
  266:                 &pid, sizeof(pid))) != sizeof(pid))
  267:         {
  268: #           ifndef SEMAPHORES_NOMMES
  269:             while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
  270: #           else
  271:             while(sem_wait((*s_etat_processus).semaphore_fork) == -1)
  272: #           endif
  273:             {
  274:                 if (errno != EINTR)
  275:                 {
  276:                     (*s_etat_processus).erreur_systeme = d_es_processus;
  277:                     return;
  278:                 }
  279:             }
  280: 
  281:             if (longueur_ecriture == -1)
  282:             {
  283:                 if ((*s_etat_processus).profilage == d_vrai)
  284:                 {
  285:                     profilage(s_etat_processus, NULL);
  286:                 }
  287: 
  288:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  289:                 return;
  290:             }
  291: 
  292:             nanosleep(&attente, NULL);
  293:             INCR_GRANULARITE(attente.tv_nsec);
  294: 
  295: #           ifndef SEMAPHORES_NOMMES
  296:             if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
  297:             {
  298:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  299:                 return;
  300:             }
  301: #           else
  302:             if (sem_post((*s_etat_processus).semaphore_fork) != 0)
  303:             {
  304:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  305:                 return;
  306:             }
  307: #           endif
  308:         }
  309: 
  310:         pid = getpid();
  311: 
  312:         attente.tv_sec = 0;
  313:         attente.tv_nsec = GRANULARITE_us * 1000;
  314: 
  315:         while((longueur_ecriture = write_atomic(s_etat_processus,
  316:                 (*s_etat_processus).pipe_nombre_objets_attente,
  317:                 &pid, sizeof(pid))) != sizeof(pid))
  318:         {
  319: #           ifndef SEMAPHORES_NOMMES
  320:             while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
  321: #           else
  322:             while(sem_wait((*s_etat_processus).semaphore_fork) == -1)
  323: #           endif
  324:             {
  325:                 if (errno != EINTR)
  326:                 {
  327:                     (*s_etat_processus).erreur_systeme = d_es_processus;
  328:                     return;
  329:                 }
  330:             }
  331: 
  332:             if (longueur_ecriture == -1)
  333:             {
  334:                 if ((*s_etat_processus).profilage == d_vrai)
  335:                 {
  336:                     profilage(s_etat_processus, NULL);
  337:                 }
  338: 
  339:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  340:                 return;
  341:             }
  342: 
  343:             nanosleep(&attente, NULL);
  344:             INCR_GRANULARITE(attente.tv_nsec);
  345: 
  346: #           ifndef SEMAPHORES_NOMMES
  347:             if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
  348: #           else
  349:             if (sem_post((*s_etat_processus).semaphore_fork) != 0)
  350: #           endif
  351:             {
  352:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  353:                 return;
  354:             }
  355:         }
  356: 
  357: #       ifndef SEMAPHORES_NOMMES
  358:         while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
  359: #       else
  360:         while(sem_wait((*s_etat_processus).semaphore_fork) == -1)
  361: #       endif
  362:         {
  363:             if (errno != EINTR)
  364:             {
  365:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  366:                 return;
  367:             }
  368:         }
  369:     }
  370:     else
  371:     {
  372:         if ((*s_etat_processus).profilage == d_vrai)
  373:         {
  374:             profilage(s_etat_processus, "Interthread communications (SEND)");
  375: 
  376:             if ((*s_etat_processus).erreur_systeme != d_es)
  377:             {
  378:                 return;
  379:             }
  380:         }
  381: 
  382:         tid = -3;
  383: 
  384:         attente.tv_sec = 0;
  385:         attente.tv_nsec = GRANULARITE_us * 1000;
  386: 
  387: #       ifndef SEMAPHORES_NOMMES
  388:         if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
  389:         {
  390:             (*s_etat_processus).erreur_systeme = d_es_processus;
  391:             return;
  392:         }
  393: #       else
  394:         if (sem_post((*s_etat_processus).semaphore_fork) != 0)
  395:         {
  396:             (*s_etat_processus).erreur_systeme = d_es_processus;
  397:             return;
  398:         }
  399: #       endif
  400: 
  401:         while((longueur_ecriture = write_atomic(s_etat_processus,
  402:                 (*s_etat_processus).pipe_nombre_objets_attente,
  403:                 &tid, sizeof(tid))) != sizeof(tid))
  404:         {
  405: #           ifndef SEMAPHORES_NOMMES
  406:             while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
  407: #           else
  408:             while(sem_wait((*s_etat_processus).semaphore_fork) == -1)
  409: #           endif
  410:             {
  411:                 if (errno != EINTR)
  412:                 {
  413:                     (*s_etat_processus).erreur_systeme = d_es_processus;
  414:                     return;
  415:                 }
  416:             }
  417: 
  418:             if (longueur_ecriture == -1)
  419:             {
  420:                 if ((*s_etat_processus).profilage == d_vrai)
  421:                 {
  422:                     profilage(s_etat_processus, NULL);
  423:                 }
  424: 
  425:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  426:                 return;
  427:             }
  428: 
  429:             nanosleep(&attente, NULL);
  430:             INCR_GRANULARITE(attente.tv_nsec);
  431: 
  432: #           ifndef SEMAPHORES_NOMMES
  433:             if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
  434:             {
  435:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  436:                 return;
  437:             }
  438: #           else
  439:             if (sem_post((*s_etat_processus).semaphore_fork) != 0)
  440:             {
  441:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  442:                 return;
  443:             }
  444: #           endif
  445:         }
  446: 
  447:         tid = pthread_self();
  448: 
  449:         attente.tv_sec = 0;
  450:         attente.tv_nsec = GRANULARITE_us * 1000;
  451: 
  452:         while((longueur_ecriture = write_atomic(s_etat_processus,
  453:                 (*s_etat_processus).pipe_nombre_objets_attente,
  454:                 &tid, sizeof(tid))) != sizeof(tid))
  455:         {
  456: #           ifndef SEMAPHORES_NOMMES
  457:             while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
  458: #           else
  459:             while(sem_wait((*s_etat_processus).semaphore_fork) == -1)
  460: #           endif
  461:             {
  462:                 if (errno != EINTR)
  463:                 {
  464:                     (*s_etat_processus).erreur_systeme = d_es_processus;
  465:                     return;
  466:                 }
  467:             }
  468: 
  469:             if (longueur_ecriture == -1)
  470:             {
  471:                 if ((*s_etat_processus).profilage == d_vrai)
  472:                 {
  473:                     profilage(s_etat_processus, NULL);
  474:                 }
  475: 
  476:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  477:                 return;
  478:             }
  479: 
  480:             nanosleep(&attente, NULL);
  481:             INCR_GRANULARITE(attente.tv_nsec);
  482: 
  483: #           ifndef SEMAPHORES_NOMMES
  484:             if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
  485:             {
  486:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  487:                 return;
  488:             }
  489: #           else
  490:             if (sem_post((*s_etat_processus).semaphore_fork) != 0)
  491:             {
  492:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  493:                 return;
  494:             }
  495: #           endif
  496:         }
  497: 
  498: #       ifndef SEMAPHORES_NOMMES
  499:         while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
  500: #       else
  501:         while(sem_wait((*s_etat_processus).semaphore_fork) == -1)
  502: #       endif
  503:         {
  504:             if (errno != EINTR)
  505:             {
  506:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  507:                 return;
  508:             }
  509:         }
  510:     }
  511: 
  512:     (*s_etat_processus).nombre_objets_envoyes_non_lus++;
  513: 
  514:     attente.tv_sec = 0;
  515:     attente.tv_nsec = GRANULARITE_us * 1000;
  516: 
  517: #   ifndef SEMAPHORES_NOMMES
  518:     if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
  519:     {
  520:         (*s_etat_processus).erreur_systeme = d_es_processus;
  521:         return;
  522:     }
  523: #   else
  524:     if (sem_post((*s_etat_processus).semaphore_fork) != 0)
  525:     {
  526:         (*s_etat_processus).erreur_systeme = d_es_processus;
  527:         return;
  528:     }
  529: #   endif
  530: 
  531:     while(read_atomic(s_etat_processus, (*s_etat_processus).pipe_acquittement,
  532:             &tampon, sizeof(unsigned char)) != sizeof(unsigned char))
  533:     {
  534: #       ifndef SEMAPHORES_NOMMES
  535:         while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
  536: #       else
  537:         while(sem_wait((*s_etat_processus).semaphore_fork) == -1)
  538: #       endif
  539:         {
  540:             if (errno != EINTR)
  541:             {
  542:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  543:                 return;
  544:             }
  545:         }
  546: 
  547:         nanosleep(&attente, NULL);
  548:         INCR_GRANULARITE(attente.tv_nsec);
  549: 
  550: #       ifndef SEMAPHORES_NOMMES
  551:         if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
  552: #       else
  553:         if (sem_post((*s_etat_processus).semaphore_fork) != 0)
  554: #       endif
  555:         {
  556:             (*s_etat_processus).erreur_systeme = d_es_processus;
  557:             return;
  558:         }
  559:     }
  560: 
  561: #   ifndef SEMAPHORES_NOMMES
  562:     while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
  563: #   else
  564:     while(sem_wait((*s_etat_processus).semaphore_fork) == -1)
  565: #   endif
  566:     {
  567:         if (errno != EINTR)
  568:         {
  569:             (*s_etat_processus).erreur_systeme = d_es_processus;
  570:             return;
  571:         }
  572:     }
  573: 
  574:     // Envoi d'un PID invalide (-1) pour ne pas bloquer le thread
  575:     // de surveillance.
  576: 
  577:     if ((*s_etat_processus).processus_detache == d_vrai)
  578:     {
  579:         pid = -1;
  580: 
  581:         attente.tv_sec = 0;
  582:         attente.tv_nsec = GRANULARITE_us * 1000;
  583: 
  584: #       ifndef SEMAPHORES_NOMMES
  585:         if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
  586: #       else
  587:         if (sem_post((*s_etat_processus).semaphore_fork) != 0)
  588: #       endif
  589:         {
  590:             (*s_etat_processus).erreur_systeme = d_es_processus;
  591:             return;
  592:         }
  593: 
  594:         while((longueur_ecriture = write_atomic(s_etat_processus,
  595:                 (*s_etat_processus).pipe_nombre_interruptions_attente,
  596:                 &pid, sizeof(pid))) != sizeof(pid))
  597:         {
  598: #           ifndef SEMAPHORES_NOMMES
  599:             while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
  600: #           else
  601:             while(sem_wait((*s_etat_processus).semaphore_fork) == -1)
  602: #           endif
  603:             {
  604:                 if (errno != EINTR)
  605:                 {
  606:                     (*s_etat_processus).erreur_systeme = d_es_processus;
  607:                     return;
  608:                 }
  609:             }
  610: 
  611:             if (longueur_ecriture == -1)
  612:             {
  613:                 if ((*s_etat_processus).profilage == d_vrai)
  614:                 {
  615:                     profilage(s_etat_processus, NULL);
  616:                 }
  617: 
  618:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  619:                 return;
  620:             }
  621: 
  622:             nanosleep(&attente, NULL);
  623:             INCR_GRANULARITE(attente.tv_nsec);
  624: 
  625: #           ifndef SEMAPHORES_NOMMES
  626:             if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
  627:             {
  628:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  629:                 return;
  630:             }
  631: #           else
  632:             if (sem_post((*s_etat_processus).semaphore_fork) != 0)
  633:             {
  634:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  635:                 return;
  636:             }
  637: #           endif
  638:         }
  639: 
  640: #       ifndef SEMAPHORES_NOMMES
  641:         while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
  642: #       else
  643:         while(sem_wait((*s_etat_processus).semaphore_fork) == -1)
  644: #       endif
  645:         {
  646:             if (errno != EINTR)
  647:             {
  648:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  649:                 return;
  650:             }
  651:         }
  652:     }
  653:     else
  654:     {
  655:         tid = -1;
  656: 
  657:         attente.tv_sec = 0;
  658:         attente.tv_nsec = GRANULARITE_us * 1000;
  659: 
  660: #       ifndef SEMAPHORES_NOMMES
  661:         if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
  662: #       else
  663:         if (sem_post((*s_etat_processus).semaphore_fork) != 0)
  664: #       endif
  665:         {
  666:             (*s_etat_processus).erreur_systeme = d_es_processus;
  667:             return;
  668:         }
  669: 
  670:         while((longueur_ecriture = write_atomic(s_etat_processus,
  671:                 (*s_etat_processus).pipe_nombre_interruptions_attente,
  672:                 &tid, sizeof(tid))) != sizeof(tid))
  673:         {
  674: #           ifndef SEMAPHORES_NOMMES
  675:             while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
  676: #           else
  677:             while(sem_wait((*s_etat_processus).semaphore_fork) == -1)
  678: #           endif
  679:             {
  680:                 if (errno != EINTR)
  681:                 {
  682:                     (*s_etat_processus).erreur_systeme = d_es_processus;
  683:                     return;
  684:                 }
  685:             }
  686: 
  687:             if (longueur_ecriture == -1)
  688:             {
  689:                 if ((*s_etat_processus).profilage == d_vrai)
  690:                 {
  691:                     profilage(s_etat_processus, NULL);
  692:                 }
  693: 
  694:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  695:                 return;
  696:             }
  697: 
  698:             nanosleep(&attente, NULL);
  699:             INCR_GRANULARITE(attente.tv_nsec);
  700: 
  701: #           ifndef SEMAPHORES_NOMMES
  702:             if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
  703: #           else
  704:             if (sem_post((*s_etat_processus).semaphore_fork) != 0)
  705: #           endif
  706:             {
  707:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  708:                 return;
  709:             }
  710:         }
  711: 
  712: #       ifndef SEMAPHORES_NOMMES
  713:         while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
  714: #       else
  715:         while(sem_wait((*s_etat_processus).semaphore_fork) == -1)
  716: #       endif
  717:         {
  718:             if (errno != EINTR)
  719:             {
  720:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  721:                 return;
  722:             }
  723:         }
  724:     }
  725: 
  726:     // ecriture_pipe() ne peut être interrompu par un signal.
  727: 
  728: #   ifndef SEMAPHORES_NOMMES
  729:     if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
  730:     {
  731:         (*s_etat_processus).erreur_systeme = d_es_processus;
  732:         return;
  733:     }
  734: #   else
  735:     if (sem_post((*s_etat_processus).semaphore_fork) != 0)
  736:     {
  737:         (*s_etat_processus).erreur_systeme = d_es_processus;
  738:         return;
  739:     }
  740: #   endif
  741: 
  742:     if (ecriture_pipe(s_etat_processus, (*s_etat_processus).pipe_donnees,
  743:             s_objet) == d_erreur)
  744:     {
  745: #       ifndef SEMAPHORES_NOMMES
  746:         while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
  747: #       else
  748:         while(sem_wait((*s_etat_processus).semaphore_fork) == -1)
  749: #       endif
  750:         {
  751:             if (errno != EINTR)
  752:             {
  753:                 (*s_etat_processus).erreur_systeme = d_es_processus;
  754:                 return;
  755:             }
  756:         }
  757: 
  758:         if ((*s_etat_processus).profilage == d_vrai)
  759:         {
  760:             profilage(s_etat_processus, NULL);
  761:         }
  762: 
  763:         liberation(s_etat_processus, s_objet);
  764:         return;
  765:     }
  766: 
  767: #   ifndef SEMAPHORES_NOMMES
  768:     while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
  769: #   else
  770:     while(sem_wait((*s_etat_processus).semaphore_fork) == -1)
  771: #   endif
  772:     {
  773:         if (errno != EINTR)
  774:         {
  775:             (*s_etat_processus).erreur_systeme = d_es_processus;
  776:             return;
  777:         }
  778:     }
  779: 
  780:     if ((*s_etat_processus).profilage == d_vrai)
  781:     {
  782:         profilage(s_etat_processus, NULL);
  783:     }
  784: 
  785:     if (registre == 0)
  786:     {
  787:         if ((*s_etat_processus).var_volatile_traitement_retarde_stop == -1)
  788:         {
  789:             (*s_etat_processus).var_volatile_requete_arret = -1;
  790:         }
  791: 
  792:         (*s_etat_processus).var_volatile_traitement_retarde_stop = registre;
  793:     }
  794: 
  795:     liberation(s_etat_processus, s_objet);
  796:     return;
  797: }
  798: 
  799: 
  800: /*
  801: ================================================================================
  802:   Fonction 'sqlquery'
  803: ================================================================================
  804:   Entrées :
  805: --------------------------------------------------------------------------------
  806:   Sorties :
  807: --------------------------------------------------------------------------------
  808:   Effets de bord : néant
  809: ================================================================================
  810: */
  811: 
  812: void
  813: instruction_sqlquery(struct_processus *s_etat_processus)
  814: {
  815: #   define                          d_LONGUEUR  1024
  816: 
  817:     logical1                        connexion_permanente;
  818:     logical1                        presence_resultat;
  819: 
  820:     struct_objet                    *s_copie_1;
  821:     struct_objet                    *s_objet_1;
  822:     struct_objet                    *s_copie_2;
  823:     struct_objet                    *s_objet_2;
  824:     struct_objet                    *s_objet_resultat;
  825: 
  826:     struct_liste_chainee            *l_element_courant;
  827:     struct_liste_chainee            *l_element_courant_ligne;
  828: 
  829:     unsigned char                   *tampon;
  830: 
  831:     unsigned int                    i;
  832:     unsigned int                    j;
  833:     unsigned int                    nombre_colonnes;
  834:     unsigned int                    nombre_lignes;
  835: 
  836:     (*s_etat_processus).erreur_execution = d_ex;
  837: 
  838:     if ((*s_etat_processus).affichage_arguments == 'Y')
  839:     {
  840:         printf("\n  SQLQUERY ");
  841: 
  842:         if ((*s_etat_processus).langue == 'F')
  843:         {
  844:             printf("(requête SQL)\n\n");
  845:         }
  846:         else
  847:         {
  848:             printf("(SQL query)\n\n");
  849:         }
  850: 
  851:         printf("    2: %s\n", d_CHN);
  852:         printf("    1: %s\n", d_LST);
  853:         printf("->  1: %s\n\n", d_LST);
  854: 
  855:         printf("    2: %s\n", d_CHN);
  856:         printf("    1: %s\n", d_SQL);
  857:         printf("->  1: %s\n\n", d_LST);
  858: 
  859:         if ((*s_etat_processus).langue == 'F')
  860:         {
  861:             printf("  Utilisation :\n\n");
  862:         }
  863:         else
  864:         {
  865:             printf("  Usage:\n\n");
  866:         }
  867: 
  868:         printf("    \"select * from table\"\n");
  869:         printf("          { \"mysql\" \"server\" \"database\" "
  870:                 "\"user\" \"password\" } SQLQUERY\n");
  871:         printf("    \"select field from table\"\n");
  872:         printf("          { \"postgresql:iso-8859-1\" \"server\" "
  873:                 "\"database\" \"user\" \"password\" port }\n");
  874:         printf("          SQLQUERY\n");
  875: 
  876:         return;
  877:     }
  878:     else if ((*s_etat_processus).test_instruction == 'Y')
  879:     {
  880:         (*s_etat_processus).nombre_arguments = -1;
  881:         return;
  882:     }
  883:     
  884:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  885:     {
  886:         if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
  887:         {
  888:             return;
  889:         }
  890:     }
  891: 
  892:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  893:             &s_objet_1) == d_erreur)
  894:     {
  895:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  896:         return;
  897:     }
  898: 
  899:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  900:             &s_objet_2) == d_erreur)
  901:     {
  902:         liberation(s_etat_processus, s_objet_1);
  903: 
  904:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  905:         return;
  906:     }
  907: 
  908:     if ((*s_objet_1).type == LST)
  909:     {
  910:         connexion_permanente = d_faux;
  911: 
  912:         s_copie_1 = s_objet_1;
  913: 
  914:         if ((s_objet_1 = parametres_sql(s_etat_processus, s_copie_1)) == NULL)
  915:         {
  916:             liberation(s_etat_processus, s_copie_1);
  917:             liberation(s_etat_processus, s_objet_2);
  918:             return;
  919:         }
  920: 
  921:         liberation(s_etat_processus, s_copie_1);
  922:     }
  923:     else
  924:     {
  925:         if ((*s_objet_1).type == SQL)
  926:         {
  927:             if (((*((struct_connecteur_sql *) (*s_objet_1).objet)).pid !=
  928:                     getpid()) || (pthread_equal((*((struct_connecteur_sql *)
  929:                     (*s_objet_1).objet)).tid, pthread_self()) == 0))
  930:             {
  931:                 (*s_etat_processus).erreur_execution =
  932:                         d_ex_fichier_hors_contexte;
  933: 
  934:                 liberation(s_etat_processus, s_objet_1);
  935:                 liberation(s_etat_processus, s_objet_2);
  936:                 return;
  937:             }
  938:         }
  939: 
  940:         connexion_permanente = d_vrai;
  941:     }
  942: 
  943:     if (((*s_objet_1).type == SQL) && ((*s_objet_2).type == CHN))
  944:     {
  945:         if ((*((struct_connecteur_sql *) (*s_objet_1).objet)).locale != NULL)
  946:         {
  947:             /*
  948:              * Transcodage de la commande SQL
  949:              */
  950: 
  951:             if ((s_copie_2 = copie_objet(s_etat_processus, s_objet_2, 'O'))
  952:                     == NULL)
  953:             {
  954:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  955:                 return;
  956:             }
  957: 
  958:             liberation(s_etat_processus, s_objet_2);
  959:             s_objet_2 = s_copie_2;
  960: 
  961:             tampon = (*s_objet_2).objet;
  962: 
  963:             if (((*s_objet_2).objet = transliteration(s_etat_processus, tampon,
  964:                     (*((struct_connecteur_sql *) (*s_objet_1).objet)).locale,
  965:                     d_locale)) == NULL)
  966:             {
  967:                 return;
  968:             }
  969: 
  970:             free(tampon);
  971:         }
  972: 
  973:         /*
  974:          * Pilote MySQL
  975:          */
  976: 
  977:         if (strcmp((*((struct_connecteur_sql *) (*s_objet_1).objet)).type,
  978:                 "MYSQL") == 0)
  979:         {
  980: #           ifdef MYSQL_SUPPORT
  981: 
  982:             MYSQL_RES       *resultat_mysql;
  983:             MYSQL_ROW       ligne;
  984: 
  985:             if (mysql_real_query((*((struct_connecteur_sql *) (*s_objet_1)
  986:                     .objet)).descripteur.mysql, (unsigned char *) (*s_objet_2)
  987:                     .objet, strlen((unsigned char *) (*s_objet_2).objet)) != 0)
  988:             {
  989:                 if (connexion_permanente == d_faux)
  990:                 {
  991:                     mysql_close((*((struct_connecteur_sql *) (*s_objet_1)
  992:                             .objet)).descripteur.mysql);
  993:                 }
  994: 
  995:                 liberation(s_etat_processus, s_objet_1);
  996:                 liberation(s_etat_processus, s_objet_2);
  997: 
  998:                 (*s_etat_processus).erreur_execution = d_ex_erreur_sql;
  999:                 return;
 1000:             }
 1001: 
 1002:             if ((resultat_mysql = mysql_store_result(
 1003:                     (*((struct_connecteur_sql *) (*s_objet_1).objet))
 1004:                     .descripteur.mysql)) == NULL)
 1005:             {
 1006:                 // La requête ne renvoie rien (exemple : INSERT)
 1007:                 presence_resultat = d_faux;
 1008:                 nombre_colonnes = 0;
 1009:             }
 1010:             else
 1011:             {
 1012:                 // La requête renvoie une ou plusieurs valeurs.
 1013:                 presence_resultat = d_vrai;
 1014:                 nombre_colonnes = mysql_field_count((*((struct_connecteur_sql *)
 1015:                         (*s_objet_1).objet)).descripteur.mysql);
 1016:             }
 1017: 
 1018:             if ((s_objet_resultat = allocation(s_etat_processus, LST))
 1019:                     == NULL)
 1020:             {
 1021:                 (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
 1022:                 return;
 1023:             }
 1024: 
 1025:             (*s_objet_resultat).objet = NULL;
 1026:             l_element_courant = (*s_objet_resultat).objet;
 1027: 
 1028:             while(((presence_resultat == d_vrai) ?
 1029:                     (ligne = mysql_fetch_row(resultat_mysql)) : NULL) != NULL)
 1030:             {
 1031:                 unsigned long           *longueurs;
 1032: 
 1033:                 longueurs = mysql_fetch_lengths(resultat_mysql);
 1034: 
 1035:                 if (l_element_courant == NULL)
 1036:                 {
 1037:                     if (((*s_objet_resultat).objet =
 1038:                             allocation_maillon(s_etat_processus)) == NULL)
 1039:                     {
 1040:                         (*s_etat_processus).erreur_systeme =
 1041:                                 d_es_allocation_memoire;
 1042:                         return;
 1043:                     }
 1044: 
 1045:                     l_element_courant = (struct_liste_chainee *)
 1046:                             (*s_objet_resultat).objet;
 1047:                 }
 1048:                 else
 1049:                 {
 1050:                     if (((*l_element_courant).suivant =
 1051:                             allocation_maillon(s_etat_processus)) == NULL)
 1052:                     {
 1053:                         (*s_etat_processus).erreur_systeme =
 1054:                                 d_es_allocation_memoire;
 1055:                         return;
 1056:                     }
 1057: 
 1058:                     l_element_courant = (*l_element_courant).suivant;
 1059:                 }
 1060: 
 1061:                 (*l_element_courant).suivant = NULL;
 1062: 
 1063:                 if (((*l_element_courant).donnee = allocation(s_etat_processus,
 1064:                         LST)) == NULL)
 1065:                 {
 1066:                     (*s_etat_processus).erreur_systeme =
 1067:                             d_es_allocation_memoire;
 1068:                     return;
 1069:                 }
 1070: 
 1071:                 (*(*l_element_courant).donnee).objet = NULL;
 1072:                 l_element_courant_ligne = NULL;
 1073: 
 1074:                 for(i = 0; i < nombre_colonnes; i++)
 1075:                 {
 1076:                     if (l_element_courant_ligne == NULL)
 1077:                     {
 1078:                         if (((*(*l_element_courant).donnee).objet =
 1079:                                 allocation_maillon(s_etat_processus)) == NULL)
 1080:                         {
 1081:                             (*s_etat_processus).erreur_systeme =
 1082:                                     d_es_allocation_memoire;
 1083:                             return;
 1084:                         }
 1085: 
 1086:                         l_element_courant_ligne = (struct_liste_chainee *)
 1087:                                 (*(*l_element_courant).donnee).objet;
 1088:                     }
 1089:                     else
 1090:                     {
 1091:                         if (((*l_element_courant_ligne).suivant =
 1092:                                 allocation_maillon(s_etat_processus)) == NULL)
 1093:                         {
 1094:                             (*s_etat_processus).erreur_systeme =
 1095:                                     d_es_allocation_memoire;
 1096:                             return;
 1097:                         }
 1098: 
 1099:                         l_element_courant_ligne =
 1100:                                 (*l_element_courant_ligne).suivant;
 1101:                     }
 1102: 
 1103:                     (*l_element_courant_ligne).suivant = NULL;
 1104: 
 1105:                     if (((*l_element_courant_ligne).donnee =
 1106:                             allocation(s_etat_processus, CHN)) == NULL)
 1107:                     {
 1108:                         (*s_etat_processus).erreur_systeme =
 1109:                                 d_es_allocation_memoire;
 1110:                         return;
 1111:                     }
 1112: 
 1113:                     if (ligne[i] == NULL)
 1114:                     {
 1115:                         if (((*(*l_element_courant_ligne).donnee).objet =
 1116:                                 malloc(5 * sizeof(unsigned char))) == NULL)
 1117:                         {
 1118:                             (*s_etat_processus).erreur_systeme =
 1119:                                     d_es_allocation_memoire;
 1120:                             return;
 1121:                         }
 1122: 
 1123:                         strcpy((unsigned char *) (*(*l_element_courant_ligne)
 1124:                                 .donnee).objet, "NULL");
 1125:                     }
 1126:                     else
 1127:                     {
 1128:                         if (((*(*l_element_courant_ligne).donnee).objet =
 1129:                                 malloc((longueurs[i] + 1) *
 1130:                                 sizeof(unsigned char))) == NULL)
 1131:                         {
 1132:                             (*s_etat_processus).erreur_systeme =
 1133:                                     d_es_allocation_memoire;
 1134:                             return;
 1135:                         }
 1136: 
 1137:                         strcpy((unsigned char *) (*(*l_element_courant_ligne)
 1138:                                 .donnee).objet, ligne[i]);
 1139:                     }
 1140:                 }
 1141:             }
 1142: 
 1143:             mysql_free_result(resultat_mysql);
 1144: 
 1145:             if (connexion_permanente == d_faux)
 1146:             {
 1147:                 mysql_close((*((struct_connecteur_sql *) (*s_objet_1).objet))
 1148:                         .descripteur.mysql);
 1149:             }
 1150: 
 1151:             if (presence_resultat == d_vrai)
 1152:             {
 1153:                 if (empilement(s_etat_processus,
 1154:                         &((*s_etat_processus).l_base_pile),
 1155:                         s_objet_resultat) == d_erreur)
 1156:                 {
 1157:                     return;
 1158:                 }
 1159:             }
 1160: 
 1161: #           else
 1162: 
 1163:             if ((*s_etat_processus).langue == 'F')
 1164:             {
 1165:                 printf("+++Attention : Support de MySQL non compilé !\n");
 1166:             }
 1167:             else
 1168:             {
 1169:                 printf("+++Warning : MySQL support not available !\n");
 1170:             }
 1171: 
 1172:             fflush(stdout);
 1173: #           endif
 1174:         }
 1175: 
 1176:         /*
 1177:          * Pilote PostgreSQL
 1178:          */
 1179: 
 1180:         else if (strcmp((*((struct_connecteur_sql *) (*s_objet_1).objet)).type,
 1181:                 "POSTGRESQL") == 0)
 1182:         {
 1183: #           ifdef POSTGRESQL_SUPPORT
 1184: 
 1185:             PGresult        *resultat_postgresql;
 1186: 
 1187:             if (PQstatus((*((struct_connecteur_sql *) (*s_objet_1).objet))
 1188:                     .descripteur.postgresql) != CONNECTION_OK)
 1189:             {
 1190:                 if (connexion_permanente == d_faux)
 1191:                 {
 1192:                     PQfinish((*((struct_connecteur_sql *) (*s_objet_1).objet))
 1193:                             .descripteur.postgresql);
 1194:                 }
 1195: 
 1196:                 liberation(s_etat_processus, s_objet_1);
 1197:                 liberation(s_etat_processus, s_objet_2);
 1198: 
 1199:                 (*s_etat_processus).erreur_execution = d_ex_erreur_sql;
 1200:                 return;
 1201:             }
 1202: 
 1203:             resultat_postgresql = PQexec((*((struct_connecteur_sql *)
 1204:                     (*s_objet_1).objet)).descripteur.postgresql,
 1205:                     (unsigned char *) (*s_objet_2).objet);
 1206:             presence_resultat = d_faux;
 1207: 
 1208:             switch(PQresultStatus(resultat_postgresql))
 1209:             {
 1210:                 case PGRES_COMMAND_OK :
 1211:                 { // Commande qui ne renvoit rien
 1212:                     if ((s_objet_resultat = allocation(s_etat_processus, LST))
 1213:                             == NULL)
 1214:                     {
 1215:                         (*s_etat_processus).erreur_systeme =
 1216:                                 d_es_allocation_memoire;
 1217:                         return;
 1218:                     }
 1219: 
 1220:                     (*s_objet_resultat).objet = NULL;
 1221:                     l_element_courant = (*s_objet_resultat).objet;
 1222:                     presence_resultat = d_vrai;
 1223: 
 1224:                     break;
 1225:                 }
 1226: 
 1227:                 case PGRES_TUPLES_OK :
 1228:                 { // Commande renvoyant des données
 1229:                     if ((s_objet_resultat = allocation(s_etat_processus, LST))
 1230:                             == NULL)
 1231:                     {
 1232:                         (*s_etat_processus).erreur_systeme =
 1233:                                 d_es_allocation_memoire;
 1234:                         return;
 1235:                     }
 1236: 
 1237:                     (*s_objet_resultat).objet = NULL;
 1238:                     l_element_courant = (*s_objet_resultat).objet;
 1239:                     presence_resultat = d_vrai;
 1240: 
 1241:                     nombre_colonnes = PQnfields(resultat_postgresql);
 1242:                     nombre_lignes = PQntuples(resultat_postgresql);
 1243: 
 1244:                     for(i = 0; i < nombre_lignes; i++)
 1245:                     {
 1246:                         // Chaînage d'un nouveau maillon de la liste résultat
 1247: 
 1248:                         if (l_element_courant == NULL)
 1249:                         {
 1250:                             if (((*s_objet_resultat).objet =
 1251:                                     allocation_maillon(s_etat_processus))
 1252:                                     == NULL)
 1253:                             {
 1254:                                 (*s_etat_processus).erreur_systeme =
 1255:                                         d_es_allocation_memoire;
 1256:                                 return;
 1257:                             }
 1258: 
 1259:                             l_element_courant = (struct_liste_chainee *)
 1260:                                     (*s_objet_resultat).objet;
 1261:                         }
 1262:                         else
 1263:                         {
 1264:                             if (((*l_element_courant).suivant =
 1265:                                     allocation_maillon(s_etat_processus))
 1266:                                     == NULL)
 1267:                             {
 1268:                                 (*s_etat_processus).erreur_systeme =
 1269:                                         d_es_allocation_memoire;
 1270:                                 return;
 1271:                             }
 1272: 
 1273:                             l_element_courant = (*l_element_courant).suivant;
 1274:                         }
 1275: 
 1276:                         (*l_element_courant).suivant = NULL;
 1277: 
 1278:                         // Création de la liste fille
 1279: 
 1280:                         if (((*l_element_courant).donnee =
 1281:                                 allocation(s_etat_processus, LST)) == NULL)
 1282:                         {
 1283:                             (*s_etat_processus).erreur_systeme =
 1284:                                     d_es_allocation_memoire;
 1285:                             return;
 1286:                         }
 1287: 
 1288:                         (*(*l_element_courant).donnee).objet = NULL;
 1289:                         l_element_courant_ligne = NULL;
 1290: 
 1291:                         for(j = 0; j < nombre_colonnes; j++)
 1292:                         {
 1293:                             if (l_element_courant_ligne == NULL)
 1294:                             {
 1295:                                 if (((*(*l_element_courant).donnee).objet =
 1296:                                         allocation_maillon(s_etat_processus))
 1297:                                         == NULL)
 1298:                                 {
 1299:                                     (*s_etat_processus).erreur_systeme =
 1300:                                             d_es_allocation_memoire;
 1301:                                     return;
 1302:                                 }
 1303: 
 1304:                                 l_element_courant_ligne =
 1305:                                         (struct_liste_chainee *)
 1306:                                         (*(*l_element_courant).donnee).objet;
 1307:                             }
 1308:                             else
 1309:                             {
 1310:                                 if (((*l_element_courant_ligne).suivant =
 1311:                                         allocation_maillon(s_etat_processus))
 1312:                                         == NULL)
 1313:                                 {
 1314:                                     l_element_courant_ligne =
 1315:                                             (*l_element_courant_ligne).suivant;
 1316:                                 }
 1317: 
 1318:                                 l_element_courant_ligne =
 1319:                                         (*l_element_courant_ligne).suivant;
 1320:                             }
 1321: 
 1322:                             (*l_element_courant_ligne).suivant = NULL;
 1323: 
 1324:                             if (((*l_element_courant_ligne).donnee =
 1325:                                     allocation(s_etat_processus, CHN))
 1326:                                     == NULL)
 1327:                             {
 1328:                                 (*s_etat_processus).erreur_systeme =
 1329:                                         d_es_allocation_memoire;
 1330:                                 return;
 1331:                             }
 1332: 
 1333:                             if (PQgetisnull(resultat_postgresql, i, j) != 0)
 1334:                             {
 1335:                                 if (((*(*l_element_courant_ligne).donnee).objet
 1336:                                         = malloc(5 * sizeof(unsigned char)))
 1337:                                         == NULL)
 1338:                                 {
 1339:                                     (*s_etat_processus).erreur_systeme =
 1340:                                             d_es_allocation_memoire;
 1341:                                     return;
 1342:                                 }
 1343: 
 1344:                                 strcpy((unsigned char *)
 1345:                                         (*(*l_element_courant_ligne).donnee)
 1346:                                         .objet, "NULL");
 1347:                             }
 1348:                             else
 1349:                             {
 1350:                                 if (((*(*l_element_courant_ligne).donnee).objet
 1351:                                         = malloc((PQgetlength(
 1352:                                         resultat_postgresql, i, j) + 1) *
 1353:                                         sizeof(unsigned char))) == NULL)
 1354:                                 {
 1355:                                     (*s_etat_processus).erreur_systeme =
 1356:                                             d_es_allocation_memoire;
 1357:                                     return;
 1358:                                 }
 1359: 
 1360:                                 strcpy((unsigned char *)
 1361:                                         (*(*l_element_courant_ligne).donnee)
 1362:                                         .objet, PQgetvalue(resultat_postgresql,
 1363:                                         i, j));
 1364:                             }
 1365:                         }
 1366:                     }
 1367: 
 1368:                     break;
 1369:                 }
 1370: 
 1371:                 case PGRES_EMPTY_QUERY :
 1372:                 case PGRES_COPY_OUT :
 1373:                 case PGRES_COPY_IN :
 1374:                 case PGRES_BAD_RESPONSE :
 1375:                 case PGRES_NONFATAL_ERROR :
 1376:                 case PGRES_FATAL_ERROR :
 1377:                 default :
 1378:                 {
 1379:                     printf("%s\n", PQresultErrorMessage(resultat_postgresql));
 1380:                     PQclear(resultat_postgresql);
 1381: 
 1382:                     if (connexion_permanente == d_faux)
 1383:                     {
 1384:                         PQfinish((*((struct_connecteur_sql *) (*s_objet_1)
 1385:                                 .objet)).descripteur.postgresql);
 1386:                     }
 1387: 
 1388:                     liberation(s_etat_processus, s_objet_1);
 1389:                     liberation(s_etat_processus, s_objet_2);
 1390:  
 1391:                     (*s_etat_processus).erreur_execution = d_ex_erreur_sql;
 1392: 
 1393:                     return;
 1394:                     break;
 1395:                 }
 1396:             }
 1397: 
 1398:             PQclear(resultat_postgresql);
 1399: 
 1400:             if (connexion_permanente == d_faux)
 1401:             {
 1402:                 PQfinish((*((struct_connecteur_sql *) (*s_objet_1).objet))
 1403:                         .descripteur.postgresql);
 1404:             }
 1405: 
 1406:             if (presence_resultat == d_vrai)
 1407:             {
 1408:                 if (empilement(s_etat_processus, &((*s_etat_processus)
 1409:                         .l_base_pile), s_objet_resultat) == d_erreur)
 1410:                 {
 1411:                     return;
 1412:                 }
 1413:             }
 1414: 
 1415: #           else
 1416: 
 1417:             if ((*s_etat_processus).langue == 'F')
 1418:             {
 1419:                 printf("+++Attention : Support de PostgreSQL non compilé !\n");
 1420:             }
 1421:             else
 1422:             {
 1423:                 printf("+++Warning : PostgreSQL support not available !\n");
 1424:             }
 1425: 
 1426:             fflush(stdout);
 1427: #           endif
 1428:         }
 1429:         else
 1430:         {
 1431:             liberation(s_etat_processus, s_objet_1);
 1432:             liberation(s_etat_processus, s_objet_2);
 1433: 
 1434:             (*s_etat_processus).erreur_execution = d_ex_erreur_sql;
 1435:             return;
 1436:         }
 1437:     }
 1438:     else
 1439:     {
 1440:         liberation(s_etat_processus, s_objet_1);
 1441:         liberation(s_etat_processus, s_objet_2);
 1442: 
 1443:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 1444:         return;
 1445:     }
 1446: 
 1447:     liberation(s_etat_processus, s_objet_1);
 1448:     liberation(s_etat_processus, s_objet_2);
 1449: 
 1450:     return;
 1451: }
 1452: 
 1453: 
 1454: /*
 1455: ================================================================================
 1456:   Fonction 'stop'
 1457: ================================================================================
 1458:   Entrées :
 1459: --------------------------------------------------------------------------------
 1460:   Sorties :
 1461: --------------------------------------------------------------------------------
 1462:   Effets de bord : néant
 1463: ================================================================================
 1464: */
 1465: 
 1466: void
 1467: instruction_stop(struct_processus *s_etat_processus)
 1468: {
 1469:     struct_liste_chainee        *l_element_courant;
 1470: 
 1471:     struct_objet                *s_objet;
 1472: 
 1473:     struct timespec             attente;
 1474: 
 1475:     attente.tv_sec = 0;
 1476:     attente.tv_nsec = GRANULARITE_us * 1000;
 1477: 
 1478:     (*s_etat_processus).erreur_execution = d_ex;
 1479: 
 1480:     if ((*s_etat_processus).affichage_arguments == 'Y')
 1481:     {
 1482:         printf("\n  STOP ");
 1483: 
 1484:         if ((*s_etat_processus).langue == 'F')
 1485:         {
 1486:             printf("(arrêt d'un processus)\n\n");
 1487:         }
 1488:         else
 1489:         {
 1490:             printf("(kill process)\n\n");
 1491:         }
 1492: 
 1493:         printf("    1: %s\n", d_PRC);
 1494: 
 1495:         return;
 1496:     }
 1497:     else if ((*s_etat_processus).test_instruction == 'Y')
 1498:     {
 1499:         (*s_etat_processus).nombre_arguments = -1;
 1500:         return;
 1501:     }
 1502:     
 1503:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
 1504:     {
 1505:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
 1506:         {
 1507:             return;
 1508:         }
 1509:     }
 1510: 
 1511:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
 1512:             &s_objet) == d_erreur)
 1513:     {
 1514:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
 1515:         return;
 1516:     }
 1517: 
 1518:     if ((*s_objet).type == PRC)
 1519:     {
 1520:         if ((*(*((struct_processus_fils *) (*s_objet).objet)).thread)
 1521:                 .processus_detache == d_vrai)
 1522:         {
 1523:             kill((*(*((struct_processus_fils *) (*s_objet).objet)).thread).pid,
 1524:                     SIGFSTOP);
 1525:         }
 1526:         else
 1527:         {
 1528:             if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0)
 1529:             {
 1530:                 (*s_etat_processus).erreur_systeme = d_es_processus;
 1531:                 return;
 1532:             }
 1533: 
 1534:             l_element_courant = (struct_liste_chainee *)
 1535:                     (*s_etat_processus).l_base_pile_processus;
 1536: 
 1537:             while(l_element_courant != NULL)
 1538:             {
 1539:                 if ((*(*((struct_processus_fils *) (*(*l_element_courant)
 1540:                         .donnee).objet)).thread).processus_detache == d_faux)
 1541:                 {
 1542:                     if ((pthread_equal((*(*((struct_processus_fils *)
 1543:                             (*(*l_element_courant).donnee).objet)).thread).tid,
 1544:                             (*(*((struct_processus_fils *)
 1545:                             (*s_objet).objet)).thread).tid) != 0) &&
 1546:                             ((*(*((struct_processus_fils *)
 1547:                             (*(*l_element_courant).donnee).objet)).thread).pid
 1548:                             == (*(*((struct_processus_fils *)
 1549:                             (*s_objet).objet)).thread).pid))
 1550:                     {
 1551:                         break;
 1552:                     }
 1553:                 }
 1554: 
 1555:                 l_element_courant = (*l_element_courant).suivant;
 1556:             }
 1557: 
 1558:             if (l_element_courant != NULL)
 1559:             {
 1560:                 // Le champ thread_actif est un pointeur sur un champ de la
 1561:                 // structure s_argument_thread libéré par la fonction
 1562:                 // retrait_thread_surveillance().
 1563: 
 1564:                 if ((*(*((struct_processus_fils *)
 1565:                         (*s_objet).objet)).thread).thread_actif == d_vrai)
 1566:                 {
 1567:                     if (pthread_mutex_lock(&((*(*((struct_processus_fils *)
 1568:                             (*s_objet).objet)).thread).mutex)) != 0)
 1569:                     {
 1570:                         if (pthread_mutex_unlock(&((*s_etat_processus).mutex))
 1571:                                 != 0)
 1572:                         {
 1573:                             (*s_etat_processus).erreur_systeme = d_es_processus;
 1574:                             return;
 1575:                         }
 1576: 
 1577:                         (*s_etat_processus).erreur_systeme = d_es_processus;
 1578:                         return;
 1579:                     }
 1580: 
 1581:                     if ((*(*((struct_processus_fils *)
 1582:                             (*s_objet).objet)).thread).thread_actif == d_vrai)
 1583:                     {
 1584:                         pthread_kill((*(*((struct_processus_fils *)
 1585:                                 (*s_objet).objet)).thread).tid, SIGFSTOP);
 1586:                     }
 1587: 
 1588:                     if (pthread_mutex_unlock(&((*(*((struct_processus_fils *)
 1589:                             (*s_objet).objet)).thread).mutex)) != 0)
 1590:                     {
 1591:                         if (pthread_mutex_unlock(&((*s_etat_processus).mutex))
 1592:                                 != 0)
 1593:                         {
 1594:                             (*s_etat_processus).erreur_systeme = d_es_processus;
 1595:                             return;
 1596:                         }
 1597: 
 1598:                         (*s_etat_processus).erreur_systeme = d_es_processus;
 1599:                         return;
 1600:                     }
 1601:                 }
 1602:             }
 1603: 
 1604:             if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
 1605:             {
 1606:                 (*s_etat_processus).erreur_systeme = d_es_processus;
 1607:                 return;
 1608:             }
 1609:         }
 1610:     }
 1611:     else
 1612:     {
 1613:         liberation(s_etat_processus, s_objet);
 1614: 
 1615:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
 1616:         return;
 1617:     }
 1618: 
 1619:     liberation(s_etat_processus, s_objet);
 1620: 
 1621:     return;
 1622: }
 1623: 
 1624: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>