Annotation of rpl/src/instructions_w1.c, revision 1.132

1.1       bertrand    1: /*
                      2: ================================================================================
1.130     bertrand    3:   RPL/2 (R) version 4.1.36
1.132   ! bertrand    4:   Copyright (C) 1989-2025 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: 
1.132   ! bertrand   22: 
1.131     bertrand   23: #define DEBUG_ERREURS
1.20      bertrand   24: #include "rpl-conv.h"
1.1       bertrand   25: 
                     26: 
                     27: /*
                     28: ================================================================================
                     29:   Fonction 'while'
                     30: ================================================================================
                     31:   Entrées :
                     32: --------------------------------------------------------------------------------
                     33:   Sorties :
                     34: --------------------------------------------------------------------------------
                     35:   Effets de bord : néant
                     36: ================================================================================
                     37: */
                     38: 
                     39: void
                     40: instruction_while(struct_processus *s_etat_processus)
                     41: {
                     42:    (*s_etat_processus).erreur_execution = d_ex;
                     43: 
                     44:    if ((*s_etat_processus).affichage_arguments == 'Y')
                     45:    {
                     46:        printf("\n  WHILE ");
                     47: 
                     48:        if ((*s_etat_processus).langue == 'F')
                     49:        {
                     50:            printf("(structure de contrôle)\n\n");
                     51:            printf("  Utilisation :\n\n");
                     52:        }
                     53:        else
                     54:        {
                     55:            printf("(control statement)\n\n");
                     56:            printf("  Usage:\n\n");
                     57:        }
                     58: 
                     59:        printf("    WHILE\n");
                     60:        printf("        (clause)\n");
                     61:        printf("    REPEAT\n");
                     62:        printf("        (expression 1)\n");
                     63:        printf("        EXIT\n");
                     64:        printf("        (expression 2)\n");
                     65:        printf("    END\n\n");
                     66: 
                     67:        printf("    WHILE\n");
                     68:        printf("        (clause)\n");
                     69:        printf("    REPEAT\n");
                     70:        printf("        (expression)\n");
                     71:        printf("    END\n");
                     72: 
                     73:        return;
                     74:    }
                     75:    else if ((*s_etat_processus).test_instruction == 'Y')
                     76:    {
                     77:        (*s_etat_processus).nombre_arguments = -1;
                     78:        return;
                     79:    }
                     80: 
                     81:    empilement_pile_systeme(s_etat_processus);
                     82: 
                     83:    if ((*s_etat_processus).erreur_systeme != d_es)
                     84:    {
                     85:        return;
                     86:    }
                     87: 
                     88:    (*(*s_etat_processus).l_base_pile_systeme).type_cloture = 'W';
                     89:    (*(*s_etat_processus).l_base_pile_systeme).clause = 'W';
                     90: 
                     91:    if ((*s_etat_processus).mode_execution_programme == 'Y')
                     92:    {
                     93:        (*(*s_etat_processus).l_base_pile_systeme).adresse_retour =
                     94:                (*s_etat_processus).position_courante;
                     95:    }
                     96:    else
                     97:    {
                     98:        if ((*s_etat_processus).expression_courante == NULL)
                     99:        {
                    100:            (*s_etat_processus).erreur_execution =
                    101:                    d_ex_erreur_traitement_boucle;
                    102:            return;
                    103:        }
                    104: 
                    105:        (*(*s_etat_processus).l_base_pile_systeme).pointeur_objet_retour =
                    106:                (*s_etat_processus).expression_courante;
                    107:    }
                    108: 
                    109:    return;
                    110: }
                    111: 
                    112: 
                    113: /*
                    114: ================================================================================
                    115:   Fonction 'warranty'
                    116: ================================================================================
                    117:   Entrées :
                    118: --------------------------------------------------------------------------------
                    119:   Sorties :
                    120: --------------------------------------------------------------------------------
                    121:   Effets de bord : néant
                    122: ================================================================================
                    123: */
                    124: 
                    125: void
                    126: instruction_warranty(struct_processus *s_etat_processus)
                    127: {
1.20      bertrand  128: #  include                 "garanties-conv.h"
1.1       bertrand  129: 
                    130:    (*s_etat_processus).erreur_execution = d_ex;
                    131: 
                    132:    if ((*s_etat_processus).affichage_arguments == 'Y')
                    133:    {
                    134:        printf("\n  WARRANTY ");
                    135: 
                    136:        if ((*s_etat_processus).langue == 'F')
                    137:        {
                    138:            printf("(garantie)\n\n");
                    139:            printf("  Aucun argument\n");
                    140:        }
                    141:        else
                    142:        {
                    143:            printf("(warranty)\n\n");
                    144:            printf("  No argument\n");
                    145:        }
                    146: 
                    147:        return;
                    148:    }
                    149:    else if ((*s_etat_processus).test_instruction == 'Y')
                    150:    {
                    151:        (*s_etat_processus).nombre_arguments = -1;
                    152:        return;
                    153:    }
                    154: 
                    155:    printf("%s\n", warranty);
                    156: 
                    157:    if ((*s_etat_processus).hauteur_pile_operationnelle == 0)
                    158:    {
                    159:        printf("\n");
                    160:    }
                    161: 
                    162:    return;
                    163: }
                    164: 
                    165: 
                    166: /*
                    167: ================================================================================
                    168:   Fonction 'wait'
                    169: ================================================================================
                    170:   Entrées :
                    171: --------------------------------------------------------------------------------
                    172:   Sorties :
                    173: --------------------------------------------------------------------------------
                    174:   Effets de bord : néant
                    175: ================================================================================
                    176: */
                    177: 
                    178: void
                    179: instruction_wait(struct_processus *s_etat_processus)
                    180: {
                    181:    int                         code_retour;
                    182:    int                         erreur;
                    183: 
                    184:    real8                       attente;
                    185: 
                    186:    struct_objet                *s_objet;
                    187: 
                    188:    struct timespec             temporisation;
                    189: 
                    190:    (*s_etat_processus).erreur_execution = d_ex;
                    191: 
                    192:    if ((*s_etat_processus).affichage_arguments == 'Y')
                    193:    {
                    194:        printf("\n  WAIT ");
                    195: 
                    196:        if ((*s_etat_processus).langue == 'F')
                    197:        {
                    198:            printf("(attente exprimée en secondes)\n\n");
                    199:        }
                    200:        else
                    201:        {
                    202:            printf("(wait a number of seconds)\n\n");
                    203:        }
                    204: 
                    205:        printf("    1: %s, %s\n", d_INT, d_REL);
                    206: 
                    207:        return;
                    208:    }
                    209:    else if ((*s_etat_processus).test_instruction == 'Y')
                    210:    {
                    211:        (*s_etat_processus).nombre_arguments = -1;
                    212:        return;
                    213:    }
                    214: 
                    215:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                    216:    {
                    217:        if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
                    218:        {
                    219:            return;
                    220:        }
                    221:    }
                    222: 
                    223:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                    224:            &s_objet) == d_erreur)
                    225:    {
                    226:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                    227:        return;
                    228:    }
                    229:    
1.30      bertrand  230:    if (((*s_objet).type == INT) || ((*s_objet).type == REL))
1.1       bertrand  231:    {
                    232:        if ((*s_objet).type == INT)
                    233:        {
                    234:            attente = (real8) (*((integer8 *) (*s_objet).objet));
                    235:        }
                    236:        else
                    237:        {
                    238:            attente = (*((real8 *) (*s_objet).objet));
                    239:        }
                    240: 
                    241:        if (attente < 0)
                    242:        {
                    243:            liberation(s_etat_processus, s_objet);
                    244: 
                    245:            (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
                    246:            return;
                    247:        }
                    248: 
1.80      bertrand  249:        temporisation.tv_sec = (time_t) floor((double) attente);
1.79      bertrand  250:        temporisation.tv_nsec = (long) ((attente -
                    251:                ((real8) temporisation.tv_sec)) * (integer8) 1000000000);
1.1       bertrand  252: 
                    253:        if ((*s_etat_processus).profilage == d_vrai)
                    254:        {
                    255:            profilage(s_etat_processus, "Sleep function (WAIT)");
                    256: 
                    257:            if ((*s_etat_processus).erreur_systeme != d_es)
                    258:            {
                    259:                return;
                    260:            }
                    261:        }
                    262: 
                    263:        do
                    264:        {
1.51      bertrand  265: #          ifndef SEMAPHORES_NOMMES
                    266:                if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
                    267: #          else
                    268:                if (sem_post((*s_etat_processus).semaphore_fork) != 0)
                    269: #          endif
1.1       bertrand  270:            {
                    271:                (*s_etat_processus).erreur_systeme = d_es_processus;
                    272:                return;
                    273:            }
                    274: 
                    275:            code_retour = nanosleep(&temporisation, &temporisation);
                    276:            erreur = errno;
                    277: 
1.51      bertrand  278: #          ifndef SEMAPHORES_NOMMES
                    279:                while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
                    280: #          else
                    281:                while(sem_wait((*s_etat_processus).semaphore_fork) != 0)
                    282: #          endif
1.1       bertrand  283:            {
1.50      bertrand  284:                if (errno != EINTR)
                    285:                {
                    286:                    (*s_etat_processus).erreur_systeme = d_es_processus;
                    287:                    return;
                    288:                }
1.1       bertrand  289:            }
1.28      bertrand  290: 
                    291:            scrutation_injection(s_etat_processus);
                    292: 
1.84      bertrand  293:            if (pthread_mutex_lock(&(*s_etat_processus).mutex_interruptions)
                    294:                    != 0)
1.83      bertrand  295:            {
                    296:                (*s_etat_processus).erreur_systeme = d_es_processus;
                    297:                return;
                    298:            }
                    299: 
1.28      bertrand  300:            if ((*s_etat_processus).nombre_interruptions_non_affectees != 0)
                    301:            {
                    302:                affectation_interruptions_logicielles(s_etat_processus);
                    303:            }
                    304: 
1.84      bertrand  305:            if (pthread_mutex_unlock(&(*s_etat_processus).mutex_interruptions)
                    306:                    != 0)
1.83      bertrand  307:            {
                    308:                (*s_etat_processus).erreur_systeme = d_es_processus;
                    309:                return;
                    310:            }
                    311: 
1.28      bertrand  312:            if ((*s_etat_processus).nombre_interruptions_en_queue != 0)
                    313:            {
                    314:                traitement_interruptions_logicielles(s_etat_processus);
                    315:            }
1.1       bertrand  316:        } while(((code_retour == -1) && (erreur == EINTR))
                    317:                && ((*s_etat_processus).var_volatile_requete_arret == 0));
                    318: 
                    319:        if ((*s_etat_processus).profilage == d_vrai)
                    320:        {
                    321:            profilage(s_etat_processus, NULL);
                    322:        }
                    323:    }
                    324:    else
                    325:    {
                    326:        liberation(s_etat_processus, s_objet);
                    327: 
                    328:        (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
                    329:        return;
                    330:    }
                    331: 
                    332:    liberation(s_etat_processus, s_objet);
                    333: 
                    334:    return;
                    335: }
                    336: 
                    337: 
                    338: /*
                    339: ================================================================================
                    340:   Fonction 'wireframe' (passe en mode d'affichage échantillonné)
                    341: ================================================================================
                    342:   Entrées : structure processus
                    343: --------------------------------------------------------------------------------
                    344:   Sorties :
                    345: --------------------------------------------------------------------------------
                    346:   Effets de bord : néant
                    347: ================================================================================
                    348: */
                    349: 
                    350: void
                    351: instruction_wireframe(struct_processus *s_etat_processus)
                    352: {
                    353:    (*s_etat_processus).erreur_execution = d_ex;
                    354: 
                    355:    if ((*s_etat_processus).affichage_arguments == 'Y')
                    356:    {
                    357:        printf("\n  WIREFRAME ");
                    358: 
                    359:        if ((*s_etat_processus).langue == 'F')
                    360:        {
                    361:            printf("(graphique tridimensionnel grillagé)\n\n");
                    362:            printf("  Aucun argument\n");
                    363:        }
                    364:        else
                    365:        {
                    366:            printf("(wireframe 3D graph)\n\n");
                    367:            printf("  No argument\n");
                    368:        }
                    369: 
                    370:        return;
                    371:    }
                    372:    else if ((*s_etat_processus).test_instruction == 'Y')
                    373:    {
                    374:        (*s_etat_processus).nombre_arguments = -1;
                    375:        return;
                    376:    }
                    377: 
                    378:    strcpy((*s_etat_processus).type_trace_eq, "GRILLE 3D");
                    379: 
                    380:    return;
                    381: }
                    382: 
                    383: 
                    384: /*
                    385: ================================================================================
                    386:   Fonction 'write'
                    387: ================================================================================
                    388:   Entrées : structure processus
                    389: --------------------------------------------------------------------------------
                    390:   Sorties :
                    391: --------------------------------------------------------------------------------
                    392:   Effets de bord : néant
                    393: ================================================================================
                    394: */
                    395: 
                    396: void
                    397: instruction_write(struct_processus *s_etat_processus)
                    398: {
1.6       bertrand  399:    const char                          *queue;
                    400: 
1.1       bertrand  401:    int                                 adresse[16];
                    402:    int                                 port;
1.70      bertrand  403:    int                                 sqlite_status;
1.1       bertrand  404: 
1.8       bertrand  405:    integer8                            clef;
                    406:    integer8                            compteur;
                    407:    integer8                            id;
1.79      bertrand  408:    integer8                            longueur;
1.78      bertrand  409:    integer8                            longueur_effective;
1.8       bertrand  410:    integer8                            ordre;
1.79      bertrand  411:    integer8                            recursivite;
1.8       bertrand  412: 
1.64      bertrand  413:    logical1                            format_degenere;
1.110     bertrand  414:    logical1                            format_oriente_ligne;
1.8       bertrand  415:    logical1                            mise_a_jour;
                    416: 
1.6       bertrand  417:    sqlite3_stmt                        *ppStmt;
                    418: 
1.1       bertrand  419:    ssize_t                             ios;
                    420: 
1.5       bertrand  421:    struct_descripteur_fichier          *descripteur;
                    422: 
1.8       bertrand  423:    struct_liste_chainee                *l_element_courant;
                    424:    struct_liste_chainee                *l_element_courant_format;
                    425: 
                    426:    struct_objet                        *s_format;
                    427:    struct_objet                        *s_element;
1.6       bertrand  428:    struct_objet                        *s_objet_argument_1;
1.1       bertrand  429:    struct_objet                        *s_objet_argument_2;
1.6       bertrand  430:    struct_objet                        *s_objet_argument_3;
1.1       bertrand  431: 
                    432:    struct sigaction                    action;
                    433:    struct sigaction                    registre;
                    434: 
                    435:    struct sockaddr_in                  adresse_ipv4;
1.20      bertrand  436: #  ifdef IPV6
1.1       bertrand  437:    struct sockaddr_in6                 adresse_ipv6;
1.20      bertrand  438: #  endif
1.1       bertrand  439:    struct sockaddr_un                  adresse_unix;
                    440: 
                    441:    struct flock                        lock;
                    442: 
1.70      bertrand  443:    struct timespec                     attente;
                    444: 
1.1       bertrand  445:    uint32_t                            calcul_adresse;
                    446: 
                    447:    unsigned char                       *chaine;
1.5       bertrand  448:    unsigned char                       *chaine_utf8;
1.8       bertrand  449:    unsigned char                       *clef_utf8;
1.6       bertrand  450:    unsigned char                       *commande;
1.64      bertrand  451:    unsigned char                       *format_chaine;
1.1       bertrand  452: 
                    453:    unsigned long                       i;
                    454: 
                    455:    (*s_etat_processus).erreur_execution = d_ex;
                    456: 
                    457:    if ((*s_etat_processus).affichage_arguments == 'Y')
                    458:    {
                    459:        printf("\n  WRITE ");
                    460: 
                    461:        if ((*s_etat_processus).langue == 'F')
                    462:        {
                    463:            printf("(écriture d'un enregistrement d'un fichier)\n\n");
                    464:        }
                    465:        else
                    466:        {
                    467:            printf("(write a record of a file)\n\n");
                    468:        }
                    469: 
                    470:        printf("    2: %s\n", d_LST);
1.6       bertrand  471:        printf("    1: %s, %s\n\n", d_FCH, d_SCK);
1.1       bertrand  472: 
1.6       bertrand  473:        printf("    3: %s\n", d_LST);
1.8       bertrand  474:        printf("    2: %s\n", d_INT);
1.6       bertrand  475:        printf("    1: %s\n", d_FCH);
1.1       bertrand  476:        return;
                    477:    }
                    478:    else if ((*s_etat_processus).test_instruction == 'Y')
                    479:    {
                    480:        (*s_etat_processus).nombre_arguments = -1;
                    481:        return;
                    482:    }
                    483: 
                    484:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                    485:    {
1.6       bertrand  486:        if ((*s_etat_processus).l_base_pile == NULL)
1.1       bertrand  487:        {
1.6       bertrand  488:            (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1.1       bertrand  489:            return;
                    490:        }
1.6       bertrand  491: 
                    492:        if ((*(*(*s_etat_processus).l_base_pile).donnee).type == FCH)
                    493:        {
                    494:            if ((*((struct_fichier *) (*(*(*s_etat_processus).l_base_pile)
1.9       bertrand  495:                    .donnee).objet)).acces == 'D')
1.6       bertrand  496:            {
1.9       bertrand  497:                if (empilement_pile_last(s_etat_processus, 3) == d_erreur)
1.6       bertrand  498:                {
                    499:                    return;
                    500:                }
                    501:            }
                    502:            else
                    503:            {
1.9       bertrand  504:                if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
1.6       bertrand  505:                {
                    506:                    return;
                    507:                }
                    508:            }
                    509:        }
                    510:        else
                    511:        {
                    512:            if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
                    513:            {
                    514:                return;
                    515:            }
                    516:        }
1.1       bertrand  517:    }
                    518: 
                    519:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                    520:            &s_objet_argument_1) == d_erreur)
                    521:    {
                    522:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                    523:        return;
                    524:    }
                    525:    
                    526:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                    527:            &s_objet_argument_2) == d_erreur)
                    528:    {
                    529:        liberation(s_etat_processus, s_objet_argument_1);
                    530: 
                    531:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                    532:        return;
                    533:    }
                    534:    
