--- rpl/src/instructions_o1.c 2010/03/08 14:28:20 1.7 +++ rpl/src/instructions_o1.c 2012/01/05 10:19:02 1.43 @@ -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.5 + 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; @@ -934,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; @@ -1017,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"); @@ -1187,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 != ' ') @@ -1939,6 +1972,16 @@ 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 { @@ -2779,10 +2822,17 @@ instruction_open(struct_processus *s_eta 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); @@ -2885,10 +2935,17 @@ instruction_open(struct_processus *s_eta } 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); @@ -3024,10 +3081,17 @@ instruction_open(struct_processus *s_eta } 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); @@ -3135,10 +3199,17 @@ instruction_open(struct_processus *s_eta } 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); @@ -3229,10 +3300,17 @@ instruction_open(struct_processus *s_eta } 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); @@ -3307,10 +3385,17 @@ instruction_open(struct_processus *s_eta 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); @@ -3973,6 +4058,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'))) { @@ -4004,16 +4111,7 @@ 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; } @@ -4081,6 +4179,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') && @@ -4178,8 +4280,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) { @@ -4334,6 +4436,7 @@ instruction_open(struct_processus *s_eta } else { // Accès en IPv6 +# ifdef IPV6 resolution_courante = resolution; while(resolution_courante != NULL) @@ -4431,6 +4534,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); @@ -4518,6 +4633,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) @@ -4588,6 +4704,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 } } @@ -4691,8 +4819,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')) { @@ -4846,6 +4974,7 @@ instruction_open(struct_processus *s_eta } else { // Accès en IPv6 +# ifdef IPV6 resolution_courante = resolution; while(resolution_courante != NULL) @@ -4945,6 +5074,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); @@ -5053,6 +5194,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) @@ -5144,6 +5286,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 @@ -5260,6 +5414,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 {