--- rpl/src/instructions_o1.c 2011/06/22 13:27:01 1.33 +++ rpl/src/instructions_o1.c 2014/04/25 07:37:32 1.76 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.0.prerelease.3 - Copyright (C) 1989-2011 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.18 + Copyright (C) 1989-2014 Dr. BERTRAND Joël This file is part of RPL/2. @@ -210,7 +210,7 @@ instruction_or(struct_processus *s_etat_ struct_objet *s_objet_argument_2; struct_objet *s_objet_resultat; - unsigned long nombre_elements; + integer8 nombre_elements; (*s_etat_processus).erreur_execution = d_ex; @@ -907,6 +907,7 @@ instruction_open(struct_processus *s_eta int buffer_reception; int drapeau; int priorite; + int prochain_descripteur; int protocole_numerique; int timeout_emission; int timeout_reception; @@ -919,6 +920,7 @@ instruction_open(struct_processus *s_eta logical1 erreur; logical1 existence; + logical1 negation; logical1 ouverture; logical1 presence_port; @@ -926,6 +928,7 @@ instruction_open(struct_processus *s_eta struct_liste_chainee *l_element_courant; struct_liste_chainee *l_element_courant_sous_objet; + struct_liste_chainee *parametre_courant; struct flock lock; @@ -942,6 +945,9 @@ instruction_open(struct_processus *s_eta struct_objet *s_objet_argument; struct_objet *s_objet_resultat; + struct_objet *s_parametres_tty; + + struct termios tc; uint32_t adresse_ipv4; @@ -952,8 +958,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; @@ -966,7 +974,6 @@ instruction_open(struct_processus *s_eta unsigned long i; unsigned long nombre_elements; - unsigned long prochain_descripteur; unsigned long unite; # define d_BIND_TO_DEVICE 0 @@ -1019,9 +1026,13 @@ 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\" \"speed,bits,parity,stop\"\n" + " { \"stty parameters\" ... } } } OPEN\n"); printf(" { \"sockettype\" { \"name\" \"local name\" } } OPEN\n"); printf(" { \"sockettype\" \"socketdomain\" \"protection\" } OPEN\n"); - printf(" \"/semaphore\" OPEN\n"); + printf(" \"/semaphore\" OPEN\n\n"); printf(" File type : NEW/OLD/REPLACE/UNKNOWN/SCRATCH\n"); printf(" File access : SEQUENTIAL/DIRECT/KEYED\n"); @@ -1031,6 +1042,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"); @@ -1052,7 +1070,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"); @@ -1061,6 +1079,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; } @@ -1121,6 +1141,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'); @@ -1972,6 +1993,17 @@ 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] = (unsigned char) + (protocole_socket[i] + - ('a' - 'A')); + } + } } else { @@ -2112,7 +2144,6 @@ instruction_open(struct_processus *s_eta { type_arguments = 'S'; } - else if (type_arguments == 'F') { liberation(s_etat_processus, s_objet_argument); @@ -2240,6 +2271,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); @@ -2593,6 +2647,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); @@ -2633,6 +2733,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') { /* @@ -2812,10 +2920,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); @@ -2918,10 +3033,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); @@ -3057,10 +3179,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); @@ -3168,10 +3297,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); @@ -3262,10 +3398,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); @@ -3340,10 +3483,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); @@ -3428,6 +3578,531 @@ instruction_open(struct_processus *s_eta 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[] = + { "50", "75", "110", "134", "150", + "200", "300", "600", "1200", "1800", "2400", + "4800", "9600", "19200", "38400", +#ifdef B57600 + "57600", +#endif +#ifdef B115200 + "115200", +#endif +#ifdef B230400 + "230400", +#endif + NULL }; + tcflag_t vitesses_constantes[] = + { B50, B75, B110, B134, B150, B200, B300, B600, + B1200, B1800, B2400, B4800, B9600, B19200, B38400, +#ifdef B57600 + B57600, +#endif +#ifdef B115200 + B115200, +#endif +#ifdef B230400 + B230400, +#endif + 0 }; + unsigned int vitesse_courante; + + vitesse_courante = 0; + + while(vitesses[vitesse_courante] != NULL) + { + if (strncmp(position, vitesses[vitesse_courante], + strlen(vitesses[vitesse_courante])) == 0) + { + if (position[strlen(vitesses[vitesse_courante])] == + d_code_espace) + { +#ifdef CBAUD + tc.c_cflag &= ~((tcflag_t) CBAUD); + tc.c_cflag |= vitesses_constantes[vitesse_courante]; +#else // POSIX + cfsetispeed(&tc, + vitesses_constantes[vitesse_courante]); + cfsetospeed(&tc, + vitesses_constantes[vitesse_courante]); +#endif + position += strlen(vitesses[vitesse_courante]); + + break; + } + } + + vitesse_courante++; + } + + if (vitesses[vitesse_courante] == NULL) + { + // La vitesse indiquée n'est pas une vitesse autorisée. + + free(parametre_courant_majuscule); + liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_resultat); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_parametre_fichier; + return; + } + + // Nombre de bits par caractère. + + while((*position) != d_code_fin_chaine) + { + if (isalnum((*position)) != 0) + { + break; + } + + position++; + } + + switch((*position)) + { + case '5': + { + tc.c_cflag &= ~((tcflag_t) CSIZE); + tc.c_cflag |= CS5; + break; + } + + case '6': + { + tc.c_cflag &= ~((tcflag_t) CSIZE); + tc.c_cflag |= CS6; + break; + } + + case '7': + { + tc.c_cflag &= ~((tcflag_t) CSIZE); + tc.c_cflag |= CS7; + break; + } + + case '8': + { + tc.c_cflag &= ~((tcflag_t) CSIZE); + tc.c_cflag |= CS8; + break; + } + + default: + { + free(parametre_courant_majuscule); + liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_resultat); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_parametre_fichier; + return; + } + } + + position++; + + if ((*position) != d_code_espace) + { + free(parametre_courant_majuscule); + liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_resultat); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_parametre_fichier; + return; + } + + // Parité + + while((*position) != d_code_fin_chaine) + { + if (isalnum((*position)) != 0) + { + break; + } + + position++; + } + + switch((*position)) + { + case 'N': + { + tc.c_cflag &= ~((tcflag_t) PARENB); + break; + } + + case 'O': + { + tc.c_cflag |= PARENB; + tc.c_cflag |= PARODD; + break; + } + + case 'E': + { + tc.c_cflag |= PARENB; + tc.c_cflag &= ~((tcflag_t) PARODD); + break; + } + + default: + { + free(parametre_courant_majuscule); + liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_resultat); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_parametre_fichier; + return; + } + } + + position++; + + if ((*position) != d_code_espace) + { + free(parametre_courant_majuscule); + liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_resultat); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_parametre_fichier; + return; + } + + // Bits de stop + + while((*position) != d_code_fin_chaine) + { + if (isalnum((*position)) != 0) + { + break; + } + + position++; + } + + switch((*position)) + { + case '1': + { + tc.c_cflag &= ~((tcflag_t) CSTOPB); + break; + } + + case '2': + { + tc.c_cflag |= CSTOPB; + break; + } + + default: + { + free(parametre_courant_majuscule); + liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_resultat); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_parametre_fichier; + return; + } + } + + // S'il reste autre chose que des espaces, il y a un + // problème de paramètres. + + position++; + + while((*position) != d_code_fin_chaine) + { + if ((*position) != d_code_espace) + { + free(parametre_courant_majuscule); + liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_resultat); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_parametre_fichier; + return; + } + + position++; + } + + // Autres paramètres + + free(parametre_courant_majuscule); + parametre_courant = (*parametre_courant).suivant; + + if (parametre_courant != NULL) + { + parametre_courant = (*(*parametre_courant).donnee).objet; + } + + while(parametre_courant != NULL) + { + if ((*(*parametre_courant).donnee).type != CHN) + { + liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_resultat); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_parametre_fichier; + return; + } + + if ((parametre_courant_majuscule = conversion_majuscule( + (*(*parametre_courant).donnee).objet)) == NULL) + { + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + return; + } + + position = parametre_courant_majuscule; + negation = d_faux; + + unsigned char *fonctions[] = + { "IGNBRK", "BRKINT", "IGNPAR", "PARMRK", + "INPCK", "ISTRIP", "INLCR", "IGNCR", "ICRNL", + "IXON", +#ifdef IXANY + "IXANY", +#endif + "IXOFF", "OPOST", + "ONLCR", "OCRNL", "ONOCR", "ONLRET", +#ifdef OFILL + "OFILL", +#endif + "HUPCL", "CLOCAL", +#ifdef CRTSCTS + "CRTSCTS", +#endif + "ISIG", "ICANON", "ECHO", "ECHOE", "ECHOK", + "ECHONL", "NOFLSH", "TOSTOP", "IEXTEN", NULL }; + tcflag_t fonctions_constantes[] = + { /* c_iflag */ + 1, IGNBRK, 1, BRKINT, 1, IGNPAR, 1, PARMRK, + 1, INPCK, 1, ISTRIP, 1, INLCR, 1, IGNCR, 1, ICRNL, + 1, IXON, +#ifdef IXANY + 1, IXANY, +#endif + 1, IXOFF, + /* c_oflag */ + 2 , OPOST, 2, ONLCR, 2, OCRNL, 2, ONOCR, 2, ONLRET, +#ifdef OFILL + 2, OFILL, +#endif + 2, HUPCL, + /* c_cflag */ + 3, CLOCAL, +#ifdef CRTSCTS + 3, CRTSCTS, +#endif + /* c_lfkag */ + 4, ISIG, 4, ICANON, 4, ECHO, 4, ECHOE, 4, ECHOK, + 4, ECHONL, 4, NOFLSH, 4, TOSTOP, 4, IEXTEN }; + unsigned int fonction_courante; + + // On vient de trouver quelque chose à interpréter. + + if (strncmp(position, "NO ", 3) == 0) + { + position += 3; + negation = d_vrai; + } + + for(fonction_courante = 0; + fonctions[fonction_courante] != NULL; + fonction_courante++) + { + if (strcmp(fonctions[fonction_courante], position) + == 0) + { + if (negation == d_vrai) + { + switch(fonctions_constantes + [fonction_courante * 2]) + { + case 1: + { + tc.c_iflag &= ~fonctions_constantes + [(fonction_courante * 2) + 1]; + break; + } + + case 2: + { + tc.c_oflag &= ~fonctions_constantes + [(fonction_courante * 2) + 1]; + break; + } + + case 3: + { + tc.c_cflag &= ~fonctions_constantes + [(fonction_courante * 2) + 1]; + break; + } + + case 4: + { + tc.c_lflag &= ~fonctions_constantes + [(fonction_courante * 2) + 1]; + break; + } + } + } + else + { + switch(fonctions_constantes + [fonction_courante * 2]) + { + case 1: + { + tc.c_iflag |= fonctions_constantes + [(fonction_courante * 2) + 1]; + break; + } + + case 2: + { + tc.c_oflag |= fonctions_constantes + [(fonction_courante * 2) + 1]; + break; + } + + case 3: + { + tc.c_cflag |= fonctions_constantes + [(fonction_courante * 2) + 1]; + break; + } + + case 4: + { + tc.c_lflag |= fonctions_constantes + [(fonction_courante * 2) + 1]; + break; + } + } + } + + break; + } + } + + if (fonctions[fonction_courante] == NULL) + { + free(parametre_courant_majuscule); + liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_resultat); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_parametre_fichier; + return; + } + + free(parametre_courant_majuscule); + parametre_courant = (*parametre_courant).suivant; + } + + if (tcsetattr(fileno(descripteur), TCSANOW, &tc) != 0) + { + liberation(s_etat_processus, s_objet_argument); + liberation(s_etat_processus, s_objet_resultat); + + (*s_etat_processus).erreur_systeme = + d_ex_erreur_fichier; + return; + } + } + strcpy((*((struct_fichier *) (*s_objet_resultat).objet)).nom, nom); liberation(s_etat_processus, s_objet_argument); @@ -3634,7 +4309,7 @@ instruction_open(struct_processus *s_eta return; } - prochain_descripteur = i; + prochain_descripteur = (int) i; /* * Ajout d'un élément à la fin de la liste chaînée @@ -3724,7 +4399,8 @@ instruction_open(struct_processus *s_eta # ifdef SO_BINDTODEVICE if (setsockopt((*((struct_socket *) (*s_objet_resultat) .objet)).socket, SOL_SOCKET, SO_BINDTODEVICE, - peripherique, strlen(peripherique)) != 0) + peripherique, (socklen_t) strlen(peripherique)) + != 0) { liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); @@ -4006,6 +4682,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 if (strcmp(protocole, "UNIX") != 0) + { + liberation(s_etat_processus, s_objet_argument); + + (*s_etat_processus).erreur_execution = + d_ex_erreur_parametre_fichier; + return; + } + } + if (((strcmp(protocole, "IPV4") == 0) && (type_adresse == '6')) || ((strcmp(protocole, "IPV6") == 0) && (type_adresse == '4'))) { @@ -4037,30 +4735,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)) @@ -4082,6 +4775,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) { @@ -4345,6 +5039,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) @@ -4449,6 +5146,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) @@ -4480,6 +5180,15 @@ instruction_open(struct_processus *s_eta 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 } @@ -4494,6 +5203,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) @@ -4542,7 +5254,8 @@ instruction_open(struct_processus *s_eta adresse_ipv4 = 0; for(i = 0; i < 4; adresse_ipv4 = - (256 * adresse_ipv4) + adresse[i++]); + (256 * adresse_ipv4) + + ((unsigned char) adresse[i++])); socket_ipv4.sin_addr.s_addr = htonl(adresse_ipv4); @@ -4569,6 +5282,9 @@ 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) @@ -4650,6 +5366,13 @@ instruction_open(struct_processus *s_eta 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 } } @@ -4883,6 +5606,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) @@ -4989,6 +5715,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) @@ -5020,6 +5749,15 @@ instruction_open(struct_processus *s_eta 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 } @@ -5036,6 +5774,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) @@ -5065,6 +5806,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) @@ -5100,7 +5844,8 @@ instruction_open(struct_processus *s_eta adresse_ipv4 = 0; for(i = 0; i < 4; adresse_ipv4 = - (256 * adresse_ipv4) + adresse[i++]); + (256 * adresse_ipv4) + + ((unsigned char) adresse[i++])); socket_ipv4.sin_addr.s_addr = htonl(adresse_ipv4); @@ -5132,6 +5877,9 @@ instruction_open(struct_processus *s_eta # 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) @@ -5162,6 +5910,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) @@ -5232,10 +5983,20 @@ instruction_open(struct_processus *s_eta 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)