--- rpl/src/instructions_o1.c 2010/02/10 10:14:23 1.3 +++ rpl/src/instructions_o1.c 2011/07/22 07:38:38 1.36 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.0.11 - Copyright (C) 1989-2010 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.1 + Copyright (C) 1989-2011 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,12 +917,13 @@ instruction_open(struct_processus *s_eta integer8 port; integer8 position_clef; - logical1 autorisation_liberation_nom; 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; @@ -933,7 +936,9 @@ 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; @@ -1016,6 +1021,7 @@ instruction_open(struct_processus *s_eta "\"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"); @@ -1186,6 +1192,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 != ' ') @@ -2648,7 +2682,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 +2720,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 +2752,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 +2761,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 +2772,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 +2782,104 @@ 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; + } + + 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; @@ -2751,11 +2887,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 +2902,47 @@ 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 + { + 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; @@ -2784,6 +2955,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 +2969,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 +2987,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 +2999,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,25 +3007,129 @@ instruction_open(struct_processus *s_eta return; } - if (fclose(descripteur) != 0) + 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_systeme = - d_es_erreur_fichier; + (*s_etat_processus).erreur_execution = + d_ex_fichier_verrouille; return; } - if ((descripteur = fopen(nom, "w+")) == NULL) + if (fclose(descripteur) != 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; + (*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; } @@ -2857,6 +3140,8 @@ instruction_open(struct_processus *s_eta if (erreur == d_erreur) { + free(nom); + liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); @@ -2867,26 +3152,141 @@ instruction_open(struct_processus *s_eta if (existence == d_faux) { - 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 + { + 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 ((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 + { + 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; + } } } @@ -2900,6 +3300,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); @@ -2908,14 +3310,104 @@ 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; + } + + 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; @@ -2944,11 +3436,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 +3450,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 +3486,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 +3499,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 +3518,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 +3537,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 +3591,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 +3670,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 +3695,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') { @@ -3605,6 +4114,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 +4147,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 +4215,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) { @@ -3861,6 +4371,7 @@ instruction_open(struct_processus *s_eta } else { // Accès en IPv6 +# ifdef IPV6 resolution_courante = resolution; while(resolution_courante != NULL) @@ -3958,6 +4469,18 @@ 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"); + } +# endif } freeaddrinfo(resolution); @@ -4045,6 +4568,7 @@ instruction_open(struct_processus *s_eta } else { // Accès en IPv6 +# ifdef IPV6 if (((*((struct_socket *) (*s_objet_resultat) .objet)).adresse = malloc(55 * sizeof(unsigned char))) == NULL) @@ -4115,6 +4639,18 @@ 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"); + } +# endif } } @@ -4218,8 +4754,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')) { @@ -4373,6 +4909,7 @@ instruction_open(struct_processus *s_eta } else { // Accès en IPv6 +# ifdef IPV6 resolution_courante = resolution; while(resolution_courante != NULL) @@ -4472,6 +5009,18 @@ 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"); + } +# endif } freeaddrinfo(resolution); @@ -4580,6 +5129,7 @@ instruction_open(struct_processus *s_eta } else if (strcmp(protocole, "IPV6") == 0) { // Accès en IPv6 +# ifdef IPV6 if (type_adresse == '6') { if (((*((struct_socket *) (*s_objet_resultat) @@ -4671,6 +5221,18 @@ 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"); + } +# endif } else { // Socket UNIX @@ -4787,6 +5349,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 {