From 5cb2b373b4f53663c73f6b93ea62a7b266d30740 Mon Sep 17 00:00:00 2001 From: xdrm-brackets Date: Wed, 16 Dec 2015 21:38:39 +0100 Subject: [PATCH] =?UTF-8?q?usr@srv=20presque=20totalement=20op=C3=A9ration?= =?UTF-8?q?nel,=20encore=20pb=20de=20buffer=20au=20niveau=20du=20-->LIST?= =?UTF-8?q?=20et=20des=20fois=20=C3=A0=20la=20co=20+=20core=20dump=20si=20?= =?UTF-8?q?mauvais=20serveur?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dep/client.c | 120 +++++--------------------------------------------- dep/client.h | 15 +++---- dep/server.c | 71 +++++++++++++++++++++++------ dep/server.h | 8 +++- dep/utility.c | 13 +++--- proxy_ftp.c | 41 ++++++++--------- proxy_ftp.h | 14 +++--- test | Bin 22902 -> 22778 bytes 8 files changed, 114 insertions(+), 168 deletions(-) diff --git a/dep/client.c b/dep/client.c index ffd70b8..ad7881f 100644 --- a/dep/client.c +++ b/dep/client.c @@ -1,115 +1,13 @@ #include "client.h" - - - - - -void CLIENT_REQUEST(char* serverHost, char* serverPort, char* pRequest, char** pAnswer){ - if( DEBUGMOD&HDR ) printf("====== CLIENT_REQUEST(%s, %s, %s, %s) ======\n\n", serverHost, serverPort, pRequest, *pAnswer); - - struct addrinfo hints; // contiendra le filtre/format - struct addrinfo* addrinfo; // contiendra les infos - int SOCKET, CONNECT; // file_desc(s) - char BUFFER[maxBuffLen]; // BUFFER de communication - // char pAnswer[maxBuffLen] = {0}; // on vide la réponse (contiendra la réponse du serveur) - - /* [1] On définit le filtre/format - =======================================================*/ - memset(&hints, 0, sizeof(struct addrinfo)); // on vide le filtre - hints.ai_family = AF_UNSPEC; // Allow IPv4 ou IPv6 - hints.ai_socktype = SOCK_STREAM; // TCP (SOCK_DGRAM = UDP) - hints.ai_flags = 0; // non spécifié - hints.ai_protocol = 0; // non spécifié - - if( DEBUGMOD&SCK ) printf("============HINTS===========\n"); - if( DEBUGMOD&SCK ) printf( "AI_FLAGS = %d\n", hints.ai_flags ); // int - if( DEBUGMOD&SCK ) printf( "AI_FAMILY = %d\n", hints.ai_family ); // int - if( DEBUGMOD&SCK ) printf( "AI_SOCKTYPE = %d\n", hints.ai_socktype ); // int - if( DEBUGMOD&SCK ) printf( "AI_PROTOCOL = %d\n", hints.ai_protocol ); // int - if( DEBUGMOD&SCK ) printf( "AI_ADDRLEN = %d\n", hints.ai_addrlen ); // int - if( DEBUGMOD&SCK ) printf("\n"); - - - /* [2] On récupère les infos - =======================================================*/ - getaddrinfo(serverHost, serverPort, &hints, &addrinfo); - - if( DEBUGMOD&SCK ) printf("=============RES============\n"); - if( DEBUGMOD&SCK ) printf( "AI_FLAGS = %d\n", addrinfo->ai_flags ); // int - if( DEBUGMOD&SCK ) printf( "AI_FAMILY = %d\n", addrinfo->ai_family ); // int - if( DEBUGMOD&SCK ) printf( "AI_SOCKTYPE = %d\n", addrinfo->ai_socktype ); // int - if( DEBUGMOD&SCK ) printf( "AI_PROTOCOL = %d\n", addrinfo->ai_protocol ); // int - if( DEBUGMOD&SCK ) printf( "AI_ADDRLEN = %d\n", addrinfo->ai_addrlen ); // int - if( DEBUGMOD&SCK ) printf("\n"); - - /* [3] Création de la socket - =======================================================*/ - SOCKET = socket(addrinfo->ai_family, addrinfo->ai_socktype, 0); - - if( DEBUGMOD&SCK ) printf("SOCKET = %d\n", SOCKET); - - // si erreur - if( SOCKET == -1 ) return; - - /* [4] On établit la connection - =======================================================*/ - CONNECT = connect( - SOCKET, - addrinfo->ai_addr, - addrinfo->ai_addrlen - ); - - if( DEBUGMOD&SCK ) printf("CONNECT = %d\n", CONNECT); - - // si erreur - if( CONNECT == -1 ) return; - - // on a plus besoin des infos de l'adresse - freeaddrinfo(addrinfo); - - - /* [5] On écrit sur la socket - =======================================================*/ - int nbSend = swrite(&SOCKET, pRequest); - - if( DEBUGMOD&BUF ) printf("nbSend: %d\n", nbSend); - if( DEBUGMOD&BUF ) printf("Message: %s\n", pRequest); - - // si pas tout envoyé - if( strlen(pRequest) != nbSend ) return; - - /* [6] On lit la réponse - =======================================================*/ - // memset(BUFFER, '\0', sizeof(BUFFER)); // on vide le buffer - int nbRecup = sread(&SOCKET, BUFFER); - - *pAnswer = malloc( maxBuffLen ); - strcpy(*pAnswer, BUFFER); - - if( DEBUGMOD&BUF ) printf("nbReceived: %d\n", nbRecup); - if( DEBUGMOD&BUF ) printf("Message: %s\n", *pAnswer); - - - /* [7] On ferme la connection - =======================================================*/ - int closeState = close(SOCKET); - - // if( closeState == -1 ) return; -} - - - - -void CONNECT_CLIENT(char* serverHost, char* serverPort, int* pSocket){ - if( DEBUGMOD&HDR ) printf("====== INIT_CLIENT(%s, %s, %d) ======\n\n", serverHost, serverPort, *pSocket); +int CONNECT_CLIENT(char* serverHost, char* serverPort, int* pSocket){ + if( DEBUGMOD&HDR ) printf("====== CONNECT_CLIENT(%s, %s, %d) ======\n\n", serverHost, serverPort, *pSocket); struct addrinfo hints; // contiendra le filtre/format struct addrinfo* addrinfo; // contiendra les infos int CONNECT; // file_desc(s) - char BUFFER[maxBuffLen]; // BUFFER de communication - // char pAnswer[maxBuffLen] = {0}; // on vide la réponse (contiendra la réponse du serveur) + char BUFFER[maxBuffLen]; // BUFFER de communication /* [1] On définit le filtre/format =======================================================*/ @@ -147,7 +45,7 @@ void CONNECT_CLIENT(char* serverHost, char* serverPort, int* pSocket){ if( DEBUGMOD&SCK ) printf("SOCKET = %d\n", *pSocket); // si erreur - if( *pSocket == -1 ) return; + if( *pSocket == -1 ) return -1; /* [4] On établit la connection =======================================================*/ @@ -160,15 +58,17 @@ void CONNECT_CLIENT(char* serverHost, char* serverPort, int* pSocket){ if( DEBUGMOD&SCK ) printf("CONNECT = %d\n", CONNECT); // si erreur - if( CONNECT == -1 ) return; + if( CONNECT == -1 ) return -1; // on a plus besoin des infos de l'adresse - freeaddrinfo(addrinfo); + freeaddrinfo(addrinfo); + + return *pSocket; } -void CLIENT_SEND(int* pSocket, char* pRequest, char** pAnswer){ +int CLIENT_SEND(int* pSocket, char* pRequest, char** pAnswer){ if( DEBUGMOD&HDR ) printf("====== CLIENT_SEND(%d, %s, %s) ======\n\n", *pSocket, pRequest, *pAnswer); char BUFFER[maxBuffLen] = {0}; @@ -180,7 +80,7 @@ void CLIENT_SEND(int* pSocket, char* pRequest, char** pAnswer){ if( DEBUGMOD&BUF ) printf("Message: %s\n", pRequest); // si pas tout envoyé - if( strlen(pRequest) != nbSend ) return; + if( strlen(pRequest) != nbSend ) return -1; /* [6] On lit la réponse =======================================================*/ diff --git a/dep/client.h b/dep/client.h index 7b87ec1..afb1fa0 100644 --- a/dep/client.h +++ b/dep/client.h @@ -2,16 +2,13 @@ * * @serverHost Nom de l'hôte distant (server) * @serverPort Numéro du port distant (server) -* @pRequest Requête à envoyer au serveur +* @pSocket Pointeur sur la requête à créer * -* @pAnswer Pointeur sur le à remplir => contiendra la réponse du serveur -* +* +* @return error retourne -1 en cas d'erreur, sinon la SOCKET */ -void CLIENT_REQUEST(char* serverHost, char* serverPort, char* pRequest, char** pAnswer); +int CONNECT_CLIENT(char* serverHost, char* serverPort, int* pSocket); - -void CONNECT_CLIENT(char* serverHost, char* serverPort, int* pSocket); - - -void CLIENT_SEND(int* pSocket, char* pRequest, char** pAnswer); \ No newline at end of file +// retourne -1 en cas d'erreur +int CLIENT_SEND(int* pSocket, char* pRequest, char** pAnswer); \ No newline at end of file diff --git a/dep/server.c b/dep/server.c index 8227183..ce3f000 100644 --- a/dep/server.c +++ b/dep/server.c @@ -127,30 +127,71 @@ void DROP_SERVER(char* serverHost, char** givenPort, int* listenSocket){ // CMD: CLIENT (SRV) PROXY (CLT) FTP // DTA: CLIENT (CLT) PROXY (CLT) FTP // -void MANAGE_REQUEST(char* pRequest, int* DUSER_SOCKET, int* DFTP_SOCKET){ - if( DEBUGMOD&HDR ) printf("====== MANAGE_REQUEST(%s, %d, %d) ======\n\n", pRequest, *DUSER_SOCKET, *DFTP_SOCKET); +void MANAGE_REQUEST(char* pRequest, int* USER_SOCKET, int* FTP_SOCKET, int* DUSER_SOCKET, int* DFTP_SOCKET){ + if( DEBUGMOD&HDR ) printf("====== MANAGE_REQUEST(%s, %d, %d, %d, %d) ======\n\n", pRequest, *USER_SOCKET, *FTP_SOCKET, *DUSER_SOCKET, *DFTP_SOCKET); - char answer[maxBuffLen]; // contiendra la réponse + + char response[maxBuffLen]; // contiendra la réponse int nbSend; // contiendra le nombre de données envoyées - char rCommand[10]; // contiendra les commandes (1ère partie) + char rCommand[5]; // contiendra les commandes (1ère partie) char rContent[maxBuffLen]; // contiendra le contenu associé à la commande (2ème partie) // on vide les buffers memset(&rCommand, '\0', sizeof(rCommand)); memset(&rContent, '\0', sizeof(rContent)); - memset(&answer, '\0', sizeof(answer)); + memset(&response, '\0', sizeof(response)); /* [1] On découpe la requête en 2 parties ================================================*/ splitFtpRequest(pRequest, rCommand, rContent); + /* [2] Selection en fonction de @rCommand ================================================*/ - /* (1) PORT a1,a2,a3,a4,p1,p2 => utilisateur (actif) + /* (1) USER username@serveur => connection FTP (commande) --------------------------------------------*/ - if( strcmp(rCommand, "PORT") == 0 ){ + if( strcmp(rCommand, "USER") == 0 && indexOf(rContent, '@') >= 0 ){ + char userName[maxBuffLen] = {0}; + char hostName[maxHostLen] = {0}; + + sscanf(rContent, "%[^@]@%s\r\n", userName, hostName); + + + if( DEBUGMOD&BUF ) printf("USERNAME [[%s]]\n", userName); + if( DEBUGMOD&BUF ) printf("HOSTNAME [[%s]]\n", hostName); + + /* On se connecte au serveur FTP (commandes) */ + CONNECT_CLIENT(hostName, FTP_PORT, FTP_SOCKET); + if( *FTP_SOCKET == -1 ) printf("CAN'T CONNECT TO GIVEN SERVER!!\n"); + + if( DEBUGMOD&SCK ) printf("FTP SOCKET CONNECTED AT %s:%s\n", hostName, FTP_PORT); + + /* On envoie la séquence d'initialisation */ + char BUFFER[maxBuffLen] = {0}; + char* ftp_response; ftp_response = malloc(maxBuffLen); + memset(ftp_response, 0, maxBuffLen); + + strcpy(BUFFER, "\r\n"); + CLIENT_SEND(FTP_SOCKET, BUFFER, &ftp_response); + + if( DEBUGMOD&CMD ) xPrint("P->F: %s\n\n", BUFFER); + if( DEBUGMOD&CMD ) xPrint("F->P: %s\n", ftp_response); + + // char BUFF[maxBuffLen] = {0}; + // strcpy(BUFF, ""); + // swrite(FTP_SOCKET, BUFF); + // sread(FTP_SOCKET, BUFF); + // swrite(USER_SOCKET, strcat(BUFF, "\r\n")); + + strcpy(response, "USER xdrm\r\n"); + printf("RESP: [[%s]]\n", response); + } + + /* (2) PORT a1,a2,a3,a4,p1,p2 => utilisateur (actif) + --------------------------------------------*/ + else if( strcmp(rCommand, "PORT") == 0 ){ int a1, a2, a3, a4 = 0; int p1, p2 = 0; @@ -171,19 +212,23 @@ void MANAGE_REQUEST(char* pRequest, int* DUSER_SOCKET, int* DFTP_SOCKET){ if( DEBUGMOD&SCK ) printf("CONNECTED TO CLIENT %s:%s\n", serverHost, serverPort); // on envoie PASV car on veut être en mode passif entre le proxy et le serveur FTP - strcpy(pRequest, "PASV\r\n"); + strcpy(response, "PASV\r\n"); } - // WAIT_SOCKET_UPDATE(DFTP_SOCKET, BUFFER); - // xPrint("FTPLIST: %s\n", BUFFER); - /* [3] Envoi de la réponse + /* (n) Si aucun traitement on recopie la requête telquel + --------------------------------------------*/ + else + strcpy(response, pRequest); + + /* [3] Retour de la réponse ================================================*/ + strcpy(pRequest, response); } -void MANAGE_RESPONSE(int* USER_SOCKET, int* FTP_SOCKET, char* pAnswer, int* DUSER_SOCKET, int* DFTP_SOCKET){ - if( DEBUGMOD&HDR ) printf("====== MANAGE_RESPONSE(%d, %s, %d, %d) ======\n\n", *USER_SOCKET, pAnswer, *DUSER_SOCKET, *DFTP_SOCKET); +void MANAGE_RESPONSE(char* pAnswer, int* USER_SOCKET, int* FTP_SOCKET, int* DUSER_SOCKET, int* DFTP_SOCKET){ + if( DEBUGMOD&HDR ) printf("====== MANAGE_RESPONSE(%s, %d, %d, %d, %d) ======\n\n", pAnswer, *USER_SOCKET, *FTP_SOCKET, *DUSER_SOCKET, *DFTP_SOCKET); char response[maxBuffLen]; // contiendra la réponse char ftpCodeStr[4]; // contiendra le code FTP (1ère partie) diff --git a/dep/server.h b/dep/server.h index e3ee8dd..980dbf4 100644 --- a/dep/server.h +++ b/dep/server.h @@ -13,6 +13,8 @@ void DROP_SERVER(char* serverHost, char** givenPort, int* listenSocket); /* Gestion de la requête du client * * @pBuffer Requête en question +* @USER_SOCKET Pointeur sur la SOCKET du BUS DE COMMANDES utilisateur +* @FTP_SOCKET Pointeur sur la SOCKET du BUS DE COMMANDES FTP * @DUSER_SOCKET Pointeur sur la SOCKET du BUS DE DONNEES utilisateur * @DFTP_SOCKET Pointeur sur la SOCKET du BUS DE DONNEES FTP * @@ -21,13 +23,15 @@ void DROP_SERVER(char* serverHost, char** givenPort, int* listenSocket); * [2] * [3] */ -void MANAGE_REQUEST(char* pRequest, int* DUSER_SOCKET, int* DFTP_SOCKET); +void MANAGE_REQUEST(char* pRequest, int* USER_SOCKET, int* FTP_SOCKET, int* DUSER_SOCKET, int* DFTP_SOCKET); /* Gestion de la réponse du serveur FTP et modification de la réponse * * @pAnswer Pointeur sur le buffer de réponse du serveur FTP +* @USER_SOCKET Pointeur sur la SOCKET du BUS DE COMMANDES utilisateur +* @FTP_SOCKET Pointeur sur la SOCKET du BUS DE COMMANDES FTP * @DUSER_SOCKET Pointeur sur la SOCKET du BUS DE DONNEES utilisateur * @DFTP_SOCKET Pointeur sur la SOCKET du BUS DE DONNEES FTP * @@ -43,7 +47,7 @@ void MANAGE_REQUEST(char* pRequest, int* DUSER_SOCKET, int* DFTP_SOCKET); * [4] SI 226, on ferme les SOCKETS du BUS DE DONNEES * */ -void MANAGE_RESPONSE(int* USER_SOCKET, int* FTP_SOCKET, char* pAnswer, int* DUSER_SOCKET, int* DFTP_SOCKET); +void MANAGE_RESPONSE(char* pAnswer, int* USER_SOCKET, int* FTP_SOCKET, int* DUSER_SOCKET, int* DFTP_SOCKET); diff --git a/dep/utility.c b/dep/utility.c index fd7d532..fa6c205 100644 --- a/dep/utility.c +++ b/dep/utility.c @@ -114,13 +114,12 @@ int swrite(int* pSocket, char* pBuffer){ // formatBuffer(pBuffer); - /* 2. On evoie le Buffer */ + /* 2. On écrit sur la SOCKET */ if( DEBUGMOD&BUF ) printf("SENDLEN_1: %lu\n", strlen(pBuffer)); int nbSent = write(*pSocket, pBuffer, strlen(pBuffer)); if( DEBUGMOD&BUF ) printf("SENDLEN_2: %d\n", nbSent); - /* 3. On vérifie que le retour est correct */ - // si on est déconnecté, on ferme la SOCKET + /* 3. Si on est déconnecté, on retourne une erreur */ if( nbSent <= 0 ){ if( DEBUGMOD&BUF ) printf("NOTHING TO SEND\n"); return -1; // on retourne une erreur @@ -140,13 +139,16 @@ int sread(int* pSocket, char* pBuffer){ if( *pSocket == -1 ) return -1; // si SOCKET fermée, on retourne une erreur - // on vide le buffer avant de lire + /* 1. On vide le buffer avant de lire */ memset(pBuffer, '\0', maxBuffLen); if( DEBUGMOD&BUF ) printf("READLEN_1: %lu\n", strlen(pBuffer)); + + /* 2. On lit la SOCKET */ int nbRead = read(*pSocket, pBuffer, maxBuffLen); if( DEBUGMOD&BUF ) printf("READLEN_3: %d\n", nbRead); - // si on est déconnecté, on ferme la SOCKET + + /* 3. Si on est déconnecté, on retourne une erreur */ if( nbRead <= 0 ){ if( DEBUGMOD&BUF ) printf("NOTHING TO READ\n"); return -1; // on retourne une erreur @@ -156,6 +158,7 @@ int sread(int* pSocket, char* pBuffer){ if( DEBUGMOD&RVL ) revealString(pBuffer); if( DEBUGMOD&RVL ) printf("READ_2\n"); + /* 4. On retourne le nombre de caractères lus */ return nbRead; } diff --git a/proxy_ftp.c b/proxy_ftp.c index 3dcb12c..0f79349 100644 --- a/proxy_ftp.c +++ b/proxy_ftp.c @@ -1,9 +1,7 @@ #include "proxy_ftp.h" // DECLARATIONS -static pthread_t userServer; -static short unsigned int userServerState = 1; -static char remoteAssignedPort[maxPortLen] = {'\0'}; +static pthread_t managers[maxListLen]; /* headers */ static void* testServer(); @@ -42,10 +40,10 @@ int main(int argc, char* argv[]){ static void* testServer(char* localPort){ - int USER_SOCKET; // contiendra le BUS DE COMMANDE utilisateur - int FTP_SOCKET; // contiendra le BUS DE COMMANDE FTP - int DUSER_SOCKET; // contiendra le BUS DE DONNES utilisateur - int DFTP_SOCKET; // contiendra le BUS DE DONNEES FTP + int USER_SOCKET = -1; // contiendra le BUS DE COMMANDE utilisateur + int FTP_SOCKET = -1; // contiendra le BUS DE COMMANDE FTP + int DUSER_SOCKET = -1; // contiendra le BUS DE DONNES utilisateur + int DFTP_SOCKET = -1; // contiendra le BUS DE DONNEES FTP char BUFFER[maxBuffLen]; // contiendra le BUFFER struct sockaddr_storage clientInfo; // contiendra les infos client @@ -67,27 +65,23 @@ static void* testServer(char* localPort){ DROP_SERVER(remoteHost, &serverPort, &LISTENSOCK); - CONNECT_CLIENT(FTP_HOST, FTP_PORT, &FTP_SOCKET); - printf("Port: %s\n", serverPort); - strcpy(remoteAssignedPort, serverPort);// PORT GLOBAL + + /* [1] Attente d'une demande de connection, puis création d'une socket ============================================================================*/ USER_SOCKET = accept(LISTENSOCK, (struct sockaddr *) &clientInfo, &len); - /* [2] On envoie la séquence d'initialisation - ============================================================================*/ - strcpy(BUFFER, ""); - CLIENT_SEND(&FTP_SOCKET, BUFFER, &ftp_response); - MANAGE_RESPONSE(&USER_SOCKET, &FTP_SOCKET, ftp_response, &DUSER_SOCKET, &DFTP_SOCKET); - swrite(&USER_SOCKET, ftp_response); - if( DEBUGMOD&CMD ) xPrint("P->F: %s\n\n", BUFFER); - if( DEBUGMOD&CMD ) xPrint("F->P: %s\n", ftp_response); +// static void* manageConnection(int* USER_SOCKET){ + + /* [2] Envoi de la séquence de Bienvenue + ============================================================================*/ + swrite(&USER_SOCKET, WLCM_MSG); /* BOUCLE DE COMMANDES */ - while( USER_SOCKET != -1 && FTP_SOCKET != -1 ){ + while( USER_SOCKET != -1 ){ /* [3] On récupère les données reçues (+attente) ============================================================================*/ @@ -97,7 +91,10 @@ static void* testServer(char* localPort){ /* [4] Traitement de la requête ============================================================================*/ - MANAGE_REQUEST(BUFFER, &DUSER_SOCKET, &DFTP_SOCKET); + MANAGE_REQUEST(BUFFER, &USER_SOCKET, &FTP_SOCKET, &DUSER_SOCKET, &DFTP_SOCKET); + + // si on a pas la connection FTP (commande) initialisée, on quitte + // if( FTP_SOCKET == -1 ) break; /* [5] Redirection vers le serveur FTP @@ -108,7 +105,7 @@ static void* testServer(char* localPort){ /* [6] Traitement de la réponse (FTP) ============================================================================*/ - MANAGE_RESPONSE(&USER_SOCKET, &FTP_SOCKET, ftp_response, &DUSER_SOCKET, &DFTP_SOCKET); + MANAGE_RESPONSE(ftp_response, &USER_SOCKET, &FTP_SOCKET, &DUSER_SOCKET, &DFTP_SOCKET); @@ -126,10 +123,10 @@ static void* testServer(char* localPort){ /* [9] Fermeture des connections (SOCKETS) ============================================================================*/ + printf("CLOSING CONNECTIONS\n"); close(USER_SOCKET); close(FTP_SOCKET); close(LISTENSOCK); - strcpy(remoteAssignedPort, "\0"); } diff --git a/proxy_ftp.h b/proxy_ftp.h index 4911a5d..b76a557 100644 --- a/proxy_ftp.h +++ b/proxy_ftp.h @@ -15,12 +15,12 @@ /* debug */ -#define ONLY_SOCKETS 0x01 // debug RESEAU -#define ONLY_COMMAND 0x02 // debug COMMANDES -#define ONLY_DATA 0x04 // debug DONNEES -#define ONLY_REVEALS 0x08 // debug EXPLICITATION des strings -#define ONLY_BUFFERS 0x10 // debug des BUFFERS -#define ONLY_HEADERS 0x20 // debug des HEADERS de fonctions +#define SOCKETS 0x01 // debug RESEAU +#define COMMAND 0x02 // debug COMMANDES +#define DATA 0x04 // debug DONNEES +#define REVEALS 0x08 // debug EXPLICITATION des strings +#define BUFFERS 0x10 // debug des BUFFERS +#define HEADERS 0x20 // debug des HEADERS de fonctions #define SCK 0x01 // FILTRE pour ONLY_SOCKET #define CMD 0x02 // FILTRE pour ONLY_COMMAND @@ -31,7 +31,7 @@ // possibilité de cumuler les DEBUGMODES /* DEBUGMOD ONLY_COMMAND + ONLY_DATA + .. */ -#define DEBUGMOD ONLY_REVEALS +#define DEBUGMOD COMMAND // REVEALS + HEADER /* vars */ diff --git a/test b/test index 80474b72eec9456b70ac7af62da37cdeb03359e1..b8d2a49ee96311a7b12968fa2c3dd1045f3ae2f8 100755 GIT binary patch delta 5711 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 delta 5706 zcmb7I3s_WD9zXX2h9oir>VWdNh@t`_L$;ck4$0&tQ4wilD-)G5HO1sn_N_J=jyVle z+JV--?90Bd*S2nDNQnuUn$tV&wN|^Pl{p5jV5Vl;-QWM5J0!Z_KJNE%{^$PRuk*i$ zIk#0g{fe@Fe^gyI6Hi_ChA*;vpH$^rJhv(jq}FAav$W;=Pa@@~H=AMY)F zYV(Pkwl1`fS-$m}qc5&Yb2V;M_p3@|g7KHb6ez#EzXf&4TF3kH5Q zj8pStQt}zw9+OwbZqi3a0_e48`|94K_o%b>Y$sE?XIJ&9S#3lz4#%XdBHVU*BYvLH zCnHUezBWm#u4^8xF;-)}2}*+Z8HO=yU&OPG^ZOiBV;aI3YrkFhInV0eeQnS4sWF~# z1vtLRa)a9c7*Do*9Jd7I!!fV2HM?rA5cb<|<>A&bscCI5!S~=hXAOfmbZ;Q&Q5b7` zm9X1@<>RgCt~-dfgIO4BB|nKPASHr6ru(K!n(qC;8xYEapM&akp08bbp1H5s4sVV2 zw6+$~IZ?_9OXr}gZ7*R*0L!1VUT^*Q3>@)$I!^$=%BeH_oVB+9!-PeA<@#0OLx)4E zIwE){eVTTG~N6ZrUp1ITg z{_WW6{syAyK55hEksbtsRR~=7d5FiSM}~He@ExRvsux@a4zK5FVxZM+)SfkJB93>0 z9%3)Dm^~4V+l*<$a zf;Fey@S{Os=Y6DKv%gwxUxeU9ck~cnDa2ofcpG(Tu;UaId3Qq>7@>ZZb6 zR#jol=aHrZ!KWzL|5(*01&8p?tAdr>^f4-}+OCI0d(_orawA`&w%OfTscoU$kYtQ0 zN%bT8r6=^AlNY7SA=7nGw)H{#Ns+0u1+ ztOtR6o6j3CU46QXZyWFjb>T@KV;iPAPV%ufO`UL(-(nl1)^u@h%Tecb@i%P+>Vi&g ziBBF?3Q@R+&qk|?Y9pDic2aEL0#n;UD<%8-wq76x|JccA#Sc>}Pw=(zsqTm2X?H{J z$`R9M!H491Q<(q_r2v;@*s~ef9f&_PW&%Oi2}oh?eg#60IbUcJNTLVfDw+E1KC z_rQ<(Ujm->CeQqUr(SIJFn?1g*9H!77y5-R-QThb6nL{jfQID+OsD)!WJLE?4~c}8 zbz(ny$W-qe1>Uo*2c>_qGrssI3erN(`I<8YqF(u#=pvl~R+KmM_wxge z@aU+0j$W9QZlYUG^ zE5b8DfLpuytx1}~_==>7%2Rx2QmvB29mxaL!^8M($wSpI!+347OR46^lPlb3XRcdNJGhi*wUK0ix;{yaO!&7U303m z#dEYG-MhRmgJ^ZX ze?RF9T@ys@%IPiu3=vv$b8@tz>BS|wH%D*N<}F>aWKKmnB8${t*Q#pf&2v>%Au>zA z5kJ3XaWrB{jAF-c#_^DGJc=_A<59n3yl_zBDAb19t96=mI=JuzS!y^;AawRtFCR|F&FYKyg(g~W3a{QbeB zlv;jaa6>KLbeFZv+ju^WZCd;gF=bZJ>BP zW1&iLuEWKXYeSPqeJNBml#&g9OTGYphX75&uwMvaV=(_?9pfQwXzBU?}q;%vxY%ej+jlX&79ysMv|28~hlMac4egi4~XT`Pnfk zYY-zEK85j|^nQs4Z5sX^@{c4qvv9;w`upQFH4`DIMX>Tf3}?okjsjl zdGsbgE^CY%Rv*Uyo}syO?W|~NW%W31XjK$b28CTqJ`KQMIi_AXj@pnThVcpBtzR2P z7T$BdF^m$xfpBmI;Ddlq1KxMkF!loGqx#lV zs*|F7sdas>h-54gs6@E`Ht4<{^tIje@t}`B%5NN*>^2bf<9O{>qt}LoJ){U$k|uR) zK(9m=KEIeR>=VI6bjn^PvNEyAdD79ET@e?_Qy||)^a!L7d?zp{{9u!I`0d$!r!EHiHjH&= zH=5Gv5Tc~M4)oQaKM2_E9;sg`JRm8SkH2l8ck<@!Nxjcw7mqTljn+{{U#^X+=avZ$ zrM_{-gqKuBX*3*vQW`g2uZ1aJ^JeF$-u3AYQo`zamvc<)X7g=xx zQJK!|1(TzT=&Fb(34eC(Dah@vIdr;-K6eg!$z*d3Lb=eNWc0X65krdXCXp> zHQ@ctDO1E+PHV#5 zrp$hegG8A4ngFg8JR8LNEUihegOf@WYDvM4CD5(?2=PrlCp2Ek-s