/* ================================================================================ RPL/2 (R) version 4.0.22 Copyright (C) 1989-2011 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\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); 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\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); 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\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); 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\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); 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; unsigned long 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 ================================================================================ */ 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 drapeau; int priorite; 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 ouverture; logical1 presence_port; sqlite3 *sqlite; struct_liste_chainee *l_element_courant; struct_liste_chainee *l_element_courant_sous_objet; 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; 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 *peripherique; unsigned char *pointeur; 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 prochain_descripteur; unsigned long unite; # define d_BIND_TO_DEVICE 0 # define d_BROADCAST 1 # define d_DONT_ROUTE 2 # define d_KEEP_ALIVE 3 # define d_PRIORITY 4 # define d_RECEIVE_BUFFER 5 # define d_FORCE_RECEIVE_BUFFER 6 # define d_SEND_BUFFER 7 # define d_FORCE_SEND_BUFFER 8 # define d_RECEIVING_TIMEOUT 9 # define d_SENDING_TIMEOUT 10 # define d_REUSE_ADDRESS 11 /* * 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(" { \"sockettype\" { \"name\" \"local name\" } } OPEN\n"); printf(" { \"sockettype\" \"socketdomain\" \"protection\" } OPEN\n"); printf(" \"/semaphore\" OPEN\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(" 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\" } } 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"); 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; drapeau = -1; 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((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( (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( (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; } 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 { 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( (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( (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 { 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; } 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; } if (sqlite3_open_v2(nom, &sqlite, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL) != SQLITE_OK) { 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 { if (sqlite3_open_v2(nom, &sqlite, SQLITE_OPEN_READWRITE, NULL) != SQLITE_OK) { 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 { if (sqlite3_open_v2(nom, &sqlite, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL) != SQLITE_OK) { 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 { if (sqlite3_open_v2(nom, &sqlite, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL) != SQLITE_OK) { 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 { if (sqlite3_open_v2(nom, &sqlite, SQLITE_OPEN_READWRITE, NULL) != SQLITE_OK) { 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; } if (sqlite3_open_v2(nom, &sqlite, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL) != SQLITE_OK) { 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; } 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 = 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 */ inline logical1 options_socket() { /* * Options des sockets */ # 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) if (options[d_BIND_TO_DEVICE] == 'Y') { # ifdef SO_BINDTODEVICE if (setsockopt((*((struct_socket *) (*s_objet_resultat) .objet)).socket, SOL_SOCKET, SO_BINDTODEVICE, peripherique, strlen(peripherique)) != 0) { 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(d_erreur); } # 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) { 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(d_erreur); } } if (options[d_DONT_ROUTE] == 'Y') { if (setsockopt((*((struct_socket *) (*s_objet_resultat) .objet)).socket, SOL_SOCKET, SO_DONTROUTE, &drapeau, sizeof(drapeau)) != 0) { 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(d_erreur); } } if (options[d_KEEP_ALIVE] == 'Y') { if (setsockopt((*((struct_socket *) (*s_objet_resultat) .objet)).socket, SOL_SOCKET, SO_KEEPALIVE, &drapeau, sizeof(drapeau)) != 0) { 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(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) { 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(d_erreur); } # 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) { 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(d_erreur); } } 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) { 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(d_erreur); } # 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) { 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(d_erreur); } } 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) { 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(d_erreur); } # 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) { 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(d_erreur); } } 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) { 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(d_erreur); } } if (options[d_REUSE_ADDRESS] == 'Y') { if (setsockopt((*((struct_socket *) (*s_objet_resultat) .objet)).socket, SOL_SOCKET, SO_REUSEADDR, &drapeau, sizeof(drapeau)) != 0) { 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(d_erreur); } } return(d_absence_erreur); #undef WARNING } /* * 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 (((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 { for(i = 0; i < strlen(protocole_socket); i++) { if ((protocole_socket[i] >= 'A') && (protocole_socket[i] <= 'Z')) { protocole_socket[i] += 'a' - 'A'; } } if (strcmp(protocole_socket, "ipv4") == 0) { protocole_socket[2] = d_code_fin_chaine; } 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; 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; 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() == 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() == 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; } if (((*((struct_socket *) (*s_objet_resultat) .objet)).adresse = malloc(22 * 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", (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); } 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() == 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; } if (((*((struct_socket *) (*s_objet_resultat) .objet)).adresse = malloc(55 * sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } for(i = 0; i < 16; i++) { sprintf((*((struct_socket *) (*s_objet_resultat) .objet)).adresse, (i == 0) ? "%s%X" : "%s:%X", (*((struct_socket *) (*s_objet_resultat) .objet)).adresse, (*((struct sockaddr_in6 *) (*resolution_courante).ai_addr)) .sin6_addr.s6_addr[i]); } # else if ((*s_etat_processus).langue == 'F') { printf("+++Attention : Support du protocole" " IPv6 indisponible\n"); } else { printf("+++Warning : IPv6 support " "unavailable\n"); } # endif } freeaddrinfo(resolution); sprintf((*((struct_socket *) (*s_objet_resultat) .objet)).adresse, "%s(%u)", (*((struct_socket *) (*s_objet_resultat) .objet)).adresse, (unsigned int) port); } else { // Hôte défini par une adresse if (strcmp(protocole, "IPV4") == 0) { // Accès en IPv4 if (((*((struct_socket *) (*s_objet_resultat) .objet)).adresse = malloc(22 * 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; for(i = 0; i < 4; i++) { sprintf((*((struct_socket *) (*s_objet_resultat) .objet)).adresse, (i == 0) ? "%s%d" : "%s.%d", (*((struct_socket *) (*s_objet_resultat) .objet)).adresse, (int) adresse[i]); } sprintf((*((struct_socket *) (*s_objet_resultat) .objet)).adresse, "%s(%u)", (*((struct_socket *) (*s_objet_resultat) .objet)).adresse, (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) + adresse[i++]); socket_ipv4.sin_addr.s_addr = htonl(adresse_ipv4); if (options_socket() == 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 if (((*((struct_socket *) (*s_objet_resultat) .objet)).adresse = malloc(55 * 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; for(i = 0; i < 16; i++) { sprintf((*((struct_socket *) (*s_objet_resultat) .objet)).adresse, (i == 0) ? "%s%X" : "%s:%X", (*((struct_socket *) (*s_objet_resultat) .objet)).adresse, (unsigned int) adresse[i]); } sprintf((*((struct_socket *) (*s_objet_resultat) .objet)).adresse, "%s(%u)", (*((struct_socket *) (*s_objet_resultat) .objet)).adresse, (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() == 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"); } # 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'; } if (((*((struct_socket *) (*s_objet_resultat) .objet)).adresse = malloc(22 * 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", (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); } 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'; } if (((*((struct_socket *) (*s_objet_resultat) .objet)).adresse = malloc(55 * sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } for(i = 0; i < 16; i++) { sprintf((*((struct_socket *) (*s_objet_resultat) .objet)).adresse, (i == 0) ? "%s%X" : "%s:%X", (*((struct_socket *) (*s_objet_resultat) .objet)).adresse, (*((struct sockaddr_in6 *) (*resolution_courante).ai_addr)) .sin6_addr.s6_addr[i]); } # else if ((*s_etat_processus).langue == 'F') { printf("+++Attention : Support du protocole" " IPv6 indisponible\n"); } else { printf("+++Warning : IPv6 support " "unavailable\n"); } # endif } freeaddrinfo(resolution); sprintf((*((struct_socket *) (*s_objet_resultat) .objet)).adresse, "%s(%u)", (*((struct_socket *) (*s_objet_resultat) .objet)).adresse, (unsigned int) port); } else { // Hôte défini par une adresse if (strcmp(protocole, "IPV4") == 0) { // Accès en IPv4 if (type_adresse == '4') { if (((*((struct_socket *) (*s_objet_resultat) .objet)).adresse = malloc(22 * 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; for(i = 0; i < 4; i++) { sprintf((*((struct_socket *) (*s_objet_resultat).objet)).adresse, (i == 0) ? "%s%d" : "%s.%d", (*((struct_socket *) (*s_objet_resultat) .objet)).adresse, (int) adresse[i]); } sprintf((*((struct_socket *) (*s_objet_resultat) .objet)).adresse, "%s(%u)", (*((struct_socket *) (*s_objet_resultat) .objet)).adresse, (unsigned int) port); } else { 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) + 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') { if (((*((struct_socket *) (*s_objet_resultat) .objet)).adresse = malloc(55 * 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; for(i = 0; i < 16; i++) { sprintf((*((struct_socket *) (*s_objet_resultat).objet)).adresse, (i == 0) ? "%s%X" : "%s:%X", (*((struct_socket *) (*s_objet_resultat) .objet)).adresse, (unsigned int) adresse[i]); } sprintf((*((struct_socket *) (*s_objet_resultat) .objet)).adresse, "%s(%u)", (*((struct_socket *) (*s_objet_resultat) .objet)).adresse, (unsigned int) port); } else { 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"); } # endif } else { // Socket UNIX 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