Annotation of rpl/src/instructions_s8.c, revision 1.28

1.1       bertrand    1: /*
                      2: ================================================================================
1.28    ! bertrand    3:   RPL/2 (R) version 4.1.0.prerelease.4
1.20      bertrand    4:   Copyright (C) 1989-2011 Dr. BERTRAND Joël
1.1       bertrand    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: 
1.15      bertrand   23: #include "rpl-conv.h"
1.1       bertrand   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: 
1.7       bertrand  250: #      ifndef SEMAPHORES_NOMMES
1.1       bertrand  251:        if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
                    252:        {
                    253:            (*s_etat_processus).erreur_systeme = d_es_processus;
                    254:            return;
                    255:        }
1.7       bertrand  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
1.1       bertrand  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:        {
1.7       bertrand  268: #          ifndef SEMAPHORES_NOMMES
1.1       bertrand  269:            while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
1.7       bertrand  270: #          else
                    271:            while(sem_wait((*s_etat_processus).semaphore_fork) == -1)
                    272: #          endif
1.1       bertrand  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: 
1.7       bertrand  295: #          ifndef SEMAPHORES_NOMMES
1.1       bertrand  296:            if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
                    297:            {
                    298:                (*s_etat_processus).erreur_systeme = d_es_processus;
                    299:                return;
                    300:            }
1.7       bertrand  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
1.1       bertrand  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:        {
1.7       bertrand  319: #          ifndef SEMAPHORES_NOMMES
1.1       bertrand  320:            while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
1.7       bertrand  321: #          else
                    322:            while(sem_wait((*s_etat_processus).semaphore_fork) == -1)
                    323: #          endif
1.1       bertrand  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: 
1.7       bertrand  346: #          ifndef SEMAPHORES_NOMMES
1.1       bertrand  347:            if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
1.7       bertrand  348: #          else
                    349:            if (sem_post((*s_etat_processus).semaphore_fork) != 0)
                    350: #          endif
1.1       bertrand  351:            {
                    352:                (*s_etat_processus).erreur_systeme = d_es_processus;
                    353:                return;
                    354:            }
                    355:        }
                    356: 
1.7       bertrand  357: #      ifndef SEMAPHORES_NOMMES
1.1       bertrand  358:        while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
1.7       bertrand  359: #      else
                    360:        while(sem_wait((*s_etat_processus).semaphore_fork) == -1)
                    361: #      endif
1.1       bertrand  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: 
1.7       bertrand  387: #      ifndef SEMAPHORES_NOMMES
1.1       bertrand  388:        if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
                    389:        {
                    390:            (*s_etat_processus).erreur_systeme = d_es_processus;
                    391:            return;
                    392:        }
1.7       bertrand  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
1.1       bertrand  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:        {
1.7       bertrand  405: #          ifndef SEMAPHORES_NOMMES
1.1       bertrand  406:            while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
1.7       bertrand  407: #          else
                    408:            while(sem_wait((*s_etat_processus).semaphore_fork) == -1)
                    409: #          endif
1.1       bertrand  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: 
1.7       bertrand  432: #          ifndef SEMAPHORES_NOMMES
1.1       bertrand  433:            if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
                    434:            {
                    435:                (*s_etat_processus).erreur_systeme = d_es_processus;
                    436:                return;
                    437:            }
1.7       bertrand  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
1.1       bertrand  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:        {
1.7       bertrand  456: #          ifndef SEMAPHORES_NOMMES
1.1       bertrand  457:            while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
1.7       bertrand  458: #          else
                    459:            while(sem_wait((*s_etat_processus).semaphore_fork) == -1)
                    460: #          endif
1.1       bertrand  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: 
1.7       bertrand  483: #          ifndef SEMAPHORES_NOMMES
1.1       bertrand  484:            if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
                    485:            {
                    486:                (*s_etat_processus).erreur_systeme = d_es_processus;
                    487:                return;
                    488:            }
1.7       bertrand  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
1.1       bertrand  496:        }
                    497: 
1.7       bertrand  498: #      ifndef SEMAPHORES_NOMMES
1.1       bertrand  499:        while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
1.7       bertrand  500: #      else
                    501:        while(sem_wait((*s_etat_processus).semaphore_fork) == -1)
                    502: #      endif
1.1       bertrand  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: 
1.7       bertrand  517: #  ifndef SEMAPHORES_NOMMES
1.1       bertrand  518:    if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
                    519:    {
                    520:        (*s_etat_processus).erreur_systeme = d_es_processus;
                    521:        return;
                    522:    }
1.7       bertrand  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
1.1       bertrand  530: 
                    531:    while(read_atomic(s_etat_processus, (*s_etat_processus).pipe_acquittement,
                    532:            &tampon, sizeof(unsigned char)) != sizeof(unsigned char))
                    533:    {
1.7       bertrand  534: #      ifndef SEMAPHORES_NOMMES
1.1       bertrand  535:        while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
1.7       bertrand  536: #      else
                    537:        while(sem_wait((*s_etat_processus).semaphore_fork) == -1)
                    538: #      endif
1.1       bertrand  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: 
1.7       bertrand  550: #      ifndef SEMAPHORES_NOMMES
1.1       bertrand  551:        if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
1.7       bertrand  552: #      else
                    553:        if (sem_post((*s_etat_processus).semaphore_fork) != 0)
                    554: #      endif
1.1       bertrand  555:        {
                    556:            (*s_etat_processus).erreur_systeme = d_es_processus;
                    557:            return;
                    558:        }
                    559:    }
                    560: 
1.7       bertrand  561: #  ifndef SEMAPHORES_NOMMES
1.1       bertrand  562:    while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
1.7       bertrand  563: #  else
                    564:    while(sem_wait((*s_etat_processus).semaphore_fork) == -1)
                    565: #  endif
1.1       bertrand  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: 
1.7       bertrand  584: #      ifndef SEMAPHORES_NOMMES
1.1       bertrand  585:        if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
1.7       bertrand  586: #      else
                    587:        if (sem_post((*s_etat_processus).semaphore_fork) != 0)
                    588: #      endif
1.1       bertrand  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:        {
1.7       bertrand  598: #          ifndef SEMAPHORES_NOMMES
1.1       bertrand  599:            while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
1.7       bertrand  600: #          else
                    601:            while(sem_wait((*s_etat_processus).semaphore_fork) == -1)
                    602: #          endif
1.1       bertrand  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: 
1.7       bertrand  625: #          ifndef SEMAPHORES_NOMMES
1.1       bertrand  626:            if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
                    627:            {
                    628:                (*s_etat_processus).erreur_systeme = d_es_processus;
                    629:                return;
                    630:            }
1.7       bertrand  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
1.1       bertrand  638:        }
                    639: 
1.7       bertrand  640: #      ifndef SEMAPHORES_NOMMES
1.1       bertrand  641:        while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
1.7       bertrand  642: #      else
                    643:        while(sem_wait((*s_etat_processus).semaphore_fork) == -1)
                    644: #      endif
1.1       bertrand  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: 
1.7       bertrand  660: #      ifndef SEMAPHORES_NOMMES
1.1       bertrand  661:        if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
1.7       bertrand  662: #      else
                    663:        if (sem_post((*s_etat_processus).semaphore_fork) != 0)
                    664: #      endif
1.1       bertrand  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:        {
1.7       bertrand  674: #          ifndef SEMAPHORES_NOMMES
1.1       bertrand  675:            while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
1.7       bertrand  676: #          else
                    677:            while(sem_wait((*s_etat_processus).semaphore_fork) == -1)
                    678: #          endif
1.1       bertrand  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: 
1.7       bertrand  701: #          ifndef SEMAPHORES_NOMMES
1.1       bertrand  702:            if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
1.7       bertrand  703: #          else
                    704:            if (sem_post((*s_etat_processus).semaphore_fork) != 0)
                    705: #          endif
1.1       bertrand  706:            {
                    707:                (*s_etat_processus).erreur_systeme = d_es_processus;
                    708:                return;
                    709:            }
                    710:        }
                    711: 
1.7       bertrand  712: #      ifndef SEMAPHORES_NOMMES
1.1       bertrand  713:        while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
1.7       bertrand  714: #      else
                    715:        while(sem_wait((*s_etat_processus).semaphore_fork) == -1)
                    716: #      endif
1.1       bertrand  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: 
1.7       bertrand  728: #  ifndef SEMAPHORES_NOMMES
1.1       bertrand  729:    if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
                    730:    {
                    731:        (*s_etat_processus).erreur_systeme = d_es_processus;
                    732:        return;
                    733:    }
1.7       bertrand  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
1.1       bertrand  741: 
                    742:    if (ecriture_pipe(s_etat_processus, (*s_etat_processus).pipe_donnees,
                    743:            s_objet) == d_erreur)
                    744:    {
1.7       bertrand  745: #      ifndef SEMAPHORES_NOMMES
1.1       bertrand  746:        while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
1.7       bertrand  747: #      else
                    748:        while(sem_wait((*s_etat_processus).semaphore_fork) == -1)
                    749: #      endif
1.1       bertrand  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: 
1.7       bertrand  767: #  ifndef SEMAPHORES_NOMMES
1.1       bertrand  768:    while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
1.7       bertrand  769: #  else
                    770:    while(sem_wait((*s_etat_processus).semaphore_fork) == -1)
                    771: #  endif
1.1       bertrand  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 *)
1.9       bertrand 1543:                            (*(*l_element_courant).donnee).objet)).thread).tid,
1.1       bertrand 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>