--- rpl/src/instructions_o1.c 2010/03/04 10:17:52 1.4 +++ rpl/src/instructions_o1.c 2012/12/19 09:58:26 1.62 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.0.12 - Copyright (C) 1989-2010 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.12 + Copyright (C) 1989-2012 Dr. BERTRAND Joël This file is part of RPL/2. @@ -20,7 +20,7 @@ */ -#include "rpl.conv.h" +#include "rpl-conv.h" /* @@ -897,6 +897,8 @@ instruction_open(struct_processus *s_eta * 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; @@ -915,14 +917,17 @@ instruction_open(struct_processus *s_eta integer8 port; integer8 position_clef; - logical1 autorisation_liberation_nom; logical1 erreur; logical1 existence; + logical1 negation; logical1 ouverture; logical1 presence_port; + sqlite3 *sqlite; + struct_liste_chainee *l_element_courant; struct_liste_chainee *l_element_courant_sous_objet; + struct_liste_chainee *parametre_courant; struct flock lock; @@ -933,10 +938,15 @@ instruction_open(struct_processus *s_eta struct sockaddr_un socket_unix; struct sockaddr_in socket_ipv4; +# ifdef IPV6 struct sockaddr_in6 socket_ipv6; +# endif struct_objet *s_objet_argument; struct_objet *s_objet_resultat; + struct_objet *s_parametres_tty; + + struct termios tc; uint32_t adresse_ipv4; @@ -947,8 +957,10 @@ instruction_open(struct_processus *s_eta unsigned char *nom; unsigned char *nom_temporaire; unsigned char options[12]; + unsigned char *parametre_courant_majuscule; unsigned char *peripherique; unsigned char *pointeur; + unsigned char *position; unsigned char protection; unsigned char protocole[16 + 1]; unsigned char *protocole_socket; @@ -1014,8 +1026,12 @@ instruction_open(struct_processus *s_eta printf(" { \"filetype\" \"access\" \"format\" { \"name\" " "\"file name\" } \"protection\" } OPEN\n"); + printf(" { \"filetype\" \"access\" \"format\" { \"name\" " + "\"file name\" } \n" + " { \"stty\" { \"stty parameters\" ... } } } OPEN\n"); printf(" { \"sockettype\" { \"name\" \"local name\" } } OPEN\n"); printf(" { \"sockettype\" \"socketdomain\" \"protection\" } OPEN\n"); + printf(" \"/semaphore\" OPEN\n\n"); printf(" File type : NEW/OLD/REPLACE/UNKNOWN/SCRATCH\n"); printf(" File access : SEQUENTIAL/DIRECT/KEYED\n"); @@ -1025,6 +1041,13 @@ instruction_open(struct_processus *s_eta printf(" Socket protocol : IPV4/IPV6/UNIX\n"); printf(" Format : FORMATTED/UNFORMATTED/FLOW\n"); printf(" Protection : READONLY/WRITEONLY/READWRITE\n\n"); + printf(" Stty parameters : can be prefixed by 'NO'\n"); + printf(" IGNBRK, BRKINT, IGNPAR, PARMRK, INPCK, ISTRIP\n"); + printf(" INLCR, IGNCR, ICRNL, IXON, IXANY, IXOFF,\n"); + printf(" IMAXBEL, OPOST, ONLCR, OCRNL, ONOCR, ONLRET,\n"); + printf(" OFILL, HUPCL, CLOCAL, CRTSCTS, ISIG, ICANON,\n"); + printf(" ECHO, ECHOE, ECHOK, ECHONL, NOFLSH, TOSTOP,\n"); + printf(" IEXTEN\n"); printf(" Address : { \"ADDRESS\" [ 127 0 0 1 ] }\n"); printf(" { \"HOST\" \"hostname\" }\n"); @@ -1046,7 +1069,7 @@ instruction_open(struct_processus *s_eta printf(" Port : { \"PORT\" port number }\n"); printf(" Protocol : { \"PROTOCOL\" \"protocol\" }\n\n"); - printf(" { { \"NAME\" \"filename\" } } OPEN\n"); + printf(" { { \"NAME\" \"filename\" } \"SEQUENTIAL\" } OPEN\n"); printf(" { \"SCRATCH\" } OPEN\n"); printf(" { { \"NAME\" \"filename\" } \"UNKNOWN\" \"FORMATTED\" " "\"DIRECT\" } OPEN\n"); @@ -1055,6 +1078,8 @@ instruction_open(struct_processus *s_eta printf(" { \"STREAM\" \"READWRITE\" } OPEN\n"); printf(" { \"FOREIGN\" \"DATAGRAM\" } OPEN\n"); printf(" { \"LOCAL\" { \"NAME\" \"socket.sock\" } } OPEN\n"); + printf(" { { \"NAME\" \"/dev/ttyS1\" } { \"STTY\" { \"9600,8,N,1\" " + "\n { \"NO ICANON\" \"IGNBRK\" } } } OPEN\n"); return; } @@ -1115,6 +1140,7 @@ instruction_open(struct_processus *s_eta timeout_emission = 0; timeout_reception = 0; drapeau = -1; + s_parametres_tty = NULL; for(i = 0; i < 12; options[i++] = 'N'); @@ -1186,6 +1212,34 @@ instruction_open(struct_processus *s_eta 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 != ' ') @@ -1938,6 +1992,15 @@ instruction_open(struct_processus *s_eta protocole_socket = (unsigned char *) (*(*l_element_courant_sous_objet) .donnee).objet; + + for(i = 0; i < strlen(protocole_socket); i++) + { + if ((protocole_socket[i] >= 'a') && + (protocole_socket[i] <= 'z')) + { + protocole_socket[i] -= 'a' - 'A'; + } + } } else { @@ -2206,6 +2269,29 @@ instruction_open(struct_processus *s_eta } } } + else if (strcmp(argument_majuscule, "STTY") == 0) + { + if ((*(*l_element_courant_sous_objet) + .donnee).type == CHN) + { + if (type_arguments == ' ') + { + type_arguments = 'F'; + } + else if (type_arguments == 'S') + { + liberation(s_etat_processus, + s_objet_argument); + free(argument_majuscule); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_parametre_fichier; + return; + } + + s_parametres_tty = (*l_element_courant).donnee; + } + } else { liberation(s_etat_processus, s_objet_argument); @@ -2559,6 +2645,52 @@ instruction_open(struct_processus *s_eta free(argument_majuscule); } + else if (strcmp(argument_majuscule, "STTY") == 0) + { + if (type_arguments == ' ') + { + type_arguments = 'F'; + } + else if (type_arguments == 'S') + { + liberation(s_etat_processus, s_objet_argument); + free(argument_majuscule); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_parametre_fichier; + return; + } + + free(argument_majuscule); + + l_element_courant_sous_objet = + (*l_element_courant_sous_objet).suivant; + + if ((*(*l_element_courant_sous_objet) + .donnee).type != CHN) + { + liberation(s_etat_processus, s_objet_argument); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_parametre_fichier; + return; + } + + l_element_courant_sous_objet = + (*l_element_courant_sous_objet).suivant; + + if ((*(*l_element_courant_sous_objet) + .donnee).type != LST) + { + liberation(s_etat_processus, s_objet_argument); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_parametre_fichier; + return; + } + + s_parametres_tty = (*l_element_courant).donnee; + } else { liberation(s_etat_processus, s_objet_argument); @@ -2599,6 +2731,14 @@ instruction_open(struct_processus *s_eta l_element_courant = (*l_element_courant).suivant; } + // Si aucun paramètre n'est discriminant, l'instruction ouvre + // par défaut un fichier. + + if (type_arguments == ' ') + { + type_arguments = 'F'; + } + if (type_arguments == 'F') { /* @@ -2648,7 +2788,9 @@ instruction_open(struct_processus *s_eta } if (((type_acces != 'I') && (position_clef != 0)) || - ((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); @@ -2684,12 +2826,16 @@ instruction_open(struct_processus *s_eta sprintf(nom, "%s.rpl", nom_temporaire); free(nom_temporaire); - - autorisation_liberation_nom = d_vrai; } else { - autorisation_liberation_nom = d_faux; + 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; + } } /* @@ -2712,6 +2858,8 @@ instruction_open(struct_processus *s_eta 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; } @@ -2719,6 +2867,8 @@ instruction_open(struct_processus *s_eta (*(*((struct_fichier *) (*s_objet_resultat).objet)) .format).objet = NULL; + descripteur = NULL; + switch(type_ouverture) { case 'N' : @@ -2728,6 +2878,8 @@ instruction_open(struct_processus *s_eta if ((erreur != 0) || (unite != 0)) { + free(nom); + liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); @@ -2736,14 +2888,111 @@ instruction_open(struct_processus *s_eta return; } - if ((descripteur = fopen(nom, "w+")) == NULL) + if (type_acces == 'S') { - liberation(s_etat_processus, s_objet_argument); - liberation(s_etat_processus, s_objet_resultat); + if ((descripteur = fopen(nom, "w+")) == NULL) + { + free(nom); - (*s_etat_processus).erreur_execution = - d_ex_erreur_acces_fichier; - return; + liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_resultat); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_acces_fichier; + return; + } + } + else + { + // Si le fichier existe, on le supprime. + + if (unlink(nom) != 0) + { + free(nom); + + liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_resultat); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_acces_fichier; + return; + } + + sqlite = NULL; + + if (sqlite3_open_v2(nom, &sqlite, + SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, + NULL) != SQLITE_OK) + { + if (sqlite != NULL) + { + sqlite3_close(sqlite); + } + + free(nom); + + liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_resultat); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_acces_fichier; + return; + } + + if ((descripteur = fopen(nom, "a+")) == NULL) + { + free(nom); + + liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_resultat); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_acces_fichier; + return; + } + + if (type_acces == 'D') + { + if (initialisation_fichier_acces_direct( + s_etat_processus, sqlite, + (format == 'N') ? d_faux : d_vrai) + != d_absence_erreur) + { + free(nom); + + liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_resultat); + + return; + } + } + else + { + if (position_clef == 0) + { + free(nom); + + liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_resultat); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_parametre_fichier; + return; + } + + if (initialisation_fichier_acces_indexe( + s_etat_processus, sqlite, position_clef, + (format == 'N') ? d_faux : d_vrai) + != d_absence_erreur) + { + free(nom); + + liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_resultat); + + return; + } + } } break; @@ -2751,11 +3000,13 @@ instruction_open(struct_processus *s_eta case 'O' : { - erreur = caracteristiques_fichier(s_etat_processus, - nom, &existence, &ouverture, &unite); + 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); @@ -2764,14 +3015,54 @@ instruction_open(struct_processus *s_eta return; } - if ((descripteur = fopen(nom, "r+")) == NULL) + if (type_acces == 'S') { - liberation(s_etat_processus, s_objet_argument); - liberation(s_etat_processus, s_objet_resultat); + if ((descripteur = fopen(nom, "r+")) == NULL) + { + free(nom); - (*s_etat_processus).erreur_execution = - d_ex_erreur_acces_fichier; - return; + liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_resultat); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_acces_fichier; + return; + } + } + else + { + sqlite = NULL; + + if (sqlite3_open_v2(nom, &sqlite, + SQLITE_OPEN_READWRITE, + NULL) != SQLITE_OK) + { + if (sqlite != NULL) + { + sqlite3_close(sqlite); + } + + free(nom); + + liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_resultat); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_acces_fichier; + return; + } + + if ((descripteur = fopen(nom, "a+")) == NULL) + { + free(nom); + + liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_resultat); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_acces_fichier; + return; + } } break; @@ -2784,6 +3075,8 @@ instruction_open(struct_processus *s_eta if ((erreur != d_absence_erreur) || (existence == d_faux)) { + free(nom); + liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); @@ -2796,6 +3089,8 @@ instruction_open(struct_processus *s_eta if ((descripteur = fopen(nom, "r")) == NULL) { + free(nom); + liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); @@ -2812,8 +3107,11 @@ instruction_open(struct_processus *s_eta 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 = @@ -2821,6 +3119,7 @@ instruction_open(struct_processus *s_eta return; } + liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_systeme = @@ -2828,8 +3127,33 @@ instruction_open(struct_processus *s_eta 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 = @@ -2837,8 +3161,114 @@ instruction_open(struct_processus *s_eta return; } - if ((descripteur = fopen(nom, "w+")) == NULL) + if (type_acces == 'S') + { + if ((descripteur = fopen(nom, "w+")) == NULL) + { + free(nom); + + liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_resultat); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_acces_fichier; + return; + } + } + else + { + sqlite = NULL; + + if (sqlite3_open_v2(nom, &sqlite, + SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, + NULL) != SQLITE_OK) + { + if (sqlite != NULL) + { + sqlite3_close(sqlite); + } + + free(nom); + + liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_resultat); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_acces_fichier; + return; + } + + // Ouverture du fichier pour pouvoir gérer les + // verrous à la façon des fichiers séquentiels. + + if ((descripteur = fopen(nom, "a+")) == NULL) + { + free(nom); + + liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_resultat); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_acces_fichier; + return; + } + + if (type_acces == 'D') + { + if (initialisation_fichier_acces_direct( + s_etat_processus, sqlite, + (format == 'N') ? d_faux : d_vrai) + != d_absence_erreur) + { + free(nom); + + liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_resultat); + + return; + } + } + else + { + if (position_clef == 0) + { + free(nom); + + liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_resultat); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_parametre_fichier; + return; + } + + if (initialisation_fichier_acces_indexe( + s_etat_processus, sqlite, position_clef, + (format == 'N') ? d_faux : d_vrai) + != d_absence_erreur) + { + free(nom); + + liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_resultat); + + return; + } + } + } + + break; + } + + case 'U' : + { + erreur = caracteristiques_fichier(s_etat_processus, + nom, &existence, &ouverture, &unite); + + if (erreur == d_erreur) { + free(nom); + liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); @@ -2847,16 +3277,172 @@ instruction_open(struct_processus *s_eta return; } + if (existence == d_faux) + { + if (type_acces == 'S') + { + if ((descripteur = fopen(nom, "w+")) == NULL) + { + free(nom); + + liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_resultat); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_acces_fichier; + return; + } + } + else + { + sqlite = NULL; + + if (sqlite3_open_v2(nom, &sqlite, + SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, + NULL) != SQLITE_OK) + { + if (sqlite != NULL) + { + sqlite3_close(sqlite); + } + + free(nom); + + liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_resultat); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_acces_fichier; + return; + } + + if ((descripteur = fopen(nom, "a+")) == NULL) + { + free(nom); + + liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_resultat); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_acces_fichier; + return; + } + + if (type_acces == 'D') + { + if (initialisation_fichier_acces_direct( + s_etat_processus, sqlite, + (format == 'N') ? d_faux : d_vrai) + != d_absence_erreur) + { + free(nom); + + liberation(s_etat_processus, + s_objet_argument); + liberation(s_etat_processus, + s_objet_resultat); + + return; + } + } + else + { + if (position_clef == 0) + { + free(nom); + + liberation(s_etat_processus, + s_objet_argument); + liberation(s_etat_processus, + s_objet_resultat); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_parametre_fichier; + return; + } + + if (initialisation_fichier_acces_indexe( + s_etat_processus, sqlite, position_clef, + (format == 'N') ? d_faux : d_vrai) + != d_absence_erreur) + { + free(nom); + + liberation(s_etat_processus, + s_objet_argument); + liberation(s_etat_processus, + s_objet_resultat); + + return; + } + } + } + } + else + { + if (type_acces == 'S') + { + if ((descripteur = fopen(nom, "r+")) == NULL) + { + free(nom); + + liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_resultat); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_acces_fichier; + return; + } + } + else + { + sqlite = NULL; + + if (sqlite3_open_v2(nom, &sqlite, + SQLITE_OPEN_READWRITE, + NULL) != SQLITE_OK) + { + if (sqlite != NULL) + { + sqlite3_close(sqlite); + } + + free(nom); + + liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_resultat); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_acces_fichier; + return; + } + + if ((descripteur = fopen(nom, "a+")) == NULL) + { + free(nom); + + liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_resultat); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_acces_fichier; + return; + } + } + } + break; } - case 'U' : + case 'S' : { erreur = caracteristiques_fichier(s_etat_processus, nom, &existence, &ouverture, &unite); - if (erreur == d_erreur) + if ((erreur != d_absence_erreur) || (existence != d_faux)) { + free(nom); + liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); @@ -2865,10 +3451,12 @@ instruction_open(struct_processus *s_eta 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); @@ -2879,8 +3467,12 @@ instruction_open(struct_processus *s_eta } else { - if ((descripteur = fopen(nom, "r+")) == NULL) + // 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); @@ -2888,52 +3480,625 @@ instruction_open(struct_processus *s_eta d_ex_erreur_acces_fichier; return; } + + sqlite = NULL; + + if (sqlite3_open_v2(nom, &sqlite, + SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, + NULL) != SQLITE_OK) + { + if (sqlite != NULL) + { + sqlite3_close(sqlite); + } + + free(nom); + + liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_resultat); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_acces_fichier; + return; + } + + if ((descripteur = fopen(nom, "a+")) == NULL) + { + free(nom); + + liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_resultat); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_acces_fichier; + return; + } + + if (type_acces == 'D') + { + if (initialisation_fichier_acces_direct( + s_etat_processus, sqlite, + (format == 'N') ? d_faux : d_vrai) + != d_absence_erreur) + { + free(nom); + + liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_resultat); + + return; + } + } + else + { + if (position_clef == 0) + { + free(nom); + + liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_resultat); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_parametre_fichier; + return; + } + + if (initialisation_fichier_acces_indexe( + s_etat_processus, sqlite, position_clef, + (format == 'N') ? d_faux : d_vrai) + != d_absence_erreur) + { + free(nom); + + liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_resultat); + + return; + } + } } break; } - case 'S' : + default: { - erreur = caracteristiques_fichier(s_etat_processus, - nom, &existence, &ouverture, &unite); + BUG(1, printf("type_ouverture=%c\n", type_ouverture)); + return; + } + } - if ((erreur != d_absence_erreur) || (existence != d_faux)) + if (((*((struct_fichier *) (*s_objet_resultat).objet)).nom = + malloc((strlen(nom) + 1) * + sizeof(unsigned char))) == NULL) + { + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return; + } + + if (s_parametres_tty != NULL) + { + // Affectation des paramètres du port série. + + if (tcgetattr(fileno(descripteur), &tc) != 0) + { + liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_resultat); + + (*s_etat_processus).erreur_systeme = + d_ex_erreur_fichier; + return; + } + + // Un test a déjà été fait pour vérifier que s_parametres_tty + // contient deux ou trois arguments. + + parametre_courant = ((*(struct_liste_chainee *) + (*s_parametres_tty).objet)).suivant; + + // Le premier paramètre concerne la vitesse du port. Il doit + // toujours être présent. + + if (parametre_courant == NULL) + { + liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_resultat); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_parametre_fichier; + return; + } + + if ((*(*parametre_courant).donnee).type != CHN) + { + liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_resultat); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_parametre_fichier; + return; + } + + if ((parametre_courant_majuscule = conversion_majuscule( + (*(*parametre_courant).donnee).objet)) == NULL) + { + liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_resultat); + + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + return; + } + + position = parametre_courant_majuscule; + + while((*position) != d_code_fin_chaine) + { + if ((*position) == ',') + { + (*position) = ' '; + } + + position++; + } + + position = parametre_courant_majuscule; + + while((*position) != d_code_fin_chaine) + { + if (isalnum((*position)) != 0) + { + break; + } + + position++; + } + + // Vitesse + + unsigned char *vitesses[] = + { "0", "50", "75", "110", "134", "150", + "200", "300", "600", "1200", "1800", "2400", + "4800", "9600", "19200", "38400", +#ifdef B57600 + "57600", +#endif +#ifdef B115200 + "115200", +#endif +#ifdef B230400 + "230400", +#endif + NULL }; + int vitesses_constantes[] = + { B0, B50, B75, B110, B134, B150, B200, B300, B600, + B1200, B1800, B2400, B4800, B9600, B19200, B38400, +#ifdef B57600 + B57600, +#endif +#ifdef B115200 + B115200, +#endif +#ifdef B230400 + B230400, +#endif + 0 }; + unsigned int vitesse_courante; + + vitesse_courante = 0; + + while(vitesses[vitesse_courante] != NULL) + { + if (strncmp(position, vitesses[vitesse_courante], + strlen(vitesses[vitesse_courante])) == 0) + { + if (position[strlen(vitesses[vitesse_courante])] == + d_code_espace) + { +#ifdef CBAUD + tc.c_cflag &= ~CBAUD; + tc.c_cflag |= vitesses_constantes[vitesse_courante]; +#else // POSIX + cfsetispeed(&tc, + vitesses_constantes[vitesse_courante]); + cfsetospeed(&tc, + vitesses_constantes[vitesse_courante]); +#endif + position += strlen(vitesses[vitesse_courante]); + + break; + } + } + + vitesse_courante++; + } + + if (vitesses[vitesse_courante] == NULL) + { + // La vitesse indiquée n'est pas une vitesse autorisée. + + free(parametre_courant_majuscule); + liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_resultat); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_parametre_fichier; + return; + } + + // Nombre de bits par caractère. + + while((*position) != d_code_fin_chaine) + { + if (isalnum((*position)) != 0) { + break; + } + + position++; + } + + switch((*position)) + { + case '5': + { + tc.c_cflag &= ~CSIZE; + tc.c_cflag |= CS5; + break; + } + + case '6': + { + tc.c_cflag &= ~CSIZE; + tc.c_cflag |= CS6; + break; + } + + case '7': + { + tc.c_cflag &= ~CSIZE; + tc.c_cflag |= CS7; + break; + } + + case '8': + { + tc.c_cflag &= ~CSIZE; + tc.c_cflag |= CS8; + break; + } + + default: + { + free(parametre_courant_majuscule); liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = - d_ex_erreur_acces_fichier; + d_ex_erreur_parametre_fichier; return; } + } + + position++; + + if ((*position) != d_code_espace) + { + free(parametre_courant_majuscule); + liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_resultat); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_parametre_fichier; + return; + } + + // Parité + + while((*position) != d_code_fin_chaine) + { + if (isalnum((*position)) != 0) + { + break; + } + + position++; + } + + switch((*position)) + { + case 'N': + { + tc.c_cflag &= ~PARENB; + break; + } + + case 'O': + { + tc.c_cflag |= PARENB; + tc.c_cflag |= PARODD; + break; + } + + case 'E': + { + tc.c_cflag |= PARENB; + tc.c_cflag &= ~PARODD; + break; + } - if ((descripteur = fopen(nom, "w+")) == NULL) + default: { + free(parametre_courant_majuscule); liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = - d_ex_erreur_acces_fichier; + d_ex_erreur_parametre_fichier; return; } - - break; } - default: + position++; + + if ((*position) != d_code_espace) { - BUG(1, printf("type_ouverture=%c\n", type_ouverture)); + free(parametre_courant_majuscule); + liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_resultat); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_parametre_fichier; return; } - } - 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; + // Bits de stop + + while((*position) != d_code_fin_chaine) + { + if (isalnum((*position)) != 0) + { + break; + } + + position++; + } + + switch((*position)) + { + case '1': + { + tc.c_cflag &= ~CSTOPB; + break; + } + + case '2': + { + tc.c_cflag |= CSTOPB; + break; + } + + default: + { + free(parametre_courant_majuscule); + liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_resultat); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_parametre_fichier; + return; + } + } + + // S'il reste autre chose que des espaces, il y a un + // problème de paramètres. + + position++; + + while((*position) != d_code_fin_chaine) + { + if ((*position) != d_code_espace) + { + free(parametre_courant_majuscule); + liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_resultat); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_parametre_fichier; + return; + } + + position++; + } + + // Autres paramètres + + free(parametre_courant_majuscule); + parametre_courant = (*parametre_courant).suivant; + + if (parametre_courant != NULL) + { + parametre_courant = (*(*parametre_courant).donnee).objet; + } + + while(parametre_courant != NULL) + { + if ((*(*parametre_courant).donnee).type != CHN) + { + liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_resultat); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_parametre_fichier; + return; + } + + if ((parametre_courant_majuscule = conversion_majuscule( + (*(*parametre_courant).donnee).objet)) == NULL) + { + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + return; + } + + position = parametre_courant_majuscule; + negation = d_faux; + + unsigned char *fonctions[] = + { "IGNBRK", "BRKINT", "IGNPAR", "PARMRK", + "INPCK", "ISTRIP", "INLCR", "IGNCR", "ICRNL", + "IXON", +#ifdef IXANY + "IXANY", +#endif + "IXOFF", "OPOST", + "ONLCR", "OCRNL", "ONOCR", "ONLRET", +#ifdef OFILL + "OFILL", +#endif + "HUPCL", "CLOCAL", +#ifdef CRTSCTS + "CRTSCTS", +#endif + "ISIG", "ICANON", "ECHO", "ECHOE", "ECHOK", + "ECHONL", "NOFLSH", "TOSTOP", "IEXTEN", NULL }; + int fonctions_constantes[] = + { /* c_iflag */ + 1, IGNBRK, 1, BRKINT, 1, IGNPAR, 1, PARMRK, + 1, INPCK, 1, ISTRIP, 1, INLCR, 1, IGNCR, 1, ICRNL, + 1, IXON, +#ifdef IXANY + 1, IXANY, +#endif + 1, IXOFF, + /* c_oflag */ + 2 , OPOST, 2, ONLCR, 2, OCRNL, 2, ONOCR, 2, ONLRET, +#ifdef OFILL + 2, OFILL, +#endif + 2, HUPCL, + /* c_cflag */ + 3, CLOCAL, +#ifdef CRTSCTS + 3, CRTSCTS, +#endif + /* c_lfkag */ + 4, ISIG, 4, ICANON, 4, ECHO, 4, ECHOE, 4, ECHOK, + 4, ECHONL, 4, NOFLSH, 4, TOSTOP, 4, IEXTEN }; + unsigned int fonction_courante; + + // On vient de trouver quelque chose à interpréter. + + if (strncmp(position, "NO ", 3) == 0) + { + position += 3; + negation = d_vrai; + } + + for(fonction_courante = 0; + fonctions[fonction_courante] != NULL; + fonction_courante++) + { + if (strcmp(fonctions[fonction_courante], position) + == 0) + { + if (negation == d_vrai) + { + switch(fonctions_constantes + [fonction_courante * 2]) + { + case 1: + { + tc.c_iflag &= ~fonctions_constantes + [(fonction_courante * 2) + 1]; + break; + } + + case 2: + { + tc.c_oflag &= ~fonctions_constantes + [(fonction_courante * 2) + 1]; + break; + } + + case 3: + { + tc.c_cflag &= ~fonctions_constantes + [(fonction_courante * 2) + 1]; + break; + } + + case 4: + { + tc.c_lflag &= ~fonctions_constantes + [(fonction_courante * 2) + 1]; + break; + } + } + } + else + { + switch(fonctions_constantes + [fonction_courante * 2]) + { + case 1: + { + tc.c_iflag |= fonctions_constantes + [(fonction_courante * 2) + 1]; + break; + } + + case 2: + { + tc.c_oflag |= fonctions_constantes + [(fonction_courante * 2) + 1]; + break; + } + + case 3: + { + tc.c_cflag |= fonctions_constantes + [(fonction_courante * 2) + 1]; + break; + } + + case 4: + { + tc.c_lflag |= fonctions_constantes + [(fonction_courante * 2) + 1]; + break; + } + } + } + + break; + } + } + + if (fonctions[fonction_courante] == NULL) + { + free(parametre_courant_majuscule); + liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_resultat); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_parametre_fichier; + return; + } + + free(parametre_courant_majuscule); + parametre_courant = (*parametre_courant).suivant; + } + + if (tcsetattr(fileno(descripteur), TCSANOW, &tc) != 0) + { + liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_resultat); + + (*s_etat_processus).erreur_systeme = + d_ex_erreur_fichier; + return; + } } strcpy((*((struct_fichier *) (*s_objet_resultat).objet)).nom, nom); @@ -2944,11 +4109,6 @@ instruction_open(struct_processus *s_eta (*((struct_fichier *) (*s_objet_resultat).objet)).position_clef = position_clef; - if (autorisation_liberation_nom == d_vrai) - { - free(nom); - } - rewind(descripteur); lock.l_type = F_WRLCK; @@ -2963,7 +4123,8 @@ instruction_open(struct_processus *s_eta { liberation(s_etat_processus, s_objet_resultat); - (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + (*s_etat_processus).erreur_systeme = + d_es_erreur_fichier; return; } @@ -2998,7 +4159,8 @@ instruction_open(struct_processus *s_eta liberation(s_etat_processus, s_objet_resultat); - (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + (*s_etat_processus).erreur_systeme = + d_es_erreur_fichier; return; } } @@ -3010,6 +4172,8 @@ instruction_open(struct_processus *s_eta if ((lock.l_type == F_RDLCK) && (protection != 'R')) { + free(nom); + if (fclose(descripteur) != 0) { liberation(s_etat_processus, s_objet_resultat); @@ -3027,6 +4191,8 @@ instruction_open(struct_processus *s_eta } else if ((lock.l_type == F_WRLCK) && (protection != 'W')) { + free(nom); + if (fclose(descripteur) != 0) { liberation(s_etat_processus, s_objet_resultat); @@ -3044,6 +4210,17 @@ instruction_open(struct_processus *s_eta } 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 = @@ -3087,8 +4264,8 @@ instruction_open(struct_processus *s_eta * Recherche du premier descripteur libre */ - if ((chaine_descripteurs = malloc( - ds_nombre_maximum_fichiers_ouverts + 1)) == NULL) + if ((chaine_descripteurs = malloc(sizeof(unsigned char) * + (ds_nombre_maximum_fichiers_ouverts + 1))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; @@ -3166,8 +4343,24 @@ instruction_open(struct_processus *s_eta = prochain_descripteur; (*((struct_descripteur_fichier *) (*l_element_courant).donnee)) .identifiant = prochain_descripteur; - (*((struct_descripteur_fichier *) (*l_element_courant).donnee)) - .descripteur = 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)) @@ -3175,19 +4368,8 @@ instruction_open(struct_processus *s_eta (*((struct_descripteur_fichier *) (*l_element_courant).donnee)) .effacement = (type_ouverture == 'S') ? 'Y' : 'N'; - if (((*((struct_descripteur_fichier *) (*l_element_courant) - .donnee)).nom = malloc((strlen((*((struct_fichier *) - (*s_objet_resultat).objet)).nom) + 1) * - sizeof(unsigned char))) == NULL) - { - (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; - return; - } - - strcpy((*((struct_descripteur_fichier *) (*l_element_courant) - .donnee)).nom, (*((struct_fichier *) (*s_objet_resultat) - .objet)).nom); - + (*((struct_descripteur_fichier *) (*l_element_courant) + .donnee)).nom = nom; } else if (type_arguments == 'S') { @@ -3497,6 +4679,28 @@ instruction_open(struct_processus *s_eta return; } + if ((type_adresse == ' ') && (type_domaine == 'L')) + { + if (strcmp(protocole, "IPV4") == 0) + { + for(i = 0; i < 4; adresse[i++] = 0); + type_adresse = '4'; + } + else if (strcmp(protocole, "IPV6") == 0) + { + for(i = 0; i < 16; adresse[i++] = 0); + type_adresse = '6'; + } + else + { + 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'))) { @@ -3528,30 +4732,25 @@ instruction_open(struct_processus *s_eta } 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) + if (strcmp(protocole_socket, "IPV4") == 0) { protocole_socket[2] = d_code_fin_chaine; + protocole_numerique = 0; } - - if ((s_protocole = getprotobyname(protocole_socket)) == NULL) + else { - liberation(s_etat_processus, s_objet_argument); + 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; - } + (*s_etat_processus).erreur_execution = + d_ex_erreur_parametre_fichier; + return; + } - protocole_numerique = (*s_protocole).p_proto; + protocole_numerique = (*s_protocole).p_proto; + } } if ((s_objet_resultat = allocation(s_etat_processus, SCK)) @@ -3573,6 +4772,7 @@ instruction_open(struct_processus *s_eta = protection; (*(*((struct_socket *) (*s_objet_resultat).objet)) .format).objet = NULL; + (*((struct_socket *) (*s_objet_resultat).objet)).adresse = NULL; switch(type_socket) { @@ -3605,6 +4805,10 @@ instruction_open(struct_processus *s_eta 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') && @@ -3634,16 +4838,13 @@ instruction_open(struct_processus *s_eta else { if (((*((struct_socket *) (*s_objet_resultat).objet)).adresse = - malloc((strlen(nom) + 1) * sizeof(unsigned char))) - == NULL) + transliteration(s_etat_processus, nom, + d_locale, "UTF-8")) == NULL) { - (*s_etat_processus).erreur_systeme = - d_es_allocation_memoire; + liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_resultat); return; } - - strcpy((*((struct_socket *) (*s_objet_resultat).objet)).adresse, - nom); } if (((*((struct_socket *) (*s_objet_resultat).objet)) @@ -3705,8 +4906,8 @@ instruction_open(struct_processus *s_eta pointeur++; } - strncpy(socket_unix.sun_path, pointeur, 108); - socket_unix.sun_path[108 - 1] = d_code_fin_chaine; + 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) { @@ -3835,6 +5036,9 @@ instruction_open(struct_processus *s_eta return; } + free((*((struct_socket *) (*s_objet_resultat) + .objet)).adresse); + if (((*((struct_socket *) (*s_objet_resultat) .objet)).adresse = malloc(22 * sizeof(unsigned char))) == NULL) @@ -3861,6 +5065,7 @@ instruction_open(struct_processus *s_eta } else { // Accès en IPv6 +# ifdef IPV6 resolution_courante = resolution; while(resolution_courante != NULL) @@ -3938,6 +5143,9 @@ instruction_open(struct_processus *s_eta return; } + free((*((struct_socket *) (*s_objet_resultat) + .objet)).adresse); + if (((*((struct_socket *) (*s_objet_resultat) .objet)).adresse = malloc(55 * sizeof(unsigned char))) == NULL) @@ -3958,6 +5166,27 @@ instruction_open(struct_processus *s_eta (*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"); + } + + liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_resultat); + + freeaddrinfo(resolution); + + (*s_etat_processus).erreur_execution = + d_ex_instruction_indisponible; + return; +# endif } freeaddrinfo(resolution); @@ -3971,6 +5200,9 @@ instruction_open(struct_processus *s_eta { // Hôte défini par une adresse if (strcmp(protocole, "IPV4") == 0) { // Accès en IPv4 + free((*((struct_socket *) (*s_objet_resultat) + .objet)).adresse); + if (((*((struct_socket *) (*s_objet_resultat) .objet)).adresse = malloc(22 * sizeof(unsigned char))) == NULL) @@ -4045,6 +5277,10 @@ instruction_open(struct_processus *s_eta } else { // Accès en IPv6 +# ifdef IPV6 + free((*((struct_socket *) (*s_objet_resultat) + .objet)).adresse); + if (((*((struct_socket *) (*s_objet_resultat) .objet)).adresse = malloc(55 * sizeof(unsigned char))) == NULL) @@ -4115,6 +5351,25 @@ instruction_open(struct_processus *s_eta d_ex_erreur_acces_fichier; return; } +# else + if ((*s_etat_processus).langue == 'F') + { + printf("+++Attention : Support du protocole" + " IPv6 indisponible\n"); + } + else + { + printf("+++Warning : IPv6 support " + "unavailable\n"); + } + + liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_resultat); + + (*s_etat_processus).erreur_execution = + d_ex_instruction_indisponible; + return; +# endif } } @@ -4218,8 +5473,8 @@ instruction_open(struct_processus *s_eta socket_unix.sun_family = AF_UNIX; strncpy(socket_unix.sun_path, (*((struct_socket *) - (*s_objet_resultat).objet)).adresse, 108); - socket_unix.sun_path[108 - 1] = d_code_fin_chaine; + (*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')) { @@ -4347,6 +5602,9 @@ instruction_open(struct_processus *s_eta .socket_en_ecoute = 'N'; } + free((*((struct_socket *) (*s_objet_resultat) + .objet)).adresse); + if (((*((struct_socket *) (*s_objet_resultat) .objet)).adresse = malloc(22 * sizeof(unsigned char))) == NULL) @@ -4373,6 +5631,7 @@ instruction_open(struct_processus *s_eta } else { // Accès en IPv6 +# ifdef IPV6 resolution_courante = resolution; while(resolution_courante != NULL) @@ -4452,6 +5711,9 @@ instruction_open(struct_processus *s_eta .socket_en_ecoute = 'N'; } + free((*((struct_socket *) (*s_objet_resultat) + .objet)).adresse); + if (((*((struct_socket *) (*s_objet_resultat) .objet)).adresse = malloc(55 * sizeof(unsigned char))) == NULL) @@ -4472,6 +5734,27 @@ instruction_open(struct_processus *s_eta (*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"); + } + + liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_resultat); + + freeaddrinfo(resolution); + + (*s_etat_processus).erreur_execution = + d_ex_instruction_indisponible; + return; +# endif } freeaddrinfo(resolution); @@ -4487,6 +5770,9 @@ instruction_open(struct_processus *s_eta { // Accès en IPv4 if (type_adresse == '4') { + free((*((struct_socket *) (*s_objet_resultat) + .objet)).adresse); + if (((*((struct_socket *) (*s_objet_resultat) .objet)).adresse = malloc(22 * sizeof(unsigned char))) == NULL) @@ -4516,6 +5802,9 @@ instruction_open(struct_processus *s_eta } else { + free((*((struct_socket *) (*s_objet_resultat) + .objet)).adresse); + if (((*((struct_socket *) (*s_objet_resultat) .objet)).adresse = malloc( sizeof(unsigned char))) == NULL) @@ -4580,8 +5869,12 @@ instruction_open(struct_processus *s_eta } else if (strcmp(protocole, "IPV6") == 0) { // Accès en IPv6 +# ifdef IPV6 if (type_adresse == '6') { + free((*((struct_socket *) (*s_objet_resultat) + .objet)).adresse); + if (((*((struct_socket *) (*s_objet_resultat) .objet)).adresse = malloc(55 * sizeof(unsigned char))) == NULL) @@ -4612,6 +5905,9 @@ instruction_open(struct_processus *s_eta } else { + free((*((struct_socket *) (*s_objet_resultat) + .objet)).adresse); + if (((*((struct_socket *) (*s_objet_resultat) .objet)).adresse = malloc( sizeof(unsigned char))) == NULL) @@ -4671,9 +5967,31 @@ instruction_open(struct_processus *s_eta (*((struct_socket *) (*s_objet_resultat).objet)) .socket_en_ecoute = 'N'; } +# else + if ((*s_etat_processus).langue == 'F') + { + printf("+++Attention : Support du protocole" + " IPv6 indisponible\n"); + } + else + { + printf("+++Warning : IPv6 support " + "unavailable\n"); + } + + liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_resultat); + + (*s_etat_processus).erreur_execution = + d_ex_instruction_indisponible; + return; +# endif } else { // Socket UNIX + free((*((struct_socket *) (*s_objet_resultat) + .objet)).adresse); + if (((*((struct_socket *) (*s_objet_resultat) .objet)).adresse = malloc( sizeof(unsigned char))) == NULL) @@ -4787,6 +6105,8 @@ instruction_open(struct_processus *s_eta (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } + + liberation(s_etat_processus, s_objet_argument); } else {