/* ================================================================================ RPL/2 (R) version 4.1.32 Copyright (C) 1989-2020 Dr. BERTRAND Joël This file is part of RPL/2. RPL/2 is free software; you can redistribute it and/or modify it under the terms of the CeCILL V2 License as published by the french CEA, CNRS and INRIA. RPL/2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL V2 License for more details. You should have received a copy of the CeCILL License along with RPL/2. If not, write to info@cecill.info. ================================================================================ */ #include "rpl-conv.h" /* ================================================================================ Fonction 'oct' ================================================================================ Entrées : -------------------------------------------------------------------------------- Sorties : -------------------------------------------------------------------------------- Effets de bord : néant ================================================================================ */ void instruction_oct(struct_processus *s_etat_processus) { (*s_etat_processus).erreur_execution = d_ex; if ((*s_etat_processus).affichage_arguments == 'Y') { printf("\n OCT "); if ((*s_etat_processus).langue == 'F') { printf("(base octale)\n\n"); printf(" Aucun argument\n"); } else { printf("(octal base)\n\n"); printf(" No argument\n"); } return; } else if ((*s_etat_processus).test_instruction == 'Y') { (*s_etat_processus).nombre_arguments = -1; return; } if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 0) == d_erreur) { return; } } sf(s_etat_processus, 43); cf(s_etat_processus, 44); return; } /* ================================================================================ Fonction 'over' ================================================================================ Entrées : -------------------------------------------------------------------------------- Sorties : -------------------------------------------------------------------------------- Effets de bord : néant ================================================================================ */ void instruction_over(struct_processus *s_etat_processus) { struct_objet *s_objet; (*s_etat_processus).erreur_execution = d_ex; if ((*s_etat_processus).affichage_arguments == 'Y') { printf("\n OVER "); if ((*s_etat_processus).langue == 'F') { printf("(duplication de l'objet de niveau 2)\n\n"); } else { printf("(duplication of level 2 object)\n\n"); } printf(" 2: %s, %s, %s, %s, %s, %s,\n" " %s, %s, %s, %s, %s,\n" " %s, %s, %s, %s, %s,\n" " %s, %s, %s, %s,\n" " %s, %s, %s\n", d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX, d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SCK, d_SQL, d_SLB, d_PRC, d_MTX, d_REC); printf(" 1: %s, %s, %s, %s, %s, %s,\n" " %s, %s, %s, %s, %s,\n" " %s, %s, %s, %s, %s,\n" " %s, %s, %s, %s,\n" " %s, %s, %s\n", d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX, d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SCK, d_SQL, d_SLB, d_PRC, d_MTX, d_REC); printf("-> 3: %s, %s, %s, %s, %s, %s,\n" " %s, %s, %s, %s, %s,\n" " %s, %s, %s, %s, %s,\n" " %s, %s, %s, %s,\n" " %s, %s, %s\n", d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX, d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SCK, d_SQL, d_SLB, d_PRC, d_MTX, d_REC); printf(" ...\n"); printf(" 1: %s, %s, %s, %s, %s, %s,\n" " %s, %s, %s, %s, %s,\n" " %s, %s, %s, %s, %s,\n" " %s, %s, %s, %s,\n" " %s, %s, %s\n", d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX, d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SCK, d_SQL, d_SLB, d_PRC, d_MTX, d_REC); return; } else if ((*s_etat_processus).test_instruction == 'Y') { (*s_etat_processus).nombre_arguments = -1; return; } if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 2) == d_erreur) { return; } } if ((*s_etat_processus).hauteur_pile_operationnelle < 2) { (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } s_objet = copie_objet(s_etat_processus, (*(*(*s_etat_processus).l_base_pile).suivant).donnee, 'P'); if (s_objet == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile), s_objet) == d_erreur) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } return; } /* ================================================================================ Fonction 'or' ================================================================================ Entrées : pointeur sur une structure struct_processus -------------------------------------------------------------------------------- Sorties : -------------------------------------------------------------------------------- Effets de bord : néant ================================================================================ */ void instruction_or(struct_processus *s_etat_processus) { struct_liste_chainee *l_element_courant; struct_liste_chainee *l_element_precedent; struct_objet *s_copie_argument_1; struct_objet *s_copie_argument_2; struct_objet *s_objet_argument_1; struct_objet *s_objet_argument_2; struct_objet *s_objet_resultat; integer8 nombre_elements; (*s_etat_processus).erreur_execution = d_ex; if ((*s_etat_processus).affichage_arguments == 'Y') { printf("\n OR "); if ((*s_etat_processus).langue == 'F') { printf("(opérateur ou)\n\n"); } else { printf("(or operator)\n\n"); } printf(" 2: %s, %s\n", d_INT, d_REL); printf(" 1: %s, %s\n", d_INT, d_REL); printf("-> 1: %s\n\n", d_INT); printf(" 2: %s\n", d_BIN); printf(" 1: %s\n", d_BIN); printf("-> 1: %s\n\n", d_BIN); printf(" 2: %s\n", d_NOM); printf(" 1: %s, %s, %s, %s\n", d_NOM, d_ALG, d_INT, d_REL); printf("-> 1: %s\n\n", d_ALG); printf(" 2: %s, %s, %s, %s\n", d_NOM, d_ALG, d_INT, d_REL); printf(" 1: %s\n", d_NOM); printf("-> 1: %s\n\n", d_ALG); printf(" 2: %s\n", d_ALG); printf(" 1: %s\n", d_ALG); printf("-> 1: %s\n\n", d_ALG); printf(" 2: %s\n", d_RPN); printf(" 1: %s\n", d_RPN); printf("-> 1: %s\n", d_RPN); return; } else if ((*s_etat_processus).test_instruction == 'Y') { (*s_etat_processus).nombre_arguments = 0; return; } if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 2) == d_erreur) { return; } } if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), &s_objet_argument_1) == d_erreur) { (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), &s_objet_argument_2) == d_erreur) { liberation(s_etat_processus, s_objet_argument_1); (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } /* -------------------------------------------------------------------------------- OR logique -------------------------------------------------------------------------------- */ if ((((*s_objet_argument_1).type == INT) || ((*s_objet_argument_1).type == REL)) && (((*s_objet_argument_2).type == INT) || ((*s_objet_argument_2).type == REL))) { if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } if ((*s_objet_argument_1).type == INT) { if ((*s_objet_argument_2).type == INT) { if (((*((integer8 *) (*s_objet_argument_1).objet)) != 0) || ((*((integer8 *) (*s_objet_argument_2).objet)) != 0)) { (*((integer8 *) (*s_objet_resultat).objet)) = -1; } else { (*((integer8 *) (*s_objet_resultat).objet)) = 0; } } else { if (((*((integer8 *) (*s_objet_argument_1).objet)) != 0) || ((*((real8 *) (*s_objet_argument_2).objet)) != 0)) { (*((integer8 *) (*s_objet_resultat).objet)) = -1; } else { (*((integer8 *) (*s_objet_resultat).objet)) = 0; } } } else { if ((*s_objet_argument_2).type == INT) { if (((*((real8 *) (*s_objet_argument_1).objet)) != 0) || ((*((integer8 *) (*s_objet_argument_2).objet)) != 0)) { (*((integer8 *) (*s_objet_resultat).objet)) = -1; } else { (*((integer8 *) (*s_objet_resultat).objet)) = 0; } } else { if (((*((real8 *) (*s_objet_argument_1).objet)) != 0) || ((*((real8 *) (*s_objet_argument_2).objet)) != 0)) { (*((integer8 *) (*s_objet_resultat).objet)) = -1; } else { (*((integer8 *) (*s_objet_resultat).objet)) = 0; } } } } /* -------------------------------------------------------------------------------- OR binaire -------------------------------------------------------------------------------- */ else if (((*s_objet_argument_1).type == BIN) && ((*s_objet_argument_2).type == BIN)) { if ((s_objet_resultat = allocation(s_etat_processus, BIN)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*((logical8 *) (*s_objet_resultat).objet)) = (*((logical8 *) (*s_objet_argument_1).objet)) | (*((logical8 *) (*s_objet_argument_2).objet)); } /* -------------------------------------------------------------------------------- OR entre des arguments complexes -------------------------------------------------------------------------------- */ /* * Nom ou valeur numérique / Nom ou valeur numérique */ else if ((((*s_objet_argument_1).type == NOM) && (((*s_objet_argument_2).type == NOM) || ((*s_objet_argument_2).type == INT) || ((*s_objet_argument_2).type == REL))) || (((*s_objet_argument_2).type == NOM) && (((*s_objet_argument_1).type == INT) || ((*s_objet_argument_1).type == REL)))) { if ((s_objet_resultat = allocation(s_etat_processus, ALG)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } if (((*s_objet_resultat).objet = allocation_maillon(s_etat_processus)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } l_element_courant = (*s_objet_resultat).objet; if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*((struct_fonction *) (*(*l_element_courant).donnee).objet)) .nombre_arguments = 0; (*((struct_fonction *) (*(*l_element_courant).donnee).objet)) .fonction = instruction_vers_niveau_superieur; if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet)) .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet)) .nom_fonction, "<<"); if (((*l_element_courant).suivant = allocation_maillon(s_etat_processus)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } l_element_courant = (*l_element_courant).suivant; (*l_element_courant).donnee = s_objet_argument_2; if (((*l_element_courant).suivant = allocation_maillon(s_etat_processus)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } l_element_courant = (*l_element_courant).suivant; (*l_element_courant).donnee = s_objet_argument_1; if (((*l_element_courant).suivant = allocation_maillon(s_etat_processus)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } l_element_courant = (*l_element_courant).suivant; if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*((struct_fonction *) (*(*l_element_courant).donnee).objet)) .nombre_arguments = 0; (*((struct_fonction *) (*(*l_element_courant).donnee).objet)) .fonction = instruction_or; if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet)) .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet)) .nom_fonction, "OR"); if (((*l_element_courant).suivant = allocation_maillon(s_etat_processus)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } l_element_courant = (*l_element_courant).suivant; if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*((struct_fonction *) (*(*l_element_courant).donnee).objet)) .nombre_arguments = 0; (*((struct_fonction *) (*(*l_element_courant).donnee).objet)) .fonction = instruction_vers_niveau_inferieur; if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet)) .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet)) .nom_fonction, ">>"); (*l_element_courant).suivant = NULL; s_objet_argument_1 = NULL; s_objet_argument_2 = NULL; } /* * Nom ou valeur numérique / Expression */ else if ((((*s_objet_argument_1).type == ALG) || ((*s_objet_argument_1).type == RPN)) && (((*s_objet_argument_2).type == NOM) || ((*s_objet_argument_2).type == INT) || ((*s_objet_argument_2).type == REL))) { nombre_elements = 0; l_element_courant = (struct_liste_chainee *) (*s_objet_argument_1).objet; while(l_element_courant != NULL) { nombre_elements++; l_element_courant = (*l_element_courant).suivant; } if (nombre_elements == 2) { liberation(s_etat_processus, s_objet_argument_1); liberation(s_etat_processus, s_objet_argument_2); (*s_etat_processus).erreur_execution = d_ex_argument_invalide; return; } if ((s_objet_resultat = copie_objet(s_etat_processus, s_objet_argument_1, 'N')) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } l_element_courant = (struct_liste_chainee *) (*s_objet_resultat).objet; l_element_precedent = l_element_courant; l_element_courant = (*l_element_courant).suivant; if (((*l_element_precedent).suivant = allocation_maillon(s_etat_processus)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*(*l_element_precedent).suivant).donnee = s_objet_argument_2; (*(*l_element_precedent).suivant).suivant = l_element_courant; while((*l_element_courant).suivant != NULL) { l_element_precedent = l_element_courant; l_element_courant = (*l_element_courant).suivant; } if (((*l_element_precedent).suivant = allocation_maillon(s_etat_processus)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } if (((*(*l_element_precedent).suivant).donnee = allocation(s_etat_processus, FCT)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*((struct_fonction *) (*(*(*l_element_precedent).suivant) .donnee).objet)).nombre_arguments = 0; (*((struct_fonction *) (*(*(*l_element_precedent).suivant) .donnee).objet)).fonction = instruction_or; if (((*((struct_fonction *) (*(*(*l_element_precedent) .suivant).donnee).objet)).nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } strcpy((*((struct_fonction *) (*(*(*l_element_precedent) .suivant).donnee).objet)).nom_fonction, "OR"); (*(*l_element_precedent).suivant).suivant = l_element_courant; s_objet_argument_2 = NULL; } /* * Expression / Nom ou valeur numérique */ else if ((((*s_objet_argument_1).type == NOM) || ((*s_objet_argument_1).type == INT) || ((*s_objet_argument_1).type == REL)) && (((*s_objet_argument_2).type == ALG) || ((*s_objet_argument_2).type == RPN))) { nombre_elements = 0; l_element_courant = (struct_liste_chainee *) (*s_objet_argument_2).objet; while(l_element_courant != NULL) { nombre_elements++; l_element_courant = (*l_element_courant).suivant; } if (nombre_elements == 2) { liberation(s_etat_processus, s_objet_argument_1); liberation(s_etat_processus, s_objet_argument_2); (*s_etat_processus).erreur_execution = d_ex_argument_invalide; return; } if ((s_objet_resultat = copie_objet(s_etat_processus, s_objet_argument_2, 'N')) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } l_element_courant = (struct_liste_chainee *) (*s_objet_resultat).objet; l_element_precedent = l_element_courant; while((*l_element_courant).suivant != NULL) { l_element_precedent = l_element_courant; l_element_courant = (*l_element_courant).suivant; } if (((*l_element_precedent).suivant = allocation_maillon(s_etat_processus)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*(*l_element_precedent).suivant).donnee = s_objet_argument_1; l_element_precedent = (*l_element_precedent).suivant; if (((*l_element_precedent).suivant = allocation_maillon(s_etat_processus)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } if (((*(*l_element_precedent).suivant).donnee = allocation(s_etat_processus, FCT)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*((struct_fonction *) (*(*(*l_element_precedent).suivant) .donnee).objet)).nombre_arguments = 0; (*((struct_fonction *) (*(*(*l_element_precedent).suivant) .donnee).objet)).fonction = instruction_or; if (((*((struct_fonction *) (*(*(*l_element_precedent) .suivant).donnee).objet)).nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } strcpy((*((struct_fonction *) (*(*(*l_element_precedent) .suivant).donnee).objet)).nom_fonction, "OR"); (*(*l_element_precedent).suivant).suivant = l_element_courant; s_objet_argument_1 = NULL; } /* * Expression / Expression */ else if ((((*s_objet_argument_1).type == ALG) && ((*s_objet_argument_2).type == ALG)) || (((*s_objet_argument_1).type == RPN) && ((*s_objet_argument_2).type == RPN))) { nombre_elements = 0; l_element_courant = (struct_liste_chainee *) (*s_objet_argument_1).objet; while(l_element_courant != NULL) { nombre_elements++; l_element_courant = (*l_element_courant).suivant; } if (nombre_elements == 2) { liberation(s_etat_processus, s_objet_argument_1); liberation(s_etat_processus, s_objet_argument_2); (*s_etat_processus).erreur_execution = d_ex_argument_invalide; return; } nombre_elements = 0; l_element_courant = (struct_liste_chainee *) (*s_objet_argument_2).objet; while(l_element_courant != NULL) { nombre_elements++; l_element_courant = (*l_element_courant).suivant; } if (nombre_elements == 2) { liberation(s_etat_processus, s_objet_argument_1); liberation(s_etat_processus, s_objet_argument_2); (*s_etat_processus).erreur_execution = d_ex_argument_invalide; return; } if ((s_copie_argument_1 = copie_objet(s_etat_processus, s_objet_argument_1, 'N')) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } if ((s_copie_argument_2 = copie_objet(s_etat_processus, s_objet_argument_2, 'N')) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } l_element_courant = (struct_liste_chainee *) (*s_copie_argument_1).objet; (*s_copie_argument_1).objet = (void *) (*((struct_liste_chainee *) (*s_copie_argument_1).objet)).suivant; liberation(s_etat_processus, (*l_element_courant).donnee); free(l_element_courant); l_element_courant = (struct_liste_chainee *) (*s_copie_argument_2).objet; l_element_precedent = l_element_courant; s_objet_resultat = s_copie_argument_2; while((*l_element_courant).suivant != NULL) { l_element_precedent = l_element_courant; l_element_courant = (*l_element_courant).suivant; } liberation(s_etat_processus, (*l_element_courant).donnee); free(l_element_courant); (*l_element_precedent).suivant = (struct_liste_chainee *) (*s_copie_argument_1).objet; free(s_copie_argument_1); l_element_courant = (*l_element_precedent).suivant; while((*l_element_courant).suivant != NULL) { l_element_precedent = l_element_courant; l_element_courant = (*l_element_courant).suivant; } if (((*l_element_precedent).suivant = allocation_maillon(s_etat_processus)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*(*l_element_precedent).suivant).suivant = l_element_courant; l_element_courant = (*l_element_precedent).suivant; if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*((struct_fonction *) (*(*l_element_courant).donnee).objet)) .nombre_arguments = 0; (*((struct_fonction *) (*(*l_element_courant).donnee).objet)) .fonction = instruction_or; if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet)) .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet)) .nom_fonction, "OR"); } /* -------------------------------------------------------------------------------- OR impossible -------------------------------------------------------------------------------- */ else { liberation(s_etat_processus, s_objet_argument_1); liberation(s_etat_processus, s_objet_argument_2); (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } liberation(s_etat_processus, s_objet_argument_1); liberation(s_etat_processus, s_objet_argument_2); if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile), s_objet_resultat) == d_erreur) { return; } return; } /* ================================================================================ Fonction 'open' ================================================================================ Entrées : pointeur sur une structure struct_processus -------------------------------------------------------------------------------- Sorties : -------------------------------------------------------------------------------- Effets de bord : néant ================================================================================ */ static inline logical1 options_socket(struct_processus *s_etat_processus, struct_objet *s_objet_resultat, unsigned char *options, unsigned char *peripherique, int *priorite, int *buffer_emission, int *buffer_reception, int *timeout_emission, int *timeout_reception) { int drapeau; /* * Options des sockets */ drapeau = -1; # define WARNING(message) { \ if ((*s_etat_processus).langue != 'F') \ printf("+++Warning : %s unavailable on host system\n", message); \ else \ printf("+++Attention : %s non disponible sur le système hôte\n", \ message); } while(0) if (options[d_BIND_TO_DEVICE] == 'Y') { # ifdef SO_BINDTODEVICE if (setsockopt((*((struct_socket *) (*s_objet_resultat).objet)) .socket, SOL_SOCKET, SO_BINDTODEVICE, peripherique, (socklen_t) strlen(peripherique)) != 0) { (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return(d_erreur); } (*((struct_socket *) (*s_objet_resultat).objet)).options |= ((integer8) 1) << d_BIND_TO_DEVICE; # else WARNING("BIND TO DEVICE"); # endif } if (options[d_BROADCAST] == 'Y') { if (setsockopt((*((struct_socket *) (*s_objet_resultat).objet)).socket, SOL_SOCKET, SO_BROADCAST, &drapeau, sizeof(drapeau)) != 0) { (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return(d_erreur); } (*((struct_socket *) (*s_objet_resultat).objet)).options |= ((integer8) 1) << d_BROADCAST; } if (options[d_DONT_ROUTE] == 'Y') { if (setsockopt((*((struct_socket *) (*s_objet_resultat).objet)).socket, SOL_SOCKET, SO_DONTROUTE, &drapeau, sizeof(drapeau)) != 0) { (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return(d_erreur); } (*((struct_socket *) (*s_objet_resultat).objet)).options |= ((integer8) 1) << d_DONT_ROUTE; } if (options[d_KEEP_ALIVE] == 'Y') { if (setsockopt((*((struct_socket *) (*s_objet_resultat).objet)).socket, SOL_SOCKET, SO_KEEPALIVE, &drapeau, sizeof(drapeau)) != 0) { (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return(d_erreur); } } if (options[d_PRIORITY] == 'Y') { # ifdef SO_PRIORITY if (setsockopt((*((struct_socket *) (*s_objet_resultat).objet)) .socket, SOL_SOCKET, SO_PRIORITY, priorite, sizeof((*priorite))) != 0) { (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return(d_erreur); } (*((struct_socket *) (*s_objet_resultat).objet)).options |= ((integer8) 1) << d_PRIORITY; (*((struct_socket *) (*s_objet_resultat).objet)).priorite = (*priorite); # else WARNING("PRIORITY"); # endif } if (options[d_RECEIVE_BUFFER] == 'Y') { if (setsockopt((*((struct_socket *) (*s_objet_resultat).objet)).socket, SOL_SOCKET, SO_RCVBUF, buffer_reception, sizeof((*buffer_reception))) != 0) { (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return(d_erreur); } (*((struct_socket *) (*s_objet_resultat).objet)).options |= ((integer8) 1) << d_RECEIVE_BUFFER; (*((struct_socket *) (*s_objet_resultat).objet)).buffer_reception = (*buffer_reception); } if (options[d_FORCE_RECEIVE_BUFFER] == 'Y') { # ifdef SO_RCVBUFFORCE if (setsockopt((*((struct_socket *) (*s_objet_resultat).objet)) .socket, SOL_SOCKET, SO_RCVBUFFORCE, buffer_reception, sizeof((*buffer_reception))) != 0) { (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return(d_erreur); } (*((struct_socket *) (*s_objet_resultat).objet)).options |= ((integer8) 1) << d_FORCE_RECEIVE_BUFFER; (*((struct_socket *) (*s_objet_resultat).objet)).buffer_reception = (*buffer_reception); # else WARNING("FORCE_RECEIVE_BUFFER"); # endif } if (options[d_SEND_BUFFER] == 'Y') { if (setsockopt((*((struct_socket *) (*s_objet_resultat).objet)).socket, SOL_SOCKET, SO_SNDBUF, buffer_emission, sizeof((*buffer_emission))) != 0) { (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return(d_erreur); } (*((struct_socket *) (*s_objet_resultat).objet)).options |= ((integer8) 1) << d_SEND_BUFFER; (*((struct_socket *) (*s_objet_resultat).objet)).buffer_emission = (*buffer_emission); } if (options[d_FORCE_SEND_BUFFER] == 'Y') { # ifdef SO_SNDBUFFORCE if (setsockopt((*((struct_socket *) (*s_objet_resultat).objet)) .socket, SOL_SOCKET, SO_SNDBUFFORCE, buffer_emission, sizeof((*buffer_emission))) != 0) { (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return(d_erreur); } (*((struct_socket *) (*s_objet_resultat).objet)).options |= ((integer8) 1) << d_FORCE_SEND_BUFFER; (*((struct_socket *) (*s_objet_resultat).objet)).buffer_emission = (*buffer_emission); # else WARNING("FORCE_SEND_BUFFER"); # endif } if (options[d_RECEIVING_TIMEOUT] == 'Y') { if (setsockopt((*((struct_socket *) (*s_objet_resultat).objet)).socket, SOL_SOCKET, SO_RCVTIMEO, timeout_reception, sizeof((*timeout_reception))) != 0) { (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return(d_erreur); } (*((struct_socket *) (*s_objet_resultat).objet)).options |= ((integer8) 1) << d_RECEIVING_TIMEOUT; (*((struct_socket *) (*s_objet_resultat).objet)).timeout_reception = (*timeout_reception); } if (options[d_SENDING_TIMEOUT] == 'Y') { if (setsockopt((*((struct_socket *) (*s_objet_resultat).objet)).socket, SOL_SOCKET, SO_SNDTIMEO, timeout_emission, sizeof((*timeout_emission))) != 0) { (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return(d_erreur); } (*((struct_socket *) (*s_objet_resultat).objet)).options |= ((integer8) 1) << d_SENDING_TIMEOUT; (*((struct_socket *) (*s_objet_resultat).objet)).timeout_emission = (*timeout_emission); } if (options[d_REUSE_ADDRESS] == 'Y') { if (setsockopt((*((struct_socket *) (*s_objet_resultat).objet)).socket, SOL_SOCKET, SO_REUSEADDR, &drapeau, sizeof(drapeau)) != 0) { (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return(d_erreur); } (*((struct_socket *) (*s_objet_resultat).objet)).options |= ((integer8) 1) << d_REUSE_ADDRESS; } return(d_absence_erreur); # undef WARNING } void instruction_open(struct_processus *s_etat_processus) { /* * Type d'ouverture : * NEW : crée un nouveau fichier, retourne une erreur si un fichier * préexiste ; * OLD : ouvre un fichier existant, retourne une erreur si le fichier * n'existe pas ; * REPLACE : remplace un fichier existant, retourne une erreur s'il n'y * a aucun fichier à effacer ; * UNKNOWN : ouvre un fichier existant ou crée un nouveau fichier ; * SCRATCH : crée un fichier temporaire automatiquement effacé lors * de sa fermeture (protection automatique 'readwrite'); * * Type d'accès : * SEQUENTIAL : accès séquentiel ; * DIRECT : accès direct ; * KEYED : accès indexé. * * Protection : * READONLY : lecture seule ; * WRITEONLY : écriture seule ; * READWRITE : lecture et écriture autorisées. * * Format : * FORMATTED : fichier texte ; * UNFORMATTED : fichier binaire. * FLOW : chaîne de caractères sans format (en tant qu'objet * binaire comme "\x00avz\xFD") */ file *descripteur; int buffer_emission; int buffer_reception; int priorite; int prochain_descripteur; int protocole_numerique; int timeout_emission; int timeout_reception; int type; integer8 adresse[16]; integer8 nombre_maximal_connexions; integer8 port; integer8 position_clef; logical1 erreur; logical1 existence; logical1 negation; logical1 ouverture; logical1 presence_port; sqlite3 *sqlite; struct_liste_chainee *l_element_courant; struct_liste_chainee *l_element_courant_sous_objet; struct_liste_chainee *parametre_courant; struct flock lock; struct addrinfo *resolution; struct addrinfo *resolution_courante; struct protoent *s_protocole; struct sockaddr_un socket_unix; struct sockaddr_in socket_ipv4; # ifdef IPV6 struct sockaddr_in6 socket_ipv6; # endif struct_objet *s_objet_argument; struct_objet *s_objet_resultat; struct_objet *s_parametres_tty; struct termios tc; uint32_t adresse_ipv4; unsigned char *argument_majuscule; unsigned char *chaine_descripteurs; unsigned char format; unsigned char *hote; unsigned char *nom; unsigned char *nom_temporaire; unsigned char options[12]; unsigned char *parametre_courant_majuscule; unsigned char *peripherique; unsigned char *pointeur; unsigned char *position; unsigned char protection; unsigned char protocole[16 + 1]; unsigned char *protocole_socket; unsigned char type_acces; unsigned char type_adresse; unsigned char type_arguments; unsigned char type_domaine; unsigned char type_ouverture; unsigned char type_socket; unsigned long i; unsigned long nombre_elements; unsigned long unite; /* * Argument : { "ouverture" "accès" "format" [ { "nom" } 'protection' ] } */ (*s_etat_processus).erreur_execution = d_ex; if ((*s_etat_processus).affichage_arguments == 'Y') { printf("\n OPEN "); if ((*s_etat_processus).langue == 'F') { printf("(ouverture d'un fichier, d'une socket ou d'un sémaphore)" "\n\n"); } else { printf("(open file, socket or semaphore)\n\n"); } printf(" 1: %s\n", d_LST); printf("-> 1: %s, %s\n\n", d_FCH, d_SCK); printf(" 1: %s\n", d_CHN); printf("-> 1: %s\n\n", d_SPH); if ((*s_etat_processus).langue == 'F') { printf(" Utilisation :\n\n"); } else { printf(" Usage:\n\n"); } printf(" { \"filetype\" \"access\" \"format\" { \"name\" " "\"file name\" } \"protection\" } OPEN\n"); printf(" { \"filetype\" \"access\" \"format\" { \"name\" " "\"file name\" } \n" " { \"stty\" \"speed,bits,parity,stop\"\n" " { \"stty parameters\" ... } } } OPEN\n"); printf(" { \"sockettype\" { \"name\" \"local name\" } } OPEN\n"); printf(" { \"sockettype\" \"socketdomain\" \"protection\" } OPEN\n"); printf(" \"/semaphore\" OPEN\n\n"); printf(" File type : NEW/OLD/REPLACE/UNKNOWN/SCRATCH\n"); printf(" File access : SEQUENTIAL/DIRECT/KEYED\n"); printf(" Socket type : STREAM/DATAGRAM/RAW/" "ROBUST DATAGRAM/SEQUENTIAL DATAGRAM\n"); printf(" Socket domain : LOCAL/FOREIGN\n"); printf(" Socket protocol : IPV4/IPV6/UNIX\n"); printf(" Format : FORMATTED/UNFORMATTED/FLOW\n"); printf(" Protection : READONLY/WRITEONLY/READWRITE\n\n"); printf(" Stty parameters : can be prefixed by 'NO'\n"); printf(" IGNBRK, BRKINT, IGNPAR, PARMRK, INPCK, ISTRIP\n"); printf(" INLCR, IGNCR, ICRNL, IXON, IXANY, IXOFF,\n"); printf(" IMAXBEL, OPOST, ONLCR, OCRNL, ONOCR, ONLRET,\n"); printf(" OFILL, HUPCL, CLOCAL, CRTSCTS, ISIG, ICANON,\n"); printf(" ECHO, ECHOE, ECHOK, ECHONL, NOFLSH, TOSTOP,\n"); printf(" IEXTEN\n"); printf(" Address : { \"ADDRESS\" [ 127 0 0 1 ] }\n"); printf(" { \"HOST\" \"hostname\" }\n"); printf(" Connections : { \"LISTEN\" amount of connections }\n"); printf(" Name : { \"NAME\" \"filename\" }\n"); printf(" Options : { \"OPTION\" \"option\" argument }\n"); printf(" \"BIND TO DEVICE\" \"device\"\n"); printf(" \"BROADCAST\"\n"); printf(" \"DO NOT ROUTE\"\n"); printf(" \"KEEP ALIVE\"\n"); printf(" \"PRIORITY\" integer\n"); printf(" \"RECEIVE BUFFER\" integer\n"); printf(" \"FORCE RECEIVE BUFFER\" integer\n"); printf(" \"SEND BUFFER\" integer\n"); printf(" \"FORCE SEND BUFFER\" integer\n"); printf(" \"RECEIVING TIMEOUT\" integer\n"); printf(" \"SENDING TIMEOUT\" integer\n"); printf(" \"REUSE ADDRESS\"\n"); printf(" Port : { \"PORT\" port number }\n"); printf(" Protocol : { \"PROTOCOL\" \"protocol\" }\n\n"); printf(" { { \"NAME\" \"filename\" } \"SEQUENTIAL\" } OPEN\n"); printf(" { \"SCRATCH\" } OPEN\n"); printf(" { { \"NAME\" \"filename\" } \"UNKNOWN\" \"FORMATTED\" " "\"DIRECT\" } OPEN\n"); printf(" { { \"NAME\" \"filename\" } \"OLD\" \"FORMATTED\" " "\"KEYED\" { \"KEY\" 2 } } OPEN\n"); printf(" { \"STREAM\" \"READWRITE\" } OPEN\n"); printf(" { \"FOREIGN\" \"DATAGRAM\" } OPEN\n"); printf(" { \"LOCAL\" { \"NAME\" \"socket.sock\" } } OPEN\n"); printf(" { { \"NAME\" \"/dev/ttyS1\" } { \"STTY\" \"9600,8,N,1\" " "\n { \"NO ICANON\" \"IGNBRK\" } } } OPEN\n"); return; } else if ((*s_etat_processus).test_instruction == 'Y') { (*s_etat_processus).nombre_arguments = -1; return; } if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 1) == d_erreur) { return; } } if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), &s_objet_argument) == d_erreur) { (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } if ((*s_objet_argument).type == LST) { l_element_courant = (struct_liste_chainee *) (*s_objet_argument).objet; if (l_element_courant == NULL) { liberation(s_etat_processus, s_objet_argument); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } format = ' '; type_domaine = ' '; type_ouverture = ' '; protection = ' '; type_acces = ' '; type_socket = ' '; nom = NULL; position_clef = 0; port = 0; type_arguments = ' '; nombre_maximal_connexions = 0; hote = NULL; type_adresse = ' '; protocole[0] = d_code_fin_chaine; protocole_socket = NULL; presence_port = d_faux; peripherique = NULL; priorite = 0; buffer_emission = 0; buffer_reception = 0; timeout_emission = 0; timeout_reception = 0; s_parametres_tty = NULL; for(i = 0; i < 12; options[i++] = 'N'); while(l_element_courant != NULL) { if ((*(*l_element_courant).donnee).type == CHN) { if ((argument_majuscule = conversion_majuscule(s_etat_processus, (unsigned char *) (*(*l_element_courant).donnee).objet)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } if (strcmp(argument_majuscule, "NEW") == 0) { if (type_ouverture != ' ') { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } if (type_arguments == ' ') { type_arguments = 'F'; } else if (type_arguments == 'S') { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } type_ouverture = 'N'; } else if (strcmp(argument_majuscule, "REPLACE") == 0) { if (type_ouverture != ' ') { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } if (type_arguments == ' ') { type_arguments = 'F'; } else if (type_arguments == 'S') { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } type_ouverture = 'R'; } else if (strcmp(argument_majuscule, "OLD") == 0) { if (type_ouverture != ' ') { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } if (type_arguments == ' ') { type_arguments = 'F'; } else if (type_arguments == 'S') { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } type_ouverture = 'O'; } else if (strcmp(argument_majuscule, "UNKNOWN") == 0) { if (type_ouverture != ' ') { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } if (type_arguments == ' ') { type_arguments = 'F'; } else if (type_arguments == 'S') { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } type_ouverture = 'U'; } else if (strcmp(argument_majuscule, "SCRATCH") == 0) { if (type_ouverture != ' ') { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } if (type_arguments == ' ') { type_arguments = 'F'; } else if (type_arguments == 'S') { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } type_ouverture = 'S'; } else if (strcmp(argument_majuscule, "SEQUENTIAL") == 0) { if (type_acces != ' ') { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } if (type_arguments == ' ') { type_arguments = 'F'; } else if (type_arguments == 'S') { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } type_acces = 'S'; } else if (strcmp(argument_majuscule, "DIRECT") == 0) { if (type_acces != ' ') { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } if (type_arguments == ' ') { type_arguments = 'F'; } else if (type_arguments == 'S') { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } type_acces = 'D'; } else if (strcmp(argument_majuscule, "KEYED") == 0) { if (type_acces != ' ') { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } if (type_arguments == ' ') { type_arguments = 'F'; } else if (type_arguments == 'S') { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } type_acces = 'I'; } else if (strcmp(argument_majuscule, "READONLY") == 0) { if (protection != ' ') { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } protection = 'R'; } else if (strcmp(argument_majuscule, "WRITEONLY") == 0) { if (protection != ' ') { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } protection = 'W'; } else if (strcmp(argument_majuscule, "READWRITE") == 0) { if (protection != ' ') { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } protection = 'N'; } else if (strcmp(argument_majuscule, "FORMATTED") == 0) { if (format != ' ') { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } format = 'N'; } else if (strcmp(argument_majuscule, "UNFORMATTED") == 0) { if (format != ' ') { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } format = 'Y'; } else if (strcmp(argument_majuscule, "FLOW") == 0) { if (format != ' ') { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } format = 'F'; } else if (strcmp(argument_majuscule, "STREAM") == 0) { if (type_socket != ' ') { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } if (type_arguments == ' ') { type_arguments = 'S'; } else if (type_arguments == 'F') { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } type_socket = 'S'; } else if (strcmp(argument_majuscule, "DATAGRAM") == 0) { if (type_socket != ' ') { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } type_socket = 'D'; } else if (strcmp(argument_majuscule, "SEQUENTIAL DATAGRAM") == 0) { if (type_socket != ' ') { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } if (type_arguments == ' ') { type_arguments = 'S'; } else if (type_arguments == 'F') { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } type_socket = 'Q'; } else if (strcmp(argument_majuscule, "RAW") == 0) { if (type_socket != ' ') { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } if (type_arguments == ' ') { type_arguments = 'S'; } else if (type_arguments == 'F') { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } type_socket = 'R'; } else if (strcmp(argument_majuscule, "ROBUST DATAGRAM") == 0) { if (type_socket != ' ') { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } if (type_arguments == ' ') { type_arguments = 'S'; } else if (type_arguments == 'F') { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } type_socket = 'M'; } else if (strcmp(argument_majuscule, "LOCAL") == 0) { if (type_domaine != ' ') { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } if (type_arguments == ' ') { type_arguments = 'S'; } else if (type_arguments == 'F') { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } type_domaine = 'L'; } else if (strcmp(argument_majuscule, "FOREIGN") == 0) { if (type_domaine != ' ') { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } if (type_arguments == ' ') { type_arguments = 'S'; } else if (type_arguments == 'F') { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } type_domaine = 'F'; } else if (strcmp(argument_majuscule, "IPV4") == 0) { if (strcmp(protocole, "") != 0) { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } if (type_arguments == ' ') { type_arguments = 'S'; } else if (type_arguments == 'F') { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } strcpy(protocole, "IPV4"); } else if (strcmp(argument_majuscule, "IPV6") == 0) { if (strcmp(protocole, "") != 0) { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } if (type_arguments == ' ') { type_arguments = 'S'; } else if (type_arguments == 'F') { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } strcpy(protocole, "IPV6"); } else if (strcmp(argument_majuscule, "UNIX") == 0) { if (strcmp(protocole, "") != 0) { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } if (type_arguments == ' ') { type_arguments = 'S'; } else if (type_arguments == 'F') { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } strcpy(protocole, "UNIX"); } else { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } free(argument_majuscule); } else if ((*(*l_element_courant).donnee).type == LST) { l_element_courant_sous_objet = (*(*l_element_courant).donnee).objet; nombre_elements = 0; while(l_element_courant_sous_objet != NULL) { nombre_elements++; l_element_courant_sous_objet = (*l_element_courant_sous_objet).suivant; } l_element_courant_sous_objet = (*(*l_element_courant).donnee).objet; if (nombre_elements == 2) { if ((*(*l_element_courant_sous_objet).donnee).type == CHN) { if ((argument_majuscule = conversion_majuscule( s_etat_processus, (unsigned char *) (*(*l_element_courant_sous_objet) .donnee).objet)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } l_element_courant_sous_objet = (*l_element_courant_sous_objet).suivant; if (strcmp(argument_majuscule, "NAME") == 0) { if ((*(*l_element_courant_sous_objet).donnee).type == CHN) { if (nom != NULL) { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } nom = (unsigned char *) (*(*l_element_courant_sous_objet) .donnee).objet; } else { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } } else if (strcmp(argument_majuscule, "OPTION") == 0) { if ((*(*l_element_courant_sous_objet).donnee).type == CHN) { if (type_arguments == ' ') { type_arguments = 'S'; } else if (type_arguments == 'F') { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } } free(argument_majuscule); if ((argument_majuscule = conversion_majuscule( s_etat_processus, (unsigned char *) (*(*l_element_courant_sous_objet) .donnee).objet)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } if (strcmp(argument_majuscule, "BROADCAST") == 0) { if (options[d_BROADCAST] == 'Y') { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } options[d_BROADCAST] = 'Y'; } else if (strcmp(argument_majuscule, "DO NOT ROUTE") == 0) { if (options[d_DONT_ROUTE] == 'Y') { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } options[d_DONT_ROUTE] = 'Y'; } else if (strcmp(argument_majuscule, "KEEP ALIVE") == 0) { if (options[d_KEEP_ALIVE] == 'Y') { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } options[d_KEEP_ALIVE] = 'Y'; } else if (strcmp(argument_majuscule, "REUSE ADDRESS") == 0) { if (options[d_REUSE_ADDRESS] == 'Y') { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } options[d_REUSE_ADDRESS] = 'Y'; } else { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } } else if (strcmp(argument_majuscule, "HOST") == 0) { if ((*(*l_element_courant_sous_objet).donnee).type == CHN) { if (type_arguments == ' ') { type_arguments = 'S'; } else if (type_arguments == 'F') { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } if (hote != NULL) { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } hote = (unsigned char *) (*(*l_element_courant_sous_objet) .donnee).objet; } else { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } } else if (strcmp(argument_majuscule, "PROTOCOL") == 0) { if ((*(*l_element_courant_sous_objet).donnee).type == CHN) { if (type_arguments == ' ') { type_arguments = 'S'; } else if (type_arguments == 'F') { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } if (protocole_socket != NULL) { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } protocole_socket = (unsigned char *) (*(*l_element_courant_sous_objet) .donnee).objet; for(i = 0; i < strlen(protocole_socket); i++) { if ((protocole_socket[i] >= 'a') && (protocole_socket[i] <= 'z')) { protocole_socket[i] = (unsigned char) (protocole_socket[i] - ('a' - 'A')); } } } else { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } } else if (strcmp(argument_majuscule, "KEY") == 0) { if ((*(*l_element_courant_sous_objet).donnee).type == INT) { if (type_arguments == ' ') { type_arguments = 'F'; } else if (type_arguments == 'S') { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } if (position_clef != 0) { liberation(s_etat_processus, s_objet_argument); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } else { if ((position_clef = (*((integer8 *) (*(*l_element_courant_sous_objet) .donnee).objet))) <= 0) { liberation(s_etat_processus, s_objet_argument); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } } } else { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } } else if (strcmp(argument_majuscule, "PORT") == 0) { if ((*(*l_element_courant_sous_objet) .donnee).type == INT) { if (type_arguments == ' ') { type_arguments = 'S'; } else if (type_arguments == 'F') { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } if (presence_port == d_vrai) { liberation(s_etat_processus, s_objet_argument); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } else { presence_port = d_vrai; if ((port = (*((integer8 *) (*(*l_element_courant_sous_objet) .donnee).objet))) < 0) { liberation(s_etat_processus, s_objet_argument); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } if (port > 65535) { liberation(s_etat_processus, s_objet_argument); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } } } else { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } } else if (strcmp(argument_majuscule, "LISTEN") == 0) { if ((*(*l_element_courant_sous_objet).donnee).type == INT) { if (type_arguments == ' ') { type_arguments = 'S'; } else if (type_arguments == 'F') { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } if (nombre_maximal_connexions != 0) { liberation(s_etat_processus, s_objet_argument); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } else { if ((nombre_maximal_connexions = (*((integer8 *) (*(*l_element_courant_sous_objet) .donnee).objet))) <= 0) { liberation(s_etat_processus, s_objet_argument); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } } } } else if (strcmp(argument_majuscule, "ADDRESS") == 0) { if ((*(*l_element_courant_sous_objet) .donnee).type == VIN) { if (type_arguments == ' ') { type_arguments = 'S'; } else if (type_arguments == 'F') { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } if (type_adresse != ' ') { liberation(s_etat_processus, s_objet_argument); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } if ((*((struct_vecteur *) (*(*l_element_courant_sous_objet) .donnee).objet)).taille == 4) { // Adresse IPv4 type_adresse = '4'; for(i = 0; i < 4; i++) { adresse[i] = ((integer8 *) (*((struct_vecteur *) (* (*l_element_courant_sous_objet) .donnee).objet)).tableau)[i]; if ((adresse[i] < 0) || (adresse[i] > 255)) { liberation(s_etat_processus, s_objet_argument); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } } } else if ((*((struct_vecteur *) (*(*l_element_courant_sous_objet) .donnee).objet)).taille == 16) { // Adresse IPv6 type_adresse = '6'; for(i = 0; i < 16; i++) { adresse[i] = ((integer8 *) (*((struct_vecteur *) (* (*l_element_courant_sous_objet) .donnee).objet)).tableau)[i]; if ((adresse[i] < 0) || (adresse[i] > 255)) { liberation(s_etat_processus, s_objet_argument); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } } } else { // Adresse non supportée liberation(s_etat_processus, s_objet_argument); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } } } else if (strcmp(argument_majuscule, "STTY") == 0) { if ((*(*l_element_courant_sous_objet) .donnee).type == CHN) { if (type_arguments == ' ') { type_arguments = 'F'; } else if (type_arguments == 'S') { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } s_parametres_tty = (*l_element_courant).donnee; } } else { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } free(argument_majuscule); } else { liberation(s_etat_processus, s_objet_argument); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } } else if (nombre_elements == 3) { if ((*(*l_element_courant_sous_objet).donnee).type == CHN) { if ((argument_majuscule = conversion_majuscule( s_etat_processus, (unsigned char *) (*(*l_element_courant_sous_objet) .donnee).objet)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } if (strcmp(argument_majuscule, "OPTION") == 0) { if (type_arguments == ' ') { type_arguments = 'S'; } else if (type_arguments == 'F') { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } free(argument_majuscule); l_element_courant_sous_objet = (*l_element_courant_sous_objet).suivant; if ((*(*l_element_courant_sous_objet) .donnee).type != CHN) { liberation(s_etat_processus, s_objet_argument); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } if ((argument_majuscule = conversion_majuscule( s_etat_processus, (unsigned char *) (*(*l_element_courant_sous_objet) .donnee).objet)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } l_element_courant_sous_objet = (*l_element_courant_sous_objet).suivant; if (strcmp(argument_majuscule, "BIND TO DEVICE") == 0) { if ((*(*l_element_courant_sous_objet) .donnee).type != CHN) { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } if (options[d_BIND_TO_DEVICE] == 'Y') { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } options[d_BIND_TO_DEVICE] = 'Y'; peripherique = (unsigned char *) (*(*l_element_courant_sous_objet) .donnee).objet; } else if (strcmp(argument_majuscule, "PRIORITY") == 0) { if ((*(*l_element_courant_sous_objet) .donnee).type != INT) { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } if (options[d_PRIORITY] == 'Y') { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } options[d_PRIORITY] = 'Y'; priorite = (int) (*((integer8 *) (*(*l_element_courant_sous_objet) .donnee).objet)); } else if (strcmp(argument_majuscule, "RECEIVE BUFFER") == 0) { if ((*(*l_element_courant_sous_objet) .donnee).type != INT) { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } if ((options[d_RECEIVE_BUFFER] == 'Y') || (options[d_FORCE_RECEIVE_BUFFER] == 'Y')) { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } options[d_RECEIVE_BUFFER] = 'Y'; buffer_reception = (int) (*((integer8 *) (*(*l_element_courant_sous_objet) .donnee).objet)); } else if (strcmp(argument_majuscule, "FORCE RECEIVE BUFFER") == 0) { if ((*(*l_element_courant_sous_objet) .donnee).type != INT) { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } if ((options[d_RECEIVE_BUFFER] == 'Y') || (options[d_FORCE_RECEIVE_BUFFER] == 'Y')) { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } options[d_FORCE_RECEIVE_BUFFER] = 'Y'; buffer_reception = (int) (*((integer8 *) (*(*l_element_courant_sous_objet) .donnee).objet)); } else if (strcmp(argument_majuscule, "SEND BUFFER") == 0) { if ((*(*l_element_courant_sous_objet) .donnee).type != INT) { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } if ((options[d_SEND_BUFFER] == 'Y') || (options[d_FORCE_SEND_BUFFER] == 'Y')) { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } options[d_SEND_BUFFER] = 'Y'; buffer_emission = (int) (*((integer8 *) (*(*l_element_courant_sous_objet) .donnee).objet)); } else if (strcmp(argument_majuscule, "FORCE SEND BUFFER") == 0) { if ((*(*l_element_courant_sous_objet) .donnee).type != INT) { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } if ((options[d_SEND_BUFFER] == 'Y') || (options[d_FORCE_SEND_BUFFER] == 'Y')) { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } options[d_FORCE_SEND_BUFFER] = 'Y'; buffer_emission = (int) (*((integer8 *) (*(*l_element_courant_sous_objet) .donnee).objet)); } else if (strcmp(argument_majuscule, "RECEIVING TIMEOUT") == 0) { if ((*(*l_element_courant_sous_objet) .donnee).type != INT) { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } if (options[d_RECEIVING_TIMEOUT] == 'Y') { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } options[d_RECEIVING_TIMEOUT] = 'Y'; timeout_reception = (int) (*((integer8 *) (*(*l_element_courant_sous_objet) .donnee).objet)); } else if (strcmp(argument_majuscule, "SENDING TIMEOUT") == 0) { if ((*(*l_element_courant_sous_objet) .donnee).type != INT) { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } if (options[d_SENDING_TIMEOUT] == 'Y') { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } options[d_SENDING_TIMEOUT] = 'Y'; timeout_emission = (int) (*((integer8 *) (*(*l_element_courant_sous_objet) .donnee).objet)); } else { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } free(argument_majuscule); } else if (strcmp(argument_majuscule, "STTY") == 0) { if (type_arguments == ' ') { type_arguments = 'F'; } else if (type_arguments == 'S') { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } free(argument_majuscule); l_element_courant_sous_objet = (*l_element_courant_sous_objet).suivant; if ((*(*l_element_courant_sous_objet) .donnee).type != CHN) { liberation(s_etat_processus, s_objet_argument); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } l_element_courant_sous_objet = (*l_element_courant_sous_objet).suivant; if ((*(*l_element_courant_sous_objet) .donnee).type != LST) { liberation(s_etat_processus, s_objet_argument); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } s_parametres_tty = (*l_element_courant).donnee; } else { liberation(s_etat_processus, s_objet_argument); free(argument_majuscule); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } } else { liberation(s_etat_processus, s_objet_argument); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } } else { liberation(s_etat_processus, s_objet_argument); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } } else { liberation(s_etat_processus, s_objet_argument); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } l_element_courant = (*l_element_courant).suivant; } // Si aucun paramètre n'est discriminant, l'instruction ouvre // par défaut un fichier. if (type_arguments == ' ') { type_arguments = 'F'; } if (type_arguments == 'F') { /* * Traitement des fichiers */ /* * Vérification de la cohérence et comportement par défaut */ if (type_ouverture == ' ') { type_ouverture = 'U'; } if (type_acces == ' ') { type_acces = 'S'; } if (format == ' ') { format = 'N'; } if (protection == ' ') { protection = 'N'; } if ((type_ouverture == 'S') && (protection != 'N')) { liberation(s_etat_processus, s_objet_argument); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } if ((type_ouverture != 'S') && (nom == NULL)) { liberation(s_etat_processus, s_objet_argument); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } if (((type_acces != 'I') && (position_clef != 0)) || ((type_acces == 'I') && (position_clef == 0) && ((type_ouverture == 'N') || (type_ouverture == 'R') || (type_ouverture == 'S')))) { liberation(s_etat_processus, s_objet_argument); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } if ((s_objet_resultat = allocation(s_etat_processus, FCH)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } if (nom == NULL) { if ((nom_temporaire = creation_nom_fichier(s_etat_processus, (*s_etat_processus).chemin_fichiers_temporaires)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if ((nom = malloc((strlen(nom_temporaire) + 5) * sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } sprintf(nom, "%s.rpl", nom_temporaire); free(nom_temporaire); } else { if ((nom = transliteration(s_etat_processus, nom, d_locale, "UTF-8")) == NULL) { liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); return; } } /* * Ouverture du fichier */ (*((struct_fichier *) (*s_objet_resultat).objet)) .nom = NULL; (*((struct_fichier *) (*s_objet_resultat).objet)) .acces = type_acces; (*((struct_fichier *) (*s_objet_resultat).objet)) .binaire = format; (*((struct_fichier *) (*s_objet_resultat).objet)) .ouverture = type_ouverture; (*((struct_fichier *) (*s_objet_resultat).objet)).pid = getpid(); (*((struct_fichier *) (*s_objet_resultat).objet)).tid = pthread_self(); if (((*((struct_fichier *) (*s_objet_resultat).objet)).format = allocation(s_etat_processus, LST)) == NULL) { free(nom); (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*(*((struct_fichier *) (*s_objet_resultat).objet)) .format).objet = NULL; descripteur = NULL; switch(type_ouverture) { case 'N' : { erreur = caracteristiques_fichier(s_etat_processus, nom, &existence, &ouverture, &unite); if ((erreur != 0) || (unite != 0)) { free(nom); liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } if (type_acces == 'S') { if ((descripteur = fopen(nom, "w+")) == NULL) { free(nom); liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } } else { // Si le fichier existe, on le supprime. if (unlink(nom) != 0) { free(nom); liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } sqlite = NULL; if (sqlite3_open_v2(nom, &sqlite, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL) != SQLITE_OK) { if (sqlite != NULL) { sqlite3_close(sqlite); } free(nom); liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } if ((descripteur = fopen(nom, "a+")) == NULL) { free(nom); liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } if (type_acces == 'D') { if (initialisation_fichier_acces_direct( s_etat_processus, sqlite, (format == 'N') ? d_faux : d_vrai) != d_absence_erreur) { free(nom); liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); return; } } else { if (position_clef == 0) { free(nom); liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } if (initialisation_fichier_acces_indexe( s_etat_processus, sqlite, position_clef, (format == 'N') ? d_faux : d_vrai) != d_absence_erreur) { free(nom); liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); return; } } } break; } case 'O' : { erreur = caracteristiques_fichier(s_etat_processus, nom, &existence, &ouverture, &unite); if ((erreur != d_absence_erreur) || (existence == d_faux)) { free(nom); liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } if (type_acces == 'S') { if ((descripteur = fopen(nom, "r+")) == NULL) { free(nom); liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } } else { sqlite = NULL; if (sqlite3_open_v2(nom, &sqlite, SQLITE_OPEN_READWRITE, NULL) != SQLITE_OK) { if (sqlite != NULL) { sqlite3_close(sqlite); } free(nom); liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } if ((descripteur = fopen(nom, "a+")) == NULL) { free(nom); liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } } break; } case 'R' : { erreur = caracteristiques_fichier(s_etat_processus, nom, &existence, &ouverture, &unite); if ((erreur != d_absence_erreur) || (existence == d_faux)) { free(nom); liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } /* Test du verrou */ if ((descripteur = fopen(nom, "r")) == NULL) { free(nom); liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } lock.l_type = F_WRLCK; lock.l_whence = SEEK_SET; lock.l_start = 0; lock.l_len = 0; lock.l_pid = getpid(); if (fcntl(fileno(descripteur), F_GETLK, &lock) == -1) { free(nom); if (fclose(descripteur) != 0) { liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (lock.l_type != F_UNLCK) { free(nom); if (fclose(descripteur) != 0) { liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_fichier_verrouille; return; } if (fclose(descripteur) != 0) { free(nom); liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (type_acces == 'S') { if ((descripteur = fopen(nom, "w+")) == NULL) { free(nom); liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } } else { sqlite = NULL; if (sqlite3_open_v2(nom, &sqlite, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL) != SQLITE_OK) { if (sqlite != NULL) { sqlite3_close(sqlite); } free(nom); liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } // Ouverture du fichier pour pouvoir gérer les // verrous à la façon des fichiers séquentiels. if ((descripteur = fopen(nom, "a+")) == NULL) { free(nom); liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } if (type_acces == 'D') { if (initialisation_fichier_acces_direct( s_etat_processus, sqlite, (format == 'N') ? d_faux : d_vrai) != d_absence_erreur) { free(nom); liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); return; } } else { if (position_clef == 0) { free(nom); liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } if (initialisation_fichier_acces_indexe( s_etat_processus, sqlite, position_clef, (format == 'N') ? d_faux : d_vrai) != d_absence_erreur) { free(nom); liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); return; } } } break; } case 'U' : { erreur = caracteristiques_fichier(s_etat_processus, nom, &existence, &ouverture, &unite); if (erreur == d_erreur) { free(nom); liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } if (existence == d_faux) { if (type_acces == 'S') { if ((descripteur = fopen(nom, "w+")) == NULL) { free(nom); liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } } else { sqlite = NULL; if (sqlite3_open_v2(nom, &sqlite, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL) != SQLITE_OK) { if (sqlite != NULL) { sqlite3_close(sqlite); } free(nom); liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } if ((descripteur = fopen(nom, "a+")) == NULL) { free(nom); liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } if (type_acces == 'D') { if (initialisation_fichier_acces_direct( s_etat_processus, sqlite, (format == 'N') ? d_faux : d_vrai) != d_absence_erreur) { free(nom); liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); return; } } else { if (position_clef == 0) { free(nom); liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } if (initialisation_fichier_acces_indexe( s_etat_processus, sqlite, position_clef, (format == 'N') ? d_faux : d_vrai) != d_absence_erreur) { free(nom); liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); return; } } } } else { if (type_acces == 'S') { if ((descripteur = fopen(nom, "r+")) == NULL) { free(nom); liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } } else { sqlite = NULL; if (sqlite3_open_v2(nom, &sqlite, SQLITE_OPEN_READWRITE, NULL) != SQLITE_OK) { if (sqlite != NULL) { sqlite3_close(sqlite); } free(nom); liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } if ((descripteur = fopen(nom, "a+")) == NULL) { free(nom); liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } } } break; } case 'S' : { erreur = caracteristiques_fichier(s_etat_processus, nom, &existence, &ouverture, &unite); if ((erreur != d_absence_erreur) || (existence != d_faux)) { free(nom); liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } if (type_acces == 'S') { if ((descripteur = fopen(nom, "w+")) == NULL) { free(nom); liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } } else { // Si le fichier existe, on le supprime. if (unlink(nom) != 0) { free(nom); liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } sqlite = NULL; if (sqlite3_open_v2(nom, &sqlite, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL) != SQLITE_OK) { if (sqlite != NULL) { sqlite3_close(sqlite); } free(nom); liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } if ((descripteur = fopen(nom, "a+")) == NULL) { free(nom); liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } if (type_acces == 'D') { if (initialisation_fichier_acces_direct( s_etat_processus, sqlite, (format == 'N') ? d_faux : d_vrai) != d_absence_erreur) { free(nom); liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); return; } } else { if (position_clef == 0) { free(nom); liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } if (initialisation_fichier_acces_indexe( s_etat_processus, sqlite, position_clef, (format == 'N') ? d_faux : d_vrai) != d_absence_erreur) { free(nom); liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); return; } } } break; } default: { BUG(1, printf("type_ouverture=%c\n", type_ouverture)); return; } } if (((*((struct_fichier *) (*s_objet_resultat).objet)).nom = malloc((strlen(nom) + 1) * sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } if (s_parametres_tty != NULL) { // Affectation des paramètres du port série. if (tcgetattr(fileno(descripteur), &tc) != 0) { liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_systeme = d_ex_erreur_fichier; return; } // Un test a déjà été fait pour vérifier que s_parametres_tty // contient deux ou trois arguments. parametre_courant = ((*(struct_liste_chainee *) (*s_parametres_tty).objet)).suivant; // Le premier paramètre concerne la vitesse du port. Il doit // toujours être présent. if (parametre_courant == NULL) { liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } if ((*(*parametre_courant).donnee).type != CHN) { liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } if ((parametre_courant_majuscule = conversion_majuscule( s_etat_processus, (*(*parametre_courant).donnee).objet)) == NULL) { liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } position = parametre_courant_majuscule; while((*position) != d_code_fin_chaine) { if ((*position) == ',') { (*position) = ' '; } position++; } position = parametre_courant_majuscule; while((*position) != d_code_fin_chaine) { if (isalnum((*position)) != 0) { break; } position++; } // Vitesse unsigned char *vitesses[] = { "50", "75", "110", "134", "150", "200", "300", "600", "1200", "1800", "2400", "4800", "9600", "19200", "38400", #ifdef B57600 "57600", #endif #ifdef B115200 "115200", #endif #ifdef B230400 "230400", #endif NULL }; tcflag_t vitesses_constantes[] = { B50, B75, B110, B134, B150, B200, B300, B600, B1200, B1800, B2400, B4800, B9600, B19200, B38400, #ifdef B57600 B57600, #endif #ifdef B115200 B115200, #endif #ifdef B230400 B230400, #endif 0 }; unsigned int vitesse_courante; vitesse_courante = 0; while(vitesses[vitesse_courante] != NULL) { if (strncmp(position, vitesses[vitesse_courante], strlen(vitesses[vitesse_courante])) == 0) { if (position[strlen(vitesses[vitesse_courante])] == d_code_espace) { #ifdef CBAUD tc.c_cflag &= ~((tcflag_t) CBAUD); tc.c_cflag |= vitesses_constantes[vitesse_courante]; #else // POSIX cfsetispeed(&tc, vitesses_constantes[vitesse_courante]); cfsetospeed(&tc, vitesses_constantes[vitesse_courante]); #endif position += strlen(vitesses[vitesse_courante]); break; } } vitesse_courante++; } if (vitesses[vitesse_courante] == NULL) { // La vitesse indiquée n'est pas une vitesse autorisée. free(parametre_courant_majuscule); liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } // Nombre de bits par caractère. while((*position) != d_code_fin_chaine) { if (isalnum((*position)) != 0) { break; } position++; } switch((*position)) { case '5': { tc.c_cflag &= ~((tcflag_t) CSIZE); tc.c_cflag |= CS5; break; } case '6': { tc.c_cflag &= ~((tcflag_t) CSIZE); tc.c_cflag |= CS6; break; } case '7': { tc.c_cflag &= ~((tcflag_t) CSIZE); tc.c_cflag |= CS7; break; } case '8': { tc.c_cflag &= ~((tcflag_t) CSIZE); tc.c_cflag |= CS8; break; } default: { free(parametre_courant_majuscule); liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } } position++; if ((*position) != d_code_espace) { free(parametre_courant_majuscule); liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } // Parité while((*position) != d_code_fin_chaine) { if (isalnum((*position)) != 0) { break; } position++; } switch((*position)) { case 'N': { tc.c_cflag &= ~((tcflag_t) PARENB); break; } case 'O': { tc.c_cflag |= PARENB; tc.c_cflag |= PARODD; break; } case 'E': { tc.c_cflag |= PARENB; tc.c_cflag &= ~((tcflag_t) PARODD); break; } default: { free(parametre_courant_majuscule); liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } } position++; if ((*position) != d_code_espace) { free(parametre_courant_majuscule); liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } // Bits de stop while((*position) != d_code_fin_chaine) { if (isalnum((*position)) != 0) { break; } position++; } switch((*position)) { case '1': { tc.c_cflag &= ~((tcflag_t) CSTOPB); break; } case '2': { tc.c_cflag |= CSTOPB; break; } default: { free(parametre_courant_majuscule); liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } } // S'il reste autre chose que des espaces, il y a un // problème de paramètres. position++; while((*position) != d_code_fin_chaine) { if ((*position) != d_code_espace) { free(parametre_courant_majuscule); liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } position++; } // Autres paramètres free(parametre_courant_majuscule); parametre_courant = (*parametre_courant).suivant; if (parametre_courant != NULL) { parametre_courant = (*(*parametre_courant).donnee).objet; } while(parametre_courant != NULL) { if ((*(*parametre_courant).donnee).type != CHN) { liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } if ((parametre_courant_majuscule = conversion_majuscule( s_etat_processus, (*(*parametre_courant).donnee) .objet)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } position = parametre_courant_majuscule; negation = d_faux; unsigned char *fonctions[] = { "IGNBRK", "BRKINT", "IGNPAR", "PARMRK", "INPCK", "ISTRIP", "INLCR", "IGNCR", "ICRNL", "IXON", #ifdef IXANY "IXANY", #endif "IXOFF", "OPOST", "ONLCR", "OCRNL", "ONOCR", "ONLRET", #ifdef OFILL "OFILL", #endif "HUPCL", "CLOCAL", #ifdef CRTSCTS "CRTSCTS", #endif "ISIG", "ICANON", "ECHO", "ECHOE", "ECHOK", "ECHONL", "NOFLSH", "TOSTOP", "IEXTEN", NULL }; tcflag_t fonctions_constantes[] = { /* c_iflag */ 1, IGNBRK, 1, BRKINT, 1, IGNPAR, 1, PARMRK, 1, INPCK, 1, ISTRIP, 1, INLCR, 1, IGNCR, 1, ICRNL, 1, IXON, #ifdef IXANY 1, IXANY, #endif 1, IXOFF, 1, IMAXBEL, /* c_oflag */ 2 , OPOST, 2, ONLCR, 2, OCRNL, 2, ONOCR, 2, ONLRET, #ifdef OFILL 2, OFILL, #endif 2, HUPCL, /* c_cflag */ 3, CLOCAL, #ifdef CRTSCTS 3, CRTSCTS, #endif /* c_lfkag */ 4, ISIG, 4, ICANON, 4, ECHO, 4, ECHOE, 4, ECHOK, 4, ECHONL, 4, NOFLSH, 4, TOSTOP, 4, IEXTEN }; unsigned int fonction_courante; // On vient de trouver quelque chose à interpréter. if (strncmp(position, "NO ", 3) == 0) { position += 3; negation = d_vrai; } for(fonction_courante = 0; fonctions[fonction_courante] != NULL; fonction_courante++) { if (strcmp(fonctions[fonction_courante], position) == 0) { if (negation == d_vrai) { switch(fonctions_constantes [fonction_courante * 2]) { case 1: { tc.c_iflag &= ~fonctions_constantes [(fonction_courante * 2) + 1]; break; } case 2: { tc.c_oflag &= ~fonctions_constantes [(fonction_courante * 2) + 1]; break; } case 3: { tc.c_cflag &= ~fonctions_constantes [(fonction_courante * 2) + 1]; break; } case 4: { tc.c_lflag &= ~fonctions_constantes [(fonction_courante * 2) + 1]; break; } } } else { switch(fonctions_constantes [fonction_courante * 2]) { case 1: { tc.c_iflag |= fonctions_constantes [(fonction_courante * 2) + 1]; break; } case 2: { tc.c_oflag |= fonctions_constantes [(fonction_courante * 2) + 1]; break; } case 3: { tc.c_cflag |= fonctions_constantes [(fonction_courante * 2) + 1]; break; } case 4: { tc.c_lflag |= fonctions_constantes [(fonction_courante * 2) + 1]; break; } } } break; } } if (fonctions[fonction_courante] == NULL) { free(parametre_courant_majuscule); liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } free(parametre_courant_majuscule); parametre_courant = (*parametre_courant).suivant; } if (tcsetattr(fileno(descripteur), TCSANOW, &tc) != 0) { liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_systeme = d_ex_erreur_fichier; return; } } strcpy((*((struct_fichier *) (*s_objet_resultat).objet)).nom, nom); liberation(s_etat_processus, s_objet_argument); (*((struct_fichier *) (*s_objet_resultat).objet)).protection = protection; (*((struct_fichier *) (*s_objet_resultat).objet)).position_clef = position_clef; rewind(descripteur); lock.l_type = F_WRLCK; lock.l_whence = SEEK_SET; lock.l_start = 0; lock.l_len = 0; lock.l_pid = getpid(); if (fcntl(fileno(descripteur), F_GETLK, &lock) == -1) { if (fclose(descripteur) != 0) { liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } if (lock.l_type == F_UNLCK) { /* * Positionnement d'un verrou exclusif d'écriture par défaut */ lock.l_type = F_RDLCK; lock.l_whence = SEEK_SET; lock.l_start = 0; lock.l_len = 0; lock.l_pid = getpid(); if (fcntl(fileno(descripteur), F_SETLK, &lock) == -1) { if (fclose(descripteur) != 0) { liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } } else { /* * Test de la cohérence du verrou avec l'option PROTECTION */ if ((lock.l_type == F_RDLCK) && (protection != 'R')) { free(nom); if (fclose(descripteur) != 0) { liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_fichier_verrouille; return; } else if ((lock.l_type == F_WRLCK) && (protection != 'W')) { free(nom); if (fclose(descripteur) != 0) { liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_fichier_verrouille; return; } else { free(nom); if (fclose(descripteur) != 0) { liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; return; } liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_fichier_verrouille; return; } } /* * Gestion de la liste des fichiers ouverts */ l_element_courant = (*s_etat_processus).s_fichiers; if (l_element_courant == NULL) { if (((*s_etat_processus).s_fichiers = malloc(sizeof( struct_liste_chainee))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*(*s_etat_processus).s_fichiers).suivant = NULL; if (((*(*s_etat_processus).s_fichiers).donnee = malloc(sizeof(struct_descripteur_fichier))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } l_element_courant = (*s_etat_processus).s_fichiers; prochain_descripteur = 0; } else { /* * Recherche du premier descripteur libre */ if ((chaine_descripteurs = malloc(sizeof(unsigned char) * (ds_nombre_maximum_fichiers_ouverts + 1))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } for(pointeur = chaine_descripteurs, i = 0; i < ds_nombre_maximum_fichiers_ouverts; (*pointeur) = d_code_espace, pointeur++, i++); (*pointeur) = d_code_fin_chaine; do { chaine_descripteurs[(*((struct_descripteur_fichier *) (*l_element_courant).donnee)).identifiant] = '-'; l_element_courant = (*l_element_courant).suivant; } while(l_element_courant != NULL); i = 0; pointeur = chaine_descripteurs; while(i < ds_nombre_maximum_fichiers_ouverts) { if ((*pointeur) == ' ') { break; } pointeur++; i++; } free(chaine_descripteurs); if (i == ds_nombre_maximum_fichiers_ouverts) { (*s_etat_processus).erreur_systeme = d_es_nombre_max_descripteurs; return; } prochain_descripteur = (int) i; /* * Ajout d'un élément à la fin de la liste chaînée */ l_element_courant = (*s_etat_processus).s_fichiers; while((*l_element_courant).suivant != NULL) { l_element_courant = (*l_element_courant).suivant; } if (((*l_element_courant).suivant = allocation_maillon(s_etat_processus)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } l_element_courant = (*l_element_courant).suivant; (*l_element_courant).suivant = NULL; if (((*l_element_courant).donnee = malloc(sizeof(struct_descripteur_fichier))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } } (*((struct_fichier *) (*s_objet_resultat).objet)).descripteur = prochain_descripteur; (*((struct_descripteur_fichier *) (*l_element_courant).donnee)) .identifiant = prochain_descripteur; if (type_acces == 'S') { (*((struct_descripteur_fichier *) (*l_element_courant).donnee)) .type = 'C'; (*((struct_descripteur_fichier *) (*l_element_courant).donnee)) .descripteur_c = descripteur; } else { (*((struct_descripteur_fichier *) (*l_element_courant).donnee)) .type = 'S'; (*((struct_descripteur_fichier *) (*l_element_courant).donnee)) .descripteur_c = descripteur; (*((struct_descripteur_fichier *) (*l_element_courant).donnee)) .descripteur_sqlite = sqlite; } (*((struct_descripteur_fichier *) (*l_element_courant).donnee)) .pid = getpid(); (*((struct_descripteur_fichier *) (*l_element_courant).donnee)) .tid = pthread_self(); (*((struct_descripteur_fichier *) (*l_element_courant).donnee)) .effacement = (type_ouverture == 'S') ? 'Y' : 'N'; (*((struct_descripteur_fichier *) (*l_element_courant) .donnee)).nom = nom; } else if (type_arguments == 'S') { /* * Traitement des sockets */ /* * Vérification de la cohérence des arguments et traitement * des valeurs par défaut. */ if (format == ' ') { format = 'N'; } if (protection == ' ') { protection = 'N'; } if (type_domaine == ' ') { type_domaine = 'L'; } if (type_socket == ' ') { type_socket = 'S'; type = SOCK_STREAM; } if (nom != NULL) { if (strcmp(protocole, "") == 0) { strcpy(protocole, "UNIX"); } } else { if (strcmp(protocole, "") == 0) { strcpy(protocole, "IPV4"); } } if ((nom != NULL) && (hote != NULL)) { liberation(s_etat_processus, s_objet_argument); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } if ((nom != NULL) && (strcmp(protocole, "UNIX") != 0)) { liberation(s_etat_processus, s_objet_argument); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } if ((hote != NULL) && (strcmp(protocole, "UNIX") == 0)) { liberation(s_etat_processus, s_objet_argument); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } if ((nom != NULL) && (type_domaine == 'F') && (type_adresse != ' ')) { liberation(s_etat_processus, s_objet_argument); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } if ((presence_port == d_vrai) && (nom != NULL)) { liberation(s_etat_processus, s_objet_argument); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } if ((type_adresse == ' ') && (type_domaine == 'L')) { if (strcmp(protocole, "IPV4") == 0) { for(i = 0; i < 4; adresse[i++] = 0); type_adresse = '4'; } else if (strcmp(protocole, "IPV6") == 0) { for(i = 0; i < 16; adresse[i++] = 0); type_adresse = '6'; } else if (strcmp(protocole, "UNIX") != 0) { liberation(s_etat_processus, s_objet_argument); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } } if (((strcmp(protocole, "IPV4") == 0) && (type_adresse == '6')) || ((strcmp(protocole, "IPV6") == 0) && (type_adresse == '4'))) { liberation(s_etat_processus, s_objet_argument); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } if ((nombre_maximal_connexions != 0) && ((type_socket != 'S') && (type_socket != 'Q'))) { liberation(s_etat_processus, s_objet_argument); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } if (nombre_maximal_connexions == 0) { nombre_maximal_connexions = 1; } if (protocole_socket == NULL) { protocole_numerique = 0; } else { if (strcmp(protocole_socket, "IPV4") == 0) { protocole_socket[2] = d_code_fin_chaine; protocole_numerique = 0; } else { if ((s_protocole = getprotobyname(protocole_socket)) == NULL) { liberation(s_etat_processus, s_objet_argument); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } protocole_numerique = (*s_protocole).p_proto; } } if ((s_objet_resultat = allocation(s_etat_processus, SCK)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } if (((*((struct_socket *) (*s_objet_resultat).objet)).format = allocation(s_etat_processus, LST)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*((struct_socket *) (*s_objet_resultat).objet)).protection = protection; (*(*((struct_socket *) (*s_objet_resultat).objet)) .format).objet = NULL; (*((struct_socket *) (*s_objet_resultat).objet)).adresse = NULL; switch(type_socket) { case 'S' : type = SOCK_STREAM; strcpy((*((struct_socket *) (*s_objet_resultat).objet)). type, "STREAM"); break; case 'D' : type = SOCK_DGRAM; strcpy((*((struct_socket *) (*s_objet_resultat).objet)). type, "DATAGRAM"); break; case 'Q' : strcpy((*((struct_socket *) (*s_objet_resultat).objet)). type, "SEQUENTIAL DATAGRAM"); type = SOCK_SEQPACKET; break; case 'R' : type = SOCK_RAW; strcpy((*((struct_socket *) (*s_objet_resultat).objet)). type, "RAW"); break; case 'M' : type = SOCK_RDM; strcpy((*((struct_socket *) (*s_objet_resultat).objet)). type, "ROBUST DATAGRAM"); break; default : BUG(1, printf("type_socket=%c\n", type_socket)); break; } if ((protection != 'N') && ((type_socket != 'S') && (type_socket != 'Q'))) { liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } if (nom == NULL) { if (((*((struct_socket *) (*s_objet_resultat).objet)).adresse = malloc(sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } strcpy((*((struct_socket *) (*s_objet_resultat).objet)).adresse, ""); } else { if (((*((struct_socket *) (*s_objet_resultat).objet)).adresse = transliteration(s_etat_processus, nom, d_locale, "UTF-8")) == NULL) { liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); return; } } if (((*((struct_socket *) (*s_objet_resultat).objet)) .adresse_distante = malloc(sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } strcpy((*((struct_socket *) (*s_objet_resultat).objet)) .adresse_distante, ""); (*((struct_socket *) (*s_objet_resultat).objet)).localisation = type_domaine; (*((struct_socket *) (*s_objet_resultat).objet)).binaire = format; (*((struct_socket *) (*s_objet_resultat).objet)).pid = getpid(); (*((struct_socket *) (*s_objet_resultat).objet)).tid = pthread_self(); (*((struct_socket *) (*s_objet_resultat).objet)).socket_en_ecoute = 'Y'; (*((struct_socket *) (*s_objet_resultat).objet)).socket_connectee = d_faux; (*((struct_socket *) (*s_objet_resultat).objet)).options = 0; if (type_domaine == 'L') { // Socket serveur if (nom != NULL) { /* * La socket locale est dans l'espace des noms. */ if (((*((struct_socket *) (*s_objet_resultat).objet)) .socket = socket(PF_UNIX, type, protocole_numerique)) == -1) { liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } (*((struct_socket *) (*s_objet_resultat).objet)).domaine = PF_UNIX; (*((struct_socket *) (*s_objet_resultat).objet)).effacement = 'Y'; socket_unix.sun_family = AF_UNIX; pointeur = (*((struct_socket *) (*s_objet_resultat).objet)).adresse; while((*pointeur) == d_code_espace) { pointeur++; } strncpy(socket_unix.sun_path, pointeur, UNIX_PATH_MAX); socket_unix.sun_path[UNIX_PATH_MAX - 1] = d_code_fin_chaine; if (options_socket(s_etat_processus, s_objet_resultat, options, peripherique, &priorite, &buffer_emission, &buffer_reception, &timeout_emission, &timeout_reception) == d_erreur) { liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); return; } if (bind((*((struct_socket *) (*s_objet_resultat).objet)) .socket, (const struct sockaddr *) &socket_unix, sizeof(socket_unix)) != 0) { liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } } else { /* * La socket est une socket réseau locale. L'adresse * passée en argument est l'adresse sur laquelle * cette socket est à l'écoute. */ (*((struct_socket *) (*s_objet_resultat).objet)).effacement = 'N'; if (hote != NULL) { // Hôte défini par un nom resolution = NULL; if (getaddrinfo(hote, NULL, NULL, &resolution) != 0) { liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); if (resolution != NULL) { freeaddrinfo(resolution); } (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } if (strcmp(protocole, "IPV4") == 0) { // Accès en IPv4 resolution_courante = resolution; while(resolution_courante != NULL) { if ((*resolution_courante).ai_family == AF_INET) { break; } resolution_courante = (*resolution_courante) .ai_next; } if (resolution_courante == NULL) { liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); freeaddrinfo(resolution); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } if (((*((struct_socket *) (*s_objet_resultat).objet)) .socket = socket(PF_INET, type, protocole_numerique)) == -1) { liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); freeaddrinfo(resolution); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } (*((struct_socket *) (*s_objet_resultat).objet)) .domaine = PF_INET; memset(&socket_ipv4, 0, sizeof(socket_ipv4)); socket_ipv4.sin_family = AF_INET; socket_ipv4.sin_port = htons((uint16_t) port); socket_ipv4.sin_addr.s_addr = (*((struct sockaddr_in *) (*resolution_courante).ai_addr)) .sin_addr.s_addr; if (options_socket(s_etat_processus, s_objet_resultat, options, peripherique, &priorite, &buffer_emission, &buffer_reception, &timeout_emission, &timeout_reception) == d_erreur) { liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); freeaddrinfo(resolution); return; } if (bind((*((struct_socket *) (*s_objet_resultat) .objet)).socket, (const struct sockaddr *) &socket_ipv4, sizeof(socket_ipv4)) != 0) { liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); freeaddrinfo(resolution); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } free((*((struct_socket *) (*s_objet_resultat) .objet)).adresse); if (((*((struct_socket *) (*s_objet_resultat) .objet)).adresse = malloc(23 * sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } sprintf((*((struct_socket *) (*s_objet_resultat) .objet)).adresse, "%d.%d.%d.%d(%u)", (ntohl((*((struct sockaddr_in *) (*resolution_courante).ai_addr)).sin_addr .s_addr) >> 24) & 0xFF, (ntohl((*((struct sockaddr_in *) (*resolution_courante).ai_addr)).sin_addr .s_addr) >> 16) & 0xFF, (ntohl((*((struct sockaddr_in *) (*resolution_courante).ai_addr)).sin_addr .s_addr) >> 8) & 0xFF, ntohl((*((struct sockaddr_in *) (*resolution_courante).ai_addr)).sin_addr .s_addr) & 0xFF, (unsigned int) port); } else { // Accès en IPv6 # ifdef IPV6 resolution_courante = resolution; while(resolution_courante != NULL) { if ((*resolution_courante).ai_family == AF_INET6) { break; } resolution_courante = (*resolution_courante) .ai_next; } if (resolution_courante == NULL) { liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); freeaddrinfo(resolution); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } if (((*((struct_socket *) (*s_objet_resultat).objet)) .socket = socket(PF_INET6, type, protocole_numerique)) == -1) { liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); freeaddrinfo(resolution); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } (*((struct_socket *) (*s_objet_resultat).objet)) .domaine = PF_INET6; memset(&socket_ipv6, 0, sizeof(socket_ipv6)); socket_ipv6.sin6_family = AF_INET6; socket_ipv6.sin6_port = htons((uint16_t) port); for(i = 0; i < 16; socket_ipv6.sin6_addr.s6_addr[i] = (*((struct sockaddr_in6 *) (*resolution_courante).ai_addr)) .sin6_addr.s6_addr[i], i++); if (options_socket(s_etat_processus, s_objet_resultat, options, peripherique, &priorite, &buffer_emission, &buffer_reception, &timeout_emission, &timeout_reception) == d_erreur) { liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); freeaddrinfo(resolution); return; } if (bind((*((struct_socket *) (*s_objet_resultat) .objet)).socket, (const struct sockaddr *) &socket_ipv6, sizeof(socket_ipv6)) != 0) { liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); freeaddrinfo(resolution); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } free((*((struct_socket *) (*s_objet_resultat) .objet)).adresse); /* * Longueur de la chaîne : * Adresse IPv6 : 16 octets soit 128 bits. * => 32 chiffres en hexadécimal * Par groupe de 4, 8 groupes * => 7 ":" * Port : (%u) * => 7 * ==> 32 + 7 + 7 + 1 = 47 */ if (((*((struct_socket *) (*s_objet_resultat) .objet)).adresse = malloc(47 * sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } sprintf((*((struct_socket *) (*s_objet_resultat) .objet)).adresse, "%02X%02X:%02X%02X:%02X%02X:%02X%02X:" "%02X%02X:%02X%02X:%02X%02X:%02X%02X(%u)", (*((struct sockaddr_in6 *) (*resolution_courante).ai_addr)).sin6_addr .s6_addr[0], (*((struct sockaddr_in6 *) (*resolution_courante).ai_addr)).sin6_addr .s6_addr[1], (*((struct sockaddr_in6 *) (*resolution_courante).ai_addr)).sin6_addr .s6_addr[2], (*((struct sockaddr_in6 *) (*resolution_courante).ai_addr)).sin6_addr .s6_addr[3], (*((struct sockaddr_in6 *) (*resolution_courante).ai_addr)).sin6_addr .s6_addr[4], (*((struct sockaddr_in6 *) (*resolution_courante).ai_addr)).sin6_addr .s6_addr[5], (*((struct sockaddr_in6 *) (*resolution_courante).ai_addr)).sin6_addr .s6_addr[6], (*((struct sockaddr_in6 *) (*resolution_courante).ai_addr)).sin6_addr .s6_addr[7], (*((struct sockaddr_in6 *) (*resolution_courante).ai_addr)).sin6_addr .s6_addr[8], (*((struct sockaddr_in6 *) (*resolution_courante).ai_addr)).sin6_addr .s6_addr[9], (*((struct sockaddr_in6 *) (*resolution_courante).ai_addr)).sin6_addr .s6_addr[10], (*((struct sockaddr_in6 *) (*resolution_courante).ai_addr)).sin6_addr .s6_addr[11], (*((struct sockaddr_in6 *) (*resolution_courante).ai_addr)).sin6_addr .s6_addr[12], (*((struct sockaddr_in6 *) (*resolution_courante).ai_addr)).sin6_addr .s6_addr[13], (*((struct sockaddr_in6 *) (*resolution_courante).ai_addr)).sin6_addr .s6_addr[14], (*((struct sockaddr_in6 *) (*resolution_courante).ai_addr)).sin6_addr .s6_addr[15], (unsigned int) port); # else if ((*s_etat_processus).langue == 'F') { printf("+++Attention : Support du protocole" " IPv6 indisponible\n"); } else { printf("+++Warning : IPv6 support " "unavailable\n"); } liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); freeaddrinfo(resolution); (*s_etat_processus).erreur_execution = d_ex_instruction_indisponible; return; # endif } freeaddrinfo(resolution); } else { // Hôte défini par une adresse if (strcmp(protocole, "IPV4") == 0) { // Accès en IPv4 free((*((struct_socket *) (*s_objet_resultat) .objet)).adresse); if (((*((struct_socket *) (*s_objet_resultat) .objet)).adresse = malloc(23 * sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } sprintf((*((struct_socket *) (*s_objet_resultat) .objet)).adresse, "%d.%d.%d.%d(%u)", (int) adresse[0], (int) adresse[1], (int) adresse[2], (int) adresse[3], (unsigned int) port); if (((*((struct_socket *) (*s_objet_resultat).objet)) .socket = socket(PF_INET, type, protocole_numerique)) == -1) { liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } (*((struct_socket *) (*s_objet_resultat).objet)) .domaine = PF_INET; memset(&socket_ipv4, 0, sizeof(socket_ipv4)); socket_ipv4.sin_family = AF_INET; socket_ipv4.sin_port = htons((uint16_t) port); adresse_ipv4 = 0; for(i = 0; i < 4; adresse_ipv4 = (256 * adresse_ipv4) + ((unsigned char) adresse[i++])); socket_ipv4.sin_addr.s_addr = htonl(adresse_ipv4); if (options_socket(s_etat_processus, s_objet_resultat, options, peripherique, &priorite, &buffer_emission, &buffer_reception, &timeout_emission, &timeout_reception) == d_erreur) { liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); return; } if (bind((*((struct_socket *) (*s_objet_resultat) .objet)).socket, (const struct sockaddr *) &socket_ipv4, sizeof(socket_ipv4)) != 0) { liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } } else { // Accès en IPv6 # ifdef IPV6 free((*((struct_socket *) (*s_objet_resultat) .objet)).adresse); if (((*((struct_socket *) (*s_objet_resultat) .objet)).adresse = malloc(47 * sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } sprintf((*((struct_socket *) (*s_objet_resultat) .objet)).adresse, "%02X%02X:%02X%02X:%02X%02X:%02X%02X:" "%02X%02X:%02X%02X:%02X%02X:%02X%02X(%u)", (unsigned int) adresse[0], (unsigned int) adresse[1], (unsigned int) adresse[2], (unsigned int) adresse[3], (unsigned int) adresse[4], (unsigned int) adresse[5], (unsigned int) adresse[6], (unsigned int) adresse[7], (unsigned int) adresse[8], (unsigned int) adresse[9], (unsigned int) adresse[10], (unsigned int) adresse[11], (unsigned int) adresse[12], (unsigned int) adresse[13], (unsigned int) adresse[14], (unsigned int) adresse[15], (unsigned int) port); if (((*((struct_socket *) (*s_objet_resultat).objet)) .socket = socket(PF_INET6, type, protocole_numerique)) == -1) { liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } (*((struct_socket *) (*s_objet_resultat).objet)) .domaine = PF_INET6; memset(&socket_ipv6, 0, sizeof(socket_ipv6)); socket_ipv6.sin6_family = AF_INET6; socket_ipv6.sin6_port = htons((uint16_t) port); for(i = 0; i < 16; socket_ipv6.sin6_addr.s6_addr[i] = (unsigned char) (adresse[i]), i++); if (options_socket(s_etat_processus, s_objet_resultat, options, peripherique, &priorite, &buffer_emission, &buffer_reception, &timeout_emission, &timeout_reception) == d_erreur) { liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); return; } if (bind((*((struct_socket *) (*s_objet_resultat) .objet)).socket, (const struct sockaddr *) &socket_ipv6, sizeof(socket_ipv6)) != 0) { liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } # else if ((*s_etat_processus).langue == 'F') { printf("+++Attention : Support du protocole" " IPv6 indisponible\n"); } else { printf("+++Warning : IPv6 support " "unavailable\n"); } liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_instruction_indisponible; return; # endif } } (*((struct_socket *) (*s_objet_resultat).objet)).effacement = 'N'; } if ((type_socket == 'S') || (type_socket == 'Q')) { if (listen((*((struct_socket *) (*s_objet_resultat).objet)) .socket, (int) nombre_maximal_connexions) != 0) { liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } (*((struct_socket *) (*s_objet_resultat).objet)) .socket_connectee = d_vrai; if (protection == 'R') { // WRITEONLY if (shutdown((*((struct_socket *) (*s_objet_resultat) .objet)).socket, SHUT_RD) != 0) { liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } } else if (protection == 'W') { // READONLY if (shutdown((*((struct_socket *) (*s_objet_resultat) .objet)).socket, SHUT_WR) != 0) { liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } } else { // READWRITE } } } else { // Socket cliente (*((struct_socket *) (*s_objet_resultat).objet)).effacement = 'N'; /* * Dans le cas où la socket n'est pas connectée, on * ne peut utiliser ni "NAME", ni "HOST", ni "PORT", * et encore moins spécifier une adresse. En effet, la cible * est défini par la commande TARGET. */ if ((type_socket != 'S') && (type_socket != 'Q')) { if ((presence_port == d_vrai) || (hote != NULL) || (nom != NULL) || (type_adresse != ' ')) { liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } } if (nom != NULL) { /* * La socket est dans l'espace des noms. */ if (((*((struct_socket *) (*s_objet_resultat).objet)) .socket = socket(PF_UNIX, type, protocole_numerique)) == -1) { liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } (*((struct_socket *) (*s_objet_resultat).objet)) .domaine = PF_UNIX; socket_unix.sun_family = AF_UNIX; strncpy(socket_unix.sun_path, (*((struct_socket *) (*s_objet_resultat).objet)).adresse, UNIX_PATH_MAX); socket_unix.sun_path[UNIX_PATH_MAX - 1] = d_code_fin_chaine; if ((type_socket == 'S') || (type_socket == 'Q')) { if (connect((*((struct_socket *) (*s_objet_resultat) .objet)).socket, (const struct sockaddr *) &socket_unix, sizeof(socket_unix)) != 0) { liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } (*((struct_socket *) (*s_objet_resultat).objet)) .socket_connectee = d_vrai; (*((struct_socket *) (*s_objet_resultat).objet)) .socket_en_ecoute = 'N'; } } else { /* * La socket est une socket réseau. L'adresse * passée en argument est l'adresse sur laquelle * cette socket est à l'écoute. */ if (hote != NULL) { // Hôte défini par un nom resolution = NULL; if (getaddrinfo(hote, NULL, NULL, &resolution) != 0) { liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); if (resolution != NULL) { freeaddrinfo(resolution); } (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } if (strcmp(protocole, "IPV4") == 0) { // Accès en IPv4 resolution_courante = resolution; while(resolution_courante != NULL) { if ((*resolution_courante).ai_family == AF_INET) { break; } resolution_courante = (*resolution_courante) .ai_next; } if (resolution_courante == NULL) { liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); freeaddrinfo(resolution); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } if (((*((struct_socket *) (*s_objet_resultat).objet)) .socket = socket(PF_INET, type, protocole_numerique)) == -1) { liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); freeaddrinfo(resolution); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } (*((struct_socket *) (*s_objet_resultat).objet)) .domaine = PF_INET; memset(&socket_ipv4, 0, sizeof(socket_ipv4)); socket_ipv4.sin_family = AF_INET; socket_ipv4.sin_port = htons((uint16_t) port); socket_ipv4.sin_addr.s_addr = (*((struct sockaddr_in *) (*resolution_courante).ai_addr)) .sin_addr.s_addr; if ((type_socket == 'S') || (type_socket == 'Q')) { if (connect((*((struct_socket *) (*s_objet_resultat).objet)).socket, (const struct sockaddr *) &socket_ipv4, sizeof(socket_ipv4)) != 0) { liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); freeaddrinfo(resolution); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } (*((struct_socket *) (*s_objet_resultat).objet)) .socket_connectee = d_vrai; (*((struct_socket *) (*s_objet_resultat).objet)) .socket_en_ecoute = 'N'; } free((*((struct_socket *) (*s_objet_resultat) .objet)).adresse); if (((*((struct_socket *) (*s_objet_resultat) .objet)).adresse = malloc(23 * sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } sprintf((*((struct_socket *) (*s_objet_resultat) .objet)).adresse, "%d.%d.%d.%d(%u)", (ntohl((*((struct sockaddr_in *) (*resolution_courante).ai_addr)).sin_addr .s_addr) >> 24) & 0xFF, (ntohl((*((struct sockaddr_in *) (*resolution_courante).ai_addr)).sin_addr .s_addr) >> 16) & 0xFF, (ntohl((*((struct sockaddr_in *) (*resolution_courante).ai_addr)).sin_addr .s_addr) >> 8) & 0xFF, ntohl((*((struct sockaddr_in *) (*resolution_courante).ai_addr)).sin_addr .s_addr) & 0xFF, (unsigned int) port); } else { // Accès en IPv6 # ifdef IPV6 resolution_courante = resolution; while(resolution_courante != NULL) { if ((*resolution_courante).ai_family == AF_INET6) { break; } resolution_courante = (*resolution_courante) .ai_next; } if (resolution_courante == NULL) { liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); freeaddrinfo(resolution); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } if (((*((struct_socket *) (*s_objet_resultat).objet)) .socket = socket(PF_INET6, type, protocole_numerique)) == -1) { liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); freeaddrinfo(resolution); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } (*((struct_socket *) (*s_objet_resultat).objet)) .domaine = PF_INET6; memset(&socket_ipv6, 0, sizeof(socket_ipv6)); socket_ipv6.sin6_family = AF_INET6; socket_ipv6.sin6_port = htons((uint16_t) port); for(i = 0; i < 16; socket_ipv6.sin6_addr.s6_addr[i] = (*((struct sockaddr_in6 *) (*resolution_courante).ai_addr)) .sin6_addr.s6_addr[i], i++); if ((type_socket == 'S') || (type_socket == 'Q')) { if (connect((*((struct_socket *) (*s_objet_resultat).objet)).socket, (const struct sockaddr *) &socket_ipv6, sizeof(socket_ipv6)) != 0) { liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); freeaddrinfo(resolution); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } (*((struct_socket *) (*s_objet_resultat).objet)) .socket_connectee = d_vrai; (*((struct_socket *) (*s_objet_resultat).objet)) .socket_en_ecoute = 'N'; } free((*((struct_socket *) (*s_objet_resultat) .objet)).adresse); if (((*((struct_socket *) (*s_objet_resultat) .objet)).adresse = malloc(47 * sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } sprintf((*((struct_socket *) (*s_objet_resultat) .objet)).adresse, "%02X%02X:%02X%02X:%02X%02X:%02X%02X:" "%02X%02X:%02X%02X:%02X%02X:%02X%02X(%u)", (*((struct sockaddr_in6 *) (*resolution_courante).ai_addr)).sin6_addr .s6_addr[0], (*((struct sockaddr_in6 *) (*resolution_courante).ai_addr)).sin6_addr .s6_addr[1], (*((struct sockaddr_in6 *) (*resolution_courante).ai_addr)).sin6_addr .s6_addr[2], (*((struct sockaddr_in6 *) (*resolution_courante).ai_addr)).sin6_addr .s6_addr[3], (*((struct sockaddr_in6 *) (*resolution_courante).ai_addr)).sin6_addr .s6_addr[4], (*((struct sockaddr_in6 *) (*resolution_courante).ai_addr)).sin6_addr .s6_addr[5], (*((struct sockaddr_in6 *) (*resolution_courante).ai_addr)).sin6_addr .s6_addr[6], (*((struct sockaddr_in6 *) (*resolution_courante).ai_addr)).sin6_addr .s6_addr[7], (*((struct sockaddr_in6 *) (*resolution_courante).ai_addr)).sin6_addr .s6_addr[8], (*((struct sockaddr_in6 *) (*resolution_courante).ai_addr)).sin6_addr .s6_addr[9], (*((struct sockaddr_in6 *) (*resolution_courante).ai_addr)).sin6_addr .s6_addr[10], (*((struct sockaddr_in6 *) (*resolution_courante).ai_addr)).sin6_addr .s6_addr[11], (*((struct sockaddr_in6 *) (*resolution_courante).ai_addr)).sin6_addr .s6_addr[12], (*((struct sockaddr_in6 *) (*resolution_courante).ai_addr)).sin6_addr .s6_addr[13], (*((struct sockaddr_in6 *) (*resolution_courante).ai_addr)).sin6_addr .s6_addr[14], (*((struct sockaddr_in6 *) (*resolution_courante).ai_addr)).sin6_addr .s6_addr[15], (unsigned int) port); # else if ((*s_etat_processus).langue == 'F') { printf("+++Attention : Support du protocole" " IPv6 indisponible\n"); } else { printf("+++Warning : IPv6 support " "unavailable\n"); } liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); freeaddrinfo(resolution); (*s_etat_processus).erreur_execution = d_ex_instruction_indisponible; return; # endif } freeaddrinfo(resolution); } else { // Hôte défini par une adresse if (strcmp(protocole, "IPV4") == 0) { // Accès en IPv4 if (type_adresse == '4') { free((*((struct_socket *) (*s_objet_resultat) .objet)).adresse); if (((*((struct_socket *) (*s_objet_resultat) .objet)).adresse = malloc(23 * sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } sprintf((*((struct_socket *) (*s_objet_resultat) .objet)).adresse, "%d.%d.%d.%d(%u)", (int) adresse[0], (int) adresse[1], (int) adresse[2], (int) adresse[3], (unsigned int) port); } else { free((*((struct_socket *) (*s_objet_resultat) .objet)).adresse); if (((*((struct_socket *) (*s_objet_resultat) .objet)).adresse = malloc( sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*((struct_socket *) (*s_objet_resultat).objet)) .adresse[0] = d_code_fin_chaine; } if (((*((struct_socket *) (*s_objet_resultat).objet)) .socket = socket(PF_INET, type, protocole_numerique)) == -1) { liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } (*((struct_socket *) (*s_objet_resultat).objet)) .domaine = PF_INET; memset(&socket_ipv4, 0, sizeof(socket_ipv4)); socket_ipv4.sin_family = AF_INET; socket_ipv4.sin_port = htons((uint16_t) port); adresse_ipv4 = 0; for(i = 0; i < 4; adresse_ipv4 = (256 * adresse_ipv4) + ((unsigned char) adresse[i++])); socket_ipv4.sin_addr.s_addr = htonl(adresse_ipv4); if ((type_socket == 'S') || (type_socket == 'Q')) { if (connect((*((struct_socket *) (*s_objet_resultat).objet)).socket, (const struct sockaddr *) &socket_ipv4, sizeof(socket_ipv4)) != 0) { liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } (*((struct_socket *) (*s_objet_resultat).objet)) .socket_connectee = d_vrai; (*((struct_socket *) (*s_objet_resultat).objet)) .socket_en_ecoute = 'N'; } } else if (strcmp(protocole, "IPV6") == 0) { // Accès en IPv6 # ifdef IPV6 if (type_adresse == '6') { free((*((struct_socket *) (*s_objet_resultat) .objet)).adresse); if (((*((struct_socket *) (*s_objet_resultat) .objet)).adresse = malloc(47 * sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } sprintf((*((struct_socket *) (*s_objet_resultat) .objet)).adresse, "%02X%02X:%02X%02X:%02X%02X:%02X%02X:" "%02X%02X:%02X%02X:%02X%02X:%02X%02X" "(%u)", (unsigned int) adresse[0], (unsigned int) adresse[1], (unsigned int) adresse[2], (unsigned int) adresse[3], (unsigned int) adresse[4], (unsigned int) adresse[5], (unsigned int) adresse[6], (unsigned int) adresse[7], (unsigned int) adresse[8], (unsigned int) adresse[9], (unsigned int) adresse[10], (unsigned int) adresse[11], (unsigned int) adresse[12], (unsigned int) adresse[13], (unsigned int) adresse[14], (unsigned int) adresse[15], (unsigned int) port); } else { free((*((struct_socket *) (*s_objet_resultat) .objet)).adresse); if (((*((struct_socket *) (*s_objet_resultat) .objet)).adresse = malloc( sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*((struct_socket *) (*s_objet_resultat).objet)) .adresse[0] = d_code_fin_chaine; } if (((*((struct_socket *) (*s_objet_resultat).objet)) .socket = socket(PF_INET6, type, protocole_numerique)) == -1) { liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } (*((struct_socket *) (*s_objet_resultat).objet)) .domaine = PF_INET6; memset(&socket_ipv6, 0, sizeof(socket_ipv6)); socket_ipv6.sin6_family = AF_INET6; socket_ipv6.sin6_port = htons((uint16_t) port); for(i = 0; i < 16; socket_ipv6.sin6_addr.s6_addr[i] = (unsigned char) (adresse[i]), i++); if ((type_socket == 'S') || (type_socket == 'Q')) { if (connect((*((struct_socket *) (*s_objet_resultat).objet)).socket, (const struct sockaddr *) &socket_ipv6, sizeof(socket_ipv6)) != 0) { liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } (*((struct_socket *) (*s_objet_resultat).objet)) .socket_connectee = d_vrai; (*((struct_socket *) (*s_objet_resultat).objet)) .socket_en_ecoute = 'N'; } # else if ((*s_etat_processus).langue == 'F') { printf("+++Attention : Support du protocole" " IPv6 indisponible\n"); } else { printf("+++Warning : IPv6 support " "unavailable\n"); } liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_instruction_indisponible; return; # endif } else { // Socket UNIX free((*((struct_socket *) (*s_objet_resultat) .objet)).adresse); if (((*((struct_socket *) (*s_objet_resultat) .objet)).adresse = malloc( sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*((struct_socket *) (*s_objet_resultat).objet)) .adresse[0] = d_code_fin_chaine; if (((*((struct_socket *) (*s_objet_resultat).objet)) .socket = socket(PF_UNIX, type, protocole_numerique)) == -1) { liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } } } (*((struct_socket *) (*s_objet_resultat).objet)).effacement = 'N'; } if ((type_socket == 'S') || (type_socket == 'Q')) { if (protection == 'R') { // WRITEONLY if (shutdown((*((struct_socket *) (*s_objet_resultat) .objet)).socket, SHUT_RD) != 0) { liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } } else if (protection == 'W') { // READONLY if (shutdown((*((struct_socket *) (*s_objet_resultat) .objet)).socket, SHUT_WR) != 0) { liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier; return; } } else { // READWRITE } } } /* * Gestion de la liste des sockets ouvertes */ l_element_courant = (*s_etat_processus).s_sockets; if (l_element_courant == NULL) { if (((*s_etat_processus).s_sockets = allocation_maillon(s_etat_processus)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*(*s_etat_processus).s_sockets).suivant = NULL; l_element_courant = (*s_etat_processus).s_sockets; } else { /* * Ajout d'un élément à la fin de la liste chaînée */ while((*l_element_courant).suivant != NULL) { l_element_courant = (*l_element_courant).suivant; } if (((*l_element_courant).suivant = allocation_maillon(s_etat_processus)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } l_element_courant = (*l_element_courant).suivant; (*l_element_courant).suivant = NULL; } if (((*l_element_courant).donnee = copie_objet(s_etat_processus, s_objet_resultat, 'O')) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } liberation(s_etat_processus, s_objet_argument); } else { liberation(s_etat_processus, s_objet_argument); (*s_etat_processus).erreur_execution = d_ex_erreur_parametre_fichier; return; } } else if ((*s_objet_argument).type == CHN) { if ((s_objet_resultat = allocation(s_etat_processus, SPH)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } if (((*((struct_semaphore *) (*s_objet_resultat).objet)).nom = malloc((strlen((unsigned char *) (*s_objet_argument).objet) + 1) *sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } strcpy((*((struct_semaphore *) (*s_objet_resultat).objet)).nom, (unsigned char *) (*s_objet_argument).objet); if (((*((struct_semaphore *) (*s_objet_resultat).objet)).semaphore = sem_open((*((struct_semaphore *) (*s_objet_resultat).objet)) .nom, 0)) == SEM_FAILED) { if (errno == ENOMEM) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*s_etat_processus).erreur_execution = d_ex_semaphore; liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); return; } } else { liberation(s_etat_processus, s_objet_argument); (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile), s_objet_resultat) == d_erreur) { return; } return; } // vim: ts=4