1.6       bertrand  535:    if ((*s_objet_argument_1).type == FCH)
1.1       bertrand  536:    {
1.5       bertrand  537:        if ((descripteur = descripteur_fichier(s_etat_processus,
                    538:                (struct_fichier *) (*s_objet_argument_1).objet)) == NULL)
                    539:        {
                    540:            return;
                    541:        }
                    542: 
1.1       bertrand  543:        /*
                    544:         * Vérification des verrous
                    545:         */
                    546: 
                    547:        lock.l_type = F_WRLCK;
                    548:        lock.l_whence = SEEK_SET;
                    549:        lock.l_start = 0;
                    550:        lock.l_len = 0;
                    551:        lock.l_pid = getpid();
                    552:        recursivite = 0;
                    553: 
1.5       bertrand  554:        if (fcntl(fileno((*descripteur).descripteur_c), F_GETLK, &lock)
                    555:                == -1)
1.1       bertrand  556:        {
                    557:            liberation(s_etat_processus, s_objet_argument_2);
                    558:            liberation(s_etat_processus, s_objet_argument_1);
                    559: 
                    560:            (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                    561:            return;
                    562:        }
                    563: 
                    564:        if (lock.l_type != F_UNLCK)
                    565:        {
                    566:            liberation(s_etat_processus, s_objet_argument_2);
                    567:            liberation(s_etat_processus, s_objet_argument_1);
                    568: 
                    569:            (*s_etat_processus).erreur_execution =
                    570:                    d_ex_fichier_verrouille;
                    571:            return;
                    572:        }
                    573: 
                    574:        /*
                    575:         * Vérification de l'autorisation d'écriture
                    576:         */
                    577: 
                    578:        if ((*((struct_fichier *) (*s_objet_argument_1).objet))
                    579:                .protection == 'R')
                    580:        {
                    581:            liberation(s_etat_processus, s_objet_argument_2);
                    582:            liberation(s_etat_processus, s_objet_argument_1);
                    583: 
                    584:            (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier;
                    585:            return;
                    586:        }
                    587: 
                    588:        if ((*((struct_fichier *) (*s_objet_argument_1).objet)).binaire == 'N')
                    589:        {
                    590:            /*
                    591:             * Fichiers formatés
                    592:             */
                    593: 
1.6       bertrand  594:            if ((*((struct_fichier *) (*s_objet_argument_1).objet)).acces
                    595:                    == 'S')
1.1       bertrand  596:            {
1.6       bertrand  597:                if ((*s_objet_argument_2).type != LST)
                    598:                {
                    599:                    liberation(s_etat_processus, s_objet_argument_2);
                    600:                    liberation(s_etat_processus, s_objet_argument_1);
                    601: 
                    602:                    (*s_etat_processus).erreur_execution =
                    603:                            d_ex_erreur_type_argument;
                    604:                    return;
                    605:                }
                    606: 
                    607:                if ((chaine = formateur_fichier(s_etat_processus,
                    608:                        s_objet_argument_2, (*((struct_fichier *)
                    609:                        (*s_objet_argument_1).objet)).format, 0, 0, ' ', 'F',
1.75      bertrand  610:                        &longueur_effective, &recursivite, d_vrai)) == NULL)
1.6       bertrand  611:                {
                    612:                    liberation(s_etat_processus, s_objet_argument_2);
                    613:                    liberation(s_etat_processus, s_objet_argument_1);
1.1       bertrand  614: 
1.6       bertrand  615:                    return;
                    616:                }
1.1       bertrand  617: 
1.5       bertrand  618:                BUG(((*descripteur).type != 'C'), uprintf("Bad filetype !\n"));
                    619: 
                    620:                if (fseek((*descripteur).descripteur_c, (long) 0, SEEK_END)
                    621:                        != 0)
1.1       bertrand  622:                {
                    623:                    liberation(s_etat_processus, s_objet_argument_2);
                    624:                    liberation(s_etat_processus, s_objet_argument_1);
                    625: 
                    626:                    (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                    627:                    return;
                    628:                }
                    629: 
1.5       bertrand  630:                if ((chaine_utf8 = transliteration(s_etat_processus,
                    631:                        chaine, d_locale, "UTF-8")) == NULL)
                    632:                {
1.6       bertrand  633:                    free(chaine);
                    634: 
1.5       bertrand  635:                    liberation(s_etat_processus, s_objet_argument_2);
                    636:                    liberation(s_etat_processus, s_objet_argument_1);
                    637: 
                    638:                    return;
                    639:                }
                    640: 
1.6       bertrand  641:                free(chaine);
                    642: 
1.7       bertrand  643:                if (fprintf((*descripteur).descripteur_c, "%s\n", chaine_utf8)
                    644:                        < 0)
1.1       bertrand  645:                {
1.5       bertrand  646:                    free(chaine_utf8);
                    647: 
1.1       bertrand  648:                    (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                    649:                    return;
                    650:                }
1.5       bertrand  651: 
                    652:                free(chaine_utf8);
1.1       bertrand  653:            }
                    654:            else if ((*((struct_fichier *) (*s_objet_argument_1).objet)).acces
                    655:                    == 'D')
                    656:            {
1.6       bertrand  657:                BUG(((*descripteur).type != 'S'), uprintf("Bad filetype !\n"));
                    658: 
                    659:                if ((*s_objet_argument_2).type != INT)
                    660:                {
                    661:                    liberation(s_etat_processus, s_objet_argument_2);
                    662:                    liberation(s_etat_processus, s_objet_argument_1);
                    663: 
                    664:                    (*s_etat_processus).erreur_execution =
                    665:                            d_ex_erreur_type_argument;
                    666:                    return;
                    667:                }
                    668: 
                    669:                if (depilement(s_etat_processus, &((*s_etat_processus)
                    670:                        .l_base_pile), &s_objet_argument_3) == d_erreur)
                    671:                {
                    672:                    (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                    673:                    return;
                    674:                }
                    675: 
                    676:                if ((*s_objet_argument_3).type != LST)
                    677:                {
                    678:                    liberation(s_etat_processus, s_objet_argument_3);
                    679:                    liberation(s_etat_processus, s_objet_argument_2);
                    680:                    liberation(s_etat_processus, s_objet_argument_1);
                    681: 
                    682:                    (*s_etat_processus).erreur_execution =
                    683:                            d_ex_erreur_type_argument;
                    684:                    return;
                    685:                }
                    686: 
1.8       bertrand  687:                // Modification ou création d'un nouvel enregistrement
                    688: 
                    689:                if ((chaine = formateur_fichier(s_etat_processus,
                    690:                        s_objet_argument_3, (*((struct_fichier *)
                    691:                        (*s_objet_argument_1).objet)).format, 0, 0, ' ',
1.75      bertrand  692:                        'F', &longueur_effective, &recursivite, d_vrai))
                    693:                        == NULL)
1.8       bertrand  694:                {
                    695:                    liberation(s_etat_processus, s_objet_argument_3);
                    696:                    liberation(s_etat_processus, s_objet_argument_2);
                    697:                    liberation(s_etat_processus, s_objet_argument_1);
                    698: 
                    699:                    return;
                    700:                }
                    701: 
                    702:                if ((chaine_utf8 = transliteration(s_etat_processus,
                    703:                        chaine, d_locale, "UTF-8")) == NULL)
                    704:                {
                    705:                    free(chaine);
                    706: 
                    707:                    liberation(s_etat_processus, s_objet_argument_3);
                    708:                    liberation(s_etat_processus, s_objet_argument_2);
                    709:                    liberation(s_etat_processus, s_objet_argument_1);
                    710: 
                    711:                    return;
                    712:                }
                    713: 
                    714:                free(chaine);
                    715: 
1.94      bertrand  716:                if (alsprintf(s_etat_processus, &commande,
                    717:                        "insert or replace into data "
1.8       bertrand  718:                        "(id, data) values (%lld, '%s')", (*((integer8 *)
                    719:                        (*s_objet_argument_2).objet)), chaine_utf8) < 0)
                    720:                {
1.9       bertrand  721:                    (*s_etat_processus).erreur_systeme =
                    722:                            d_es_allocation_memoire;
1.8       bertrand  723:                    return;
                    724:                }
                    725: 
                    726:                free(chaine_utf8);
                    727: 
                    728:                if (sqlite3_prepare_v2((*descripteur).descripteur_sqlite,
1.79      bertrand  729:                        commande, (int) strlen(commande), &ppStmt, &queue)
1.8       bertrand  730:                        != SQLITE_OK)
                    731:                {
                    732:                    (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                    733:                    return;
                    734:                }
                    735: 
                    736:                if (sqlite3_step(ppStmt) != SQLITE_DONE)
                    737:                {
                    738:                    (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                    739:                    return;
                    740:                }
                    741: 
                    742:                if (sqlite3_finalize(ppStmt) != SQLITE_OK)
                    743:                {
                    744:                    (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                    745:                    return;
                    746:                }
                    747: 
                    748:                liberation(s_etat_processus, s_objet_argument_3);
                    749:                free(commande);
                    750:            }
                    751:            else // Fichiers indexés
                    752:            {
                    753:                BUG(((*descripteur).type != 'S'), uprintf("Bad filetype !\n"));
                    754: 
                    755:                if ((*s_objet_argument_2).type != LST)
                    756:                {
                    757:                    liberation(s_etat_processus, s_objet_argument_2);
                    758:                    liberation(s_etat_processus, s_objet_argument_1);
                    759: 
                    760:                    (*s_etat_processus).erreur_execution =
                    761:                            d_ex_erreur_type_argument;
                    762:                    return;
                    763:                }
                    764: 
1.9       bertrand  765:                // Récupération de la position de la clef
1.8       bertrand  766: 
1.94      bertrand  767:                if (alsprintf(s_etat_processus, &commande,
                    768:                        "select key from control where id = 1") < 0)
1.8       bertrand  769:                {
1.9       bertrand  770:                    (*s_etat_processus).erreur_systeme =
                    771:                            d_es_allocation_memoire;
1.8       bertrand  772:                    return;
                    773:                }
                    774: 
                    775:                if (sqlite3_prepare_v2((*descripteur).descripteur_sqlite,
1.79      bertrand  776:                        commande, (int) strlen(commande), &ppStmt, &queue)
1.8       bertrand  777:                        != SQLITE_OK)
                    778:                {
1.9       bertrand  779:                    (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
1.8       bertrand  780:                    return;
                    781:                }
                    782: 
1.70      bertrand  783:                attente.tv_sec = 0;
                    784:                attente.tv_nsec = GRANULARITE_us * 1000;
                    785: 
                    786:                do
1.8       bertrand  787:                {
1.70      bertrand  788:                    sqlite_status = sqlite3_step(ppStmt);
                    789: 
                    790:                    if (sqlite_status == SQLITE_ROW)
                    791:                    {
                    792:                        break;
                    793:                    }
                    794:                    else if ((sqlite_status == SQLITE_BUSY) ||
                    795:                            (sqlite_status == SQLITE_LOCKED))
                    796:                    {
                    797:                        nanosleep(&attente, NULL);
                    798:                        INCR_GRANULARITE(attente.tv_nsec);
                    799:                    }
                    800:                    else
                    801:                    {
                    802:                        (*s_etat_processus).erreur_systeme =
                    803:                                d_es_erreur_fichier;
                    804:                        return;
                    805:                    }
                    806:                } while(sqlite_status != SQLITE_ROW);
1.8       bertrand  807: 
                    808:                if (sqlite3_column_type(ppStmt, 0) != SQLITE_INTEGER)
                    809:                {
1.9       bertrand  810:                    (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
1.8       bertrand  811:                    return;
                    812:                }
                    813: 
                    814:                clef = sqlite3_column_int64(ppStmt, 0);
                    815: 
                    816:                if (sqlite3_step(ppStmt) != SQLITE_DONE)
                    817:                {
1.9       bertrand  818:                    (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
1.8       bertrand  819:                    return;
                    820:                }
                    821: 
                    822:                if (sqlite3_finalize(ppStmt) != SQLITE_OK)
                    823:                {
1.9       bertrand  824:                    (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
1.8       bertrand  825:                    return;
                    826:                }
                    827: 
                    828:                free(commande);
                    829: 
                    830:                l_element_courant = (struct_liste_chainee *)
                    831:                        (*s_objet_argument_2).objet;
                    832:                l_element_courant_format = (struct_liste_chainee *)
                    833:                        (*(*((struct_fichier *) (*s_objet_argument_1).objet))
                    834:                        .format).objet;
                    835:                compteur = 1;
                    836: 
                    837:                while((l_element_courant != NULL) &&
                    838:                        (l_element_courant_format != NULL))
                    839:                {
                    840:                    if (compteur == clef)
                    841:                    {
                    842:                        break;
                    843:                    }
                    844: 
                    845:                    l_element_courant = (*l_element_courant).suivant;
                    846:                    l_element_courant_format = (*l_element_courant_format)
                    847:                            .suivant;
                    848:                    compteur++;
                    849:                }
                    850: 
                    851:                if ((l_element_courant == NULL) ||
                    852:                        (l_element_courant_format == NULL))
                    853:                {
                    854:                    (*s_etat_processus).erreur_execution =
                    855:                            d_ex_clef_inexistante;
                    856:                        
                    857:                    liberation(s_etat_processus, s_objet_argument_2);
                    858:                    liberation(s_etat_processus, s_objet_argument_1);
                    859: 
                    860:                    return;
                    861:                }
                    862: 
                    863:                if ((s_element = allocation(s_etat_processus, LST)) == NULL)
                    864:                {
                    865:                    (*s_etat_processus).erreur_systeme =
                    866:                            d_es_allocation_memoire;
                    867:                    return;
                    868:                }
                    869: 
                    870:                if (((*s_element).objet = allocation_maillon(s_etat_processus))
                    871:                        == NULL)
                    872:                {
                    873:                    (*s_etat_processus).erreur_systeme =
                    874:                            d_es_allocation_memoire;
                    875:                    return;
                    876:                }
                    877: 
                    878:                (*((struct_liste_chainee *) (*s_element).objet)).suivant = NULL;
                    879: 
                    880:                if (((*((struct_liste_chainee *) (*s_element).objet))
                    881:                        .donnee = copie_objet(s_etat_processus,
                    882:                        (*l_element_courant).donnee, 'N')) == NULL)
                    883:                {
                    884:                    (*s_etat_processus).erreur_systeme =
                    885:                            d_es_allocation_memoire;
                    886:                    return;
                    887:                }
                    888: 
                    889:                if ((s_format = allocation(s_etat_processus, LST)) == NULL)
                    890:                {
                    891:                    (*s_etat_processus).erreur_systeme =
                    892:                            d_es_allocation_memoire;
                    893:                    return;
                    894:                }
                    895: 
                    896:                if (((*s_format).objet = allocation_maillon(s_etat_processus))
                    897:                        == NULL)
                    898:                {
                    899:                    (*s_etat_processus).erreur_systeme =
                    900:                            d_es_allocation_memoire;
                    901:                    return;
                    902:                }
                    903: 
                    904:                (*((struct_liste_chainee *) (*s_format).objet)).suivant = NULL;
                    905: 
                    906:                if (((*((struct_liste_chainee *) (*s_format).objet))
                    907:                        .donnee = copie_objet(s_etat_processus,
                    908:                        (*l_element_courant_format).donnee, 'N')) == NULL)
                    909:                {
                    910:                    (*s_etat_processus).erreur_systeme =
                    911:                            d_es_allocation_memoire;
                    912:                    return;
                    913:                }
                    914: 
                    915:                if ((chaine = formateur_fichier(s_etat_processus,
                    916:                        s_element, s_format, 0, 0, ' ',
1.75      bertrand  917:                        'F', &longueur_effective, &recursivite, d_vrai))
                    918:                        == NULL)
1.8       bertrand  919:                {
                    920:                    liberation(s_etat_processus, s_element);
                    921:                    liberation(s_etat_processus, s_format);
                    922:                    liberation(s_etat_processus, s_objet_argument_2);
                    923:                    liberation(s_etat_processus, s_objet_argument_1);
                    924: 
                    925:                    return;
                    926:                }
                    927: 
                    928:                liberation(s_etat_processus, s_element);
                    929:                liberation(s_etat_processus, s_format);
                    930: 
                    931:                if ((clef_utf8 = transliteration(s_etat_processus,
                    932:                        chaine, d_locale, "UTF-8")) == NULL)
                    933:                {
                    934:                    liberation(s_etat_processus, s_objet_argument_2);
                    935:                    liberation(s_etat_processus, s_objet_argument_1);
                    936: 
                    937:                    return;
                    938:                }
                    939: 
                    940:                free(chaine);
                    941: 
                    942:                // Récupération de l'identifiant de la clef
                    943: 
1.94      bertrand  944:                if (alsprintf(s_etat_processus, &commande,
                    945:                        "select id from key where key = '%s'", clef_utf8) < 0)
1.8       bertrand  946:                {
1.9       bertrand  947:                    (*s_etat_processus).erreur_systeme =
                    948:                            d_es_allocation_memoire;
1.8       bertrand  949:                    return;
                    950:                }
                    951: 
                    952:                if (sqlite3_prepare_v2((*descripteur).descripteur_sqlite,
1.79      bertrand  953:                        commande, (int) strlen(commande), &ppStmt, &queue)
1.8       bertrand  954:                        != SQLITE_OK)
                    955:                {
1.9       bertrand  956:                    (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
1.8       bertrand  957:                    return;
                    958:                }
                    959: 
1.70      bertrand  960:                attente.tv_sec = 0;
                    961:                attente.tv_nsec = GRANULARITE_us * 1000;
                    962: 
                    963:                do
1.8       bertrand  964:                {
1.70      bertrand  965:                    switch(sqlite_status = sqlite3_step(ppStmt))
1.8       bertrand  966:                    {
1.70      bertrand  967:                        case SQLITE_ROW:
                    968:                        {
                    969:                            // Une clef existe.
                    970: 
                    971:                            mise_a_jour = d_vrai;
                    972:                            break;
                    973:                        }
1.8       bertrand  974: 
1.70      bertrand  975:                        case SQLITE_DONE:
                    976:                        {
                    977:                            // Aucune clef n'existe.
                    978: 
                    979:                            mise_a_jour = d_faux;
1.8       bertrand  980: 
1.70      bertrand  981:                            if (sqlite3_finalize(ppStmt) != SQLITE_OK)
                    982:                            {
                    983:                                (*s_etat_processus).erreur_systeme =
                    984:                                        d_es_erreur_fichier;
                    985:                                return;
                    986:                            }
1.8       bertrand  987: 
1.70      bertrand  988:                            free(commande);
1.8       bertrand  989: 
1.94      bertrand  990:                            if (alsprintf(s_etat_processus, &commande,
                    991:                                    "insert into key (key) values ('%s')",
                    992:                                    clef_utf8) < 0)
1.70      bertrand  993:                            {
                    994:                                (*s_etat_processus).erreur_systeme =
                    995:                                        d_es_allocation_memoire;
                    996:                                return;
                    997:                            }
1.8       bertrand  998: 
1.70      bertrand  999:                            if (sqlite3_prepare_v2((*descripteur)
1.79      bertrand 1000:                                    .descripteur_sqlite, commande,
                   1001:                                    (int) strlen(commande), &ppStmt, &queue)
1.70      bertrand 1002:                                    != SQLITE_OK)
                   1003:                            {
                   1004:                                (*s_etat_processus).erreur_systeme =
                   1005:                                        d_es_erreur_fichier;
                   1006:                                return;
                   1007:                            }
1.8       bertrand 1008: 
1.70      bertrand 1009:                            if (sqlite3_step(ppStmt) != SQLITE_DONE)
                   1010:                            {
                   1011:                                (*s_etat_processus).erreur_systeme =
                   1012:                                        d_es_erreur_fichier;
                   1013:                                return;
                   1014:                            }
1.8       bertrand 1015: 
1.70      bertrand 1016:                            if (sqlite3_finalize(ppStmt) != SQLITE_OK)
                   1017:                            {
                   1018:                                (*s_etat_processus).erreur_systeme =
                   1019:                                        d_es_erreur_fichier;
                   1020:                                return;
                   1021:                            }
1.8       bertrand 1022: 
1.70      bertrand 1023:                            free(commande);
1.8       bertrand 1024: 
1.94      bertrand 1025:                            if (alsprintf(s_etat_processus, &commande,
                   1026:                                    "select id from key where key = '%s'",
                   1027:                                    clef_utf8) < 0)
1.70      bertrand 1028:                            {
                   1029:                                (*s_etat_processus).erreur_systeme =
                   1030:                                        d_es_allocation_memoire;
                   1031:                                return;
                   1032:                            }
1.8       bertrand 1033: 
1.70      bertrand 1034:                            if (sqlite3_prepare_v2((*descripteur)
1.79      bertrand 1035:                                    .descripteur_sqlite, commande,
                   1036:                                    (int) strlen(commande), &ppStmt, &queue)
1.70      bertrand 1037:                                    != SQLITE_OK)
                   1038:                            {
                   1039:                                (*s_etat_processus).erreur_systeme =
                   1040:                                        d_es_erreur_fichier;
                   1041:                                return;
                   1042:                            }
1.8       bertrand 1043: 
1.70      bertrand 1044:                            break;
1.8       bertrand 1045:                        }
                   1046: 
1.70      bertrand 1047:                        case SQLITE_BUSY:
                   1048:                        case SQLITE_LOCKED:
1.8       bertrand 1049:                        {
1.70      bertrand 1050:                            nanosleep(&attente, NULL);
                   1051:                            INCR_GRANULARITE(attente.tv_nsec);
                   1052:                            break;
1.8       bertrand 1053:                        }
                   1054: 
1.70      bertrand 1055:                        default:
1.8       bertrand 1056:                        {
                   1057:                            (*s_etat_processus).erreur_systeme =
                   1058:                                    d_es_erreur_fichier;
                   1059:                            return;
                   1060:                        }
                   1061:                    }
1.70      bertrand 1062:                } while(sqlite_status != SQLITE_ROW);
1.8       bertrand 1063: 
                   1064:                if (sqlite3_column_type(ppStmt, 0) != SQLITE_INTEGER)
                   1065:                {
1.9       bertrand 1066:                    (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
1.8       bertrand 1067:                    return;
                   1068:                }
                   1069: 
                   1070:                id = sqlite3_column_int64(ppStmt, 0);
                   1071: 
                   1072:                if (sqlite3_step(ppStmt) != SQLITE_DONE)
1.6       bertrand 1073:                {
1.9       bertrand 1074:                    (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
1.8       bertrand 1075:                    return;
                   1076:                }
1.6       bertrand 1077: 
1.8       bertrand 1078:                if (sqlite3_finalize(ppStmt) != SQLITE_OK)
                   1079:                {
1.9       bertrand 1080:                    (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
1.8       bertrand 1081:                    return;
                   1082:                }
                   1083: 
                   1084:                free(commande);
                   1085: 
                   1086:                // Modification de la clef
                   1087: 
                   1088:                if (mise_a_jour == d_vrai)
                   1089:                {
1.94      bertrand 1090:                    if (alsprintf(s_etat_processus, &commande,
                   1091:                            "update key set key = '%s' where id = %lld",
                   1092:                            clef_utf8, id) < 0)
1.6       bertrand 1093:                    {
1.9       bertrand 1094:                        (*s_etat_processus).erreur_systeme =
                   1095:                                d_es_allocation_memoire;
1.6       bertrand 1096:                        return;
                   1097:                    }
1.8       bertrand 1098: 
                   1099:                    if (sqlite3_prepare_v2((*descripteur).descripteur_sqlite,
1.79      bertrand 1100:                            commande, (int) strlen(commande), &ppStmt, &queue)
1.8       bertrand 1101:                            != SQLITE_OK)
                   1102:                    {
                   1103:                        (*s_etat_processus).erreur_systeme =
                   1104:                                d_es_erreur_fichier;
                   1105:                        return;
                   1106:                    }
                   1107: 
                   1108:                    if (sqlite3_step(ppStmt) != SQLITE_DONE)
                   1109:                    {
                   1110:                        (*s_etat_processus).erreur_systeme =
                   1111:                                d_es_erreur_fichier;
                   1112:                        return;
                   1113:                    }
                   1114: 
                   1115:                    if (sqlite3_finalize(ppStmt) != SQLITE_OK)
                   1116:                    {
                   1117:                        (*s_etat_processus).erreur_systeme =
                   1118:                                d_es_erreur_fichier;
                   1119:                        return;
                   1120:                    }
                   1121: 
                   1122:                    free(commande);
1.6       bertrand 1123:                }
1.8       bertrand 1124: 
                   1125:                // Effacement de l'enregistrement existant
                   1126: 
1.94      bertrand 1127:                if (alsprintf(s_etat_processus, &commande,
                   1128:                        "delete from data where key_id = %lld", id) < 0)
1.8       bertrand 1129:                {
1.9       bertrand 1130:                    (*s_etat_processus).erreur_systeme =
                   1131:                            d_es_allocation_memoire;
1.8       bertrand 1132:                    return;
                   1133:                }
                   1134: 
                   1135:                if (sqlite3_prepare_v2((*descripteur).descripteur_sqlite,
1.79      bertrand 1136:                        commande, (int) strlen(commande), &ppStmt, &queue)
1.8       bertrand 1137:                        != SQLITE_OK)
                   1138:                {
1.9       bertrand 1139:                    (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
1.8       bertrand 1140:                    return;
                   1141:                }
                   1142: 
                   1143:                if (sqlite3_step(ppStmt) != SQLITE_DONE)
                   1144:                {
1.9       bertrand 1145:                    (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
1.8       bertrand 1146:                    return;
                   1147:                }
                   1148: 
                   1149:                if (sqlite3_finalize(ppStmt) != SQLITE_OK)
                   1150:                {
1.9       bertrand 1151:                    (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
1.8       bertrand 1152:                    return;
                   1153:                }
                   1154: 
                   1155:                free(commande);
                   1156: 
                   1157:                // Modification ou création d'un nouvel enregistrement
                   1158: 
                   1159:                l_element_courant = (struct_liste_chainee *)
                   1160:                        (*s_objet_argument_2).objet;
                   1161:                l_element_courant_format = (struct_liste_chainee *)
                   1162:                        (*(*((struct_fichier *) (*s_objet_argument_1).objet))
                   1163:                        .format).objet;
                   1164:                compteur = 1;
                   1165:                ordre = 1;
                   1166: 
                   1167:                while((l_element_courant != NULL) &&
                   1168:                        (l_element_courant_format != NULL))
1.6       bertrand 1169:                {
1.8       bertrand 1170:                    if (compteur == clef)
                   1171:                    {
                   1172:                        l_element_courant = (*l_element_courant).suivant;
                   1173:                        l_element_courant_format = (*l_element_courant_format)
                   1174:                                .suivant;
                   1175:                        compteur++;
                   1176:                        continue;
                   1177:                    }
                   1178: 
                   1179:                    if ((s_element = allocation(s_etat_processus, LST)) == NULL)
                   1180:                    {
                   1181:                        (*s_etat_processus).erreur_systeme =
                   1182:                                d_es_allocation_memoire;
                   1183:                        return;
                   1184:                    }
                   1185: 
                   1186:                    if (((*s_element).objet =
                   1187:                            allocation_maillon(s_etat_processus)) == NULL)
                   1188:                    {
                   1189:                        (*s_etat_processus).erreur_systeme =
                   1190:                                d_es_allocation_memoire;
                   1191:                        return;
                   1192:                    }
                   1193: 
                   1194:                    (*((struct_liste_chainee *) (*s_element).objet)).suivant
                   1195:                            = NULL;
                   1196: 
                   1197:                    if ((s_format = allocation(s_etat_processus, LST)) == NULL)
                   1198:                    {
                   1199:                        (*s_etat_processus).erreur_systeme =
                   1200:                                d_es_allocation_memoire;
                   1201:                        return;
                   1202:                    }
                   1203: 
                   1204:                    if (((*s_format).objet =
                   1205:                            allocation_maillon(s_etat_processus)) == NULL)
                   1206:                    {
                   1207:                        (*s_etat_processus).erreur_systeme =
                   1208:                                d_es_allocation_memoire;
                   1209:                        return;
                   1210:                    }
                   1211: 
                   1212:                    (*((struct_liste_chainee *) (*s_format).objet)).suivant
                   1213:                            = NULL;
                   1214: 
                   1215:                    if (((*((struct_liste_chainee *) (*s_element).objet))
                   1216:                            .donnee = copie_objet(s_etat_processus,
                   1217:                            (*l_element_courant).donnee, 'N')) == NULL)
                   1218:                    {
                   1219:                        (*s_etat_processus).erreur_systeme =
                   1220:                                d_es_allocation_memoire;
                   1221:                        return;
                   1222:                    }
                   1223: 
                   1224:                    if (((*((struct_liste_chainee *) (*s_format).objet))
                   1225:                            .donnee = copie_objet(s_etat_processus,
                   1226:                            (*l_element_courant_format).donnee, 'N')) == NULL)
                   1227:                    {
                   1228:                        (*s_etat_processus).erreur_systeme =
                   1229:                                d_es_allocation_memoire;
                   1230:                        return;
                   1231:                    }
1.6       bertrand 1232: 
                   1233:                    if ((chaine = formateur_fichier(s_etat_processus,
1.8       bertrand 1234:                            s_element, s_format, 0, 0, ' ',
1.75      bertrand 1235:                            'F', &longueur_effective, &recursivite, d_vrai))
                   1236:                            == NULL)
1.6       bertrand 1237:                    {
1.8       bertrand 1238:                        free(clef_utf8);
1.9       bertrand 1239: 
1.8       bertrand 1240:                        liberation(s_etat_processus, s_element);
                   1241:                        liberation(s_etat_processus, s_format);
1.6       bertrand 1242:                        liberation(s_etat_processus, s_objet_argument_2);
                   1243:                        liberation(s_etat_processus, s_objet_argument_1);
                   1244: 
                   1245:                        return;
                   1246:                    }
                   1247: 
                   1248:                    if ((chaine_utf8 = transliteration(s_etat_processus,
                   1249:                            chaine, d_locale, "UTF-8")) == NULL)
                   1250:                    {
1.8       bertrand 1251:                        free(clef_utf8);
1.6       bertrand 1252:                        free(chaine);
                   1253: 
                   1254:                        liberation(s_etat_processus, s_objet_argument_2);
                   1255:                        liberation(s_etat_processus, s_objet_argument_1);
                   1256: 
                   1257:                        return;
                   1258:                    }
                   1259: 
                   1260:                    free(chaine);
                   1261: 
1.94      bertrand 1262:                    if (alsprintf(s_etat_processus, &commande,
                   1263:                            "insert into data (data, key_id, sequence) values "
1.8       bertrand 1264:                            "('%s', %lld, %lld)", chaine_utf8, id, ordre) < 0)
1.6       bertrand 1265:                    {
1.9       bertrand 1266:                        (*s_etat_processus).erreur_systeme =
                   1267:                                d_es_allocation_memoire;
1.6       bertrand 1268:                        return;
                   1269:                    }
                   1270: 
1.8       bertrand 1271:                    if (sqlite3_prepare_v2((*descripteur).descripteur_sqlite,
1.79      bertrand 1272:                            commande, (int) strlen(commande), &ppStmt, &queue)
1.8       bertrand 1273:                            != SQLITE_OK)
                   1274:                    {
                   1275:                        (*s_etat_processus).erreur_systeme =
                   1276:                                d_es_erreur_fichier;
                   1277:                        return;
                   1278:                    }
                   1279: 
                   1280:                    if (sqlite3_step(ppStmt) != SQLITE_DONE)
                   1281:                    {
                   1282:                        (*s_etat_processus).erreur_systeme =
                   1283:                                d_es_erreur_fichier;
                   1284:                        return;
                   1285:                    }
                   1286: 
                   1287:                    if (sqlite3_finalize(ppStmt) != SQLITE_OK)
                   1288:                    {
                   1289:                        (*s_etat_processus).erreur_systeme =
                   1290:                                d_es_erreur_fichier;
                   1291:                        return;
                   1292:                    }
                   1293: 
                   1294:                    free(commande);
1.6       bertrand 1295:                    free(chaine_utf8);
1.8       bertrand 1296: 
                   1297:                    liberation(s_etat_processus, s_element);
                   1298:                    liberation(s_etat_processus, s_format);
                   1299: 
                   1300:                    l_element_courant = (*l_element_courant).suivant;
                   1301:                    l_element_courant_format = (*l_element_courant_format)
                   1302:                            .suivant;
                   1303: 
                   1304:                    compteur++;
                   1305:                    ordre++;
1.6       bertrand 1306:                }
                   1307: 
1.8       bertrand 1308:                free(clef_utf8);
1.6       bertrand 1309: 
1.8       bertrand 1310:                if ((l_element_courant != NULL) ||
                   1311:                        (l_element_courant_format != NULL))
1.6       bertrand 1312:                {
1.8       bertrand 1313:                    liberation(s_etat_processus, s_objet_argument_1);
                   1314:                    liberation(s_etat_processus, s_objet_argument_2);
1.6       bertrand 1315: 
1.8       bertrand 1316:                    (*s_etat_processus).erreur_execution =
                   1317:                            d_ex_erreur_format_fichier;
1.6       bertrand 1318:                    return;
                   1319:                }
1.1       bertrand 1320:            }
                   1321:        }
                   1322:        else if ((*((struct_fichier *) (*s_objet_argument_1).objet)).binaire
                   1323:                == 'Y')
                   1324:        {
                   1325:            /*
                   1326:             * Fichiers non formatés
                   1327:             */
                   1328: 
1.75      bertrand 1329:            if ((*((struct_fichier *) (*s_objet_argument_1).objet)).acces
                   1330:                    == 'S')
1.1       bertrand 1331:            {
1.76      bertrand 1332:                if ((*s_objet_argument_2).type != LST)
                   1333:                {
                   1334:                    liberation(s_etat_processus, s_objet_argument_2);
                   1335:                    liberation(s_etat_processus, s_objet_argument_1);
                   1336: 
                   1337:                    (*s_etat_processus).erreur_execution =
                   1338:                            d_ex_erreur_type_argument;
                   1339:                    return;
                   1340:                }
                   1341: 
1.75      bertrand 1342:                if ((chaine = formateur_fichier(s_etat_processus,
                   1343:                        s_objet_argument_2, (*((struct_fichier *)
                   1344:                        (*s_objet_argument_1).objet)).format, 0, 0, ' ', 'U',
                   1345:                        &longueur_effective, &recursivite, d_vrai)) == NULL)
                   1346:                {
                   1347:                    liberation(s_etat_processus, s_objet_argument_2);
                   1348:                    liberation(s_etat_processus, s_objet_argument_1);
1.1       bertrand 1349: 
1.75      bertrand 1350:                    return;
                   1351:                }
1.1       bertrand 1352: 
1.5       bertrand 1353:                BUG(((*descripteur).type != 'C'), uprintf("Bad filetype !\n"));
                   1354: 
                   1355:                if (fseek((*descripteur).descripteur_c, (long) 0, SEEK_END)
                   1356:                        != 0)
1.1       bertrand 1357:                {
                   1358:                    liberation(s_etat_processus, s_objet_argument_2);
                   1359:                    liberation(s_etat_processus, s_objet_argument_1);
                   1360: 
                   1361:                    (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                   1362:                    return;
                   1363:                }
                   1364: 
1.121     bertrand 1365:                if (write(fileno((*descripteur).descripteur_c),
                   1366:                        chaine, (size_t) longueur_effective) !=
                   1367:                        (ssize_t) longueur_effective)
1.1       bertrand 1368:                {
                   1369:                    (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                   1370:                    return;
                   1371:                }
                   1372:            }
                   1373:            else if ((*((struct_fichier *) (*s_objet_argument_1).objet)).acces
                   1374:                    == 'D')
                   1375:            {
1.76      bertrand 1376:                if ((*s_objet_argument_2).type != INT)
                   1377:                {
                   1378:                    liberation(s_etat_processus, s_objet_argument_2);
                   1379:                    liberation(s_etat_processus, s_objet_argument_1);
                   1380: 
                   1381:                    (*s_etat_processus).erreur_execution =
                   1382:                            d_ex_erreur_type_argument;
                   1383:                    return;
                   1384:                }
                   1385: 
                   1386:                if (depilement(s_etat_processus, &((*s_etat_processus)
                   1387:                        .l_base_pile), &s_objet_argument_3) == d_erreur)
                   1388:                {
                   1389:                    (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                   1390:                    return;
                   1391:                }
                   1392: 
                   1393:                if ((*s_objet_argument_3).type != LST)
                   1394:                {
                   1395:                    liberation(s_etat_processus, s_objet_argument_3);
                   1396:                    liberation(s_etat_processus, s_objet_argument_2);
                   1397:                    liberation(s_etat_processus, s_objet_argument_1);
                   1398: 
                   1399:                    (*s_etat_processus).erreur_execution =
                   1400:                            d_ex_erreur_type_argument;
                   1401:                    return;
                   1402:                }
                   1403: 
1.75      bertrand 1404:                if ((chaine = formateur_fichier(s_etat_processus,
                   1405:                        s_objet_argument_2, (*((struct_fichier *)
                   1406:                        (*s_objet_argument_1).objet)).format, 0, 0, ' ', 'U',
                   1407:                        &longueur_effective, &recursivite, d_faux)) == NULL)
                   1408:                {
                   1409:                    liberation(s_etat_processus, s_objet_argument_2);
                   1410:                    liberation(s_etat_processus, s_objet_argument_1);
                   1411: 
                   1412:                    return;
                   1413:                }
1.131     bertrand 1414: 
                   1415:                if ((chaine_utf8 = transliteration(s_etat_processus,
                   1416:                        chaine, d_locale, "UTF-8")) == NULL)
                   1417:                {
                   1418:                    free(chaine);
                   1419: 
                   1420:                    liberation(s_etat_processus, s_objet_argument_2);
                   1421:                    liberation(s_etat_processus, s_objet_argument_1);
                   1422: 
                   1423:                    return;
                   1424:                }
                   1425: 
                   1426:                free(chaine);
                   1427: 
                   1428:                if (alsprintf(s_etat_processus, &commande,
                   1429:                        "insert or replace into data "
                   1430:                        "(id, data) values (%lld, '%s')", (*((integer8 *)
                   1431:                        (*s_objet_argument_2).objet)), chaine_utf8) < 0)
                   1432:                {
                   1433:                    (*s_etat_processus).erreur_systeme =
                   1434:                            d_es_allocation_memoire;
                   1435:                    return;
                   1436:                }
                   1437: 
                   1438:                free(chaine_utf8);
                   1439: 
                   1440:                if (sqlite3_prepare_v2((*descripteur).descripteur_sqlite,
                   1441:                        commande, (int) strlen(commande), &ppStmt, &queue)
                   1442:                        != SQLITE_OK)
                   1443:                {
                   1444:                    (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                   1445:                    return;
                   1446:                }
                   1447: 
                   1448:                if (sqlite3_step(ppStmt) != SQLITE_DONE)
                   1449:                {
                   1450:                    (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                   1451:                    return;
                   1452:                }
                   1453: 
                   1454:                if (sqlite3_finalize(ppStmt) != SQLITE_OK)
                   1455:                {
                   1456:                    (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                   1457:                    return;
                   1458:                }
                   1459: 
                   1460:                liberation(s_etat_processus, s_objet_argument_3);
                   1461:                free(commande);
1.1       bertrand 1462:            }
1.75      bertrand 1463:            else // Fichiers indexés
1.1       bertrand 1464:            {
1.76      bertrand 1465:                if ((*s_objet_argument_2).type != LST)
                   1466:                {
                   1467:                    liberation(s_etat_processus, s_objet_argument_2);
                   1468:                    liberation(s_etat_processus, s_objet_argument_1);
                   1469: 
                   1470:                    (*s_etat_processus).erreur_execution =
                   1471:                            d_ex_erreur_type_argument;
                   1472:                    return;
                   1473:                }
                   1474: 
1.75      bertrand 1475:                if ((chaine = formateur_fichier(s_etat_processus,
                   1476:                        s_objet_argument_2, (*((struct_fichier *)
                   1477:                        (*s_objet_argument_1).objet)).format, 0, 0, ' ', 'U',
                   1478:                        &longueur_effective, &recursivite, d_faux)) == NULL)
                   1479:                {
                   1480:                    liberation(s_etat_processus, s_objet_argument_2);
                   1481:                    liberation(s_etat_processus, s_objet_argument_1);
                   1482: 
                   1483:                    return;
                   1484:                }
1.1       bertrand 1485:            }
                   1486: 
                   1487:            free(chaine);
                   1488:        }
                   1489:        else
                   1490:        {
                   1491:            /*
                   1492:             * Fichiers de type FLOW
                   1493:             */
1.33      bertrand 1494: 
                   1495:            if ((*((struct_fichier *) (*s_objet_argument_1).objet)).acces
                   1496:                    == 'S')
                   1497:            {
                   1498:                BUG(((*descripteur).type != 'C'), uprintf("Bad filetype !\n"));
                   1499: 
1.56      bertrand 1500:                if ((*s_objet_argument_2).type != LST)
                   1501:                {
                   1502:                    liberation(s_etat_processus, s_objet_argument_2);
                   1503:                    liberation(s_etat_processus, s_objet_argument_1);
                   1504: 
                   1505:                    (*s_etat_processus).erreur_execution =
                   1506:                            d_ex_erreur_type_argument;
                   1507:                    return;
                   1508:                }
                   1509: 
                   1510:                if ((*((struct_liste_chainee *) (*s_objet_argument_2).objet))
                   1511:                        .donnee == NULL)
                   1512:                {
                   1513:                    liberation(s_etat_processus, s_objet_argument_2);
                   1514:                    liberation(s_etat_processus, s_objet_argument_1);
                   1515: 
                   1516:                    (*s_etat_processus).erreur_execution =
                   1517:                            d_ex_erreur_type_argument;
                   1518:                    return;
                   1519:                }
                   1520: 
1.64      bertrand 1521:                l_element_courant = (*s_objet_argument_2).objet;
                   1522:                l_element_courant_format = (struct_liste_chainee *)
                   1523:                        (*(*((struct_fichier *) (*s_objet_argument_1).objet))
                   1524:                        .format).objet;
                   1525: 
                   1526:                while((l_element_courant != NULL) &&
                   1527:                        (l_element_courant_format != NULL))
1.33      bertrand 1528:                {
1.64      bertrand 1529:                    if ((*(*l_element_courant).donnee).type != CHN)
                   1530:                    {
                   1531:                        liberation(s_etat_processus, s_objet_argument_2);
                   1532:                        liberation(s_etat_processus, s_objet_argument_1);
                   1533: 
                   1534:                        (*s_etat_processus).erreur_execution =
                   1535:                                d_ex_erreur_type_argument;
                   1536:                        return;
                   1537:                    }
                   1538: 
                   1539:                    if ((*(*l_element_courant_format).donnee).type != CHN)
                   1540:                    {
                   1541:                        liberation(s_etat_processus, s_objet_argument_2);
                   1542:                        liberation(s_etat_processus, s_objet_argument_1);
                   1543: 
                   1544:                        (*s_etat_processus).erreur_execution =
                   1545:                                d_ex_erreur_type_argument;
                   1546:                        return;
                   1547:                    }
                   1548: 
1.94      bertrand 1549:                    if ((format_chaine = conversion_majuscule(s_etat_processus,
                   1550:                            (unsigned char *) (*(*l_element_courant_format)
                   1551:                            .donnee).objet)) == NULL)
1.64      bertrand 1552:                    {
                   1553:                        (*s_etat_processus).erreur_systeme =
                   1554:                                d_es_allocation_memoire;
                   1555:                        return;
                   1556:                    }
                   1557: 
1.110     bertrand 1558:                    if (strcmp("LINE*(*)", format_chaine) == 0)
1.64      bertrand 1559:                    {
1.110     bertrand 1560:                        format_oriente_ligne = d_vrai;
                   1561:                        format_degenere = d_vrai;
1.64      bertrand 1562:                    }
1.110     bertrand 1563:                    else
1.64      bertrand 1564:                    {
1.110     bertrand 1565:                        format_oriente_ligne = d_faux;
                   1566:                        
                   1567:                        if (strncmp("LENGTH*(", format_chaine, 8) != 0)
                   1568:                        {
                   1569:                            free(format_chaine);
1.64      bertrand 1570: 
1.110     bertrand 1571:                            liberation(s_etat_processus, s_objet_argument_2);
                   1572:                            liberation(s_etat_processus, s_objet_argument_1);
1.64      bertrand 1573: 
1.110     bertrand 1574:                            (*s_etat_processus).erreur_execution =
                   1575:                                    d_ex_erreur_format_fichier;
                   1576:                            return;
                   1577:                        }
1.64      bertrand 1578: 
1.110     bertrand 1579:                        longueur = (integer8) strlen(format_chaine);
1.64      bertrand 1580: 
1.110     bertrand 1581:                        if (format_chaine[longueur - 1] != ')')
1.64      bertrand 1582:                        {
                   1583:                            free(format_chaine);
                   1584: 
                   1585:                            liberation(s_etat_processus, s_objet_argument_2);
                   1586:                            liberation(s_etat_processus, s_objet_argument_1);
1.33      bertrand 1587: 
1.64      bertrand 1588:                            (*s_etat_processus).erreur_execution =
                   1589:                                    d_ex_erreur_format_fichier;
                   1590:                            return;
                   1591:                        }
1.110     bertrand 1592: 
                   1593:                        format_chaine[longueur] = d_code_fin_chaine;
                   1594: 
                   1595:                        if (format_chaine[8] == '*')
                   1596:                        {
                   1597:                            format_degenere = d_vrai;
                   1598:                        }
                   1599:                        else
                   1600:                        {
                   1601:                            // Détermination de la longueur
                   1602:                            format_degenere = d_faux;
                   1603: 
                   1604:                            if (sscanf(&(format_chaine[8]), "%lld", &longueur)
                   1605:                                    != 1)
                   1606:                            {
                   1607:                                free(format_chaine);
                   1608: 
                   1609:                                liberation(s_etat_processus,
                   1610:                                        s_objet_argument_2);
                   1611:                                liberation(s_etat_processus,
                   1612:                                        s_objet_argument_1);
                   1613: 
                   1614:                                (*s_etat_processus).erreur_execution =
                   1615:                                        d_ex_erreur_format_fichier;
                   1616:                                return;
                   1617:                            }
                   1618:                        }
1.64      bertrand 1619:                    }
1.33      bertrand 1620: 
1.64      bertrand 1621:                    free(format_chaine);
1.33      bertrand 1622: 
1.64      bertrand 1623:                    if ((chaine = formateur_flux(s_etat_processus,
                   1624:                            (unsigned char *) (*(*l_element_courant).donnee)
                   1625:                            .objet, &longueur_effective)) == NULL)
                   1626:                    {
                   1627:                        (*s_etat_processus).erreur_systeme =
                   1628:                                d_es_allocation_memoire;
                   1629:                        return;
                   1630:                    }
1.33      bertrand 1631: 
1.64      bertrand 1632:                    if ((format_degenere == d_vrai) ||
                   1633:                            (longueur_effective < longueur))
                   1634:                    {
1.121     bertrand 1635:                        if (write(fileno((*descripteur).descripteur_c),
                   1636:                                chaine, (size_t) longueur_effective)
                   1637:                                != (ssize_t) longueur_effective)
1.64      bertrand 1638:                        {
                   1639:                            (*s_etat_processus).erreur_systeme =
                   1640:                                    d_es_erreur_fichier;
                   1641:                            return;
                   1642:                        }
                   1643:                    }
                   1644:                    else
                   1645:                    {
1.121     bertrand 1646:                        if (write(fileno((*descripteur).descripteur_c),
                   1647:                                chaine, (size_t) longueur_effective)
                   1648:                                != (ssize_t) longueur)
1.64      bertrand 1649:                        {
                   1650:                            (*s_etat_processus).erreur_systeme =
                   1651:                                    d_es_erreur_fichier;
                   1652:                            return;
                   1653:                        }
                   1654:                    }
1.63      bertrand 1655: 
1.64      bertrand 1656:                    free(chaine);
1.63      bertrand 1657: 
1.110     bertrand 1658:                    if (format_oriente_ligne == d_vrai)
                   1659:                    {
1.121     bertrand 1660:                        if (write(fileno((*descripteur).descripteur_c),
                   1661:                                "\n", 1) != 1)
1.110     bertrand 1662:                        {
                   1663:                            (*s_etat_processus).erreur_systeme =
                   1664:                                    d_es_erreur_fichier;
                   1665:                            return;
                   1666:                        }
                   1667:                    }
                   1668: 
1.64      bertrand 1669:                    l_element_courant = (*l_element_courant).suivant;
                   1670:                    l_element_courant_format = (*l_element_courant_format)
                   1671:                            .suivant;
                   1672:                }
1.63      bertrand 1673: 
1.64      bertrand 1674:                if ((l_element_courant_format != NULL) ||
                   1675:                        (l_element_courant != NULL))
1.63      bertrand 1676:                {
1.64      bertrand 1677:                    liberation(s_etat_processus, s_objet_argument_2);
                   1678:                    liberation(s_etat_processus, s_objet_argument_1);
                   1679: 
                   1680:                    (*s_etat_processus).erreur_execution =
                   1681:                            d_ex_erreur_format_fichier;
1.63      bertrand 1682:                    return;
                   1683:                }
1.33      bertrand 1684:            }
                   1685:            else
                   1686:            {
                   1687:                liberation(s_etat_processus, s_objet_argument_1);
                   1688:                liberation(s_etat_processus, s_objet_argument_2);
                   1689: 
                   1690:                (*s_etat_processus).erreur_execution =
                   1691:                        d_ex_erreur_type_fichier;
                   1692:                return;
                   1693:            }
1.1       bertrand 1694:        }
                   1695:    }
                   1696:    else if (((*s_objet_argument_2).type == LST) &&
                   1697:            ((*s_objet_argument_1).type == SCK))
                   1698:    {
                   1699:        /*
                   1700:         * Vérification de l'autorisation d'écriture
                   1701:         */
                   1702: 
                   1703:        if ((*((struct_socket *) (*s_objet_argument_1).objet))
                   1704:                .protection == 'R')
                   1705:        {
                   1706:            liberation(s_etat_processus, s_objet_argument_2);
                   1707:            liberation(s_etat_processus, s_objet_argument_1);
                   1708: 
                   1709:            (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier;
                   1710:            return;
                   1711:        }
                   1712: 
                   1713:        if ((*((struct_socket *) (*s_objet_argument_1).objet)).binaire == 'N')
                   1714:        {
                   1715:            /*
                   1716:             * Sockets formatées
                   1717:             */
                   1718: 
                   1719:            if ((chaine = formateur_fichier(s_etat_processus,
                   1720:                    s_objet_argument_2, (*((struct_socket *)
                   1721:                    (*s_objet_argument_1).objet)).format, 0, 0, ' ', 'F',
1.75      bertrand 1722:                    &longueur_effective, &recursivite, d_faux)) == NULL)
1.1       bertrand 1723:            {
                   1724:                liberation(s_etat_processus, s_objet_argument_2);
                   1725:                liberation(s_etat_processus, s_objet_argument_1);
                   1726: 
                   1727:                return;
                   1728:            }
1.33      bertrand 1729:        }
                   1730:        else if ((*((struct_socket *) (*s_objet_argument_1).objet)).binaire
                   1731:                == 'Y')
                   1732:        {
                   1733:            /*
                   1734:             * Sockets non formatées
                   1735:             */
1.38      bertrand 1736: 
1.77      bertrand 1737:            if ((chaine = formateur_fichier(s_etat_processus,
                   1738:                    s_objet_argument_2, (*((struct_socket *)
                   1739:                    (*s_objet_argument_1).objet)).format, 0, 0, ' ', 'U',
                   1740:                    &longueur_effective, &recursivite, d_faux)) == NULL)
                   1741:            {
                   1742:                liberation(s_etat_processus, s_objet_argument_2);
                   1743:                liberation(s_etat_processus, s_objet_argument_1);
                   1744: 
                   1745:                return;
                   1746:            }
1.33      bertrand 1747:        }
                   1748:        else
                   1749:        {
                   1750:            /*
                   1751:             *  Sockets de type FLOW
                   1752:             */
                   1753: 
                   1754:            if ((*((*((struct_liste_chainee *) (*s_objet_argument_2).objet))
                   1755:                    .donnee)).type != CHN)
                   1756:            {
                   1757:                liberation(s_etat_processus, s_objet_argument_2);
                   1758:                liberation(s_etat_processus, s_objet_argument_1);
                   1759: 
                   1760:                (*s_etat_processus).erreur_execution =
                   1761:                        d_ex_erreur_type_argument;
                   1762:                return;
                   1763:            }
                   1764: 
                   1765:            if ((chaine = formateur_flux(s_etat_processus, (unsigned char *)
                   1766:                    (*((*((struct_liste_chainee *) (*s_objet_argument_2)
                   1767:                    .objet)).donnee)).objet, &longueur_effective)) == NULL)
                   1768:            {
                   1769:                liberation(s_etat_processus, s_objet_argument_2);
                   1770:                liberation(s_etat_processus, s_objet_argument_1);
                   1771: 
                   1772:                return;
                   1773:            }
                   1774:        }
1.1       bertrand 1775: 
1.33      bertrand 1776:        if ((strcmp((*((struct_socket *) (*s_objet_argument_1).objet)).type,
                   1777:                "STREAM") == 0) || (strcmp((*((struct_socket *)
                   1778:                (*s_objet_argument_1).objet)).type,
                   1779:                "SEQUENTIAL DATAGRAM") == 0))
                   1780:        { // Sockets connectées
1.117     bertrand 1781: #          ifndef SEMAPHORES_NOMMES
                   1782:                if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
                   1783: #          else
                   1784:                if (sem_post((*s_etat_processus).semaphore_fork) != 0)
                   1785: #          endif
                   1786:            {
                   1787:                (*s_etat_processus).erreur_systeme = d_es_processus;
                   1788:                return;
                   1789:            }
                   1790: 
1.116     bertrand 1791:            if (pthread_mutex_lock(&mutex_sigaction) != 0)
                   1792:            {
                   1793:                (*s_etat_processus).erreur_systeme = d_es_processus;
                   1794:                return;
                   1795:            }
1.33      bertrand 1796: 
                   1797:            action.sa_handler = SIG_IGN;
1.115     bertrand 1798:            action.sa_flags = 0;
1.33      bertrand 1799: 
                   1800:            if (sigaction(SIGPIPE, &action, &registre) != 0)
                   1801:            {
1.116     bertrand 1802:                pthread_mutex_unlock(&mutex_sigaction);
1.33      bertrand 1803:                (*s_etat_processus).erreur_systeme = d_es_signal;
                   1804:                return;
                   1805:            }
                   1806: 
                   1807:            if (send((*((struct_socket *) (*s_objet_argument_1).objet))
1.79      bertrand 1808:                    .socket, chaine, (size_t) longueur_effective, 0) < 0)
1.33      bertrand 1809:            {
                   1810:                ios = errno;
1.1       bertrand 1811: 
1.33      bertrand 1812:                if (sigaction(SIGPIPE, &registre, NULL) != 0)
1.1       bertrand 1813:                {
1.116     bertrand 1814:                    pthread_mutex_unlock(&mutex_sigaction);
1.1       bertrand 1815:                    (*s_etat_processus).erreur_systeme = d_es_signal;
                   1816:                    return;
                   1817:                }
                   1818: 
1.116     bertrand 1819:                if (pthread_mutex_unlock(&mutex_sigaction) != 0)
                   1820:                {
                   1821:                    (*s_etat_processus).erreur_systeme = d_es_processus;
                   1822:                    return;
                   1823:                }
                   1824: 
1.51      bertrand 1825: #              ifndef SEMAPHORES_NOMMES
                   1826:                    while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
                   1827: #              else
                   1828:                    while(sem_wait((*s_etat_processus).semaphore_fork) != 0)
                   1829: #              endif
1.1       bertrand 1830:                {
1.50      bertrand 1831:                    if (errno != EINTR)
                   1832:                    {
                   1833:                        (*s_etat_processus).erreur_systeme = d_es_processus;
                   1834:                        return;
                   1835:                    }
1.33      bertrand 1836:                }
1.1       bertrand 1837: 
1.33      bertrand 1838:                if ((ios == EPIPE) || (ios == ECONNRESET))
                   1839:                {
                   1840:                    (*s_etat_processus).erreur_execution =
                   1841:                            d_ex_erreur_acces_fichier;
1.1       bertrand 1842:                    return;
                   1843:                }
                   1844: 
1.33      bertrand 1845:                (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                   1846:                return;
                   1847:            }
                   1848: 
1.117     bertrand 1849:            if (sigaction(SIGPIPE, &registre, NULL) != 0)
                   1850:            {
                   1851:                pthread_mutex_unlock(&mutex_sigaction);
                   1852: 
                   1853: #              ifndef SEMAPHORES_NOMMES
                   1854:                    while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
                   1855: #              else
                   1856:                    while(sem_wait((*s_etat_processus).semaphore_fork) != 0)
                   1857: #              endif
                   1858:                {
                   1859:                    if (errno != EINTR)
                   1860:                    {
                   1861:                        if (sigaction(SIGPIPE, &registre, NULL) != 0)
                   1862:                        {
                   1863:                            pthread_mutex_unlock(&mutex_sigaction);
                   1864:                            (*s_etat_processus).erreur_systeme = d_es_signal;
                   1865:                            return;
                   1866:                        }
                   1867: 
                   1868:                        pthread_mutex_unlock(&mutex_sigaction);
                   1869:                        (*s_etat_processus).erreur_systeme = d_es_processus;
                   1870:                        return;
                   1871:                    }
                   1872:                }
                   1873: 
                   1874:                (*s_etat_processus).erreur_systeme = d_es_signal;
                   1875:                return;
                   1876:            }
                   1877: 
                   1878:            if (pthread_mutex_unlock(&mutex_sigaction) != 0)
                   1879:            {
                   1880:                (*s_etat_processus).erreur_systeme = d_es_processus;
                   1881:                return;
                   1882:            }
                   1883: 
1.51      bertrand 1884: #          ifndef SEMAPHORES_NOMMES
                   1885:                while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
                   1886: #          else
                   1887:                while(sem_wait((*s_etat_processus).semaphore_fork) != 0)
                   1888: #          endif
1.33      bertrand 1889:            {
                   1890:                if (errno != EINTR)
1.1       bertrand 1891:                {
                   1892:                    if (sigaction(SIGPIPE, &registre, NULL) != 0)
                   1893:                    {
                   1894:                        (*s_etat_processus).erreur_systeme = d_es_signal;
                   1895:                        return;
                   1896:                    }
                   1897: 
1.33      bertrand 1898:                    (*s_etat_processus).erreur_systeme = d_es_processus;
                   1899:                    return;
                   1900:                }
                   1901:            }
                   1902:        }
                   1903:        else
                   1904:        { // Sockets non connectées
                   1905: 
                   1906:            /*
                   1907:             * Vérification de l'adresse distante
                   1908:             */
                   1909: 
                   1910:            if (strcmp((*((struct_socket *) (*s_objet_argument_1).objet))
                   1911:                    .adresse_distante, "") == 0)
                   1912:            {
                   1913:                liberation(s_etat_processus, s_objet_argument_1);
                   1914:                liberation(s_etat_processus, s_objet_argument_2);
                   1915: 
                   1916:                (*s_etat_processus).erreur_execution =
                   1917:                        d_ex_erreur_acces_fichier;
                   1918:                return;
                   1919:            }
                   1920: 
                   1921:            /*
                   1922:             * Création de l'adresse logique
                   1923:             */
                   1924: 
                   1925:            if ((*((struct_socket *) (*s_objet_argument_1).objet))
                   1926:                    .domaine == PF_UNIX)
                   1927:            {
                   1928:                adresse_unix.sun_family = AF_UNIX;
                   1929:                strncpy(adresse_unix.sun_path, (*((struct_socket *)
                   1930:                        (*s_objet_argument_1).objet)).adresse_distante,
                   1931:                        UNIX_PATH_MAX);
                   1932:                adresse_unix.sun_path[UNIX_PATH_MAX - 1] =
                   1933:                        d_code_fin_chaine;
                   1934: 
1.51      bertrand 1935: #              ifndef SEMAPHORES_NOMMES
                   1936:                    if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
                   1937: #              else
                   1938:                    if (sem_post((*s_etat_processus).semaphore_fork) != 0)
                   1939: #              endif
1.33      bertrand 1940:                {
                   1941:                    (*s_etat_processus).erreur_systeme = d_es_processus;
                   1942:                    return;
                   1943:                }
                   1944: 
                   1945:                if (sendto((*((struct_socket *)
                   1946:                        (*s_objet_argument_1).objet)).socket, chaine,
1.79      bertrand 1947:                        (size_t) longueur_effective, 0, (struct sockaddr *)
1.33      bertrand 1948:                        &adresse_unix, sizeof(adresse_unix)) < 0)
                   1949:                {
1.38      bertrand 1950:                    ios = errno;
                   1951: 
1.51      bertrand 1952: #                  ifndef SEMAPHORES_NOMMES
                   1953:                        while(sem_wait(&((*s_etat_processus).semaphore_fork))
                   1954:                                != 0)
                   1955: #                  else
                   1956:                        while(sem_wait((*s_etat_processus).semaphore_fork) != 0)
                   1957: #                  endif
1.1       bertrand 1958:                    {
1.50      bertrand 1959:                        if (errno != EINTR)
                   1960:                        {
                   1961:                            (*s_etat_processus).erreur_systeme = d_es_processus;
                   1962:                            return;
                   1963:                        }
1.1       bertrand 1964:                    }
                   1965: 
1.34      bertrand 1966:                    if ((ios == EPIPE) || (ios == ECONNRESET))
                   1967:                    {
                   1968:                        (*s_etat_processus).erreur_execution =
                   1969:                                d_ex_erreur_acces_fichier;
                   1970:                        return;
                   1971:                    }
                   1972: 
1.73      bertrand 1973:                    if (ios == EMSGSIZE)
                   1974:                    {
                   1975:                        (*s_etat_processus).erreur_execution =
                   1976:                                d_ex_taille_message;
1.74      bertrand 1977:                        return;
1.73      bertrand 1978:                    }
1.34      bertrand 1979: 
                   1980:                    (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
1.1       bertrand 1981:                    return;
                   1982:                }
                   1983: 
1.51      bertrand 1984: #              ifndef SEMAPHORES_NOMMES
                   1985:                    while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
                   1986: #              else
                   1987:                    while(sem_wait((*s_etat_processus).semaphore_fork) != 0)
                   1988: #              endif
1.1       bertrand 1989:                {
1.50      bertrand 1990:                    if (errno != EINTR)
                   1991:                    {
                   1992:                        (*s_etat_processus).erreur_systeme = d_es_processus;
                   1993:                        return;
                   1994:                    }
1.1       bertrand 1995:                }
                   1996:            }
1.33      bertrand 1997:            else if ((*((struct_socket *) (*s_objet_argument_1).objet))
                   1998:                    .domaine == PF_INET)
                   1999:            {
                   2000:                if (sscanf((*((struct_socket *)
                   2001:                        (*s_objet_argument_1).objet))
                   2002:                        .adresse_distante, "%d.%d.%d.%d(%d)",
                   2003:                        &(adresse[0]), &(adresse[1]), &(adresse[2]),
                   2004:                        &(adresse[3]), &port) == 5)
                   2005:                { // Adresse IPv4
                   2006:                    calcul_adresse = 0;
                   2007:                    for(i = 0; i < 4; calcul_adresse =
1.79      bertrand 2008:                            (256 * calcul_adresse) +
                   2009:                            ((unsigned char) adresse[i++]));
1.33      bertrand 2010: 
                   2011:                    memset(&adresse_ipv4, 0, sizeof(adresse_ipv4));
                   2012:                    adresse_ipv4.sin_family = AF_INET;
1.81      bertrand 2013:                    adresse_ipv4.sin_port = htons((uint16_t) port);
1.33      bertrand 2014:                    adresse_ipv4.sin_addr.s_addr = htonl(calcul_adresse);
1.1       bertrand 2015: 
1.51      bertrand 2016: #                  ifndef SEMAPHORES_NOMMES
                   2017:                        if (sem_post(&((*s_etat_processus).semaphore_fork))
                   2018:                                != 0)
                   2019: #                  else
                   2020:                        if (sem_post((*s_etat_processus).semaphore_fork) != 0)
                   2021: #                  endif
1.1       bertrand 2022:                    {
                   2023:                        (*s_etat_processus).erreur_systeme = d_es_processus;
                   2024:                        return;
                   2025:                    }
                   2026: 
                   2027:                    if (sendto((*((struct_socket *)
                   2028:                            (*s_objet_argument_1).objet)).socket, chaine,
1.79      bertrand 2029:                            (size_t) longueur_effective, 0, (struct sockaddr *)
1.33      bertrand 2030:                            &adresse_ipv4, sizeof(adresse_ipv4)) < 0)
1.1       bertrand 2031:                    {
1.74      bertrand 2032:                        ios = errno;
                   2033: 
1.51      bertrand 2034: #                      ifndef SEMAPHORES_NOMMES
                   2035:                            while(sem_wait(&((*s_etat_processus)
                   2036:                                    .semaphore_fork)) != 0)
                   2037: #                      else
                   2038:                            while(sem_wait((*s_etat_processus)
                   2039:                                    .semaphore_fork) != 0)
                   2040: #                      endif
1.1       bertrand 2041:                        {
1.50      bertrand 2042:                            if (errno != EINTR)
                   2043:                            {
                   2044:                                (*s_etat_processus).erreur_systeme =
                   2045:                                        d_es_processus;
                   2046:                                return;
                   2047:                            }
1.1       bertrand 2048:                        }
                   2049: 
1.74      bertrand 2050:                        if ((ios == EPIPE) || (ios == ECONNRESET))
                   2051:                        {
                   2052:                            (*s_etat_processus).erreur_execution =
                   2053:                                    d_ex_erreur_acces_fichier;
                   2054:                            return;
                   2055:                        }
                   2056: 
                   2057:                        if (ios == EMSGSIZE)
                   2058:                        {
                   2059:                            (*s_etat_processus).erreur_execution =
                   2060:                                    d_ex_taille_message;
                   2061:                            return;
                   2062:                        }
                   2063: 
1.1       bertrand 2064:                        (*s_etat_processus).erreur_systeme =
                   2065:                                d_es_erreur_fichier;
                   2066:                        return;
                   2067:                    }
                   2068: 
1.51      bertrand 2069: #                  ifndef SEMAPHORES_NOMMES
                   2070:                        while(sem_wait(&((*s_etat_processus).semaphore_fork))
                   2071:                                != 0)
                   2072: #                  else
                   2073:                        while(sem_wait((*s_etat_processus).semaphore_fork) != 0)
                   2074: #                  endif
1.1       bertrand 2075:                    {
1.50      bertrand 2076:                        if (errno != EINTR)
                   2077:                        {
                   2078:                            (*s_etat_processus).erreur_systeme = d_es_processus;
                   2079:                            return;
                   2080:                        }
1.1       bertrand 2081:                    }
                   2082:                }
1.33      bertrand 2083:                else
1.1       bertrand 2084:                {
1.33      bertrand 2085:                    liberation(s_etat_processus, s_objet_argument_1);
                   2086:                    liberation(s_etat_processus, s_objet_argument_2);
1.1       bertrand 2087: 
1.33      bertrand 2088:                    (*s_etat_processus).erreur_execution =
                   2089:                            d_ex_erreur_parametre_fichier;
                   2090:                    return;
                   2091:                }
                   2092:            }
                   2093:            else if ((*((struct_socket *) (*s_objet_argument_1).objet))
                   2094:                    .domaine == PF_INET6)
                   2095:            {
                   2096:                if (sscanf((*((struct_socket *) (*s_objet_argument_1)
                   2097:                        .objet)).adresse_distante, "%X:%X:%X:%X:%X:"
                   2098:                        "%X:%X:%X:%X:%X:%X:%X:%X:%X:%X:%X(%d)",
                   2099:                        &(adresse[0]), &(adresse[1]), &(adresse[2]),
                   2100:                        &(adresse[3]), &(adresse[4]), &(adresse[5]),
                   2101:                        &(adresse[6]), &(adresse[7]), &(adresse[8]),
                   2102:                        &(adresse[9]), &(adresse[10]), &(adresse[11]),
                   2103:                        &(adresse[12]), &(adresse[13]), &(adresse[14]),
                   2104:                        &(adresse[15]), &port)== 17)
                   2105:                { // Adresse IPv6
                   2106: #                  ifdef IPV6
                   2107:                    memset(&adresse_ipv6, 0, sizeof(adresse_ipv6));
                   2108:                    adresse_ipv6.sin6_family = AF_INET6;
                   2109:                    adresse_ipv6.sin6_port = htons((uint16_t) port);
                   2110: 
                   2111:                    for(i = 0; i < 16;
                   2112:                            adresse_ipv6.sin6_addr.s6_addr[i] =
1.79      bertrand 2113:                            (unsigned char) adresse[i], i++);
1.1       bertrand 2114: 
1.51      bertrand 2115: #                  ifndef SEMAPHORES_NOMMES
                   2116:                        if (sem_post(&((*s_etat_processus).semaphore_fork))
                   2117:                                != 0)
                   2118: #                  else
                   2119:                        if (sem_post((*s_etat_processus).semaphore_fork) != 0)
                   2120: #                  endif
1.33      bertrand 2121:                    {
                   2122:                        (*s_etat_processus).erreur_systeme = d_es_processus;
                   2123:                        return;
                   2124:                    }
1.1       bertrand 2125: 
1.33      bertrand 2126:                    if (sendto((*((struct_socket *)
                   2127:                            (*s_objet_argument_1).objet)).socket, chaine,
1.79      bertrand 2128:                            (size_t) longueur_effective, 0, (struct sockaddr *)
1.33      bertrand 2129:                            &adresse_ipv6, sizeof(adresse_ipv6)) < 0)
                   2130:                    {
1.74      bertrand 2131:                        ios = errno;
                   2132: 
1.51      bertrand 2133: #                      ifndef SEMAPHORES_NOMMES
                   2134:                            while(sem_wait(&((*s_etat_processus)
                   2135:                                    .semaphore_fork)) != 0)
                   2136: #                      else
                   2137:                            while(sem_wait((*s_etat_processus)
                   2138:                                    .semaphore_fork) != 0)
                   2139: #                      endif
1.1       bertrand 2140:                        {
1.50      bertrand 2141:                            if (errno != EINTR)
                   2142:                            {
                   2143:                                (*s_etat_processus).erreur_systeme =
                   2144:                                        d_es_processus;
                   2145:                                return;
                   2146:                            }
1.1       bertrand 2147:                        }
                   2148: 
1.74      bertrand 2149:                        if ((ios == EPIPE) || (ios == ECONNRESET))
                   2150:                        {
                   2151:                            (*s_etat_processus).erreur_execution =
                   2152:                                    d_ex_erreur_acces_fichier;
                   2153:                            return;
                   2154:                        }
                   2155: 
                   2156:                        if (ios == EMSGSIZE)
                   2157:                        {
                   2158:                            (*s_etat_processus).erreur_execution =
                   2159:                                    d_ex_taille_message;
                   2160:                            return;
                   2161:                        }
                   2162: 
1.33      bertrand 2163:                        (*s_etat_processus).erreur_systeme =
                   2164:                                d_es_erreur_fichier;
1.1       bertrand 2165:                        return;
                   2166:                    }
                   2167: 
1.51      bertrand 2168: #                  ifndef SEMAPHORES_NOMMES
                   2169:                        while(sem_wait(&((*s_etat_processus).semaphore_fork))
                   2170:                                != 0)
                   2171: #                  else
                   2172:                        while(sem_wait((*s_etat_processus).semaphore_fork) != 0)
                   2173: #                  endif
1.33      bertrand 2174:                    {
1.50      bertrand 2175:                        if (errno != EINTR)
                   2176:                        {
                   2177:                            (*s_etat_processus).erreur_systeme =
                   2178:                                    d_es_processus;
                   2179:                            return;
                   2180:                        }
1.33      bertrand 2181:                    }
                   2182: #                  else
                   2183:                    if ((*s_etat_processus).langue == 'F')
                   2184:                    {
                   2185:                        printf("+++Attention : Support du protocole"
                   2186:                                " IPv6 indisponible\n");
1.1       bertrand 2187:                    }
                   2188:                    else
                   2189:                    {
1.33      bertrand 2190:                        printf("+++Warning : IPv6 support "
                   2191:                                "unavailable\n");
1.1       bertrand 2192:                    }
1.33      bertrand 2193: #                  endif
1.1       bertrand 2194:                }
1.33      bertrand 2195:                else
1.1       bertrand 2196:                {
                   2197:                    liberation(s_etat_processus, s_objet_argument_1);
                   2198:                    liberation(s_etat_processus, s_objet_argument_2);
                   2199: 
                   2200:                    (*s_etat_processus).erreur_execution =
                   2201:                            d_ex_erreur_parametre_fichier;
                   2202:                    return;
                   2203:                }
                   2204:            }
1.33      bertrand 2205:            else 
                   2206:            {
                   2207:                liberation(s_etat_processus, s_objet_argument_1);
                   2208:                liberation(s_etat_processus, s_objet_argument_2);
1.1       bertrand 2209: 
1.33      bertrand 2210:                (*s_etat_processus).erreur_execution =
                   2211:                        d_ex_erreur_parametre_fichier;
                   2212:                return;
                   2213:            }
1.1       bertrand 2214:        }
1.33      bertrand 2215: 
                   2216:        free(chaine);
1.1       bertrand 2217:    }
                   2218:    else
                   2219:    {
                   2220:        liberation(s_etat_processus, s_objet_argument_2);
                   2221:        liberation(s_etat_processus, s_objet_argument_1);
                   2222: 
                   2223:        (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
                   2224:        return;
                   2225:    }
                   2226: 
                   2227:    liberation(s_etat_processus, s_objet_argument_2);
                   2228:    liberation(s_etat_processus, s_objet_argument_1);
                   2229: 
                   2230:    return;
                   2231: }
                   2232: 
                   2233: 
                   2234: /*
                   2235: ================================================================================
                   2236:   Fonction 'wflock'
                   2237: ================================================================================
                   2238:   Entrées : pointeur sur une structure struct_processus
                   2239: --------------------------------------------------------------------------------
                   2240:   Sorties :
                   2241: --------------------------------------------------------------------------------
                   2242:   Effets de bord : néant
                   2243: ================================================================================
                   2244: */
                   2245: 
                   2246: void
                   2247: instruction_wflock(struct_processus *s_etat_processus)
                   2248: {
                   2249:    logical1                    drapeau;
                   2250: 
                   2251:    struct flock                lock;
                   2252: 
                   2253:    struct timespec             attente;
                   2254: 
1.5       bertrand 2255:    struct_descripteur_fichier  *descripteur;
                   2256: 
1.1       bertrand 2257:    struct_objet                *s_objet_argument_1;
                   2258:    struct_objet                *s_objet_argument_2;
                   2259: 
                   2260:    unsigned char               *chaine;
                   2261:    unsigned char               registre_instruction_valide;
                   2262: 
                   2263:    attente.tv_sec = 0;
                   2264:    attente.tv_nsec = GRANULARITE_us * 1000;
                   2265: 
                   2266:    (*s_etat_processus).erreur_execution = d_ex;
                   2267: 
                   2268:    if ((*s_etat_processus).affichage_arguments == 'Y')
                   2269:    {
                   2270:        printf("\n  WFLOCK ");
                   2271:        
                   2272:        if ((*s_etat_processus).langue == 'F')
                   2273:        {
                   2274:            printf("(attente du positionnement d'un verrou sur un fichier)"
                   2275:                    "\n\n");
                   2276:        }
                   2277:        else
                   2278:        {
                   2279:            printf("(wait for file lock)\n\n");
                   2280:        }
                   2281: 
                   2282:        printf("    2: %s\n", d_FCH);
                   2283:        printf("    1: %s (READ/WRITE/NONE)\n", d_CHN);
                   2284: 
                   2285:        return;
                   2286:    }
                   2287:    else if ((*s_etat_processus).test_instruction == 'Y')
                   2288:    {
                   2289:        (*s_etat_processus).nombre_arguments = -1;
                   2290:        return;
                   2291:    }
                   2292: 
                   2293:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                   2294:    {
                   2295:        if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
                   2296:        {
                   2297:            return;
                   2298:        }
                   2299:    }
                   2300: 
                   2301:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                   2302:            &s_objet_argument_1) == d_erreur)
                   2303:    {
                   2304:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                   2305:        return;
                   2306:    }
                   2307: 
                   2308:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                   2309:            &s_objet_argument_2) == d_erreur)
                   2310:    {
                   2311:        liberation(s_etat_processus, s_objet_argument_1);
                   2312: 
                   2313:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                   2314:        return;
                   2315:    }
                   2316: 
                   2317:    if (((*s_objet_argument_2).type == FCH) &&
                   2318:            ((*s_objet_argument_1).type == CHN))
                   2319:    {
                   2320:        drapeau = d_faux;
                   2321: 
                   2322:        do
                   2323:        {
1.94      bertrand 2324:            if ((chaine = conversion_majuscule(s_etat_processus,
                   2325:                    (unsigned char *) (*s_objet_argument_1).objet)) == NULL)
1.1       bertrand 2326:            {
                   2327:                (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                   2328:                return;
                   2329:            }
                   2330: 
                   2331:            if (strcmp(chaine, "WRITE") == 0)
                   2332:            {
                   2333:                lock.l_type = F_WRLCK;
                   2334:            }
                   2335:            else if (strcmp(chaine, "READ") == 0)
                   2336:            {
                   2337:                lock.l_type = F_RDLCK;
                   2338:            }
                   2339:            else if (strcmp(chaine, "NONE") == 0)
                   2340:            {
                   2341:                lock.l_type = F_UNLCK;
                   2342:            }
                   2343:            else
                   2344:            {
                   2345:                free(chaine);
                   2346: 
                   2347:                liberation(s_etat_processus, s_objet_argument_1);
                   2348:                liberation(s_etat_processus, s_objet_argument_2);
                   2349: 
                   2350:                (*s_etat_processus).erreur_execution = d_ex_verrou_indefini;
                   2351:                return;
                   2352:            }
                   2353: 
                   2354:            free(chaine);
                   2355: 
                   2356:            lock.l_whence = SEEK_SET;
                   2357:            lock.l_start = 0;
                   2358:            lock.l_len = 0;
                   2359:            lock.l_pid = getpid();
                   2360: 
                   2361:            if ((descripteur = descripteur_fichier(s_etat_processus,
                   2362:                    (struct_fichier *) (*s_objet_argument_2).objet)) == NULL)
                   2363:            {
                   2364:                return;
                   2365:            }
                   2366: 
1.5       bertrand 2367:            if (fcntl(fileno((*descripteur).descripteur_c), F_GETLK, &lock)
                   2368:                    == -1)
1.1       bertrand 2369:            {
                   2370:                liberation(s_etat_processus, s_objet_argument_1);
                   2371:                liberation(s_etat_processus, s_objet_argument_2);
                   2372: 
                   2373:                (*s_etat_processus).erreur_execution = d_ex_fichier_verrouille;
                   2374:                return;
                   2375:            }
                   2376: 
                   2377:            if (lock.l_type == F_UNLCK)
                   2378:            {
                   2379:                drapeau = d_vrai;
                   2380:            }
                   2381:            else
                   2382:            {
1.84      bertrand 2383:                if (pthread_mutex_lock(&(*s_etat_processus).mutex_interruptions)
                   2384:                        != 0)
1.83      bertrand 2385:                {
                   2386:                    (*s_etat_processus).erreur_systeme = d_es_processus;
                   2387:                    return;
                   2388:                }
                   2389: 
1.1       bertrand 2390:                if ((*s_etat_processus).nombre_interruptions_non_affectees != 0)
                   2391:                {
                   2392:                    affectation_interruptions_logicielles(s_etat_processus);
                   2393:                }
                   2394: 
1.84      bertrand 2395:                if (pthread_mutex_unlock(&(*s_etat_processus)
                   2396:                        .mutex_interruptions) != 0)
1.83      bertrand 2397:                {
                   2398:                    (*s_etat_processus).erreur_systeme = d_es_processus;
                   2399:                    return;
                   2400:                }
                   2401: 
                   2402:                if ((*s_etat_processus).nombre_interruptions_en_queue != 0)
1.1       bertrand 2403:                {
                   2404:                    registre_instruction_valide =
                   2405:                            (*s_etat_processus).instruction_valide;
                   2406:                    traitement_interruptions_logicielles(
                   2407:                            s_etat_processus);
                   2408:                    (*s_etat_processus).instruction_valide =
                   2409:                            registre_instruction_valide;
                   2410:                }
                   2411: 
1.118     bertrand 2412:                scrutation_injection(s_etat_processus);
                   2413: 
                   2414: #              ifndef SEMAPHORES_NOMMES
                   2415:                    if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
                   2416: #              else
                   2417:                    if (sem_post((*s_etat_processus).semaphore_fork) != 0)
                   2418: #              endif
                   2419:                {
                   2420:                    (*s_etat_processus).erreur_systeme = d_es_processus;
                   2421:                    return;
                   2422:                }
                   2423: 
1.1       bertrand 2424:                nanosleep(&attente, NULL);
                   2425: 
                   2426:                INCR_GRANULARITE(attente.tv_nsec);
1.118     bertrand 2427: 
                   2428: #              ifndef SEMAPHORES_NOMMES
                   2429:                    while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
                   2430: #              else
                   2431:                    while(sem_wait((*s_etat_processus).semaphore_fork) != 0)
                   2432: #              endif
                   2433:                {
                   2434:                    if (errno != EINTR)
                   2435:                    {
                   2436:                        (*s_etat_processus).erreur_systeme = d_es_processus;
                   2437:                        return;
                   2438:                    }
                   2439:                }
1.1       bertrand 2440:            }
                   2441:        } while((drapeau == d_faux) && ((*s_etat_processus)
                   2442:                .var_volatile_requete_arret != -1));
                   2443:    }
                   2444:    else
                   2445:    {
                   2446:        liberation(s_etat_processus, s_objet_argument_1);
                   2447:        liberation(s_etat_processus, s_objet_argument_2);
                   2448: 
                   2449:        (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
                   2450:        return;
                   2451:    }
                   2452: 
                   2453:    return;
                   2454: }
                   2455: 
                   2456: 
                   2457: /*
                   2458: ================================================================================
                   2459:   Fonction 'wfproc'
                   2460: ================================================================================
                   2461:   Entrées : pointeur sur une structure struct_processus
                   2462: --------------------------------------------------------------------------------
                   2463:   Sorties :
                   2464: --------------------------------------------------------------------------------
                   2465:   Effets de bord : néant
                   2466: ================================================================================
                   2467: */
                   2468: 
                   2469: void
                   2470: instruction_wfproc(struct_processus *s_etat_processus)
                   2471: {
                   2472:    logical1                    drapeau_fin;
                   2473: 
                   2474:    struct_liste_chainee        *l_element_courant;
                   2475: 
                   2476:    struct_objet                *s_objet_argument;
                   2477: 
                   2478:    struct timespec             attente;
                   2479: 
                   2480:    unsigned char               registre_instruction_valide;
                   2481: 
                   2482:    (*s_etat_processus).erreur_execution = d_ex;
                   2483: 
                   2484:    attente.tv_sec = 0;
                   2485:    attente.tv_nsec = GRANULARITE_us * 1000;
                   2486: 
                   2487:    if ((*s_etat_processus).affichage_arguments == 'Y')
                   2488:    {
                   2489:        printf("\n  WFPROC ");
                   2490: 
                   2491:        if ((*s_etat_processus).langue == 'F')
                   2492:        {
                   2493:            printf("(attente de la fin d'un processus fils)\n\n");
                   2494:        }
                   2495:        else
                   2496:        {
                   2497:            printf("(wait for child process end)\n\n");
                   2498:        }
                   2499: 
                   2500:        printf("    1: %s\n", d_PRC);
                   2501: 
                   2502:        return;
                   2503:    }
                   2504:    else if ((*s_etat_processus).test_instruction == 'Y')
                   2505:    {
                   2506:        (*s_etat_processus).nombre_arguments = -1;
                   2507:        return;
                   2508:    }
                   2509: 
                   2510:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                   2511:    {
                   2512:        if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
                   2513:        {
                   2514:            return;
                   2515:        }
                   2516:    }
                   2517: 
                   2518:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                   2519:            &s_objet_argument) == d_erreur)
                   2520:    {
                   2521:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                   2522:        return;
                   2523:    }
                   2524: 
                   2525:    if ((*s_objet_argument).type == PRC)
                   2526:    {
                   2527:        drapeau_fin = d_faux;
                   2528: 
                   2529:        if ((*s_etat_processus).profilage == d_vrai)
                   2530:        {
                   2531:            profilage(s_etat_processus, "Interprocess or interthread "
                   2532:                    "communications (WFPROC)");
                   2533: 
                   2534:            if ((*s_etat_processus).erreur_systeme != d_es)
                   2535:            {
                   2536:                return;
                   2537:            }
                   2538:        }
                   2539: 
1.85      bertrand 2540:        if (pthread_mutex_lock(&((*s_etat_processus).mutex_pile_processus))
                   2541:                != 0)
1.1       bertrand 2542:        {
                   2543:            if ((*s_etat_processus).profilage == d_vrai)
                   2544:            {
                   2545:                profilage(s_etat_processus, NULL);
                   2546:            }
                   2547: 
                   2548:            (*s_etat_processus).erreur_systeme = d_es_processus;
                   2549:            return;
                   2550:        }
                   2551: 
                   2552:        while(drapeau_fin == d_faux)
                   2553:        {
                   2554:            l_element_courant = (struct_liste_chainee *)
                   2555:                    (*s_etat_processus).l_base_pile_processus;
                   2556: 
                   2557:            while(l_element_courant != NULL)
                   2558:            {
                   2559:                if ((*(*((struct_processus_fils *) (*(*l_element_courant)
                   2560:                        .donnee).objet)).thread).processus_detache == d_vrai)
                   2561:                {
                   2562:                    if ((*(*((struct_processus_fils *)
                   2563:                            (*s_objet_argument).objet)).thread)
                   2564:                            .processus_detache == d_vrai)
                   2565:                    {
                   2566:                        if ((*(*((struct_processus_fils *)
                   2567:                                (*(*l_element_courant)
                   2568:                                .donnee).objet)).thread).pid ==
                   2569:                                (*(*((struct_processus_fils *)
                   2570:                                (*s_objet_argument).objet)).thread).pid)
                   2571:                        {
                   2572:                            break;
                   2573:                        }
                   2574:                    }
                   2575:                }
                   2576:                else
                   2577:                {
                   2578:                    if ((*(*((struct_processus_fils *)
                   2579:                            (*s_objet_argument).objet)).thread)
                   2580:                            .processus_detache == d_faux)
                   2581:                    {
                   2582:                        if ((pthread_equal((*(*((struct_processus_fils *)
                   2583:                                (*(*l_element_courant).donnee).objet)).thread)
                   2584:                                .tid, (*(*((struct_processus_fils *)
                   2585:                                (*s_objet_argument).objet)).thread).tid) != 0)
                   2586:                                && ((*(*((struct_processus_fils *)
                   2587:                                (*(*l_element_courant).donnee).objet)).thread)
                   2588:                                .pid == (*(*((struct_processus_fils *)
                   2589:                                (*s_objet_argument).objet)).thread).pid))
                   2590:                        {
                   2591:                            break;
                   2592:                        }
                   2593:                    }
                   2594:                }
                   2595: 
                   2596:                l_element_courant = (*l_element_courant).suivant;
                   2597:            }
                   2598: 
                   2599:            if ((*s_etat_processus).var_volatile_requete_arret != 0)
                   2600:            {
                   2601:                if ((*s_etat_processus).profilage == d_vrai)
                   2602:                {
                   2603:                    profilage(s_etat_processus, NULL);
                   2604:                }
                   2605: 
1.85      bertrand 2606:                if (pthread_mutex_unlock(&((*s_etat_processus)
                   2607:                        .mutex_pile_processus)) != 0)
1.1       bertrand 2608:                {
                   2609:                    (*s_etat_processus).erreur_systeme = d_es_processus;
                   2610:                    return;
                   2611:                }
                   2612: 
                   2613:                liberation(s_etat_processus, s_objet_argument);
                   2614:                return;
                   2615:            }
                   2616: 
                   2617:            if (l_element_courant == NULL)
                   2618:            {
                   2619:                /*
                   2620:                 * Si l_element_courant vaut NULL, le processus n'existe plus.
                   2621:                 */
                   2622: 
                   2623:                drapeau_fin = d_vrai;
                   2624:            }
                   2625:            else
                   2626:            {
                   2627:                if ((*(*((struct_processus_fils *) (*(*l_element_courant)
                   2628:                        .donnee).objet)).thread).processus_detache == d_vrai)
                   2629:                {
1.48      bertrand 2630:                    if (envoi_signal_processus((*(*((struct_processus_fils *)
1.1       bertrand 2631:                            (*(*l_element_courant).donnee).objet)).thread).pid,
1.104     bertrand 2632:                            rpl_signull, d_faux) != 0)
1.1       bertrand 2633:                    {
                   2634:                        drapeau_fin = d_vrai;
                   2635:                    }
                   2636:                    else
                   2637:                    {
                   2638:                        drapeau_fin = d_faux;
                   2639:                    }
                   2640:                }
                   2641:                else
                   2642:                {
                   2643:                    if (pthread_mutex_lock(&((*(*((struct_processus_fils *)
                   2644:                            (*(*l_element_courant).donnee).objet)).thread)
                   2645:                            .mutex)) != 0)
                   2646:                    {
                   2647:                        if ((*s_etat_processus).profilage == d_vrai)
                   2648:                        {
                   2649:                            profilage(s_etat_processus, NULL);
                   2650:                        }
                   2651: 
                   2652:                        (*s_etat_processus).erreur_systeme = d_es_processus;
                   2653:                        return;
                   2654:                    }
                   2655: 
                   2656:                    if ((*(*((struct_processus_fils *)
                   2657:                            (*(*l_element_courant).donnee).objet)).thread)
                   2658:                            .thread_actif == d_faux)
                   2659:                    {
                   2660:                        drapeau_fin = d_vrai;
                   2661:                    }
                   2662:                    else
                   2663:                    {
                   2664:                        drapeau_fin = d_faux;
                   2665:                    }
                   2666: 
                   2667:                    if (pthread_mutex_unlock(&((*(*((struct_processus_fils *)
                   2668:                            (*(*l_element_courant).donnee).objet)).thread)
                   2669:                            .mutex)) != 0)
                   2670:                    {
                   2671:                        if ((*s_etat_processus).profilage == d_vrai)
                   2672:                        {
                   2673:                            profilage(s_etat_processus, NULL);
                   2674:                        }
                   2675: 
                   2676:                        (*s_etat_processus).erreur_systeme = d_es_processus;
                   2677:                        return;
                   2678:                    }
                   2679:                }
                   2680: 
                   2681:                if (drapeau_fin == d_faux)
                   2682:                {
                   2683:                    /*
                   2684:                     * Le processus n'est pas terminé
                   2685:                     */
                   2686: 
1.84      bertrand 2687:                    if (pthread_mutex_lock(&((*s_etat_processus)
                   2688:                            .mutex_interruptions)) != 0)
                   2689:                    {
1.85      bertrand 2690:                        pthread_mutex_unlock(&((*s_etat_processus)
                   2691:                                .mutex_pile_processus));
1.84      bertrand 2692: 
                   2693:                        if ((*s_etat_processus).profilage == d_vrai)
                   2694:                        {
                   2695:                            profilage(s_etat_processus, NULL);
                   2696:                        }
                   2697: 
                   2698:                        (*s_etat_processus).erreur_systeme =
                   2699:                                d_es_processus;
                   2700:                        return;
                   2701:                    }
                   2702: 
1.83      bertrand 2703:                    if ((*s_etat_processus).nombre_interruptions_non_affectees
                   2704:                            != 0)
                   2705:                    {
                   2706:                        affectation_interruptions_logicielles(s_etat_processus);
                   2707:                    }
                   2708: 
1.84      bertrand 2709:                    if (pthread_mutex_unlock(&((*s_etat_processus)
                   2710:                            .mutex_interruptions)) != 0)
                   2711:                    {
1.85      bertrand 2712:                        pthread_mutex_unlock(&((*s_etat_processus)
                   2713:                                .mutex_pile_processus));
1.84      bertrand 2714: 
                   2715:                        if ((*s_etat_processus).profilage == d_vrai)
                   2716:                        {
                   2717:                            profilage(s_etat_processus, NULL);
                   2718:                        }
                   2719: 
                   2720:                        (*s_etat_processus).erreur_systeme =
                   2721:                                d_es_processus;
                   2722:                        return;
                   2723:                    }
                   2724: 
1.85      bertrand 2725:                    if (pthread_mutex_unlock(&((*s_etat_processus)
                   2726:                            .mutex_pile_processus)) != 0)
1.1       bertrand 2727:                    {
                   2728:                        if ((*s_etat_processus).profilage == d_vrai)
                   2729:                        {
                   2730:                            profilage(s_etat_processus, NULL);
                   2731:                        }
                   2732: 
                   2733:                        (*s_etat_processus).erreur_systeme =
                   2734:                                d_es_processus;
                   2735:                        return;
                   2736:                    }
                   2737: 
1.83      bertrand 2738:                    if ((*s_etat_processus).nombre_interruptions_en_queue != 0)
1.1       bertrand 2739:                    {
                   2740:                        registre_instruction_valide =
                   2741:                                (*s_etat_processus).instruction_valide;
                   2742:                        traitement_interruptions_logicielles(
                   2743:                                s_etat_processus);
                   2744:                        (*s_etat_processus).instruction_valide =
                   2745:                                registre_instruction_valide;
                   2746:                    }
                   2747: 
1.51      bertrand 2748: #                  ifndef SEMAPHORES_NOMMES
                   2749:                        if (sem_post(&((*s_etat_processus).semaphore_fork))
                   2750:                                != 0)
                   2751: #                  else
                   2752:                        if (sem_post((*s_etat_processus).semaphore_fork) != 0)
                   2753: #                  endif
1.1       bertrand 2754:                    {
                   2755:                        (*s_etat_processus).erreur_systeme = d_es_processus;
                   2756:                        return;
                   2757:                    }
                   2758: 
                   2759:                    nanosleep(&attente, NULL);
                   2760: 
1.51      bertrand 2761: #                  ifndef SEMAPHORES_NOMMES
                   2762:                        while(sem_wait(&((*s_etat_processus).semaphore_fork))
                   2763:                                != 0)
                   2764: #                  else
                   2765:                        while(sem_wait((*s_etat_processus).semaphore_fork) != 0)
                   2766: #                  endif
1.1       bertrand 2767:                    {
1.50      bertrand 2768:                        if (errno != EINTR)
                   2769:                        {
                   2770:                            (*s_etat_processus).erreur_systeme = d_es_processus;
                   2771:                            return;
                   2772:                        }
1.1       bertrand 2773:                    }
                   2774: 
                   2775:                    scrutation_injection(s_etat_processus);
                   2776: 
1.85      bertrand 2777:                    if (pthread_mutex_lock(&((*s_etat_processus)
                   2778:                            .mutex_pile_processus)) != 0)
1.1       bertrand 2779:                    {
                   2780:                        if ((*s_etat_processus).profilage == d_vrai)
                   2781:                        {
                   2782:                            profilage(s_etat_processus, NULL);
                   2783:                        }
                   2784: 
                   2785:                        (*s_etat_processus).erreur_systeme =
                   2786:                                d_es_processus;
                   2787:                        return;
                   2788:                    }
                   2789:                }
                   2790:            }
                   2791: 
                   2792:            INCR_GRANULARITE(attente.tv_nsec);
                   2793:        }
                   2794: 
                   2795:        if ((*s_etat_processus).profilage == d_vrai)
                   2796:        {
                   2797:            profilage(s_etat_processus, NULL);
                   2798:        }
                   2799: 
1.85      bertrand 2800:        if (pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus))
                   2801:                != 0)
1.1       bertrand 2802:        {
                   2803:            (*s_etat_processus).erreur_systeme = d_es_processus;
                   2804:            return;
                   2805:        }
                   2806:    }
                   2807:    else
                   2808:    {
                   2809:        liberation(s_etat_processus, s_objet_argument);
                   2810: 
                   2811:        (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
                   2812:        return;
                   2813:    }
                   2814: 
                   2815:    liberation(s_etat_processus, s_objet_argument);
                   2816: 
                   2817:    return;
                   2818: }
                   2819: 
                   2820: 
                   2821: /*
                   2822: ================================================================================
                   2823:   Fonction 'wfdata'
                   2824: ================================================================================
                   2825:   Entrées : pointeur sur une structure struct_processus
                   2826: --------------------------------------------------------------------------------
                   2827:   Sorties :
                   2828: --------------------------------------------------------------------------------
                   2829:   Effets de bord : néant
                   2830: ================================================================================
                   2831: */
                   2832: 
                   2833: void
                   2834: instruction_wfdata(struct_processus *s_etat_processus)
                   2835: {
                   2836:    logical1                    drapeau_fin;
                   2837: 
                   2838:    struct_liste_chainee        *l_element_courant;
                   2839: 
                   2840:    struct_objet                *s_objet_argument;
                   2841: 
                   2842:    struct timespec             attente;
                   2843: 
                   2844:    unsigned char               registre_instruction_valide;
                   2845: 
                   2846:    (*s_etat_processus).erreur_execution = d_ex;
                   2847: 
                   2848:    attente.tv_sec = 0;
                   2849:    attente.tv_nsec = GRANULARITE_us * 1000;
                   2850: 
                   2851:    if ((*s_etat_processus).affichage_arguments == 'Y')
                   2852:    {
                   2853:        printf("\n  WFDATA ");
                   2854: 
                   2855:        if ((*s_etat_processus).langue == 'F')
                   2856:        {
                   2857:            printf("(attente de données d'un processus fils)\n\n");
                   2858:        }
                   2859:        else
                   2860:        {
                   2861:            printf("(wait for data from child process)\n\n");
                   2862:        }
                   2863: 
                   2864:        printf("    1: %s\n", d_PRC);
                   2865: 
                   2866:        return;
                   2867:    }
                   2868:    else if ((*s_etat_processus).test_instruction == 'Y')
                   2869:    {
                   2870:        (*s_etat_processus).nombre_arguments = -1;
                   2871:        return;
                   2872:    }
                   2873: 
                   2874:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                   2875:    {
                   2876:        if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
                   2877:        {
                   2878:            return;
                   2879:        }
                   2880:    }
                   2881: 
                   2882:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                   2883:            &s_objet_argument) == d_erreur)
                   2884:    {
                   2885:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                   2886:        return;
                   2887:    }
                   2888: 
                   2889:    if ((*s_objet_argument).type == PRC)
                   2890:    {
                   2891:        drapeau_fin = d_faux;
                   2892: 
                   2893:        if ((*s_etat_processus).profilage == d_vrai)
                   2894:        {
                   2895:            profilage(s_etat_processus, "Interprocess or interthread "
                   2896:                    "communications (WFDATA)");
                   2897: 
                   2898:            if ((*s_etat_processus).erreur_systeme != d_es)
                   2899:            {
                   2900:                return;
                   2901:            }
                   2902:        }
                   2903: 
1.85      bertrand 2904:        if (pthread_mutex_lock(&((*s_etat_processus).mutex_pile_processus))
                   2905:                != 0)
1.1       bertrand 2906:        {
                   2907:            if ((*s_etat_processus).profilage == d_vrai)
                   2908:            {
                   2909:                profilage(s_etat_processus, NULL);
                   2910:            }
                   2911: 
                   2912:            (*s_etat_processus).erreur_systeme = d_es_processus;
                   2913:            return;
                   2914:        }
                   2915: 
                   2916:        while(drapeau_fin == d_faux)
                   2917:        {
                   2918:            l_element_courant = (struct_liste_chainee *)
                   2919:                    (*s_etat_processus).l_base_pile_processus;
                   2920: 
                   2921:            while(l_element_courant != NULL)
                   2922:            {
                   2923:                if ((*(*((struct_processus_fils *) (*(*l_element_courant)
                   2924:                        .donnee).objet)).thread).processus_detache == d_vrai)
                   2925:                {
                   2926:                    if (((*(*((struct_processus_fils *) (*(*l_element_courant)
                   2927:                            .donnee).objet)).thread).pid ==
                   2928:                            (*(*((struct_processus_fils *)
                   2929:                            (*s_objet_argument).objet)).thread).pid)
                   2930:                            && ((*(*((struct_processus_fils *)
                   2931:                            (*s_objet_argument).objet)).thread)
                   2932:                            .processus_detache == d_vrai))
                   2933:                    {
                   2934:                        break;
                   2935:                    }
                   2936:                }
                   2937:                else
                   2938:                {
                   2939:                    if ((pthread_equal((*(*((struct_processus_fils *)
                   2940:                            (*(*l_element_courant).donnee).objet)).thread).tid,
                   2941:                            (*(*((struct_processus_fils *) (*s_objet_argument)
                   2942:                            .objet)).thread).tid) != 0) &&
                   2943:                            ((*(*((struct_processus_fils *)
                   2944:                            (*(*l_element_courant).donnee).objet)).thread).pid
                   2945:                            == (*(*((struct_processus_fils *)
                   2946:                            (*s_objet_argument).objet)).thread).pid) &&
                   2947:                            ((*(*((struct_processus_fils *)
                   2948:                            (*s_objet_argument).objet)).thread)
                   2949:                            .processus_detache == d_faux))
                   2950:                    {
                   2951:                        break;
                   2952:                    }
                   2953:                }
                   2954: 
                   2955:                l_element_courant = (*l_element_courant).suivant;
                   2956:            }
                   2957: 
                   2958:            if ((*s_etat_processus).var_volatile_requete_arret != 0)
                   2959:            {
                   2960:                if ((*s_etat_processus).profilage == d_vrai)
                   2961:                {
                   2962:                    profilage(s_etat_processus, NULL);
                   2963:                }
                   2964: 
1.85      bertrand 2965:                if (pthread_mutex_unlock(&((*s_etat_processus)
                   2966:                        .mutex_pile_processus)) != 0)
1.1       bertrand 2967:                {
                   2968:                    (*s_etat_processus).erreur_systeme = d_es_processus;
                   2969:                    return;
                   2970:                }
                   2971: 
                   2972:                liberation(s_etat_processus, s_objet_argument);
                   2973:                return;
                   2974:            }
                   2975: 
                   2976:            if (l_element_courant != NULL)
                   2977:            {
                   2978:                if (pthread_mutex_lock(&((*(*((struct_processus_fils *)
                   2979:                        (*(*l_element_courant).donnee).objet)).thread).mutex))
                   2980:                        != 0)
                   2981:                {
                   2982:                    (*s_etat_processus).erreur_systeme = d_es_processus;
                   2983:                    return;
                   2984:                }
                   2985: 
                   2986:                if ((*(*((struct_processus_fils *) (*(*l_element_courant)
                   2987:                        .donnee).objet)).thread).nombre_objets_dans_pipe != 0)
                   2988:                {
                   2989:                    if (pthread_mutex_unlock(&((*(*((struct_processus_fils *)
                   2990:                            (*(*l_element_courant).donnee).objet)).thread)
                   2991:                            .mutex)) != 0)
                   2992:                    {
                   2993:                        (*s_etat_processus).erreur_systeme = d_es_processus;
                   2994:                        return;
                   2995:                    }
                   2996: 
                   2997:                    drapeau_fin = d_vrai;
                   2998:                }
                   2999:                else
                   3000:                {
                   3001:                    if (pthread_mutex_unlock(&((*(*((struct_processus_fils *)
                   3002:                            (*(*l_element_courant).donnee).objet)).thread)
                   3003:                            .mutex)) != 0)
                   3004:                    {
                   3005:                        (*s_etat_processus).erreur_systeme = d_es_processus;
                   3006:                        return;
                   3007:                    }
                   3008: 
1.85      bertrand 3009:                    if (pthread_mutex_unlock(&((*s_etat_processus)
                   3010:                            .mutex_pile_processus)) != 0)
1.1       bertrand 3011:                    {
                   3012:                        if ((*s_etat_processus).profilage == d_vrai)
                   3013:                        {
                   3014:                            profilage(s_etat_processus, NULL);
                   3015:                        }
                   3016: 
                   3017:                        (*s_etat_processus).erreur_systeme =
                   3018:                                d_es_processus;
                   3019:                        return;
                   3020:                    }
                   3021: 
1.51      bertrand 3022: #                  ifndef SEMAPHORES_NOMMES
                   3023:                        if (sem_post(&((*s_etat_processus).semaphore_fork))
                   3024:                                != 0)
                   3025: #                  else
                   3026:                        if (sem_post((*s_etat_processus).semaphore_fork) != 0)
                   3027: #                  endif
1.12      bertrand 3028:                    {
                   3029:                        (*s_etat_processus).erreur_systeme = d_es_processus;
                   3030:                        return;
                   3031:                    }
1.1       bertrand 3032: 
                   3033:                    nanosleep(&attente, NULL);
                   3034: 
1.51      bertrand 3035: #                  ifndef SEMAPHORES_NOMMES
                   3036:                        while(sem_wait(&((*s_etat_processus).semaphore_fork))
                   3037:                                != 0)
                   3038: #                  else
                   3039:                        while(sem_wait((*s_etat_processus).semaphore_fork) != 0)
                   3040: #                  endif
1.1       bertrand 3041:                    {
1.50      bertrand 3042:                        if (errno != EINTR)
                   3043:                        {
                   3044:                            (*s_etat_processus).erreur_systeme = d_es_processus;
                   3045:                            return;
                   3046:                        }
1.1       bertrand 3047:                    }
                   3048: 
                   3049:                    scrutation_injection(s_etat_processus);
                   3050: 
1.84      bertrand 3051:                    if (pthread_mutex_lock(&(*s_etat_processus)
                   3052:                            .mutex_interruptions) != 0)
1.83      bertrand 3053:                    {
                   3054:                        (*s_etat_processus).erreur_systeme = d_es_processus;
                   3055:                        return;
                   3056:                    }
                   3057: 
1.1       bertrand 3058:                    if ((*s_etat_processus).nombre_interruptions_non_affectees
                   3059:                            != 0)
                   3060:                    {
                   3061:                        affectation_interruptions_logicielles(s_etat_processus);
                   3062:                    }
                   3063: 
1.84      bertrand 3064:                    if (pthread_mutex_unlock(&(*s_etat_processus)
                   3065:                            .mutex_interruptions) != 0)
1.83      bertrand 3066:                    {
                   3067:                        (*s_etat_processus).erreur_systeme = d_es_processus;
                   3068:                        return;
                   3069:                    }
                   3070: 
1.1       bertrand 3071:                    if ((*s_etat_processus).nombre_interruptions_en_queue != 0)
                   3072:                    {
                   3073:                        registre_instruction_valide =
                   3074:                                (*s_etat_processus).instruction_valide;
                   3075:                        traitement_interruptions_logicielles(s_etat_processus);
                   3076:                        (*s_etat_processus).instruction_valide =
                   3077:                                registre_instruction_valide;
                   3078:                    }
                   3079: 
                   3080:                    if ((*s_etat_processus).var_volatile_requete_arret != 0)
                   3081:                    {
                   3082:                        if ((*s_etat_processus).profilage == d_vrai)
                   3083:                        {
                   3084:                            profilage(s_etat_processus, NULL);
                   3085:                        }
                   3086: 
                   3087:                        return;
                   3088:                    }
                   3089: 
1.85      bertrand 3090:                    if (pthread_mutex_lock(&((*s_etat_processus)
                   3091:                            .mutex_pile_processus)) != 0)
1.1       bertrand 3092:                    {
                   3093:                        if ((*s_etat_processus).profilage == d_vrai)
                   3094:                        {
                   3095:                            profilage(s_etat_processus, NULL);
                   3096:                        }
                   3097: 
                   3098:                        (*s_etat_processus).erreur_systeme =
                   3099:                                d_es_processus;
                   3100:                        return;
                   3101:                    }
                   3102:                }
                   3103:            }
                   3104:            else
                   3105:            {
                   3106:                drapeau_fin = d_vrai;
                   3107:                (*s_etat_processus).erreur_execution = d_ex_processus;
                   3108:            }
                   3109: 
                   3110:            INCR_GRANULARITE(attente.tv_nsec);
                   3111:        }
                   3112: 
                   3113:        if ((*s_etat_processus).profilage == d_vrai)
                   3114:        {
                   3115:            profilage(s_etat_processus, NULL);
                   3116:        }
                   3117: 
1.85      bertrand 3118:        if (pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus))
                   3119:                != 0)
1.1       bertrand 3120:        {
                   3121:            (*s_etat_processus).erreur_systeme = d_es_processus;
                   3122:            return;
                   3123:        }
                   3124:    }
                   3125:    else
                   3126:    {
                   3127:        liberation(s_etat_processus, s_objet_argument);
                   3128: 
                   3129:        (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
                   3130:        return;
                   3131:    }
                   3132: 
                   3133:    liberation(s_etat_processus, s_objet_argument);
                   3134: 
                   3135:    return;
                   3136: }
                   3137: 
                   3138: 
                   3139: /*
                   3140: ================================================================================
                   3141:   Fonction 'wfsock'
                   3142: ================================================================================
                   3143:   Entrées : pointeur sur une structure struct_processus
                   3144: --------------------------------------------------------------------------------
                   3145:   Sorties :
                   3146: --------------------------------------------------------------------------------
                   3147:   Effets de bord : néant
                   3148: ================================================================================
                   3149: */
                   3150: 
1.98      bertrand 3151: static inline logical1
                   3152: options_sockets(struct_processus *s_etat_processus, struct_socket *s_socket)
                   3153: {
                   3154:    if (((*s_socket).options & (1 << d_BROADCAST)) != 0)
                   3155:    {
1.123     bertrand 3156:        if (setsockopt((*s_socket).socket, SOL_SOCKET, SO_BROADCAST, NULL, 0)
                   3157:                != 0)
1.98      bertrand 3158:        {
                   3159:            return(d_erreur);
                   3160:        }
                   3161:    }
                   3162: 
                   3163:    if (((*s_socket).options & (1 << d_DONT_ROUTE)) != 0)
                   3164:    {
1.123     bertrand 3165:        if (setsockopt((*s_socket).socket, SOL_SOCKET, SO_DONTROUTE, NULL, 0)
                   3166:                != 0)
1.98      bertrand 3167:        {
                   3168:            return(d_erreur);
                   3169:        }
                   3170:    }
                   3171: 
                   3172:    if (((*s_socket).options & (1 << d_KEEP_ALIVE)) != 0)
                   3173:    {
1.123     bertrand 3174:        if (setsockopt((*s_socket).socket, SOL_SOCKET, SO_KEEPALIVE, NULL, 0)
                   3175:                != 0)
1.98      bertrand 3176:        {
                   3177:            return(d_erreur);
                   3178:        }
                   3179:    }
                   3180: 
1.101     bertrand 3181: #  ifdef SO_PRIORITY
1.98      bertrand 3182:    if (((*s_socket).options & (1 << d_PRIORITY)) != 0)
                   3183:    {
                   3184:        if (setsockopt((*s_socket).socket, SOL_SOCKET, SO_PRIORITY,
                   3185:                &((*s_socket).priorite), sizeof((*s_socket).priorite)) != 0)
                   3186:        {
                   3187:            return(d_erreur);
                   3188:        }
                   3189:    }
1.101     bertrand 3190: #  endif
1.98      bertrand 3191: 
                   3192:    // Les deux options suivantes ne peuvent être positionnées simultanément.
                   3193: 
                   3194:    if (((*s_socket).options & (1 << d_RECEIVE_BUFFER)) != 0)
                   3195:    {
                   3196:        if (setsockopt((*s_socket).socket, SOL_SOCKET, SO_RCVBUF,
                   3197:                &((*s_socket).buffer_reception),
                   3198:                sizeof((*s_socket).buffer_reception)) != 0)
                   3199:        {
                   3200:            return(d_erreur);
                   3201:        }
                   3202:    }
                   3203: 
1.101     bertrand 3204: #  ifdef SO_RCVBUFFORCE
1.98      bertrand 3205:    if (((*s_socket).options & (1 << d_FORCE_RECEIVE_BUFFER)) != 0)
                   3206:    {
                   3207:        if (setsockopt((*s_socket).socket, SOL_SOCKET, SO_RCVBUFFORCE,
                   3208:                &((*s_socket).buffer_reception),
                   3209:                sizeof((*s_socket).buffer_reception)) != 0)
                   3210:        {
                   3211:            return(d_erreur);
                   3212:        }
                   3213:    }
1.101     bertrand 3214: #  endif
1.98      bertrand 3215: 
                   3216:    // Même remarque
                   3217: 
                   3218:    if (((*s_socket).options & (1 << d_SEND_BUFFER)) != 0)
                   3219:    {
                   3220:        if (setsockopt((*s_socket).socket, SOL_SOCKET, SO_SNDBUF,
                   3221:                &((*s_socket).buffer_emission),
                   3222:                sizeof((*s_socket).buffer_emission)) != 0)
                   3223:        {
                   3224:            return(d_erreur);
                   3225:        }
                   3226:    }
                   3227: 
1.101     bertrand 3228: #  ifdef SO_SNDBUFFORCE
1.98      bertrand 3229:    if (((*s_socket).options & (1 << d_FORCE_SEND_BUFFER)) != 0)
                   3230:    {
                   3231:        if (setsockopt((*s_socket).socket, SOL_SOCKET, SO_SNDBUFFORCE,
                   3232:                &((*s_socket).buffer_emission),
                   3233:                sizeof((*s_socket).buffer_emission)) != 0)
                   3234:        {
                   3235:            return(d_erreur);
                   3236:        }
                   3237:    }
1.101     bertrand 3238: #  endif
1.98      bertrand 3239: 
                   3240:    if (((*s_socket).options & (1 << d_RECEIVING_TIMEOUT)) != 0)
                   3241:    {
                   3242:        if (setsockopt((*s_socket).socket, SOL_SOCKET, SO_RCVTIMEO,
                   3243:                &((*s_socket).timeout_emission),
                   3244:                sizeof((*s_socket).timeout_emission)) != 0)
                   3245:        {
                   3246:            return(d_erreur);
                   3247:        }
                   3248:    }
                   3249: 
                   3250:    if (((*s_socket).options & (1 << d_SENDING_TIMEOUT)) != 0)
                   3251:    {
                   3252:        if (setsockopt((*s_socket).socket, SOL_SOCKET, SO_SNDTIMEO,
                   3253:                &((*s_socket).timeout_emission),
                   3254:                sizeof((*s_socket).timeout_emission)) != 0)
                   3255:        {
                   3256:            return(d_erreur);
                   3257:        }
                   3258:    }
                   3259: 
                   3260:    return(d_absence_erreur);;
                   3261: }
                   3262: 
                   3263: 
1.1       bertrand 3264: void
                   3265: instruction_wfsock(struct_processus *s_etat_processus)
                   3266: {
                   3267:    int                     erreur;
                   3268: 
                   3269:    logical1                drapeau;
                   3270: 
                   3271:    socklen_t               longueur;
                   3272: 
                   3273:    struct_liste_chainee    *l_element_courant;
                   3274: 
                   3275:    struct_objet            *s_objet_argument;
                   3276:    struct_objet            *s_objet_resultat;
                   3277: 
1.54      bertrand 3278:    struct pollfd           s_poll;
                   3279: 
1.1       bertrand 3280:    struct sockaddr_in      adresse_ipv4;
1.20      bertrand 3281: #  ifdef IPV6
1.1       bertrand 3282:    struct sockaddr_in6     adresse_ipv6;
1.20      bertrand 3283: #  endif
1.1       bertrand 3284: 
                   3285:    if ((*s_etat_processus).affichage_arguments == 'Y')
                   3286:    {
                   3287:        printf("\n  WFSOCK ");
                   3288: 
                   3289:        if ((*s_etat_processus).langue == 'F')
                   3290:        {
                   3291:            printf("(attente d'une connexion sur une socket)\n\n");
                   3292:        }
                   3293:        else
                   3294:        {
                   3295:            printf("(wait for connection on a socket)\n\n");
                   3296:        }
                   3297: 
                   3298:        printf("    1: %s\n", d_SCK);
                   3299:        printf("->  2: %s\n", d_SCK);
                   3300:        printf("    1: %s\n", d_SCK);
                   3301: 
                   3302:        return;
                   3303:    }
                   3304:    else if ((*s_etat_processus).test_instruction == 'Y')
                   3305:    {
                   3306:        (*s_etat_processus).nombre_arguments = -1;
                   3307:        return;
                   3308:    }
                   3309: 
                   3310:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                   3311:    {
                   3312:        if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
                   3313:        {
                   3314:            return;
                   3315:        }
                   3316:    }
                   3317: 
                   3318:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                   3319:            &s_objet_argument) == d_erreur)
                   3320:    {
                   3321:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                   3322:        return;
                   3323:    }
                   3324: 
                   3325:    if ((*s_objet_argument).type == SCK)
                   3326:    {
                   3327:        if ((strcmp((*((struct_socket *) (*s_objet_argument).objet)).type,
                   3328:                "STREAM") != 0) && (strcmp((*((struct_socket *)
                   3329:                (*s_objet_argument).objet)).type, "SEQUENTIAL DATAGRAM") != 0))
                   3330:        {
1.54      bertrand 3331:            // Mode non connecté : l'attente se fait sur un poll()
1.126     bertrand 3332: #define DEBUG_RETURN
1.54      bertrand 3333:            if ((s_objet_resultat = copie_objet(s_etat_processus,
                   3334:                    s_objet_argument, 'P')) == NULL)
                   3335:            {
                   3336:                (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                   3337:                return;
                   3338:            }
                   3339: 
                   3340:            s_poll.fd = (*((struct_socket *) (*s_objet_argument).objet)).socket;
                   3341:            s_poll.events = POLLIN;
                   3342:            s_poll.revents = 0;
                   3343: 
1.55      bertrand 3344:            do
1.54      bertrand 3345:            {
1.55      bertrand 3346:                drapeau = d_vrai;
                   3347: 
                   3348: #              ifndef SEMAPHORES_NOMMES
                   3349:                if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
                   3350: #              else
                   3351:                if (sem_post((*s_etat_processus).semaphore_fork) != 0)
                   3352: #              endif
                   3353:                {
                   3354:                    (*s_etat_processus).erreur_systeme = d_es_processus;
                   3355:                    return;
                   3356:                }
                   3357: 
                   3358:                if (poll(&s_poll, 1, -1) < 0)
                   3359:                {
                   3360:                    erreur = errno;
                   3361: 
                   3362: #                  ifndef SEMAPHORES_NOMMES
                   3363:                    while(sem_wait(&((*s_etat_processus)
                   3364:                            .semaphore_fork)) != 0)
                   3365: #                  else
                   3366:                    while(sem_wait((*s_etat_processus).semaphore_fork)
                   3367:                            != 0)
                   3368: #                  endif
                   3369: 
                   3370:                    if (erreur != EINTR)
                   3371:                    {
                   3372:                        liberation(s_etat_processus, s_objet_argument);
                   3373:                        liberation(s_etat_processus, s_objet_resultat);
                   3374: 
                   3375:                        (*s_etat_processus).erreur_execution =
                   3376:                                d_ex_erreur_acces_fichier;
                   3377:                        return;
                   3378:                    }
                   3379: 
                   3380:                    scrutation_injection(s_etat_processus);
                   3381: 
                   3382:                    if ((*s_etat_processus).var_volatile_requete_arret != 0)
                   3383:                    {
                   3384:                        drapeau = d_vrai;
                   3385:                    }
                   3386:                    else
                   3387:                    {
                   3388:                        drapeau = d_faux;
                   3389:                    }
                   3390:                }
                   3391:                else
1.54      bertrand 3392:                {
1.55      bertrand 3393: #                  ifndef SEMAPHORES_NOMMES
                   3394:                        while(sem_wait(&((*s_etat_processus)
                   3395:                                .semaphore_fork)) != 0)
                   3396: #                  else
                   3397:                        while(sem_wait((*s_etat_processus).semaphore_fork)
                   3398:                                != 0)
                   3399: #                  endif
                   3400:                    {
                   3401:                        if (errno != EINTR)
                   3402:                        {
                   3403:                            (*s_etat_processus).erreur_systeme =
                   3404:                                    d_es_processus;
                   3405:                            return;
                   3406:                        }
                   3407:                    }
1.54      bertrand 3408:                }
1.55      bertrand 3409:            } while(drapeau == d_faux);
1.54      bertrand 3410: 
                   3411:            if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                   3412:                    s_objet_argument) == d_erreur)
                   3413:            {
                   3414:                return;
                   3415:            }
1.1       bertrand 3416: 
1.54      bertrand 3417:            if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                   3418:                    s_objet_resultat) == d_erreur)
                   3419:            {
                   3420:                return;
                   3421:            }
1.1       bertrand 3422:        }
1.54      bertrand 3423:        else
1.1       bertrand 3424:        {
1.54      bertrand 3425:            // Mode connecté
1.1       bertrand 3426: 
1.54      bertrand 3427:            if ((s_objet_resultat = copie_objet(s_etat_processus,
                   3428:                    s_objet_argument, 'O')) == NULL)
                   3429:            {
                   3430:                (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                   3431:                return;
                   3432:            }
1.1       bertrand 3433: 
1.54      bertrand 3434:            (*((struct_socket *) (*s_objet_resultat).objet)).effacement = 'N';
                   3435:            (*((struct_socket *) (*s_objet_resultat).objet)).socket_en_ecoute
                   3436:                    = 'N';
1.1       bertrand 3437: 
1.54      bertrand 3438:            if ((*((struct_socket *) (*s_objet_resultat).objet)).domaine ==
                   3439:                    PF_INET)
1.1       bertrand 3440:            {
1.54      bertrand 3441:                longueur = sizeof(adresse_ipv4);
                   3442: 
                   3443:                do
                   3444:                {
                   3445:                    drapeau = d_vrai;
1.1       bertrand 3446: 
1.98      bertrand 3447: #                  ifndef SEMAPHORES_NOMMES
1.54      bertrand 3448:                        if (sem_post(&((*s_etat_processus).semaphore_fork))
                   3449:                                != 0)
1.98      bertrand 3450: #                  else
1.54      bertrand 3451:                        if (sem_post((*s_etat_processus).semaphore_fork) != 0)
1.98      bertrand 3452: #                  endif
1.54      bertrand 3453:                    {
                   3454:                        (*s_etat_processus).erreur_systeme = d_es_processus;
                   3455:                        return;
                   3456:                    }
1.1       bertrand 3457: 
1.54      bertrand 3458:                    if (((*((struct_socket *) (*s_objet_resultat).objet))
                   3459:                            .socket = accept((*((struct_socket *)
                   3460:                            (*s_objet_argument).objet)).socket,
                   3461:                            (struct sockaddr *) &adresse_ipv4, &longueur))
                   3462:                            < 0)
                   3463:                    {
                   3464:                        erreur = errno;
1.1       bertrand 3465: 
1.55      bertrand 3466: #                      ifndef SEMAPHORES_NOMMES
1.98      bertrand 3467:                            while(sem_wait(&((*s_etat_processus)
                   3468:                                    .semaphore_fork)) != 0)
1.55      bertrand 3469: #                      else
1.98      bertrand 3470:                            while(sem_wait((*s_etat_processus).semaphore_fork)
                   3471:                                    != 0)
1.55      bertrand 3472: #                      endif
1.50      bertrand 3473:                        {
1.54      bertrand 3474:                            if (errno != EINTR)
                   3475:                            {
                   3476:                                (*s_etat_processus).erreur_systeme =
                   3477:                                        d_es_processus;
                   3478:                                return;
                   3479:                            }
1.50      bertrand 3480:                        }
1.1       bertrand 3481: 
1.54      bertrand 3482:                        if (erreur != EINTR)
                   3483:                        {
                   3484:                            liberation(s_etat_processus, s_objet_argument);
                   3485:                            liberation(s_etat_processus, s_objet_resultat);
1.1       bertrand 3486: 
1.54      bertrand 3487:                            (*s_etat_processus).erreur_execution =
                   3488:                                    d_ex_erreur_acces_fichier;
                   3489:                            return;
                   3490:                        }
1.1       bertrand 3491: 
1.54      bertrand 3492:                        scrutation_injection(s_etat_processus);
1.1       bertrand 3493: 
1.54      bertrand 3494:                        if ((*s_etat_processus).var_volatile_requete_arret != 0)
                   3495:                        {
                   3496:                            drapeau = d_vrai;
                   3497:                        }
                   3498:                        else
                   3499:                        {
                   3500:                            drapeau = d_faux;
                   3501:                        }
1.1       bertrand 3502:                    }
                   3503:                    else
                   3504:                    {
1.98      bertrand 3505: #                      ifndef SEMAPHORES_NOMMES
1.54      bertrand 3506:                            while(sem_wait(&((*s_etat_processus)
                   3507:                                    .semaphore_fork)) != 0)
1.98      bertrand 3508: #                      else
1.54      bertrand 3509:                            while(sem_wait((*s_etat_processus).semaphore_fork)
                   3510:                                    != 0)
1.98      bertrand 3511: #                      endif
1.50      bertrand 3512:                        {
1.54      bertrand 3513:                            if (errno != EINTR)
                   3514:                            {
                   3515:                                (*s_etat_processus).erreur_systeme =
                   3516:                                        d_es_processus;
                   3517:                                return;
                   3518:                            }
1.50      bertrand 3519:                        }
1.98      bertrand 3520: 
                   3521:                        if (options_sockets(s_etat_processus,
                   3522:                                (*s_objet_resultat).objet) != d_absence_erreur)
                   3523:                        {
                   3524:                            liberation(s_etat_processus, s_objet_argument);
                   3525:                            liberation(s_etat_processus, s_objet_resultat);
                   3526: 
                   3527:                            (*s_etat_processus).erreur_execution =
                   3528:                                    d_ex_erreur_parametre_fichier;
                   3529:                            return;
                   3530:                        }
1.1       bertrand 3531:                    }
1.54      bertrand 3532:                } while(drapeau == d_faux);
                   3533: 
                   3534:                if (((*((struct_socket *) (*s_objet_resultat).objet))
                   3535:                        .adresse_distante = malloc(22 *
                   3536:                        sizeof(unsigned char))) == NULL)
                   3537:                {
                   3538:                    (*s_etat_processus).erreur_systeme =
                   3539:                            d_es_allocation_memoire;
                   3540:                    return;
1.1       bertrand 3541:                }
                   3542: 
1.54      bertrand 3543:                sprintf((*((struct_socket *) (*s_objet_resultat).objet))
                   3544:                        .adresse_distante, "%d.%d.%d.%d(%d)",
                   3545:                        (ntohl(adresse_ipv4.sin_addr.s_addr) >> 24) & 0xFF,
                   3546:                        (ntohl(adresse_ipv4.sin_addr.s_addr) >> 16) & 0xFF,
                   3547:                        (ntohl(adresse_ipv4.sin_addr.s_addr) >> 8) & 0xFF,
                   3548:                        ntohl(adresse_ipv4.sin_addr.s_addr) & 0xFF,
                   3549:                        ntohs(adresse_ipv4.sin_port));
                   3550:            }
                   3551:            else if ((*((struct_socket *) (*s_objet_resultat).objet)).domaine ==
                   3552:                    PF_INET6)
1.1       bertrand 3553:            {
1.20      bertrand 3554: #          ifdef IPV6
1.54      bertrand 3555:                longueur = sizeof(adresse_ipv6);
1.1       bertrand 3556: 
1.54      bertrand 3557:                do
                   3558:                {
                   3559:                    drapeau = d_vrai;
1.1       bertrand 3560: 
1.98      bertrand 3561: #                  ifndef SEMAPHORES_NOMMES
1.54      bertrand 3562:                        if (sem_post(&((*s_etat_processus).semaphore_fork))
                   3563:                                != 0)
1.98      bertrand 3564: #                  else
1.54      bertrand 3565:                        if (sem_post((*s_etat_processus).semaphore_fork) != 0)
1.98      bertrand 3566: #                  endif
1.54      bertrand 3567:                    {
                   3568:                        (*s_etat_processus).erreur_systeme = d_es_processus;
                   3569:                        return;
                   3570:                    }
1.1       bertrand 3571: 
1.54      bertrand 3572:                    if (((*((struct_socket *) (*s_objet_resultat).objet))
                   3573:                            .socket = accept((*((struct_socket *)
                   3574:                            (*s_objet_argument).objet)).socket,
                   3575:                            (struct sockaddr *) &adresse_ipv6, &longueur)) < 0)
                   3576:                    {
                   3577:                        erreur = errno;
1.1       bertrand 3578: 
1.98      bertrand 3579: #                      ifndef SEMAPHORES_NOMMES
1.54      bertrand 3580:                            while(sem_wait(&((*s_etat_processus)
                   3581:                                    .semaphore_fork)) != 0)
1.98      bertrand 3582: #                      else
1.54      bertrand 3583:                            while(sem_wait((*s_etat_processus).semaphore_fork)
                   3584:                                    != 0)
1.98      bertrand 3585: #                      endif
1.50      bertrand 3586:                        {
1.54      bertrand 3587:                            if (errno != EINTR)
                   3588:                            {
                   3589:                                (*s_etat_processus).erreur_systeme =
                   3590:                                        d_es_processus;
                   3591:                                return;
                   3592:                            }
1.50      bertrand 3593:                        }
1.1       bertrand 3594: 
1.54      bertrand 3595:                        if (erreur != EINTR)
                   3596:                        {
                   3597:                            liberation(s_etat_processus, s_objet_argument);
                   3598:                            liberation(s_etat_processus, s_objet_resultat);
1.1       bertrand 3599: 
1.54      bertrand 3600:                            (*s_etat_processus).erreur_execution =
                   3601:                                    d_ex_erreur_acces_fichier;
                   3602:                            return;
                   3603:                        }
1.1       bertrand 3604: 
1.54      bertrand 3605:                        scrutation_injection(s_etat_processus);
1.1       bertrand 3606: 
1.54      bertrand 3607:                        if ((*s_etat_processus).var_volatile_requete_arret != 0)
                   3608:                        {
                   3609:                            drapeau = d_vrai;
                   3610:                        }
                   3611:                        else
                   3612:                        {
                   3613:                            drapeau = d_faux;
                   3614:                        }
1.1       bertrand 3615:                    }
                   3616:                    else
                   3617:                    {
1.98      bertrand 3618: #                      ifndef SEMAPHORES_NOMMES
1.54      bertrand 3619:                            while(sem_wait(&((*s_etat_processus)
                   3620:                                    .semaphore_fork)) != 0)
1.98      bertrand 3621: #                      else
1.54      bertrand 3622:                            while(sem_wait((*s_etat_processus).semaphore_fork)
                   3623:                                    != 0)
1.98      bertrand 3624: #                      endif
1.50      bertrand 3625:                        {
1.54      bertrand 3626:                            if (errno != EINTR)
                   3627:                            {
                   3628:                                (*s_etat_processus).erreur_systeme =
                   3629:                                        d_es_processus;
                   3630:                                return;
                   3631:                            }
1.50      bertrand 3632:                        }
1.98      bertrand 3633: 
                   3634:                        if (options_sockets(s_etat_processus,
                   3635:                                (*s_objet_resultat).objet) != d_absence_erreur)
                   3636:                        {
                   3637:                            liberation(s_etat_processus, s_objet_argument);
                   3638:                            liberation(s_etat_processus, s_objet_resultat);
                   3639: 
                   3640:                            (*s_etat_processus).erreur_execution =
                   3641:                                    d_ex_erreur_parametre_fichier;
                   3642:                            return;
                   3643:                        }
1.1       bertrand 3644:                    }
1.54      bertrand 3645:                } while(drapeau == d_faux);
                   3646: 
                   3647:                if (((*((struct_socket *) (*s_objet_resultat).objet))
1.111     bertrand 3648:                        .adresse_distante = malloc(47 *
1.54      bertrand 3649:                        sizeof(unsigned char))) == NULL)
                   3650:                {
                   3651:                    (*s_etat_processus).erreur_systeme =
                   3652:                            d_es_allocation_memoire;
                   3653:                    return;
1.1       bertrand 3654:                }
                   3655: 
                   3656:                sprintf((*((struct_socket *) (*s_objet_resultat)
                   3657:                        .objet)).adresse_distante,
1.111     bertrand 3658:                        "%02X%02X:%02X%02X:%02X%02X:%02X%02X:"
                   3659:                        "%02X%02X:%02X%02X:%02X%02X:%02X%02X(%u)",
                   3660:                        adresse_ipv6.sin6_addr.s6_addr[0],
                   3661:                        adresse_ipv6.sin6_addr.s6_addr[1],
                   3662:                        adresse_ipv6.sin6_addr.s6_addr[2],
                   3663:                        adresse_ipv6.sin6_addr.s6_addr[3],
                   3664:                        adresse_ipv6.sin6_addr.s6_addr[4],
                   3665:                        adresse_ipv6.sin6_addr.s6_addr[5],
                   3666:                        adresse_ipv6.sin6_addr.s6_addr[6],
                   3667:                        adresse_ipv6.sin6_addr.s6_addr[7],
                   3668:                        adresse_ipv6.sin6_addr.s6_addr[8],
                   3669:                        adresse_ipv6.sin6_addr.s6_addr[9],
                   3670:                        adresse_ipv6.sin6_addr.s6_addr[10],
                   3671:                        adresse_ipv6.sin6_addr.s6_addr[11],
                   3672:                        adresse_ipv6.sin6_addr.s6_addr[12],
                   3673:                        adresse_ipv6.sin6_addr.s6_addr[13],
                   3674:                        adresse_ipv6.sin6_addr.s6_addr[14],
                   3675:                        adresse_ipv6.sin6_addr.s6_addr[15],
1.54      bertrand 3676:                        ntohs(adresse_ipv6.sin6_port));
1.20      bertrand 3677: #          else
1.54      bertrand 3678:                if ((*s_etat_processus).langue == 'F')
                   3679:                {
                   3680:                    printf("+++Attention : Support du protocole"
                   3681:                            " IPv6 indisponible\n");
                   3682:                }
                   3683:                else
                   3684:                {
                   3685:                    printf("+++Warning : IPv6 support "
                   3686:                            "unavailable\n");
                   3687:                }
                   3688: #          endif
1.22      bertrand 3689:            }
                   3690:            else
                   3691:            {
1.54      bertrand 3692:                longueur = 0;
1.1       bertrand 3693: 
1.54      bertrand 3694:                do
                   3695:                {
                   3696:                    drapeau = d_vrai;
1.1       bertrand 3697: 
1.98      bertrand 3698: #                  ifndef SEMAPHORES_NOMMES
1.54      bertrand 3699:                        if (sem_post(&((*s_etat_processus).semaphore_fork))
                   3700:                                != 0)
1.98      bertrand 3701: #                  else
1.54      bertrand 3702:                        if (sem_post((*s_etat_processus).semaphore_fork) != 0)
1.98      bertrand 3703: #                  endif
1.54      bertrand 3704:                    {
                   3705:                        (*s_etat_processus).erreur_systeme = d_es_processus;
                   3706:                        return;
                   3707:                    }
1.1       bertrand 3708: 
1.54      bertrand 3709:                    if (((*((struct_socket *) (*s_objet_resultat).objet))
                   3710:                            .socket = accept((*((struct_socket *)
                   3711:                            (*s_objet_argument).objet)).socket, NULL,
                   3712:                            &longueur)) < 0)
                   3713:                    {
                   3714:                        erreur = errno;
1.1       bertrand 3715: 
1.98      bertrand 3716: #                      ifndef SEMAPHORES_NOMMES
1.54      bertrand 3717:                            while(sem_wait(&((*s_etat_processus)
                   3718:                                    .semaphore_fork)) != 0)
1.98      bertrand 3719: #                      else
1.54      bertrand 3720:                            while(sem_wait((*s_etat_processus).semaphore_fork)
                   3721:                                    != 0)
1.98      bertrand 3722: #                      endif
1.50      bertrand 3723:                        {
1.54      bertrand 3724:                            if (errno != EINTR)
                   3725:                            {
                   3726:                                (*s_etat_processus).erreur_systeme =
                   3727:                                        d_es_processus;
                   3728:                                return;
                   3729:                            }
1.50      bertrand 3730:                        }
1.1       bertrand 3731: 
1.54      bertrand 3732:                        if (erreur != EINTR)
                   3733:                        {
                   3734:                            liberation(s_etat_processus, s_objet_argument);
                   3735:                            liberation(s_etat_processus, s_objet_resultat);
1.1       bertrand 3736: 
1.54      bertrand 3737:                            (*s_etat_processus).erreur_execution =
                   3738:                                    d_ex_erreur_acces_fichier;
                   3739:                            return;
                   3740:                        }
1.1       bertrand 3741: 
1.54      bertrand 3742:                        scrutation_injection(s_etat_processus);
1.1       bertrand 3743: 
1.54      bertrand 3744:                        if ((*s_etat_processus).var_volatile_requete_arret != 0)
                   3745:                        {
                   3746:                            drapeau = d_vrai;
                   3747:                        }
                   3748:                        else
                   3749:                        {
                   3750:                            drapeau = d_faux;
                   3751:                        }
1.1       bertrand 3752:                    }
                   3753:                    else
                   3754:                    {
1.98      bertrand 3755: #                      ifndef SEMAPHORES_NOMMES
1.54      bertrand 3756:                            while(sem_wait(&((*s_etat_processus)
                   3757:                                    .semaphore_fork)) != 0)
1.98      bertrand 3758: #                      else
1.54      bertrand 3759:                            while(sem_wait((*s_etat_processus).semaphore_fork)
                   3760:                                    != 0)
1.98      bertrand 3761: #                      endif
1.50      bertrand 3762:                        {
1.54      bertrand 3763:                            if (errno != EINTR)
                   3764:                            {
                   3765:                                (*s_etat_processus).erreur_systeme =
                   3766:                                        d_es_processus;
                   3767:                                return;
                   3768:                            }
1.50      bertrand 3769:                        }
1.98      bertrand 3770: 
                   3771:                        if (options_sockets(s_etat_processus,
                   3772:                                (*s_objet_resultat).objet) != d_absence_erreur)
                   3773:                        {
                   3774:                            liberation(s_etat_processus, s_objet_argument);
                   3775:                            liberation(s_etat_processus, s_objet_resultat);
                   3776: 
                   3777:                            (*s_etat_processus).erreur_execution =
                   3778:                                    d_ex_erreur_parametre_fichier;
                   3779:                            return;
                   3780:                        }
1.1       bertrand 3781:                    }
1.54      bertrand 3782:                } while(drapeau == d_faux);
                   3783:            }
1.1       bertrand 3784: 
1.54      bertrand 3785:            // Si accept() renvoie une erreur non récupérée, il ne peut s'agir
                   3786:            // que de EINTR sachant qu'une requête d'arrêt est en court de
                   3787:            // traitement.
1.1       bertrand 3788: 
1.54      bertrand 3789:            if ((*((struct_socket *) (*s_objet_resultat).objet)).socket >= 0)
                   3790:            {
                   3791:                l_element_courant = (*s_etat_processus).s_sockets;
1.1       bertrand 3792: 
1.54      bertrand 3793:                if (l_element_courant == NULL)
1.1       bertrand 3794:                {
1.54      bertrand 3795:                    if (((*s_etat_processus).s_sockets =
                   3796:                            allocation_maillon(s_etat_processus)) == NULL)
                   3797:                    {
                   3798:                        (*s_etat_processus).erreur_systeme =
                   3799:                                d_es_allocation_memoire;
                   3800:                        return;
                   3801:                    }
                   3802: 
                   3803:                    (*(*s_etat_processus).s_sockets).suivant = NULL;
                   3804:                    l_element_courant = (*s_etat_processus).s_sockets;
1.1       bertrand 3805:                }
1.54      bertrand 3806:                else
                   3807:                {
                   3808:                    /*
                   3809:                     * Ajout d'un élément à la fin de la liste chaînée
                   3810:                     */
1.1       bertrand 3811: 
1.54      bertrand 3812:                    while((*l_element_courant).suivant != NULL)
                   3813:                    {
                   3814:                        l_element_courant = (*l_element_courant).suivant;
                   3815:                    }
                   3816: 
                   3817:                    if (((*l_element_courant).suivant =
                   3818:                            allocation_maillon(s_etat_processus)) == NULL)
                   3819:                    {
                   3820:                        (*s_etat_processus).erreur_systeme =
                   3821:                                d_es_allocation_memoire;
                   3822:                        return;
                   3823:                    }
1.1       bertrand 3824: 
                   3825:                    l_element_courant = (*l_element_courant).suivant;
1.54      bertrand 3826:                    (*l_element_courant).suivant = NULL;
1.1       bertrand 3827:                }
                   3828: 
1.54      bertrand 3829:                if (((*l_element_courant).donnee = copie_objet(s_etat_processus,
                   3830:                        s_objet_resultat, 'O')) == NULL)
1.1       bertrand 3831:                {
                   3832:                    (*s_etat_processus).erreur_systeme =
                   3833:                            d_es_allocation_memoire;
                   3834:                    return;
                   3835:                }
1.54      bertrand 3836:            }
1.1       bertrand 3837: 
1.54      bertrand 3838:            if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                   3839:                    s_objet_argument) == d_erreur)
                   3840:            {
                   3841:                return;
1.1       bertrand 3842:            }
                   3843: 
1.54      bertrand 3844:            if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                   3845:                    s_objet_resultat) == d_erreur)
1.1       bertrand 3846:            {
                   3847:                return;
                   3848:            }
                   3849:        }
                   3850:    }
                   3851:    else
                   3852:    {
                   3853:        liberation(s_etat_processus, s_objet_argument);
                   3854: 
                   3855:        (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
                   3856:        return;
                   3857:    }
                   3858: 
                   3859:    return;
                   3860: }
                   3861: 
                   3862: 
                   3863: /*
                   3864: ================================================================================
                   3865:   Fonction 'wfswi'
                   3866: ================================================================================
                   3867:   Entrées : pointeur sur une structure struct_processus
                   3868: --------------------------------------------------------------------------------
                   3869:   Sorties :
                   3870: --------------------------------------------------------------------------------
                   3871:   Effets de bord : néant
                   3872: ================================================================================
                   3873: */
                   3874: 
                   3875: void
                   3876: instruction_wfswi(struct_processus *s_etat_processus)
                   3877: {
                   3878:    integer8                    interruption;
                   3879: 
                   3880:    logical1                    drapeau_fin;
                   3881: 
                   3882:    struct_objet                *s_objet_argument;
                   3883: 
                   3884:    struct timespec             attente;
                   3885: 
                   3886:    (*s_etat_processus).erreur_execution = d_ex;
                   3887: 
                   3888:    attente.tv_sec = 0;
                   3889:    attente.tv_nsec = GRANULARITE_us * 1000;
                   3890: 
                   3891:    if ((*s_etat_processus).affichage_arguments == 'Y')
                   3892:    {
                   3893:        printf("\n  WFSWI ");
                   3894: 
                   3895:        if ((*s_etat_processus).langue == 'F')
                   3896:        {
                   3897:            printf("(attente d'une interruption)\n\n");
                   3898:        }
                   3899:        else
                   3900:        {
                   3901:            printf("(wait for interrupt)\n\n");
                   3902:        }
                   3903: 
                   3904:        printf("    1: %s\n", d_INT);
                   3905: 
                   3906:        return;
                   3907:    }
                   3908:    else if ((*s_etat_processus).test_instruction == 'Y')
                   3909:    {
                   3910:        (*s_etat_processus).nombre_arguments = -1;
                   3911:        return;
                   3912:    }
                   3913: 
                   3914:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                   3915:    {
                   3916:        if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
                   3917:        {
                   3918:            return;
                   3919:        }
                   3920:    }
                   3921: 
                   3922:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                   3923:            &s_objet_argument) == d_erreur)
                   3924:    {
                   3925:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                   3926:        return;
                   3927:    }
                   3928: 
                   3929:    if ((*s_objet_argument).type == INT)
                   3930:    {
                   3931:        drapeau_fin = d_faux;
                   3932: 
                   3933:        interruption = (*((integer8 *) (*s_objet_argument).objet));
                   3934: 
                   3935:        if ((interruption < 1) || (interruption > d_NOMBRE_INTERRUPTIONS))
                   3936:        {
                   3937:            liberation(s_etat_processus, s_objet_argument);
                   3938: 
                   3939:            (*s_etat_processus).erreur_execution = d_ex_interruption_invalide;
                   3940:            return;
                   3941:        }
                   3942: 
                   3943:        while(drapeau_fin == d_faux)
                   3944:        {
                   3945:            if ((*s_etat_processus).var_volatile_requete_arret != 0)
                   3946:            {
                   3947:                liberation(s_etat_processus, s_objet_argument);
                   3948:                return;
                   3949:            }
                   3950: 
1.84      bertrand 3951:            if (pthread_mutex_lock(&(*s_etat_processus).mutex_interruptions)
                   3952:                    != 0)
1.83      bertrand 3953:            {
                   3954:                (*s_etat_processus).erreur_systeme = d_es_processus;
                   3955:                return;
                   3956:            }
                   3957: 
1.1       bertrand 3958:            if ((*s_etat_processus).nombre_interruptions_non_affectees != 0)
                   3959:            {
                   3960:                affectation_interruptions_logicielles(s_etat_processus);
                   3961:            }
                   3962: 
1.84      bertrand 3963:            if (pthread_mutex_unlock(&(*s_etat_processus).mutex_interruptions)
                   3964:                    != 0)
1.83      bertrand 3965:            {
                   3966:                (*s_etat_processus).erreur_systeme = d_es_processus;
                   3967:                return;
                   3968:            }
                   3969: 
1.1       bertrand 3970:            if ((*s_etat_processus).queue_interruptions[interruption - 1] > 0)
                   3971:            {
                   3972:                drapeau_fin = d_vrai;
                   3973:            }
                   3974:            else
                   3975:            {
1.118     bertrand 3976: #              ifndef SEMAPHORES_NOMMES
                   3977:                    if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
                   3978: #              else
                   3979:                    if (sem_post((*s_etat_processus).semaphore_fork) != 0)
                   3980: #              endif
                   3981:                {
                   3982:                    (*s_etat_processus).erreur_systeme = d_es_processus;
                   3983:                    return;
                   3984:                }
1.1       bertrand 3985:                nanosleep(&attente, NULL);
1.118     bertrand 3986: 
                   3987: #              ifndef SEMAPHORES_NOMMES
                   3988:                    while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
                   3989: #              else
                   3990:                    while(sem_wait((*s_etat_processus).semaphore_fork) != 0)
                   3991: #              endif
                   3992:                {
                   3993:                    if (errno != EINTR)
                   3994:                    {
                   3995:                        (*s_etat_processus).erreur_systeme = d_es_processus;
                   3996:                        return;
                   3997:                    }
                   3998:                }
                   3999: 
1.1       bertrand 4000:                scrutation_injection(s_etat_processus);
                   4001:                INCR_GRANULARITE(attente.tv_nsec);
                   4002:            }
                   4003:        }
                   4004:    }
                   4005:    else
                   4006:    {
                   4007:        liberation(s_etat_processus, s_objet_argument);
                   4008: 
                   4009:        (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
                   4010:        return;
                   4011:    }
                   4012: 
                   4013:    liberation(s_etat_processus, s_objet_argument);
                   4014: 
                   4015:    return;
                   4016: }
                   4017: 
                   4018: 
                   4019: /*
                   4020: ================================================================================
                   4021:   Fonction 'wfpoke'
                   4022: ================================================================================
                   4023:   Entrées : pointeur sur une structure struct_processus
                   4024: --------------------------------------------------------------------------------
                   4025:   Sorties :
                   4026: --------------------------------------------------------------------------------
                   4027:   Effets de bord : néant
                   4028: ================================================================================
                   4029: */
                   4030: 
                   4031: void
                   4032: instruction_wfpoke(struct_processus *s_etat_processus)
                   4033: {
                   4034:    struct timespec             attente;
                   4035: 
                   4036:    unsigned char               registre_instruction_valide;
                   4037: 
                   4038:    (*s_etat_processus).erreur_execution = d_ex;
                   4039: 
                   4040:    attente.tv_sec = 0;
                   4041:    attente.tv_nsec = GRANULARITE_us * 1000;
                   4042: 
                   4043:    if ((*s_etat_processus).affichage_arguments == 'Y')
                   4044:    {
                   4045:        printf("\n  WFPOKE ");
                   4046: 
                   4047:        if ((*s_etat_processus).langue == 'F')
                   4048:        {
                   4049:            printf("(attente de données en provenance du processus père)\n\n");
                   4050:            printf("  Aucun argument\n");
                   4051:        }
                   4052:        else
                   4053:        {
                   4054:            printf("(wait for data from parent process)\n\n");
                   4055:            printf("  No argument\n");
                   4056:        }
                   4057: 
                   4058:        return;
                   4059:    }
                   4060:    else if ((*s_etat_processus).test_instruction == 'Y')
                   4061:    {
                   4062:        (*s_etat_processus).nombre_arguments = -1;
                   4063:        return;
                   4064:    }
                   4065: 
                   4066:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                   4067:    {
                   4068:        if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
                   4069:        {
                   4070:            return;
                   4071:        }
                   4072:    }
                   4073: 
                   4074:    if ((*s_etat_processus).presence_pipes == d_faux)
                   4075:    {
                   4076:        (*s_etat_processus).erreur_execution = d_ex_absence_processus_pere;
                   4077:        return;
                   4078:    }
                   4079: 
                   4080:    if ((*s_etat_processus).nombre_objets_injectes > 0)
                   4081:    {
                   4082:        return;
                   4083:    }
                   4084: 
                   4085:    if ((*s_etat_processus).profilage == d_vrai)
                   4086:    {
                   4087:        profilage(s_etat_processus, "Interprocess or interthread "
                   4088:                "communications (WFPOKE)");
                   4089: 
                   4090:        if ((*s_etat_processus).erreur_systeme != d_es)
                   4091:        {
                   4092:            return;
                   4093:        }
                   4094:    }
                   4095: 
                   4096:    do
                   4097:    {
1.51      bertrand 4098: #      ifndef SEMAPHORES_NOMMES
                   4099:            if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
                   4100: #      else
                   4101:            if (sem_post((*s_etat_processus).semaphore_fork) != 0)
                   4102: #      endif
1.1       bertrand 4103:        {
                   4104:            (*s_etat_processus).erreur_systeme = d_es_processus;
                   4105:            return;
                   4106:        }
                   4107: 
                   4108:        nanosleep(&attente, NULL);
                   4109: 
1.51      bertrand 4110: #      ifndef SEMAPHORES_NOMMES
                   4111:            while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
                   4112: #      else
                   4113:            while(sem_wait((*s_etat_processus).semaphore_fork) != 0)
                   4114: #      endif
1.1       bertrand 4115:        {
1.50      bertrand 4116:            if (errno != EINTR)
                   4117:            {
                   4118:                (*s_etat_processus).erreur_systeme = d_es_processus;
                   4119:                return;
                   4120:            }
1.1       bertrand 4121:        }
                   4122: 
                   4123:        scrutation_injection(s_etat_processus);
                   4124: 
1.84      bertrand 4125:        if (pthread_mutex_lock(&(*s_etat_processus).mutex_interruptions) != 0)
1.83      bertrand 4126:        {
                   4127:            (*s_etat_processus).erreur_systeme = d_es_processus;
                   4128:            return;
                   4129:        }
                   4130: 
1.1       bertrand 4131:        if ((*s_etat_processus).nombre_interruptions_non_affectees != 0)
                   4132:        {
                   4133:            affectation_interruptions_logicielles(s_etat_processus);
                   4134:        }
                   4135: 
1.84      bertrand 4136:        if (pthread_mutex_unlock(&(*s_etat_processus).mutex_interruptions) != 0)
1.83      bertrand 4137:        {
                   4138:            (*s_etat_processus).erreur_systeme = d_es_processus;
                   4139:            return;
                   4140:        }
                   4141: 
1.1       bertrand 4142:        if ((*s_etat_processus).nombre_interruptions_en_queue != 0)
                   4143:        {
                   4144:            registre_instruction_valide =
                   4145:                    (*s_etat_processus).instruction_valide;
                   4146:            traitement_interruptions_logicielles(s_etat_processus);
                   4147:            (*s_etat_processus).instruction_valide =
                   4148:                    registre_instruction_valide;
                   4149:        }
                   4150: 
                   4151:        if ((*s_etat_processus).var_volatile_requete_arret != 0)
                   4152:        {
                   4153:            if ((*s_etat_processus).profilage == d_vrai)
                   4154:            {
                   4155:                profilage(s_etat_processus, NULL);
                   4156:            }
                   4157: 
                   4158:            return;
                   4159:        }
                   4160: 
                   4161:        INCR_GRANULARITE(attente.tv_nsec);
                   4162:    } while((*s_etat_processus).nombre_objets_injectes == 0);
                   4163: 
                   4164:    return;
                   4165: }
                   4166: 
                   4167: 
                   4168: /*
                   4169: ================================================================================
                   4170:   Fonction 'wfack'
                   4171: ================================================================================
                   4172:   Entrées : pointeur sur une structure struct_processus
                   4173: --------------------------------------------------------------------------------
                   4174:   Sorties :
                   4175: --------------------------------------------------------------------------------
                   4176:   Effets de bord : néant
                   4177: ================================================================================
                   4178: */
                   4179: 
                   4180: void
                   4181: instruction_wfack(struct_processus *s_etat_processus)
                   4182: {
                   4183:    struct timespec             attente;
                   4184: 
                   4185:    unsigned char               registre_instruction_valide;
                   4186: 
                   4187:    (*s_etat_processus).erreur_execution = d_ex;
                   4188: 
                   4189:    attente.tv_sec = 0;
                   4190:    attente.tv_nsec = GRANULARITE_us * 1000;
                   4191: 
                   4192:    if ((*s_etat_processus).affichage_arguments == 'Y')
                   4193:    {
                   4194:        printf("\n  WFACK ");
                   4195: 
                   4196:        if ((*s_etat_processus).langue == 'F')
                   4197:        {
                   4198:            printf("(attente des acquittements de lecture)\n\n");
                   4199:            printf("  Aucun argument\n");
                   4200:        }
                   4201:        else
                   4202:        {
                   4203:            printf("(wait for reading of data acknowledgement)\n\n");
                   4204:            printf("  No argument\n");
                   4205:        }
                   4206: 
                   4207:        return;
                   4208:    }
                   4209:    else if ((*s_etat_processus).test_instruction == 'Y')
                   4210:    {
                   4211:        (*s_etat_processus).nombre_arguments = -1;
                   4212:        return;
                   4213:    }
                   4214: 
                   4215:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                   4216:    {
                   4217:        if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
                   4218:        {
                   4219:            return;
                   4220:        }
                   4221:    }
                   4222: 
                   4223:    if ((*s_etat_processus).presence_pipes == d_faux)
                   4224:    {
                   4225:        (*s_etat_processus).erreur_execution = d_ex_absence_processus_pere;
                   4226:        return;
                   4227:    }
                   4228: 
                   4229:    if ((*s_etat_processus).profilage == d_vrai)
                   4230:    {
                   4231:        profilage(s_etat_processus, "Interprocess or interthread communications"
                   4232:                " (WFACK)");
                   4233: 
                   4234:        if ((*s_etat_processus).erreur_systeme != d_es)
                   4235:        {
                   4236:            return;
                   4237:        }
                   4238:    }
                   4239: 
                   4240:    while((*s_etat_processus).nombre_objets_envoyes_non_lus != 0)
                   4241:    {
                   4242:        scrutation_injection(s_etat_processus);
                   4243: 
1.84      bertrand 4244:        if (pthread_mutex_lock(&(*s_etat_processus).mutex_interruptions) != 0)
1.83      bertrand 4245:        {
                   4246:            (*s_etat_processus).erreur_systeme = d_es_processus;
                   4247:            return;
                   4248:        }
                   4249: 
1.1       bertrand 4250:        if ((*s_etat_processus).nombre_interruptions_non_affectees != 0)
                   4251:        {
                   4252:            affectation_interruptions_logicielles(s_etat_processus);
                   4253:        }
                   4254: 
1.84      bertrand 4255:        if (pthread_mutex_unlock(&(*s_etat_processus).mutex_interruptions) != 0)
1.83      bertrand 4256:        {
                   4257:            (*s_etat_processus).erreur_systeme = d_es_processus;
                   4258:            return;
                   4259:        }
                   4260: 
1.1       bertrand 4261:        if ((*s_etat_processus).nombre_interruptions_en_queue != 0)
                   4262:        {
                   4263:            registre_instruction_valide =
                   4264:                    (*s_etat_processus).instruction_valide;
                   4265:            traitement_interruptions_logicielles(s_etat_processus);
                   4266:            (*s_etat_processus).instruction_valide =
                   4267:                    registre_instruction_valide;
                   4268:        }
                   4269: 
                   4270:        if ((*s_etat_processus).var_volatile_requete_arret != 0)
                   4271:        {
                   4272:            if ((*s_etat_processus).profilage == d_vrai)
                   4273:            {
                   4274:                profilage(s_etat_processus, NULL);
                   4275:            }
                   4276: 
                   4277:            return;
                   4278:        }
                   4279: 
1.51      bertrand 4280: #      ifndef SEMAPHORES_NOMMES
                   4281:            if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
                   4282: #      else
                   4283:            if (sem_post((*s_etat_processus).semaphore_fork) != 0)
                   4284: #      endif
1.12      bertrand 4285:        {
                   4286:            (*s_etat_processus).erreur_systeme = d_es_processus;
                   4287:            return;
                   4288:        }
1.1       bertrand 4289: 
                   4290:        nanosleep(&attente, NULL);
                   4291:        INCR_GRANULARITE(attente.tv_nsec);
                   4292: 
1.51      bertrand 4293: #      ifndef SEMAPHORES_NOMMES
                   4294:            while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
                   4295: #      else
                   4296:            while(sem_wait((*s_etat_processus).semaphore_fork) != 0)
                   4297: #      endif
1.1       bertrand 4298:        {
1.50      bertrand 4299:            if (errno != EINTR)
                   4300:            {
                   4301:                (*s_etat_processus).erreur_systeme = d_es_processus;
                   4302:                return;
                   4303:            }
1.1       bertrand 4304:        }
                   4305:    }
                   4306: 
                   4307:    if ((*s_etat_processus).profilage == d_vrai)
                   4308:    {
                   4309:        profilage(s_etat_processus, NULL);
                   4310:    }
                   4311: 
                   4312:    return;
                   4313: }
                   4314: 
                   4315: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>