proxy-ftp/dep/utility.c

183 lines
5.1 KiB
C
Raw Normal View History

2015-12-14 20:48:19 +00:00
#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++ ){
2015-12-14 20:48:19 +00:00
if( i < firstSpaceIndex ) // première partie (pCommand)
strcpy( pCommand, strcat(pCommand, (char[2]) { (char) pRequest[i], '\0' }) );
if( i > firstSpaceIndex ) // seconde partie (pContent)
strcpy( 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++ ){
2015-12-14 20:48:19 +00:00
if( i < codeLength ) // première partie (ftpCode)
strcpy( ftpCode, strcat(ftpCode, (char[2]) { (char) pAnswer[i], '\0' }) );
if( i > codeLength ) // seconde partie (ftpText)
strcpy( 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++ )
2015-12-14 20:48:19 +00:00
if( haystack[i] == needle ) // si on trouve le caractère
return i;
return -1;
}
void formatBuffer(char* pBuffer){
if( DEBUGMOD&BUF ) printf( "BUFLEN (bef): %lu\n", strlen(pBuffer) );
if( DEBUGMOD&BUF ) printf( "BUFFER: (%s)\n", pBuffer );
2015-12-14 20:48:19 +00:00
/* [1] On retire les "\n" et "\r" de la fin de la chaine
============================================================*/
int i = strlen(pBuffer);
2015-12-14 20:48:19 +00:00
while( pBuffer[strlen(pBuffer)-1] == '\r' || pBuffer[strlen(pBuffer)-1] == '\n' )
pBuffer[strlen(pBuffer)-1] = '\0';
2015-12-14 20:48:19 +00:00
/* [2] On ajoute "\r\n" à la fin
============================================================*/
strcpy(pBuffer, strcat(pBuffer, "\r\n"));
if( DEBUGMOD&BUF ) printf( "BUFLEN (aft): %lu\n", strlen(pBuffer) );
2015-12-14 20:48:19 +00:00
}
void read_stdin(char* pBuffer, unsigned long pLength){
fgets(pBuffer, pLength, stdin); // on lit l'entrée standard
// on supprimes les retours à la ligne de la fin
int i = strlen(pBuffer);
while( pBuffer[strlen(pBuffer)-1] == '\r' || pBuffer[strlen(pBuffer)-1] == '\n' )
pBuffer[strlen(pBuffer)-1] = '\0';
2015-12-14 20:48:19 +00:00
strcpy(pBuffer, strcat(pBuffer, "\r\n\0"));
2015-12-14 20:48:19 +00:00
}
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
2015-12-14 20:48:19 +00:00
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);
// si on est déconnecté, on ferme la SOCKET
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");
return nbSent;
2015-12-14 20:48:19 +00:00
}
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
memset(pBuffer, '\0', maxBuffLen);
if( DEBUGMOD&BUF ) printf("READLEN_1: %lu\n", strlen(pBuffer));
2015-12-14 20:48:19 +00:00
int nbRead = read(*pSocket, pBuffer, maxBuffLen);
if( DEBUGMOD&BUF ) printf("READLEN_3: %d\n", nbRead);
2015-12-14 20:48:19 +00:00
// si on est déconnecté, on ferme la SOCKET
if( nbRead <= 0 ){
if( DEBUGMOD&BUF ) printf("NOTHING TO READ\n");
2015-12-14 20:48:19 +00:00
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");
2015-12-14 20:48:19 +00:00
return nbRead;
}
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-- )
2015-12-14 20:48:19 +00:00
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("REVEALED: %s\n", revealedString);
2015-12-14 20:48:19 +00:00
}