#include "utility.h" void splitFtpRequest(char* pRequest, char* pCommand, char* pContent){ /* [1] Vérification du format ===========================================*/ int firstSpaceIndex = indexOf(pRequest, ' '); if( firstSpaceIndex != 3 && firstSpaceIndex != 4){ // contient aucun espace en position 3 ou 4, on quitte strcpy(pCommand, "ERROR"); strcpy(pContent, ""); return; } /* [2] Séparation des 2 parties ===========================================*/ int i; for( i = 0 ; i < strlen(pRequest) && pRequest[i] != '\0' ; i++ ){ if( i < firstSpaceIndex ) // première partie (pCommand) strcat( pCommand, (char[2]){(char) pRequest[i], '\0'}); if( i > firstSpaceIndex ) // seconde partie (pContent) strcat( pContent, (char[2]){(char) pRequest[i], '\0'}); } } void splitFtpResponse(char* pAnswer, char* ftpCode, char* ftpText){ /* [1] Vérification du format ===========================================*/ int codeLength = 3; // taille du code /* [2] Séparation des 2 parties ===========================================*/ int i; for( i = 0 ; i < strlen(pAnswer) && pAnswer[i] != '\0' ; i++ ){ if( i < codeLength ) // première partie (ftpCode) strcat(ftpCode, (char[2]){(char)pAnswer[i], '\0' }); if( i > codeLength ) // seconde partie (ftpText) strcat(ftpText, (char[2]){(char)pAnswer[i], '\0' }); } } int indexOf(char* haystack, char needle){ int i; for( i = 0 ; i < strlen(haystack) && haystack[i] != '\0' ; i++ ) if( haystack[i] == needle ) // si on trouve le caractère return i; return -1; } int swrite(int* pSocket, char* pBuffer){ if( *pSocket == -1 ) return -1; // si SOCKET fermée, on retourne une erreur if( strlen(pBuffer) == 0 ) return 0; // si on a rien à écrire, on n'écrit rien :p /* 1. 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); /* 2. 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 } if( DEBUGMOD&RVL ) printf("SEND_1\n"); if( DEBUGMOD&RVL ) revealString(pBuffer); if( DEBUGMOD&RVL ) printf("SEND_2\n"); /* 3. On retourne le nombre de envoyés */ return nbSent; } int sread(int* pSocket, char* pBuffer){ if( *pSocket == -1 ) return -1; // si SOCKET fermée, on retourne une erreur /* 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); /* 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 } if( DEBUGMOD&RVL ) printf("READ_1\n"); if( DEBUGMOD&RVL ) revealString(pBuffer); if( DEBUGMOD&RVL ) printf("READ_2\n"); /* 4. On retourne le nombre de caractères lus */ return nbRead; } void setSocketTimeout(int* pSocket, const int pSec, const int pUSec){ /* 1. On créé la structure contenant le timeout */ struct timeval timeout; timeout.tv_sec = pSec; timeout.tv_usec = pUSec; setsockopt(*pSocket, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(struct timeval)); if( DEBUGMOD&SCK ) printf("Set socket(%d) timeout to %lus\n", *pSocket, (long unsigned) timeout.tv_sec ); } void xPrint(char* pPattern, char* pBuffer){ char tmpBuffer[maxBuffLen]; strcpy(tmpBuffer, pBuffer); int i; // on supprimes les retours à la ligne de la fin for( i = strlen(tmpBuffer)-1 ; i >= 0 && tmpBuffer[i] != '\0' ; i-- ) if( tmpBuffer[i] == '\n' || tmpBuffer[i] == '\r' ) // si c'est un retour chariot tmpBuffer[i] = '\0'; // on efface else break; printf(pPattern, pBuffer); } void revealString(char* pString){ /* 1. On créé une copie de @pString */ char revealedString[maxBuffLen] = {0}; /* 2. On rend visible tous les caractères "invisibles" */ int i; for( i = 0 ; i < strlen(pString) && pString[i] != '\0' ; i++ ){ if( pString[i] == '\r' ){ revealedString[strlen(revealedString)] = '\\'; revealedString[strlen(revealedString)] = 'r'; } else if( pString[i] == '\n' ){ revealedString[strlen(revealedString)] = '\\'; revealedString[strlen(revealedString)] = 'n'; } else revealedString[strlen(revealedString)] = pString[i]; revealedString[strlen(revealedString)] = '\0'; } /* 3. On affiche la chaîne explicite */ if( DEBUGMOD&RVL ) printf("[[%s]]\n", revealedString); }