--- rpl/src/instructions_o1.c 2015/11/26 11:44:38 1.86 +++ rpl/src/instructions_o1.c 2023/08/07 17:42:56 1.107 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.24 - Copyright (C) 1989-2015 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.35 + Copyright (C) 1989-2023 Dr. BERTRAND Joël This file is part of RPL/2. @@ -114,35 +114,35 @@ instruction_over(struct_processus *s_eta " %s, %s, %s, %s, %s,\n" " %s, %s, %s, %s, %s,\n" " %s, %s, %s, %s,\n" - " %s, %s\n", + " %s, %s, %s\n", d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX, d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SCK, - d_SQL, d_SLB, d_PRC, d_MTX); + d_SQL, d_SLB, d_PRC, d_MTX, d_REC); printf(" 1: %s, %s, %s, %s, %s, %s,\n" " %s, %s, %s, %s, %s,\n" " %s, %s, %s, %s, %s,\n" " %s, %s, %s, %s,\n" - " %s, %s\n", + " %s, %s, %s\n", d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX, d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SCK, - d_SQL, d_SLB, d_PRC, d_MTX); + d_SQL, d_SLB, d_PRC, d_MTX, d_REC); printf("-> 3: %s, %s, %s, %s, %s, %s,\n" " %s, %s, %s, %s, %s,\n" " %s, %s, %s, %s, %s,\n" " %s, %s, %s, %s,\n" - " %s, %s\n", + " %s, %s, %s\n", d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX, d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SCK, - d_SQL, d_SLB, d_PRC, d_MTX); + d_SQL, d_SLB, d_PRC, d_MTX, d_REC); printf(" ...\n"); printf(" 1: %s, %s, %s, %s, %s, %s,\n" " %s, %s, %s, %s, %s,\n" " %s, %s, %s, %s, %s,\n" " %s, %s, %s, %s,\n" - " %s, %s\n", + " %s, %s, %s\n", d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX, d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SCK, - d_SQL, d_SLB, d_PRC, d_MTX); + d_SQL, d_SLB, d_PRC, d_MTX, d_REC); return; } @@ -1265,7 +1265,7 @@ instruction_open(struct_processus *s_eta 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(" IEXTEN, RAW\n"); printf(" Address : { \"ADDRESS\" [ 127 0 0 1 ] }\n"); printf(" { \"HOST\" \"hostname\" }\n"); @@ -2361,6 +2361,7 @@ instruction_open(struct_processus *s_eta { type_arguments = 'S'; } + else if (type_arguments == 'F') { liberation(s_etat_processus, s_objet_argument); @@ -3889,6 +3890,24 @@ instruction_open(struct_processus *s_eta #ifdef B230400 "230400", #endif +#ifdef B460800 + "460800", +#endif +#ifdef B500000 + "500000", +#endif +#ifdef B576000 + "576000", +#endif +#ifdef B921600 + "921600", +#endif +#ifdef B1000000 + "1000000", +#endif +#ifdef B1152000 + "1152000", +#endif NULL }; tcflag_t vitesses_constantes[] = { B50, B75, B110, B134, B150, B200, B300, B600, @@ -3902,6 +3921,24 @@ instruction_open(struct_processus *s_eta #ifdef B230400 B230400, #endif +#ifdef B460800 + B460800, +#endif +#ifdef B500000 + B500000, +#endif +#ifdef B576000 + B576000, +#endif +#ifdef B921600 + B921600, +#endif +#ifdef B1000000 + B1000000, +#endif +#ifdef B1152000 + B1152000, +#endif 0 }; unsigned int vitesse_courante; @@ -4172,8 +4209,8 @@ instruction_open(struct_processus *s_eta #ifdef IXANY "IXANY", #endif - "IXOFF", "OPOST", - "ONLCR", "OCRNL", "ONOCR", "ONLRET", + "IXOFF", + "OPOST", "ONLCR", "OCRNL", "ONOCR", "ONLRET", #ifdef OFILL "OFILL", #endif @@ -4182,7 +4219,11 @@ instruction_open(struct_processus *s_eta "CRTSCTS", #endif "ISIG", "ICANON", "ECHO", "ECHOE", "ECHOK", - "ECHONL", "NOFLSH", "TOSTOP", "IEXTEN", NULL }; + "ECHONL", "NOFLSH", "TOSTOP", "IEXTEN", + + "RAW", + + NULL }; tcflag_t fonctions_constantes[] = { /* c_iflag */ 1, IGNBRK, 1, BRKINT, 1, IGNPAR, 1, PARMRK, @@ -4203,9 +4244,12 @@ instruction_open(struct_processus *s_eta #ifdef CRTSCTS 3, CRTSCTS, #endif - /* c_lfkag */ + /* c_lflag */ 4, ISIG, 4, ICANON, 4, ECHO, 4, ECHOE, 4, ECHOK, - 4, ECHONL, 4, NOFLSH, 4, TOSTOP, 4, IEXTEN }; + 4, ECHONL, 4, NOFLSH, 4, TOSTOP, 4, IEXTEN, + + /* RAW */ + 5, 0 }; unsigned int fonction_courante; // On vient de trouver quelque chose à interpréter. @@ -4255,6 +4299,12 @@ instruction_open(struct_processus *s_eta [(fonction_courante * 2) + 1]; break; } + + case 5: + { + // RAW ne peut être négatif + break; + } } } else @@ -4289,15 +4339,64 @@ instruction_open(struct_processus *s_eta [(fonction_courante * 2) + 1]; break; } + + case 5: + { + // no ignbrk + tc.c_iflag &= ~(tcflag_t) IGNBRK; + // no brkint + tc.c_iflag &= ~(tcflag_t) BRKINT; + // no ignpar + tc.c_iflag &= ~(tcflag_t) IGNPAR; + // no parmrk + tc.c_iflag &= ~(tcflag_t) PARMRK; + // no inpck + tc.c_iflag &= ~(tcflag_t) INPCK; + // no istrip + tc.c_iflag &= ~(tcflag_t) ISTRIP; + // no inlcr + tc.c_iflag &= ~(tcflag_t) INLCR; + // no icrnl + tc.c_iflag &= ~(tcflag_t) ICRNL; + // no ixon + tc.c_iflag &= ~(tcflag_t) IXON; + // no ixoff + tc.c_iflag &= ~(tcflag_t) IXOFF; +#ifdef IXANY + // no ixany + tc.c_iflag &= ~(tcflag_t) IXANY; +#endif + // no opost + tc.c_oflag &= ~(tcflag_t) OPOST; + // no isig + tc.c_lflag &= ~(tcflag_t) ISIG; + // no icanon + tc.c_lflag &= ~(tcflag_t) ICANON; + // no echo + tc.c_lflag &= ~(tcflag_t) ECHO; + // no echoe + tc.c_lflag &= ~(tcflag_t) ECHOE; + // no echok + tc.c_lflag &= ~(tcflag_t) ECHOK; + } } } - break; + // On sort si on a trouvé un paramètre + // correct et donc différent de "NO RAW". + + if (!((negation == d_vrai) && + (fonctions_constantes[fonction_courante * 2] + == 5))) + { + break; + } } } if (fonctions[fonction_courante] == NULL) { + // Paramètre inconnu free(parametre_courant_majuscule); liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); @@ -5054,7 +5153,7 @@ instruction_open(struct_processus *s_eta .objet)).adresse); if (((*((struct_socket *) (*s_objet_resultat) - .objet)).adresse = malloc(22 * + .objet)).adresse = malloc(23 * sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = @@ -5063,7 +5162,7 @@ instruction_open(struct_processus *s_eta } sprintf((*((struct_socket *) (*s_objet_resultat) - .objet)).adresse, "%d.%d.%d.%d", + .objet)).adresse, "%d.%d.%d.%d(%u)", (ntohl((*((struct sockaddr_in *) (*resolution_courante).ai_addr)).sin_addr .s_addr) >> 24) & 0xFF, @@ -5075,7 +5174,8 @@ instruction_open(struct_processus *s_eta .s_addr) >> 8) & 0xFF, ntohl((*((struct sockaddr_in *) (*resolution_courante).ai_addr)).sin_addr - .s_addr) & 0xFF); + .s_addr) & 0xFF, + (unsigned int) port); } else { // Accès en IPv6 @@ -5165,8 +5265,19 @@ instruction_open(struct_processus *s_eta free((*((struct_socket *) (*s_objet_resultat) .objet)).adresse); + /* + * Longueur de la chaîne : + * Adresse IPv6 : 16 octets soit 128 bits. + * => 32 chiffres en hexadécimal + * Par groupe de 4, 8 groupes + * => 7 ":" + * Port : (%u) + * => 7 + * ==> 32 + 7 + 7 + 1 = 47 + */ + if (((*((struct_socket *) (*s_objet_resultat) - .objet)).adresse = malloc(55 * + .objet)).adresse = malloc(47 * sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = @@ -5174,17 +5285,59 @@ instruction_open(struct_processus *s_eta return; } - for(i = 0; i < 16; i++) - { - sprintf((*((struct_socket *) (*s_objet_resultat) - .objet)).adresse, - (i == 0) ? "%s%X" : "%s:%X", - (*((struct_socket *) (*s_objet_resultat) - .objet)).adresse, - (*((struct sockaddr_in6 *) - (*resolution_courante).ai_addr)) - .sin6_addr.s6_addr[i]); - } + sprintf((*((struct_socket *) (*s_objet_resultat) + .objet)).adresse, + "%02X%02X:%02X%02X:%02X%02X:%02X%02X:" + "%02X%02X:%02X%02X:%02X%02X:%02X%02X(%u)", + (*((struct sockaddr_in6 *) + (*resolution_courante).ai_addr)).sin6_addr + .s6_addr[0], + (*((struct sockaddr_in6 *) + (*resolution_courante).ai_addr)).sin6_addr + .s6_addr[1], + (*((struct sockaddr_in6 *) + (*resolution_courante).ai_addr)).sin6_addr + .s6_addr[2], + (*((struct sockaddr_in6 *) + (*resolution_courante).ai_addr)).sin6_addr + .s6_addr[3], + (*((struct sockaddr_in6 *) + (*resolution_courante).ai_addr)).sin6_addr + .s6_addr[4], + (*((struct sockaddr_in6 *) + (*resolution_courante).ai_addr)).sin6_addr + .s6_addr[5], + (*((struct sockaddr_in6 *) + (*resolution_courante).ai_addr)).sin6_addr + .s6_addr[6], + (*((struct sockaddr_in6 *) + (*resolution_courante).ai_addr)).sin6_addr + .s6_addr[7], + (*((struct sockaddr_in6 *) + (*resolution_courante).ai_addr)).sin6_addr + .s6_addr[8], + (*((struct sockaddr_in6 *) + (*resolution_courante).ai_addr)).sin6_addr + .s6_addr[9], + (*((struct sockaddr_in6 *) + (*resolution_courante).ai_addr)).sin6_addr + .s6_addr[10], + (*((struct sockaddr_in6 *) + (*resolution_courante).ai_addr)).sin6_addr + .s6_addr[11], + (*((struct sockaddr_in6 *) + (*resolution_courante).ai_addr)).sin6_addr + .s6_addr[12], + (*((struct sockaddr_in6 *) + (*resolution_courante).ai_addr)).sin6_addr + .s6_addr[13], + (*((struct sockaddr_in6 *) + (*resolution_courante).ai_addr)).sin6_addr + .s6_addr[14], + (*((struct sockaddr_in6 *) + (*resolution_courante).ai_addr)).sin6_addr + .s6_addr[15], + (unsigned int) port); # else if ((*s_etat_processus).langue == 'F') { @@ -5209,11 +5362,6 @@ instruction_open(struct_processus *s_eta } freeaddrinfo(resolution); - - sprintf((*((struct_socket *) (*s_objet_resultat) - .objet)).adresse, "%s(%u)", - (*((struct_socket *) (*s_objet_resultat) - .objet)).adresse, (unsigned int) port); } else { // Hôte défini par une adresse @@ -5223,7 +5371,7 @@ instruction_open(struct_processus *s_eta .objet)).adresse); if (((*((struct_socket *) (*s_objet_resultat) - .objet)).adresse = malloc(22 * + .objet)).adresse = malloc(23 * sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = @@ -5231,22 +5379,11 @@ instruction_open(struct_processus *s_eta return; } - (*((struct_socket *) (*s_objet_resultat).objet)) - .adresse[0] = d_code_fin_chaine; - - for(i = 0; i < 4; i++) - { - sprintf((*((struct_socket *) (*s_objet_resultat) - .objet)).adresse, - (i == 0) ? "%s%d" : "%s.%d", - (*((struct_socket *) (*s_objet_resultat) - .objet)).adresse, (int) adresse[i]); - } - sprintf((*((struct_socket *) (*s_objet_resultat) - .objet)).adresse, "%s(%u)", - (*((struct_socket *) (*s_objet_resultat) - .objet)).adresse, (unsigned int) port); + .objet)).adresse, "%d.%d.%d.%d(%u)", + (int) adresse[0], (int) adresse[1], + (int) adresse[2], (int) adresse[3], + (unsigned int) port); if (((*((struct_socket *) (*s_objet_resultat).objet)) @@ -5307,7 +5444,7 @@ instruction_open(struct_processus *s_eta .objet)).adresse); if (((*((struct_socket *) (*s_objet_resultat) - .objet)).adresse = malloc(55 * + .objet)).adresse = malloc(47 * sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = @@ -5315,23 +5452,27 @@ instruction_open(struct_processus *s_eta return; } - (*((struct_socket *) (*s_objet_resultat).objet)) - .adresse[0] = d_code_fin_chaine; - - for(i = 0; i < 16; i++) - { - sprintf((*((struct_socket *) (*s_objet_resultat) - .objet)).adresse, - (i == 0) ? "%s%X" : "%s:%X", - (*((struct_socket *) (*s_objet_resultat) - .objet)).adresse, (unsigned int) - adresse[i]); - } - sprintf((*((struct_socket *) (*s_objet_resultat) - .objet)).adresse, "%s(%u)", - (*((struct_socket *) (*s_objet_resultat) - .objet)).adresse, (unsigned int) port); + .objet)).adresse, + "%02X%02X:%02X%02X:%02X%02X:%02X%02X:" + "%02X%02X:%02X%02X:%02X%02X:%02X%02X(%u)", + (unsigned int) adresse[0], + (unsigned int) adresse[1], + (unsigned int) adresse[2], + (unsigned int) adresse[3], + (unsigned int) adresse[4], + (unsigned int) adresse[5], + (unsigned int) adresse[6], + (unsigned int) adresse[7], + (unsigned int) adresse[8], + (unsigned int) adresse[9], + (unsigned int) adresse[10], + (unsigned int) adresse[11], + (unsigned int) adresse[12], + (unsigned int) adresse[13], + (unsigned int) adresse[14], + (unsigned int) adresse[15], + (unsigned int) port); if (((*((struct_socket *) (*s_objet_resultat).objet)) @@ -5636,7 +5777,7 @@ instruction_open(struct_processus *s_eta .objet)).adresse); if (((*((struct_socket *) (*s_objet_resultat) - .objet)).adresse = malloc(22 * + .objet)).adresse = malloc(23 * sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = @@ -5645,7 +5786,7 @@ instruction_open(struct_processus *s_eta } sprintf((*((struct_socket *) (*s_objet_resultat) - .objet)).adresse, "%d.%d.%d.%d", + .objet)).adresse, "%d.%d.%d.%d(%u)", (ntohl((*((struct sockaddr_in *) (*resolution_courante).ai_addr)).sin_addr .s_addr) >> 24) & 0xFF, @@ -5657,7 +5798,8 @@ instruction_open(struct_processus *s_eta .s_addr) >> 8) & 0xFF, ntohl((*((struct sockaddr_in *) (*resolution_courante).ai_addr)).sin_addr - .s_addr) & 0xFF); + .s_addr) & 0xFF, + (unsigned int) port); } else { // Accès en IPv6 @@ -5745,7 +5887,7 @@ instruction_open(struct_processus *s_eta .objet)).adresse); if (((*((struct_socket *) (*s_objet_resultat) - .objet)).adresse = malloc(55 * + .objet)).adresse = malloc(47 * sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = @@ -5753,17 +5895,59 @@ instruction_open(struct_processus *s_eta return; } - for(i = 0; i < 16; i++) - { - sprintf((*((struct_socket *) (*s_objet_resultat) - .objet)).adresse, - (i == 0) ? "%s%X" : "%s:%X", - (*((struct_socket *) (*s_objet_resultat) - .objet)).adresse, - (*((struct sockaddr_in6 *) - (*resolution_courante).ai_addr)) - .sin6_addr.s6_addr[i]); - } + sprintf((*((struct_socket *) (*s_objet_resultat) + .objet)).adresse, + "%02X%02X:%02X%02X:%02X%02X:%02X%02X:" + "%02X%02X:%02X%02X:%02X%02X:%02X%02X(%u)", + (*((struct sockaddr_in6 *) + (*resolution_courante).ai_addr)).sin6_addr + .s6_addr[0], + (*((struct sockaddr_in6 *) + (*resolution_courante).ai_addr)).sin6_addr + .s6_addr[1], + (*((struct sockaddr_in6 *) + (*resolution_courante).ai_addr)).sin6_addr + .s6_addr[2], + (*((struct sockaddr_in6 *) + (*resolution_courante).ai_addr)).sin6_addr + .s6_addr[3], + (*((struct sockaddr_in6 *) + (*resolution_courante).ai_addr)).sin6_addr + .s6_addr[4], + (*((struct sockaddr_in6 *) + (*resolution_courante).ai_addr)).sin6_addr + .s6_addr[5], + (*((struct sockaddr_in6 *) + (*resolution_courante).ai_addr)).sin6_addr + .s6_addr[6], + (*((struct sockaddr_in6 *) + (*resolution_courante).ai_addr)).sin6_addr + .s6_addr[7], + (*((struct sockaddr_in6 *) + (*resolution_courante).ai_addr)).sin6_addr + .s6_addr[8], + (*((struct sockaddr_in6 *) + (*resolution_courante).ai_addr)).sin6_addr + .s6_addr[9], + (*((struct sockaddr_in6 *) + (*resolution_courante).ai_addr)).sin6_addr + .s6_addr[10], + (*((struct sockaddr_in6 *) + (*resolution_courante).ai_addr)).sin6_addr + .s6_addr[11], + (*((struct sockaddr_in6 *) + (*resolution_courante).ai_addr)).sin6_addr + .s6_addr[12], + (*((struct sockaddr_in6 *) + (*resolution_courante).ai_addr)).sin6_addr + .s6_addr[13], + (*((struct sockaddr_in6 *) + (*resolution_courante).ai_addr)).sin6_addr + .s6_addr[14], + (*((struct sockaddr_in6 *) + (*resolution_courante).ai_addr)).sin6_addr + .s6_addr[15], + (unsigned int) port); # else if ((*s_etat_processus).langue == 'F') { @@ -5788,11 +5972,6 @@ instruction_open(struct_processus *s_eta } freeaddrinfo(resolution); - - sprintf((*((struct_socket *) (*s_objet_resultat) - .objet)).adresse, "%s(%u)", - (*((struct_socket *) (*s_objet_resultat) - .objet)).adresse, (unsigned int) port); } else { // Hôte défini par une adresse @@ -5804,7 +5983,7 @@ instruction_open(struct_processus *s_eta .objet)).adresse); if (((*((struct_socket *) (*s_objet_resultat) - .objet)).adresse = malloc(22 * + .objet)).adresse = malloc(23 * sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = @@ -5812,23 +5991,11 @@ instruction_open(struct_processus *s_eta return; } - (*((struct_socket *) (*s_objet_resultat).objet)) - .adresse[0] = d_code_fin_chaine; - - for(i = 0; i < 4; i++) - { - sprintf((*((struct_socket *) - (*s_objet_resultat).objet)).adresse, - (i == 0) ? "%s%d" : "%s.%d", - (*((struct_socket *) - (*s_objet_resultat) - .objet)).adresse, (int) adresse[i]); - } - sprintf((*((struct_socket *) (*s_objet_resultat) - .objet)).adresse, "%s(%u)", - (*((struct_socket *) (*s_objet_resultat) - .objet)).adresse, (unsigned int) port); + .objet)).adresse, "%d.%d.%d.%d(%u)", + (int) adresse[0], (int) adresse[1], + (int) adresse[2], (int) adresse[3], + (unsigned int) port); } else { @@ -5907,7 +6074,7 @@ instruction_open(struct_processus *s_eta .objet)).adresse); if (((*((struct_socket *) (*s_objet_resultat) - .objet)).adresse = malloc(55 * + .objet)).adresse = malloc(47 * sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = @@ -5915,24 +6082,28 @@ instruction_open(struct_processus *s_eta return; } - (*((struct_socket *) (*s_objet_resultat).objet)) - .adresse[0] = d_code_fin_chaine; - - for(i = 0; i < 16; i++) - { - sprintf((*((struct_socket *) - (*s_objet_resultat).objet)).adresse, - (i == 0) ? "%s%X" : "%s:%X", - (*((struct_socket *) - (*s_objet_resultat) - .objet)).adresse, (unsigned int) - adresse[i]); - } - sprintf((*((struct_socket *) (*s_objet_resultat) - .objet)).adresse, "%s(%u)", - (*((struct_socket *) (*s_objet_resultat) - .objet)).adresse, (unsigned int) port); + .objet)).adresse, + "%02X%02X:%02X%02X:%02X%02X:%02X%02X:" + "%02X%02X:%02X%02X:%02X%02X:%02X%02X" + "(%u)", + (unsigned int) adresse[0], + (unsigned int) adresse[1], + (unsigned int) adresse[2], + (unsigned int) adresse[3], + (unsigned int) adresse[4], + (unsigned int) adresse[5], + (unsigned int) adresse[6], + (unsigned int) adresse[7], + (unsigned int) adresse[8], + (unsigned int) adresse[9], + (unsigned int) adresse[10], + (unsigned int) adresse[11], + (unsigned int) adresse[12], + (unsigned int) adresse[13], + (unsigned int) adresse[14], + (unsigned int) adresse[15], + (unsigned int) port); } else {