--- rpl/src/instructions_o1.c 2015/06/08 14:11:38 1.83 +++ rpl/src/instructions_o1.c 2019/10/31 15:40:16 1.99 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.22 - Copyright (C) 1989-2015 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.32 + Copyright (C) 1989-2019 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; } @@ -870,19 +870,6 @@ instruction_or(struct_processus *s_etat_ */ -#define d_BIND_TO_DEVICE 0 -#define d_BROADCAST 1 -#define d_DONT_ROUTE 2 -#define d_KEEP_ALIVE 3 -#define d_PRIORITY 4 -#define d_RECEIVE_BUFFER 5 -#define d_FORCE_RECEIVE_BUFFER 6 -#define d_SEND_BUFFER 7 -#define d_FORCE_SEND_BUFFER 8 -#define d_RECEIVING_TIMEOUT 9 -#define d_SENDING_TIMEOUT 10 -#define d_REUSE_ADDRESS 11 - static inline logical1 options_socket(struct_processus *s_etat_processus, struct_objet *s_objet_resultat, unsigned char *options, @@ -916,6 +903,9 @@ options_socket(struct_processus *s_etat_ d_ex_erreur_parametre_fichier; return(d_erreur); } + + (*((struct_socket *) (*s_objet_resultat).objet)).options |= + ((integer8) 1) << d_BIND_TO_DEVICE; # else WARNING("BIND TO DEVICE"); # endif @@ -930,6 +920,9 @@ options_socket(struct_processus *s_etat_ d_ex_erreur_parametre_fichier; return(d_erreur); } + + (*((struct_socket *) (*s_objet_resultat).objet)).options |= + ((integer8) 1) << d_BROADCAST; } if (options[d_DONT_ROUTE] == 'Y') @@ -941,6 +934,9 @@ options_socket(struct_processus *s_etat_ d_ex_erreur_parametre_fichier; return(d_erreur); } + + (*((struct_socket *) (*s_objet_resultat).objet)).options |= + ((integer8) 1) << d_DONT_ROUTE; } if (options[d_KEEP_ALIVE] == 'Y') @@ -965,6 +961,11 @@ options_socket(struct_processus *s_etat_ d_ex_erreur_parametre_fichier; return(d_erreur); } + + (*((struct_socket *) (*s_objet_resultat).objet)).options |= + ((integer8) 1) << d_PRIORITY; + (*((struct_socket *) (*s_objet_resultat).objet)).priorite = + (*priorite); # else WARNING("PRIORITY"); # endif @@ -980,6 +981,11 @@ options_socket(struct_processus *s_etat_ d_ex_erreur_parametre_fichier; return(d_erreur); } + + (*((struct_socket *) (*s_objet_resultat).objet)).options |= + ((integer8) 1) << d_RECEIVE_BUFFER; + (*((struct_socket *) (*s_objet_resultat).objet)).buffer_reception = + (*buffer_reception); } if (options[d_FORCE_RECEIVE_BUFFER] == 'Y') @@ -993,6 +999,11 @@ options_socket(struct_processus *s_etat_ d_ex_erreur_parametre_fichier; return(d_erreur); } + + (*((struct_socket *) (*s_objet_resultat).objet)).options |= + ((integer8) 1) << d_FORCE_RECEIVE_BUFFER; + (*((struct_socket *) (*s_objet_resultat).objet)).buffer_reception = + (*buffer_reception); # else WARNING("FORCE_RECEIVE_BUFFER"); # endif @@ -1008,6 +1019,11 @@ options_socket(struct_processus *s_etat_ d_ex_erreur_parametre_fichier; return(d_erreur); } + + (*((struct_socket *) (*s_objet_resultat).objet)).options |= + ((integer8) 1) << d_SEND_BUFFER; + (*((struct_socket *) (*s_objet_resultat).objet)).buffer_emission = + (*buffer_emission); } if (options[d_FORCE_SEND_BUFFER] == 'Y') @@ -1021,6 +1037,11 @@ options_socket(struct_processus *s_etat_ d_ex_erreur_parametre_fichier; return(d_erreur); } + + (*((struct_socket *) (*s_objet_resultat).objet)).options |= + ((integer8) 1) << d_FORCE_SEND_BUFFER; + (*((struct_socket *) (*s_objet_resultat).objet)).buffer_emission = + (*buffer_emission); # else WARNING("FORCE_SEND_BUFFER"); # endif @@ -1036,6 +1057,11 @@ options_socket(struct_processus *s_etat_ d_ex_erreur_parametre_fichier; return(d_erreur); } + + (*((struct_socket *) (*s_objet_resultat).objet)).options |= + ((integer8) 1) << d_RECEIVING_TIMEOUT; + (*((struct_socket *) (*s_objet_resultat).objet)).timeout_reception = + (*timeout_reception); } if (options[d_SENDING_TIMEOUT] == 'Y') @@ -1048,6 +1074,11 @@ options_socket(struct_processus *s_etat_ d_ex_erreur_parametre_fichier; return(d_erreur); } + + (*((struct_socket *) (*s_objet_resultat).objet)).options |= + ((integer8) 1) << d_SENDING_TIMEOUT; + (*((struct_socket *) (*s_objet_resultat).objet)).timeout_emission = + (*timeout_emission); } if (options[d_REUSE_ADDRESS] == 'Y') @@ -1059,6 +1090,9 @@ options_socket(struct_processus *s_etat_ d_ex_erreur_parametre_fichier; return(d_erreur); } + + (*((struct_socket *) (*s_objet_resultat).objet)).options |= + ((integer8) 1) << d_REUSE_ADDRESS; } return(d_absence_erreur); @@ -2327,6 +2361,7 @@ instruction_open(struct_processus *s_eta { type_arguments = 'S'; } + else if (type_arguments == 'F') { liberation(s_etat_processus, s_objet_argument); @@ -4841,6 +4876,7 @@ instruction_open(struct_processus *s_eta = 'Y'; (*((struct_socket *) (*s_objet_resultat).objet)).socket_connectee = d_faux; + (*((struct_socket *) (*s_objet_resultat).objet)).options = 0; if (type_domaine == 'L') { // Socket serveur @@ -5019,7 +5055,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 = @@ -5028,7 +5064,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, @@ -5040,7 +5076,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 @@ -5130,8 +5167,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 = @@ -5139,17 +5187,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') { @@ -5174,11 +5264,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 @@ -5188,7 +5273,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 = @@ -5196,22 +5281,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)) @@ -5272,7 +5346,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 = @@ -5280,23 +5354,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)) @@ -5601,7 +5679,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 = @@ -5610,7 +5688,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, @@ -5622,7 +5700,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 @@ -5710,7 +5789,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 = @@ -5718,17 +5797,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') { @@ -5753,11 +5874,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 @@ -5769,7 +5885,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 = @@ -5777,23 +5893,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 { @@ -5872,7 +5976,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 = @@ -5880,24 +5984,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 {