mirror of
https://github.com/kingk85/uFTP.git
synced 2025-07-17 09:16:11 +03:00
Refactoring, fix
This commit is contained in:
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
build/uFTP
BIN
build/uFTP
Binary file not shown.
BIN
dist/Debug/GNU-Linux/uftp
vendored
BIN
dist/Debug/GNU-Linux/uftp
vendored
Binary file not shown.
@ -50,15 +50,12 @@ int parseCommandUser(clientDataType *theClientData)
|
||||
char *theName;
|
||||
theName = getFtpCommandArg("USER", theClientData->theCommandReceived);
|
||||
|
||||
printTimeStamp();
|
||||
printf("The Name: %s", theName);
|
||||
|
||||
if (strlen(theName) >= 1)
|
||||
{
|
||||
char *theResponse = "331 User ok, Waiting for the password.\r\n";
|
||||
setDynamicStringDataType(&theClientData->login.name, theName, strlen(theName));
|
||||
write(theClientData->socketDescriptor, theResponse, strlen(theResponse));
|
||||
printf("\nUSER COMMAND OK, USERNAME IS: %s", theClientData->login.name.text);
|
||||
//printf("\nUSER COMMAND OK, USERNAME IS: %s", theClientData->login.name.text);
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
@ -75,10 +72,7 @@ int parseCommandSite(clientDataType *theClientData)
|
||||
char *theCommand;
|
||||
theCommand = getFtpCommandArg("SITE", theClientData->theCommandReceived);
|
||||
|
||||
printTimeStamp();
|
||||
printf("\ntheCommand:%s", theCommand);
|
||||
if(strncmp(theCommand, "CHMOD", strlen("CHMOD")) == 0 ||
|
||||
strncmp(theCommand, "chmod", strlen("chmod")) == 0)
|
||||
if(compareStringCaseInsensitive(theCommand, "CHMOD", strlen("CHMOD")) == 1)
|
||||
{
|
||||
setPermissions(theCommand, theClientData->login.absolutePath.text);
|
||||
char *theResponse = "200 Permissions changed\r\n";
|
||||
@ -90,11 +84,11 @@ int parseCommandSite(clientDataType *theClientData)
|
||||
write(theClientData->socketDescriptor, theResponse, strlen(theResponse));
|
||||
}
|
||||
|
||||
|
||||
return 1;
|
||||
//site chmod 777 test
|
||||
//200 Permissions changed on test
|
||||
//500 SITE ciao is an unknown extension
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int parseCommandPass(ftpDataType * data, int socketId)
|
||||
@ -102,9 +96,6 @@ int parseCommandPass(ftpDataType * data, int socketId)
|
||||
char *thePass;
|
||||
thePass = getFtpCommandArg("PASS", data->clients[socketId].theCommandReceived);
|
||||
|
||||
printTimeStamp();
|
||||
printf("The Pass is: %s", thePass);
|
||||
|
||||
if (strlen(thePass) >= 1)
|
||||
{
|
||||
int searchUserNameIndex;
|
||||
@ -115,7 +106,7 @@ int parseCommandPass(ftpDataType * data, int socketId)
|
||||
{
|
||||
char *theResponse = "430 Invalid username or password\r\n";
|
||||
write(data->clients[socketId].socketDescriptor, theResponse, strlen(theResponse));
|
||||
printf("\nLogin Error recorded no such username or password");
|
||||
//printf("\nLogin Error recorded no such username or password");
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -129,10 +120,10 @@ int parseCommandPass(ftpDataType * data, int socketId)
|
||||
write(data->clients[socketId].socketDescriptor, theResponse, strlen(theResponse));
|
||||
printTimeStamp();
|
||||
|
||||
printf("PASS COMMAND OK, PASSWORD IS: %s", data->clients[socketId].login.password.text);
|
||||
printf("\nheClientData->login.homePath: %s", data->clients[socketId].login.homePath.text);
|
||||
printf("\nheClientData->login.ftpPath: %s", data->clients[socketId].login.ftpPath.text);
|
||||
printf("\nheClientData->login.absolutePath: %s", data->clients[socketId].login.absolutePath.text);
|
||||
//printf("PASS COMMAND OK, PASSWORD IS: %s", data->clients[socketId].login.password.text);
|
||||
//printf("\nheClientData->login.homePath: %s", data->clients[socketId].login.homePath.text);
|
||||
//printf("\nheClientData->login.ftpPath: %s", data->clients[socketId].login.ftpPath.text);
|
||||
//printf("\nheClientData->login.absolutePath: %s", data->clients[socketId].login.absolutePath.text);
|
||||
}
|
||||
|
||||
return 1;
|
||||
@ -147,10 +138,10 @@ int parseCommandPass(ftpDataType * data, int socketId)
|
||||
|
||||
int parseCommandAuth(clientDataType *theClientData)
|
||||
{
|
||||
char *theAuth;
|
||||
theAuth = getFtpCommandArg("AUTH", theClientData->theCommandReceived);
|
||||
printTimeStamp();
|
||||
printf("The Auth is: %s", theAuth);
|
||||
//char *theAuth;
|
||||
//theAuth = getFtpCommandArg("AUTH", theClientData->theCommandReceived);
|
||||
//printTimeStamp();
|
||||
//printf("The Auth is: %s", theAuth);
|
||||
char *theResponse = "502 Security extensions not implemented.\r\n";
|
||||
write(theClientData->socketDescriptor, theResponse, strlen(theResponse));
|
||||
return 1;
|
||||
@ -239,7 +230,7 @@ int parseCommandPasv(ftpDataType * data, int socketId)
|
||||
void *pReturn;
|
||||
pthread_cancel(data->clients[socketId].workerData.workerThread);
|
||||
pthread_join(data->clients[socketId].workerData.workerThread, &pReturn);
|
||||
printf("\nThread has been cancelled.");
|
||||
//printf("\nThread has been cancelled.");
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -261,11 +252,11 @@ int parseCommandPort(ftpDataType * data, int socketId)
|
||||
int portBytes[2];
|
||||
theIpAndPort = getFtpCommandArg("PORT", data->clients[socketId].theCommandReceived);
|
||||
sscanf(theIpAndPort, "%d,%d,%d,%d,%d,%d", &ipAddressBytes[0], &ipAddressBytes[1], &ipAddressBytes[2], &ipAddressBytes[3], &portBytes[0], &portBytes[1]);
|
||||
printf("\ntheIpAndPort: %s", theIpAndPort);
|
||||
//printf("\ntheIpAndPort: %s", theIpAndPort);
|
||||
data->clients[socketId].workerData.connectionPort = (portBytes[0]*256)+portBytes[1];
|
||||
sprintf(data->clients[socketId].workerData.activeIpAddress, "%d.%d.%d.%d", ipAddressBytes[0],ipAddressBytes[1],ipAddressBytes[2],ipAddressBytes[3]);
|
||||
printf("\ndata->clients[socketId].workerData.connectionPort: %d", data->clients[socketId].workerData.connectionPort);
|
||||
printf("\ndata->clients[socketId].workerData.activeIpAddress: %s", data->clients[socketId].workerData.activeIpAddress);
|
||||
//printf("\ndata->clients[socketId].workerData.connectionPort: %d", data->clients[socketId].workerData.connectionPort);
|
||||
//printf("\ndata->clients[socketId].workerData.activeIpAddress: %s", data->clients[socketId].workerData.activeIpAddress);
|
||||
|
||||
/* Create worker thread */
|
||||
if (data->clients[socketId].workerData.threadIsAlive == 1)
|
||||
@ -273,7 +264,7 @@ int parseCommandPort(ftpDataType * data, int socketId)
|
||||
void *pReturn;
|
||||
pthread_cancel(data->clients[socketId].workerData.workerThread);
|
||||
pthread_join(data->clients[socketId].workerData.workerThread, &pReturn);
|
||||
printf("\nThread has been cancelled.");
|
||||
//printf("\nThread has been cancelled.");
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -306,7 +297,7 @@ int parseCommandAbor(ftpDataType * data, int socketId)
|
||||
void *pReturn;
|
||||
pthread_cancel(data->clients[socketId].workerData.workerThread);
|
||||
pthread_join(data->clients[socketId].workerData.workerThread, &pReturn);
|
||||
printf("\nThread has been cancelled due to ABOR request.");
|
||||
//printf("\nThread has been cancelled due to ABOR request.");
|
||||
|
||||
memset(theResponse, 0, FTP_COMMAND_ELABORATE_CHAR_BUFFER);
|
||||
sprintf(theResponse, "426 ABORT\r\n");
|
||||
@ -345,17 +336,14 @@ int parseCommandList(ftpDataType * data, int socketId)
|
||||
-t Sort by modification time
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
int isSafePath = 0;
|
||||
char *theNameToList;
|
||||
|
||||
theNameToList = getFtpCommandArg("LIST", data->clients[socketId].theCommandReceived);
|
||||
getFtpCommandArgWithOptions("LIST", data->clients[socketId].theCommandReceived, &data->clients[socketId].workerData.ftpCommand);
|
||||
|
||||
printf("\nLIST COMMAND ARG: %s", data->clients[socketId].workerData.ftpCommand.commandArgs.text);
|
||||
printf("\nLIST COMMAND OPS: %s", data->clients[socketId].workerData.ftpCommand.commandOps.text);
|
||||
// printf("\nLIST COMMAND ARG: %s", data->clients[socketId].workerData.ftpCommand.commandArgs.text);
|
||||
// printf("\nLIST COMMAND OPS: %s", data->clients[socketId].workerData.ftpCommand.commandOps.text);
|
||||
|
||||
cleanDynamicStringDataType(&data->clients[socketId].workerData.ftpCommand.commandArgs, 0);
|
||||
cleanDynamicStringDataType(&data->clients[socketId].workerData.ftpCommand.commandOps, 0);
|
||||
@ -454,7 +442,7 @@ int parseCommandStor(ftpDataType * data, int socketId)
|
||||
if (isSafePath == 1)
|
||||
{
|
||||
pthread_mutex_lock(&data->clients[socketId].workerData.conditionMutex);
|
||||
printf("data->clients[%d].fileToStor = %s", socketId, data->clients[socketId].fileToStor.text);
|
||||
//printf("data->clients[%d].fileToStor = %s", socketId, data->clients[socketId].fileToStor.text);
|
||||
memset(data->clients[socketId].workerData.theCommandReceived, 0, CLIENT_COMMAND_STRING_SIZE);
|
||||
strcpy(data->clients[socketId].workerData.theCommandReceived, data->clients[socketId].theCommandReceived);
|
||||
data->clients[socketId].workerData.commandReceived = 1;
|
||||
@ -529,7 +517,7 @@ int parseCommandCwd(clientDataType *theClientData)
|
||||
|
||||
if (FILE_IsDirectory(theClientData->login.absolutePath.text) == 1)
|
||||
{
|
||||
printf("\nDirectory ok found, theClientData->login.ftpPath.text = %s", theClientData->login.ftpPath.text);
|
||||
//printf("\nDirectory ok found, theClientData->login.ftpPath.text = %s", theClientData->login.ftpPath.text);
|
||||
int theSizeToMalloc = strlen("250 OK. Current directory is ")+theClientData->login.ftpPath.textLen+1;
|
||||
theResponse = (char *) malloc (theSizeToMalloc);
|
||||
memset(theResponse, 0, theSizeToMalloc);
|
||||
@ -538,7 +526,7 @@ int parseCommandCwd(clientDataType *theClientData)
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("\n%s does not exist", theClientData->login.absolutePath.text);
|
||||
//printf("\n%s does not exist", theClientData->login.absolutePath.text);
|
||||
setDynamicStringDataType(&theClientData->login.absolutePath, absolutePathPrevious.text, absolutePathPrevious.textLen);
|
||||
setDynamicStringDataType(&theClientData->login.ftpPath, ftpPathPrevious.text, ftpPathPrevious.textLen);
|
||||
int theSizeToMalloc = strlen("550 Can't change directory to : No such file or directory")+10+strlen(theClientData->login.ftpPath.text);
|
||||
@ -553,9 +541,9 @@ int parseCommandCwd(clientDataType *theClientData)
|
||||
|
||||
write(theClientData->socketDescriptor, theResponse, strlen(theResponse));
|
||||
printTimeStamp();
|
||||
printf("\nCwd response : %s", theResponse);
|
||||
printf("\nUSER COMMAND OK, NEW PATH IS: %s", theClientData->login.absolutePath.text);
|
||||
printf("\nUSER COMMAND OK, NEW LOCAL PATH IS: %s", theClientData->login.ftpPath.text);
|
||||
//printf("\nCwd response : %s", theResponse);
|
||||
//printf("\nUSER COMMAND OK, NEW PATH IS: %s", theClientData->login.absolutePath.text);
|
||||
//printf("\nUSER COMMAND OK, NEW LOCAL PATH IS: %s", theClientData->login.ftpPath.text);
|
||||
|
||||
cleanDynamicStringDataType(&absolutePathPrevious, 0);
|
||||
cleanDynamicStringDataType(&ftpPathPrevious, 0);
|
||||
@ -608,9 +596,6 @@ int parseCommandRest(clientDataType *theClientData)
|
||||
}
|
||||
}
|
||||
|
||||
printTimeStamp();
|
||||
printf(" REST set to: %s", theSize);
|
||||
fflush(0);
|
||||
|
||||
FILE_AppendToString(&theResponse, theSize);
|
||||
FILE_AppendToString(&theResponse, " \r\n");
|
||||
@ -638,7 +623,7 @@ int parseCommandMkd(clientDataType *theClientData)
|
||||
if (isSafePath == 1)
|
||||
{
|
||||
int returnStatus;
|
||||
printf("\nThe directory to make is: %s", mkdFileName.text);
|
||||
//printf("\nThe directory to make is: %s", mkdFileName.text);
|
||||
returnStatus = mkdir(mkdFileName.text, S_IRWXU | S_IRWXG | S_IRWXO);
|
||||
setDynamicStringDataType(&theResponse, "257 \"", strlen("257 \""));
|
||||
appendToDynamicStringDataType(&theResponse, theDirectoryFilename, strlen(theDirectoryFilename));
|
||||
@ -659,9 +644,9 @@ int parseCommandMkd(clientDataType *theClientData)
|
||||
|
||||
int parseCommandOpts(clientDataType *theClientData)
|
||||
{
|
||||
char *theCommand;
|
||||
theCommand = getFtpCommandArg("OPTS", theClientData->theCommandReceived);
|
||||
printf("\nThe command received: %s", theCommand);
|
||||
//char *theCommand;
|
||||
//theCommand = getFtpCommandArg("OPTS", theClientData->theCommandReceived);
|
||||
//printf("\nThe command received: %s", theCommand);
|
||||
char *theResponse = "200 OK\r\n";
|
||||
write(theClientData->socketDescriptor, theResponse, strlen(theResponse));
|
||||
return 1;
|
||||
@ -684,7 +669,7 @@ int parseCommandDele(clientDataType *theClientData)
|
||||
|
||||
if (isSafePath == 1)
|
||||
{
|
||||
printf("\nThe file to delete is: %s", deleFileName.text);
|
||||
//printf("\nThe file to delete is: %s", deleFileName.text);
|
||||
returnStatus = remove(deleFileName.text);
|
||||
setDynamicStringDataType(&theResponse, "250 Deleted ", strlen("250 Deleted "));
|
||||
appendToDynamicStringDataType(&theResponse, theFileToDelete, strlen(theFileToDelete));
|
||||
@ -744,7 +729,7 @@ int parseCommandRmd(clientDataType *theClientData)
|
||||
|
||||
if (isSafePath == 1)
|
||||
{
|
||||
printf("\nThe directory to delete is: %s", rmdFileName.text);
|
||||
//printf("\nThe directory to delete is: %s", rmdFileName.text);
|
||||
returnStatus = rmdir(rmdFileName.text);
|
||||
setDynamicStringDataType(&theResponse, "250 The directory was successfully removed\r\n", strlen("250 The directory was successfully removed\r\n"));
|
||||
write(theClientData->socketDescriptor, theResponse.text, theResponse.textLen);
|
||||
@ -780,7 +765,7 @@ int parseCommandSize(clientDataType *theClientData)
|
||||
|
||||
if (isSafePath == 1)
|
||||
{
|
||||
printf("\nThe file to get the size is: %s", getSizeFromFileName.text);
|
||||
// printf("\nThe file to get the size is: %s", getSizeFromFileName.text);
|
||||
|
||||
if (FILE_IsFile(getSizeFromFileName.text)==1)
|
||||
{
|
||||
@ -824,7 +809,7 @@ int parseCommandRnfr(clientDataType *theClientData)
|
||||
(FILE_IsFile(theClientData->renameFromFile.text) == 1 ||
|
||||
FILE_IsDirectory(theClientData->renameFromFile.text) == 1))
|
||||
{
|
||||
printf("\nThe file to check is: %s", theClientData->renameFromFile.text);
|
||||
// printf("\nThe file to check is: %s", theClientData->renameFromFile.text);
|
||||
|
||||
if (FILE_IsFile(theClientData->renameFromFile.text) == 1 ||
|
||||
FILE_IsDirectory(theClientData->renameFromFile.text) == 1)
|
||||
@ -862,7 +847,7 @@ int parseCommandRnto(clientDataType *theClientData)
|
||||
if (isSafePath == 1 &&
|
||||
theClientData->renameFromFile.textLen > 0)
|
||||
{
|
||||
printf("\nThe file to check is: %s", theClientData->renameFromFile.text);
|
||||
// printf("\nThe file to check is: %s", theClientData->renameFromFile.text);
|
||||
|
||||
if (FILE_IsFile(theClientData->renameFromFile.text) == 1 ||
|
||||
FILE_IsDirectory(theClientData->renameFromFile.text) == 1)
|
||||
@ -913,9 +898,9 @@ int parseCommandCdup(clientDataType *theClientData)
|
||||
FILE_AppendToString(&theResponse, " \r\n");
|
||||
|
||||
write(theClientData->socketDescriptor, theResponse, strlen(theResponse));
|
||||
printTimeStamp();
|
||||
printf("USER COMMAND OK, NEW PATH IS: %s", theClientData->login.absolutePath.text);
|
||||
printf("\nUSER COMMAND OK, NEW LOCAL PATH IS: %s", theClientData->login.ftpPath.text);
|
||||
// printTimeStamp();
|
||||
// printf("USER COMMAND OK, NEW PATH IS: %s", theClientData->login.absolutePath.text);
|
||||
//printf("\nUSER COMMAND OK, NEW LOCAL PATH IS: %s", theClientData->login.ftpPath.text);
|
||||
free(theResponse);
|
||||
return 1;
|
||||
}
|
||||
@ -929,7 +914,7 @@ int writeRetrFile(char * theFilename, int thePasvSocketConnection, int startFrom
|
||||
long long int theFileSize;
|
||||
char buffer[FTP_COMMAND_ELABORATE_CHAR_BUFFER];
|
||||
|
||||
printf("\nOpening: %s", theFilename);
|
||||
//printf("\nOpening: %s", theFilename);
|
||||
|
||||
retrFP = fopen(theFilename, "rb");
|
||||
if (retrFP == NULL)
|
||||
@ -942,9 +927,9 @@ int writeRetrFile(char * theFilename, int thePasvSocketConnection, int startFrom
|
||||
|
||||
if (startFrom > 0)
|
||||
{
|
||||
printf("\nSeek startFrom: %d", startFrom);
|
||||
//printf("\nSeek startFrom: %d", startFrom);
|
||||
currentPosition = (long int) lseek(fileno(retrFP), startFrom, SEEK_SET);
|
||||
printf("\nSeek result: %ld", currentPosition);
|
||||
// printf("\nSeek result: %ld", currentPosition);
|
||||
if (currentPosition == -1)
|
||||
{
|
||||
fclose(retrFP);
|
||||
@ -957,7 +942,7 @@ int writeRetrFile(char * theFilename, int thePasvSocketConnection, int startFrom
|
||||
toReturn = toReturn + write(thePasvSocketConnection, buffer, readen);
|
||||
}
|
||||
|
||||
printf("\n Bytes written: %ld", toReturn);
|
||||
//printf("\n Bytes written: %ld", toReturn);
|
||||
|
||||
fclose(retrFP);
|
||||
return toReturn;
|
||||
@ -1066,7 +1051,6 @@ int getFtpCommandArgWithOptions(char * theCommand, char *theCommandString, ftpCo
|
||||
setDynamicStringDataType(&ftpCommand->commandOps, argSecondary, argSecondaryIndex);
|
||||
|
||||
return 1;
|
||||
|
||||
}
|
||||
|
||||
int setPermissions(char * permissionsCommand, char * basePath)
|
||||
@ -1118,15 +1102,15 @@ int setPermissions(char * permissionsCommand, char * basePath)
|
||||
permissionsCommandCursor++;
|
||||
}
|
||||
|
||||
printf("\n thePermissionString = %s ", thePermissionString);
|
||||
printf("\n theLocalPathCursor = %s ", theLocalPath);
|
||||
//printf("\n thePermissionString = %s ", thePermissionString);
|
||||
//printf("\n theLocalPathCursor = %s ", theLocalPath);
|
||||
|
||||
if (basePath[strlen(basePath)-1] != '/')
|
||||
sprintf(theFinalCommand, "chmod %s %s/%s", thePermissionString, basePath, theLocalPath);
|
||||
else
|
||||
sprintf(theFinalCommand, "chmod %s %s%s", thePermissionString, basePath, theLocalPath);
|
||||
|
||||
printf("\n theFinalCommand = %s ", theFinalCommand);
|
||||
//printf("\n theFinalCommand = %s ", theFinalCommand);
|
||||
|
||||
system(theFinalCommand);
|
||||
|
||||
|
@ -23,20 +23,6 @@
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* To change this license header, choose License Headers in Project Properties.
|
||||
* To change this template file, choose Tools | Templates
|
||||
* and open the template in the editor.
|
||||
*/
|
||||
|
||||
/*
|
||||
* File: ftpCommandsElaborate.h
|
||||
* Author: ugo
|
||||
*
|
||||
* Created on 8 ottobre 2017, 12.40
|
||||
*/
|
||||
|
||||
#ifndef FTPCOMMANDSELABORATE_H
|
||||
#define FTPCOMMANDSELABORATE_H
|
||||
|
||||
|
93
ftpData.c
93
ftpData.c
@ -178,14 +178,12 @@ int getSafePath(dynamicStringDataType *safePath, char *theDirectoryName, loginDa
|
||||
|
||||
void appendToDynamicStringDataType(dynamicStringDataType *dynamicString, char *theString, int stringLen)
|
||||
{
|
||||
printf("\n Appending in %s --> %s", dynamicString->text, theString);
|
||||
int theNewSize = dynamicString->textLen + stringLen;
|
||||
dynamicString->text = realloc(dynamicString->text, theNewSize + 1);
|
||||
memset(dynamicString->text+dynamicString->textLen, 0, stringLen+1);
|
||||
memcpy(dynamicString->text+dynamicString->textLen, theString, stringLen);
|
||||
dynamicString->text[theNewSize] = '\0';
|
||||
dynamicString->textLen = theNewSize;
|
||||
printf("\n Append done --> %s", dynamicString->text);
|
||||
}
|
||||
|
||||
void setRandomicPort(ftpDataType *data, int socketPosition)
|
||||
@ -193,7 +191,6 @@ void setRandomicPort(ftpDataType *data, int socketPosition)
|
||||
static unsigned short int randomizeInteger = 0;
|
||||
unsigned short int randomicPort = 5000;
|
||||
int i;
|
||||
time_t t;
|
||||
|
||||
randomizeInteger += 7;
|
||||
|
||||
@ -206,13 +203,12 @@ void setRandomicPort(ftpDataType *data, int socketPosition)
|
||||
|
||||
randomicPort = ((rand() + socketPosition + randomizeInteger) % (10000 - 50000)) + 10000;
|
||||
i = 0;
|
||||
printf("randomicPort = %d", randomicPort);
|
||||
|
||||
while (i < data->ftpParameters.maxClients)
|
||||
{
|
||||
|
||||
if (randomicPort == data->clients[i].workerData.connectionPort)
|
||||
{
|
||||
printf("randomicPort already in use = %d", randomicPort);
|
||||
randomicPort = ((rand() + socketPosition + i + randomizeInteger) % (10000 - 50000)) + 10000;
|
||||
i = 0;
|
||||
}
|
||||
@ -262,7 +258,7 @@ void getListDataInfo(char * thePath, DYNV_VectorGenericDataType *directoryInfo)
|
||||
}
|
||||
if (data.isDirectory == 0 && data.isFile == 0)
|
||||
{
|
||||
printf("\nNot a directory, not a file, broken link");
|
||||
//printf("\nNot a directory, not a file, broken link");
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -344,58 +340,36 @@ void deleteListDataInfoVector(void *TheElementToDelete)
|
||||
{
|
||||
ftpListDataType *data = (ftpListDataType *)TheElementToDelete;
|
||||
|
||||
|
||||
|
||||
|
||||
if (data->owner != NULL)
|
||||
{
|
||||
printf("\nDeleting data->owner:%s", data->owner);
|
||||
fflush(0);
|
||||
free(data->owner);
|
||||
}
|
||||
printf("\nDone");
|
||||
fflush(0);
|
||||
|
||||
if (data->groupOwner != NULL)
|
||||
{
|
||||
printf("\nDeleting data->groupOwner:%s", data->groupOwner);
|
||||
fflush(0);
|
||||
free(data->groupOwner);
|
||||
}
|
||||
printf("\nDone");
|
||||
fflush(0);
|
||||
|
||||
if (data->inodePermissionString != NULL)
|
||||
{
|
||||
printf("\nDeleting data->inodePermissionString:%s", data->inodePermissionString);
|
||||
fflush(0);
|
||||
free(data->inodePermissionString);
|
||||
}
|
||||
printf("\nDone");
|
||||
fflush(0);
|
||||
|
||||
if (data->fileNameWithPath != NULL)
|
||||
{
|
||||
printf("\nDeleting data->fileNameWithPath:%s", data->fileNameWithPath);
|
||||
fflush(0);
|
||||
free(data->fileNameWithPath);
|
||||
}
|
||||
printf("\nDone");
|
||||
fflush(0);
|
||||
|
||||
if (data->finalStringPath != NULL)
|
||||
{
|
||||
printf("\nDeleting data->finalStringPath:%s", data->finalStringPath);
|
||||
fflush(0);
|
||||
free(data->finalStringPath);
|
||||
}
|
||||
printf("\nDone");
|
||||
fflush(0);
|
||||
|
||||
if (data->linkPath != NULL)
|
||||
{
|
||||
printf("\nDeleting data->linkPath:%s", data->linkPath);
|
||||
fflush(0);
|
||||
free(data->linkPath);
|
||||
}
|
||||
printf("\nDone");
|
||||
fflush(0);
|
||||
|
||||
}
|
||||
|
||||
void resetWorkerData(workerDataType *workerData, int isInitialization)
|
||||
@ -444,7 +418,7 @@ void resetClientData(clientDataType *clientData, int isInitialization)
|
||||
void *pReturn;
|
||||
pthread_cancel(clientData->workerData.workerThread);
|
||||
pthread_join(clientData->workerData.workerThread, &pReturn);
|
||||
printf("\nThread has been cancelled.");
|
||||
//printf("\nThread has been cancelled.");
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -493,3 +467,54 @@ void resetClientData(clientDataType *clientData, int isInitialization)
|
||||
|
||||
|
||||
}
|
||||
|
||||
int compareStringCaseInsensitive(char * stringIn, char * stringRef, int stringLenght)
|
||||
{
|
||||
int i = 0;
|
||||
char * alfaLowerCase = "qwertyuiopasdfghjklzxcvbnm ";
|
||||
char * alfaUpperCase = "QWERTYUIOPASDFGHJKLZXCVBNM ";
|
||||
|
||||
int stringInIndex;
|
||||
int stringRefIndex;
|
||||
|
||||
for (i = 0; i <stringLenght; i++)
|
||||
{
|
||||
stringInIndex = isCharInString(alfaUpperCase, strlen(alfaUpperCase), stringIn[i]);
|
||||
if (stringInIndex == -1)
|
||||
{
|
||||
stringInIndex = isCharInString(alfaLowerCase, strlen(alfaLowerCase), stringIn[i]);
|
||||
}
|
||||
|
||||
stringRefIndex = isCharInString(alfaUpperCase, strlen(alfaUpperCase), stringRef[i]);
|
||||
if (stringRefIndex == -1)
|
||||
{
|
||||
stringRefIndex = isCharInString(alfaLowerCase, strlen(alfaLowerCase), stringRef[i]);
|
||||
}
|
||||
|
||||
if (stringRefIndex == -1 || stringInIndex == -1)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (stringRefIndex != stringInIndex)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int isCharInString(char *theString, int stringLen, char theChar)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < stringLen; i++)
|
||||
{
|
||||
if (theString[i] == theChar)
|
||||
{
|
||||
return i;
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
16
ftpData.h
16
ftpData.h
@ -23,20 +23,6 @@
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* To change this license header, choose License Headers in Project Properties.
|
||||
* To change this template file, choose Tools | Templates
|
||||
* and open the template in the editor.
|
||||
*/
|
||||
|
||||
/*
|
||||
* File: ftpData.h
|
||||
* Author: ugo
|
||||
*
|
||||
* Created on 8 ottobre 2017, 13.14
|
||||
*/
|
||||
|
||||
#ifndef FTPDATA_H
|
||||
#define FTPDATA_H
|
||||
|
||||
@ -224,6 +210,8 @@ void getListDataInfo(char * thePath, DYNV_VectorGenericDataType *directoryInfo);
|
||||
void deleteListDataInfoVector(void *TheElementToDelete);
|
||||
void resetWorkerData(workerDataType *pasvData, int isInitialization);
|
||||
void resetClientData(clientDataType *clientData, int isInitialization);
|
||||
int compareStringCaseInsensitive(char *stringIn, char* stringRef, int stringLenght);
|
||||
int isCharInString(char *theString, int stringLen, char theChar);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
309
ftpServer.c
309
ftpServer.c
@ -50,8 +50,6 @@
|
||||
|
||||
ftpDataType ftpData;
|
||||
|
||||
|
||||
|
||||
static int processCommand(int processingElement);
|
||||
|
||||
void workerCleanup(void *socketId)
|
||||
@ -327,7 +325,6 @@ void *connectionWorkerHandle(void * socketId)
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
pthread_exit((void *)1);
|
||||
pthread_cleanup_pop(0);
|
||||
pthread_exit((void *)2);
|
||||
@ -338,7 +335,7 @@ void *connectionWorkerHandle(void * socketId)
|
||||
void runFtpServer(void)
|
||||
{
|
||||
/* Needed for Select*/
|
||||
static int processingSock = 0;
|
||||
static int processingSock = 0, returnCode = 0;
|
||||
|
||||
/* Handle signals */
|
||||
signalHandlerInstall();
|
||||
@ -346,7 +343,7 @@ void runFtpServer(void)
|
||||
/*Read the configuration file */
|
||||
configurationRead(&ftpData.ftpParameters);
|
||||
|
||||
/* apply the readen configuration */
|
||||
/* apply the reden configuration */
|
||||
applyConfiguration(&ftpData.ftpParameters);
|
||||
|
||||
/* initialize the ftp data structure */
|
||||
@ -359,12 +356,13 @@ void runFtpServer(void)
|
||||
/* init fd set needed for select */
|
||||
fdInit(&ftpData);
|
||||
|
||||
/* the maximum socket fd is now the main socket descriptor */
|
||||
ftpData.connectionData.maxSocketFD = ftpData.connectionData.theMainSocket+1;
|
||||
|
||||
//Endless loop ftp process
|
||||
while (1)
|
||||
{
|
||||
/* Check for socket activity, if timeout check maximum idle timeout */
|
||||
/* waits for socket activity, if no activity then checks for client socket timeouts */
|
||||
if (selectWait(&ftpData) == 0)
|
||||
{
|
||||
checkClientConnectionTimeout(&ftpData);
|
||||
@ -380,82 +378,13 @@ void runFtpServer(void)
|
||||
continue;
|
||||
}
|
||||
|
||||
if (FD_ISSET(ftpData.connectionData.theMainSocket, &ftpData.connectionData.rset))
|
||||
{
|
||||
int socketIndex, availableSocketIndex;
|
||||
availableSocketIndex = -1;
|
||||
/* Check if there are client pending connections, accept the connection if possible otherwise reject */
|
||||
returnCode = evaluateClientSocketConnection(&ftpData);
|
||||
|
||||
for (socketIndex = 0; socketIndex < ftpData.ftpParameters.maxClients; socketIndex++)
|
||||
{
|
||||
if (ftpData.clients[socketIndex].socketDescriptor < 0 &&
|
||||
ftpData.clients[socketIndex].socketIsConnected == 0 )
|
||||
{
|
||||
availableSocketIndex = socketIndex;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (availableSocketIndex != -1)
|
||||
{
|
||||
if ((ftpData.clients[availableSocketIndex].socketDescriptor = accept(ftpData.connectionData.theMainSocket, (struct sockaddr *)&ftpData.clients[availableSocketIndex].client_sockaddr_in, (socklen_t*)&ftpData.clients[availableSocketIndex].sockaddr_in_size))!=-1)
|
||||
{
|
||||
int error;
|
||||
ftpData.connectedClients++;
|
||||
ftpData.clients[availableSocketIndex].socketIsConnected = 1;
|
||||
|
||||
error = fcntl(ftpData.clients[availableSocketIndex].socketDescriptor, F_SETFL, O_NONBLOCK);
|
||||
|
||||
FD_SET(ftpData.clients[availableSocketIndex].socketDescriptor, &ftpData.connectionData.rsetAll);
|
||||
FD_SET(ftpData.clients[availableSocketIndex].socketDescriptor, &ftpData.connectionData.wsetAll);
|
||||
FD_SET(ftpData.clients[availableSocketIndex].socketDescriptor, &ftpData.connectionData.esetAll);
|
||||
ftpData.connectionData.maxSocketFD = getMaximumSocketFd(ftpData.connectionData.theMainSocket, &ftpData) + 1;
|
||||
|
||||
error = getsockname(ftpData.clients[availableSocketIndex].socketDescriptor, (struct sockaddr *)&ftpData.clients[availableSocketIndex].server_sockaddr_in, (socklen_t*)&ftpData.clients[availableSocketIndex].sockaddr_in_server_size);
|
||||
inet_ntop(AF_INET, &(ftpData.clients[availableSocketIndex].server_sockaddr_in.sin_addr), ftpData.clients[availableSocketIndex].serverIpAddress, INET_ADDRSTRLEN);
|
||||
printf("\n Server IP: %s", ftpData.clients[availableSocketIndex].serverIpAddress);
|
||||
printf("Server: New client connected with id: %d", availableSocketIndex);
|
||||
printf("\nServer: Clients connected: %d", ftpData.connectedClients);
|
||||
sscanf (ftpData.clients[availableSocketIndex].serverIpAddress,"%d.%d.%d.%d", &ftpData.clients[availableSocketIndex].serverIpAddressInteger[0],
|
||||
&ftpData.clients[availableSocketIndex].serverIpAddressInteger[1],
|
||||
&ftpData.clients[availableSocketIndex].serverIpAddressInteger[2],
|
||||
&ftpData.clients[availableSocketIndex].serverIpAddressInteger[3]);
|
||||
|
||||
error = inet_ntop(AF_INET, &(ftpData.clients[availableSocketIndex].client_sockaddr_in.sin_addr), ftpData.clients[availableSocketIndex].clientIpAddress, INET_ADDRSTRLEN);
|
||||
printf("\n Client IP: %s", ftpData.clients[availableSocketIndex].clientIpAddress);
|
||||
ftpData.clients[availableSocketIndex].clientPort = (int) ntohs(ftpData.clients[availableSocketIndex].client_sockaddr_in.sin_port);
|
||||
printf("\nClient port is: %d\n", ftpData.clients[availableSocketIndex].clientPort);
|
||||
|
||||
ftpData.clients[availableSocketIndex].connectionTimeStamp = (int)time(NULL);
|
||||
ftpData.clients[availableSocketIndex].lastActivityTimeStamp = (int)time(NULL);
|
||||
write(ftpData.clients[availableSocketIndex].socketDescriptor, ftpData.welcomeMessage, strlen(ftpData.welcomeMessage));
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("\nErrno = %d", errno);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
int socketRefuseFd, socketRefuse_in_size;
|
||||
socketRefuse_in_size = sizeof(struct sockaddr_in);
|
||||
struct sockaddr_in socketRefuse_sockaddr_in;
|
||||
if ((socketRefuseFd = accept(ftpData.connectionData.theMainSocket, (struct sockaddr *)&socketRefuse_sockaddr_in, (socklen_t*)&socketRefuse_in_size))!=-1)
|
||||
{
|
||||
char *messageToWrite = "530 Server reached the maximum number of connection, please try later.\r\n";
|
||||
write(socketRefuseFd, messageToWrite, strlen(messageToWrite));
|
||||
shutdown(socketRefuseFd, SHUT_RDWR);
|
||||
close(socketRefuseFd);
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("\nErrno = %d", errno);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (ftpData.clients[processingSock].socketDescriptor < 0 ||
|
||||
ftpData.clients[processingSock].socketIsConnected == 0)
|
||||
/* no data to check client is not connected, continue to check other clients */
|
||||
if (isClientConnected(&ftpData, processingSock) == 0)
|
||||
{
|
||||
/* socket is not conneted */
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -463,24 +392,16 @@ void runFtpServer(void)
|
||||
FD_ISSET(ftpData.clients[processingSock].socketDescriptor, &ftpData.connectionData.eset))
|
||||
{
|
||||
|
||||
printf("\nClient r: %d, e: %d", FD_ISSET(ftpData.clients[processingSock].socketDescriptor, &ftpData.connectionData.rset), FD_ISSET(ftpData.clients[processingSock].socketDescriptor, &ftpData.connectionData.eset));
|
||||
|
||||
//The client is not connected anymore
|
||||
if ((ftpData.clients[processingSock].bufferIndex = read(ftpData.clients[processingSock].socketDescriptor, ftpData.clients[processingSock].buffer, CLIENT_BUFFER_STRING_SIZE)) == 0)
|
||||
{
|
||||
|
||||
FD_CLR(ftpData.clients[processingSock].socketDescriptor, &ftpData.connectionData.rsetAll);
|
||||
FD_CLR(ftpData.clients[processingSock].socketDescriptor, &ftpData.connectionData.wsetAll);
|
||||
FD_CLR(ftpData.clients[processingSock].socketDescriptor, &ftpData.connectionData.esetAll);
|
||||
|
||||
fdRemove(&ftpData, processingSock);
|
||||
closeSocket(&ftpData, processingSock);
|
||||
|
||||
printf("\nSocket is closed!\n");
|
||||
|
||||
ftpData.connectionData.maxSocketFD = ftpData.connectionData.theMainSocket+1;
|
||||
ftpData.connectionData.maxSocketFD = getMaximumSocketFd(ftpData.connectionData.theMainSocket, &ftpData) + 1;
|
||||
ftpData.connectionData.maxSocketFD = getMaximumSocketFd(ftpData.connectionData.theMainSocket, &ftpData);
|
||||
printf("\nA client has been disconnected!\n");
|
||||
}
|
||||
|
||||
//Debug print errors
|
||||
if (ftpData.clients[processingSock].bufferIndex < 0)
|
||||
{
|
||||
printf("\nErrno = %d", errno);
|
||||
@ -509,8 +430,7 @@ void runFtpServer(void)
|
||||
if (commandProcessStatus == 0)
|
||||
{
|
||||
char * theNotSupportedString = "500 Unknown command\r\n";
|
||||
//write(ftpData.clients[processingSock].socketDescriptor, ftpData.clients[processingSock].buffer, ftpData.clients[processingSock].bufferIndex);
|
||||
//write(ftpData.clients[processingSock].socketDescriptor, theNotSupportedString, strlen(theNotSupportedString));
|
||||
write(ftpData.clients[processingSock].socketDescriptor, theNotSupportedString, strlen(theNotSupportedString));
|
||||
printf("\n COMMAND NOT SUPPORTED ********* %s", ftpData.clients[processingSock].buffer);
|
||||
}
|
||||
else
|
||||
@ -522,9 +442,11 @@ void runFtpServer(void)
|
||||
else
|
||||
{
|
||||
//Command overflow can't be processed
|
||||
char * theNotSupportedString = "500 Unknown command\r\n";
|
||||
ftpData.clients[processingSock].commandIndex = 0;
|
||||
memset(ftpData.clients[processingSock].theCommandReceived, 0, CLIENT_COMMAND_STRING_SIZE);
|
||||
//Write some error message to the client
|
||||
write(ftpData.clients[processingSock].socketDescriptor, theNotSupportedString, strlen(theNotSupportedString));
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -542,320 +464,201 @@ void runFtpServer(void)
|
||||
return;
|
||||
}
|
||||
|
||||
int createPassiveSocket(int port)
|
||||
{
|
||||
int sock, returnCode, flags;
|
||||
struct sockaddr_in temp;
|
||||
|
||||
//Socket creation
|
||||
sock = socket(AF_INET, SOCK_STREAM, 0);
|
||||
temp.sin_family = AF_INET;
|
||||
temp.sin_addr.s_addr = INADDR_ANY;
|
||||
temp.sin_port = htons(port);
|
||||
|
||||
|
||||
int reuse = 1;
|
||||
if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (const char*)&reuse, sizeof(reuse)) < 0)
|
||||
perror("setsockopt(SO_REUSEADDR) failed");
|
||||
|
||||
if (setsockopt(sock, SOL_SOCKET, SO_REUSEPORT, (const char*)&reuse, sizeof(reuse)) < 0)
|
||||
perror("setsockopt(SO_REUSEPORT) failed");
|
||||
|
||||
|
||||
//Bind socket
|
||||
returnCode = bind(sock,(struct sockaddr*) &temp,sizeof(temp));
|
||||
|
||||
//Number of client allowed
|
||||
returnCode = listen(sock, 1);
|
||||
|
||||
return sock;
|
||||
}
|
||||
|
||||
int createActiveSocket(int port, char *ipAddress)
|
||||
{
|
||||
int sockfd;
|
||||
struct sockaddr_in serv_addr;
|
||||
struct hostent *hostnm; /* server host name information */
|
||||
|
||||
memset(&serv_addr, 0, sizeof(struct sockaddr_in));
|
||||
serv_addr.sin_family = AF_INET;
|
||||
serv_addr.sin_port = htons(port);
|
||||
if(inet_pton(AF_INET, ipAddress, &serv_addr.sin_addr)<=0)
|
||||
{
|
||||
printf("\n inet_pton error occured\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
|
||||
{
|
||||
printf("\n Error : Could not create socket \n");
|
||||
return -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("\n sockfd = %d \n", sockfd);
|
||||
}
|
||||
|
||||
|
||||
int reuse = 1;
|
||||
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (const char*)&reuse, sizeof(reuse)) < 0)
|
||||
perror("setsockopt(SO_REUSEADDR) failed");
|
||||
|
||||
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEPORT, (const char*)&reuse, sizeof(reuse)) < 0)
|
||||
perror("setsockopt(SO_REUSEPORT) failed");
|
||||
|
||||
|
||||
|
||||
if(connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
|
||||
{
|
||||
printf("\n Error : Connect Failed \n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
printf("\n Connection socket %d is going to start ip: %s:%d \n",sockfd, ipAddress, port);
|
||||
|
||||
return sockfd;
|
||||
}
|
||||
|
||||
static int processCommand(int processingElement)
|
||||
{
|
||||
int toReturn = 0;
|
||||
printTimeStamp();
|
||||
printf ("Command received from (%d): %s", processingElement, ftpData.clients[processingElement].theCommandReceived);
|
||||
|
||||
//printf ("\nstrncmp(ftpData.clients[processingElement].theCommandReceived, \"USER\", strlen(\"USER\")) %d", strncmp(ftpData.clients[processingElement].theCommandReceived, "USER", strlen("USER")));
|
||||
//printf ("\nstrncmp(ftpData.clients[processingElement].theCommandReceived, \"user\", strlen(\"user\")) %d", strncmp(ftpData.clients[processingElement].theCommandReceived, "user", strlen("user")));
|
||||
//printf ("\nstrncmp(ftpData.clients[processingElement].theCommandReceived, \"PASS\", strlen(\"PASS\")) %d", strncmp(ftpData.clients[processingElement].theCommandReceived, "PASS", strlen("PASS")));
|
||||
//printf ("\nstrncmp(ftpData.clients[processingElement].theCommandReceived, \"pass\", strlen(\"pass\")) %d", strncmp(ftpData.clients[processingElement].theCommandReceived, "pass", strlen("pass")));
|
||||
|
||||
cleanDynamicStringDataType(&ftpData.clients[processingElement].ftpCommand.commandArgs, 0);
|
||||
cleanDynamicStringDataType(&ftpData.clients[processingElement].ftpCommand.commandOps, 0);
|
||||
|
||||
if (ftpData.clients[processingElement].login.userLoggedIn == 0 &&
|
||||
(strncmp(ftpData.clients[processingElement].theCommandReceived, "USER", strlen("USER")) != 0 &&
|
||||
strncmp(ftpData.clients[processingElement].theCommandReceived, "user", strlen("user")) != 0 &&
|
||||
strncmp(ftpData.clients[processingElement].theCommandReceived, "PASS", strlen("PASS")) != 0 &&
|
||||
strncmp(ftpData.clients[processingElement].theCommandReceived, "pass", strlen("pass")) != 0 &&
|
||||
strncmp(ftpData.clients[processingElement].theCommandReceived, "QUIT", strlen("QUIT")) != 0 &&
|
||||
strncmp(ftpData.clients[processingElement].theCommandReceived, "quit", strlen("quit")) != 0) &&
|
||||
strncmp(ftpData.clients[processingElement].theCommandReceived, "AUTH", strlen("AUTH")) != 0 &&
|
||||
strncmp(ftpData.clients[processingElement].theCommandReceived, "auth", strlen("auth")) != 0)
|
||||
(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "USER", strlen("USER")) != 1 &&
|
||||
compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "PASS", strlen("PASS")) != 1 &&
|
||||
compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "QUIT", strlen("QUIT")) != 1 &&
|
||||
compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "AUTH", strlen("AUTH")) != 1))
|
||||
{
|
||||
toReturn = notLoggedInMessage(&ftpData.clients[processingElement]);
|
||||
ftpData.clients[processingElement].commandIndex = 0;
|
||||
memset(ftpData.clients[processingElement].theCommandReceived, 0, CLIENT_COMMAND_STRING_SIZE);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
//Process Command
|
||||
if(strncmp(ftpData.clients[processingElement].theCommandReceived, "USER", strlen("USER")) == 0 ||
|
||||
strncmp(ftpData.clients[processingElement].theCommandReceived, "user", strlen("user")) == 0)
|
||||
if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "USER", strlen("USER")) == 1)
|
||||
{
|
||||
printf("\nUSER COMMAND RECEIVED");
|
||||
toReturn = parseCommandUser(&ftpData.clients[processingElement]);
|
||||
}
|
||||
else if(strncmp(ftpData.clients[processingElement].theCommandReceived, "PASS", strlen("PASS")) == 0 ||
|
||||
strncmp(ftpData.clients[processingElement].theCommandReceived, "pass", strlen("pass")) == 0)
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "PASS", strlen("PASS")) == 1)
|
||||
{
|
||||
printf("\nPASS COMMAND RECEIVED");
|
||||
toReturn = parseCommandPass(&ftpData, processingElement);
|
||||
}
|
||||
else if(strncmp(ftpData.clients[processingElement].theCommandReceived, "SITE", strlen("SITE")) == 0 ||
|
||||
strncmp(ftpData.clients[processingElement].theCommandReceived, "site", strlen("site")) == 0)
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "SITE", strlen("SITE")) == 1)
|
||||
{
|
||||
printf("\nSITE COMMAND RECEIVED");
|
||||
toReturn = parseCommandSite(&ftpData.clients[processingElement]);
|
||||
}
|
||||
else if(strncmp(ftpData.clients[processingElement].theCommandReceived, "AUTH", strlen("AUTH")) == 0 ||
|
||||
strncmp(ftpData.clients[processingElement].theCommandReceived, "auth", strlen("auth")) == 0)
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "AUTH", strlen("AUTH")) == 1)
|
||||
{
|
||||
printf("\nAUTH COMMAND RECEIVED");
|
||||
toReturn = parseCommandAuth(&ftpData.clients[processingElement]);
|
||||
}
|
||||
else if(strncmp(ftpData.clients[processingElement].theCommandReceived, "PWD", strlen("PWD")) == 0 ||
|
||||
strncmp(ftpData.clients[processingElement].theCommandReceived, "pwd", strlen("pwd")) == 0)
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "PWD", strlen("PWD")) == 1)
|
||||
{
|
||||
printf("\nPWD COMMAND RECEIVED");
|
||||
toReturn = parseCommandPwd(&ftpData.clients[processingElement]);
|
||||
}
|
||||
else if(strncmp(ftpData.clients[processingElement].theCommandReceived, "SYST", strlen("SYST")) == 0 ||
|
||||
strncmp(ftpData.clients[processingElement].theCommandReceived, "syst", strlen("syst")) == 0)
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "SYST", strlen("SYST")) == 1)
|
||||
{
|
||||
printf("\nSYST COMMAND RECEIVED");
|
||||
toReturn = parseCommandSyst(&ftpData.clients[processingElement]);
|
||||
}
|
||||
else if(strncmp(ftpData.clients[processingElement].theCommandReceived, "FEAT", strlen("FEAT")) == 0 ||
|
||||
strncmp(ftpData.clients[processingElement].theCommandReceived, "feat", strlen("feat")) == 0)
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "FEAT", strlen("FEAT")) == 1)
|
||||
{
|
||||
printf("\nFEAT COMMAND RECEIVED");
|
||||
toReturn = parseCommandFeat(&ftpData.clients[processingElement]);
|
||||
}
|
||||
else if(strncmp(ftpData.clients[processingElement].theCommandReceived, "TYPE I", strlen("TYPE I")) == 0 ||
|
||||
strncmp(ftpData.clients[processingElement].theCommandReceived, "type i", strlen("type i")) == 0)
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "TYPE I", strlen("TYPE I")) == 1)
|
||||
{
|
||||
printf("\nTYPE I COMMAND RECEIVED");
|
||||
toReturn = parseCommandTypeI(&ftpData.clients[processingElement]);
|
||||
}
|
||||
else if(strncmp(ftpData.clients[processingElement].theCommandReceived, "STRU F", strlen("STRU F")) == 0 ||
|
||||
strncmp(ftpData.clients[processingElement].theCommandReceived, "stru f", strlen("stru f")) == 0)
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "STRU F", strlen("STRU F")) == 1)
|
||||
{
|
||||
printf("\nTYPE I COMMAND RECEIVED");
|
||||
toReturn = parseCommandStruF(&ftpData.clients[processingElement]);
|
||||
}
|
||||
else if(strncmp(ftpData.clients[processingElement].theCommandReceived, "MODE S", strlen("TMODE S")) == 0 ||
|
||||
strncmp(ftpData.clients[processingElement].theCommandReceived, "mode s", strlen("mode s")) == 0)
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "MODE S", strlen("MODE S")) == 1)
|
||||
{
|
||||
printf("\nMODE S COMMAND RECEIVED");
|
||||
toReturn = parseCommandModeS(&ftpData.clients[processingElement]);
|
||||
}
|
||||
else if(strncmp(ftpData.clients[processingElement].theCommandReceived, "TYPE A", strlen("TYPE A")) == 0 ||
|
||||
strncmp(ftpData.clients[processingElement].theCommandReceived, "type a", strlen("type a")) == 0)
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "TYPE A", strlen("TYPE A")) == 1)
|
||||
{
|
||||
printf("\nTYPE A COMMAND RECEIVED");
|
||||
toReturn = parseCommandTypeI(&ftpData.clients[processingElement]);
|
||||
}
|
||||
else if(strncmp(ftpData.clients[processingElement].theCommandReceived, "PASV", strlen("PASV")) == 0 ||
|
||||
strncmp(ftpData.clients[processingElement].theCommandReceived, "pasv", strlen("pasv")) == 0)
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "PASV", strlen("PASV")) == 1)
|
||||
{
|
||||
printf("\nPASV COMMAND RECEIVED");
|
||||
setRandomicPort(&ftpData, processingElement);
|
||||
toReturn = parseCommandPasv(&ftpData, processingElement);
|
||||
}
|
||||
else if(strncmp(ftpData.clients[processingElement].theCommandReceived, "PORT", strlen("PORT")) == 0 ||
|
||||
strncmp(ftpData.clients[processingElement].theCommandReceived, "port", strlen("port")) == 0)
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "PORT", strlen("PORT")) == 1)
|
||||
{
|
||||
printf("\nPORT COMMAND RECEIVED");
|
||||
toReturn = parseCommandPort(&ftpData, processingElement);
|
||||
}
|
||||
else if(strncmp(ftpData.clients[processingElement].theCommandReceived, "LIST", strlen("LIST")) == 0 ||
|
||||
strncmp(ftpData.clients[processingElement].theCommandReceived, "list", strlen("list")) == 0)
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "LIST", strlen("LIST")) == 1)
|
||||
{
|
||||
printf("\nLIST COMMAND RECEIVED");
|
||||
toReturn = parseCommandList(&ftpData, processingElement);
|
||||
}
|
||||
else if(strncmp(ftpData.clients[processingElement].theCommandReceived, "CWD", strlen("CWD")) == 0 ||
|
||||
strncmp(ftpData.clients[processingElement].theCommandReceived, "cwd", strlen("cwd")) == 0)
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "CWD", strlen("CWD")) == 1)
|
||||
{
|
||||
printf("\nCWD COMMAND RECEIVED");
|
||||
toReturn = parseCommandCwd(&ftpData.clients[processingElement]);
|
||||
}
|
||||
else if(strncmp(ftpData.clients[processingElement].theCommandReceived, "CDUP", strlen("CDUP")) == 0 ||
|
||||
strncmp(ftpData.clients[processingElement].theCommandReceived, "cdup", strlen("cdup")) == 0)
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "CDUP", strlen("CDUP")) == 1)
|
||||
{
|
||||
printf("\nCDUP COMMAND RECEIVED");
|
||||
toReturn = parseCommandCdup(&ftpData.clients[processingElement]);
|
||||
}
|
||||
else if(strncmp(ftpData.clients[processingElement].theCommandReceived, "REST", strlen("REST")) == 0 ||
|
||||
strncmp(ftpData.clients[processingElement].theCommandReceived, "rest", strlen("rest")) == 0)
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "REST", strlen("REST")) == 1)
|
||||
{
|
||||
printf("\nREST COMMAND RECEIVED");
|
||||
toReturn = parseCommandRest(&ftpData.clients[processingElement]);
|
||||
}
|
||||
else if(strncmp(ftpData.clients[processingElement].theCommandReceived, "RETR", strlen("RETR")) == 0 ||
|
||||
strncmp(ftpData.clients[processingElement].theCommandReceived, "retr", strlen("retr")) == 0)
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "RETR", strlen("RETR")) == 1)
|
||||
{
|
||||
printf("\nRETR COMMAND RECEIVED");
|
||||
toReturn = parseCommandRetr(&ftpData, processingElement);
|
||||
}
|
||||
else if(strncmp(ftpData.clients[processingElement].theCommandReceived, "STOR", strlen("STOR")) == 0 ||
|
||||
strncmp(ftpData.clients[processingElement].theCommandReceived, "stor", strlen("stor")) == 0)
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "STOR", strlen("STOR")) == 1)
|
||||
{
|
||||
printf("\nSTOR COMMAND RECEIVED");
|
||||
toReturn = parseCommandStor(&ftpData, processingElement);
|
||||
}
|
||||
else if(strncmp(ftpData.clients[processingElement].theCommandReceived, "MKD", strlen("MKD")) == 0 ||
|
||||
strncmp(ftpData.clients[processingElement].theCommandReceived, "mkd", strlen("mkd")) == 0)
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "MKD", strlen("MKD")) == 1)
|
||||
{
|
||||
printf("\nMKD command received");
|
||||
toReturn = parseCommandMkd(&ftpData.clients[processingElement]);
|
||||
}
|
||||
else if(strncmp(ftpData.clients[processingElement].theCommandReceived, "ABOR", strlen("ABOR")) == 0 ||
|
||||
strncmp(ftpData.clients[processingElement].theCommandReceived, "abor", strlen("abor")) == 0)
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "ABOR", strlen("ABOR")) == 1)
|
||||
{
|
||||
printf("\nABOR command received");
|
||||
toReturn = parseCommandAbor(&ftpData, processingElement);
|
||||
}
|
||||
else if(strncmp(ftpData.clients[processingElement].theCommandReceived, "DELE", strlen("DELE")) == 0 ||
|
||||
strncmp(ftpData.clients[processingElement].theCommandReceived, "dele", strlen("dele")) == 0)
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "DELE", strlen("DELE")) == 1)
|
||||
{
|
||||
printf("\nDELE command received");
|
||||
toReturn = parseCommandDele(&ftpData.clients[processingElement]);
|
||||
}
|
||||
else if(strncmp(ftpData.clients[processingElement].theCommandReceived, "OPTS", strlen("OPTS")) == 0 ||
|
||||
strncmp(ftpData.clients[processingElement].theCommandReceived, "opts", strlen("opts")) == 0)
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "OPTS", strlen("OPTS")) == 1)
|
||||
{
|
||||
printf("\nOPTS command received");
|
||||
toReturn = parseCommandOpts(&ftpData.clients[processingElement]);
|
||||
}
|
||||
else if(strncmp(ftpData.clients[processingElement].theCommandReceived, "MTDM", strlen("MTDM")) == 0 ||
|
||||
strncmp(ftpData.clients[processingElement].theCommandReceived, "mtdm", strlen("mtdm")) == 0)
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "MTDM", strlen("MTDM")) == 1)
|
||||
{
|
||||
printf("\nMTDM command received");
|
||||
//To implement
|
||||
}
|
||||
else if(strncmp(ftpData.clients[processingElement].theCommandReceived, "NLST", strlen("NLST")) == 0 ||
|
||||
strncmp(ftpData.clients[processingElement].theCommandReceived, "nlst", strlen("nlst")) == 0)
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "NLST", strlen("NLST")) == 1)
|
||||
{
|
||||
printf("\nNLST command received");
|
||||
toReturn = parseCommandNlst(&ftpData, processingElement);
|
||||
}
|
||||
else if(strncmp(ftpData.clients[processingElement].theCommandReceived, "PORT", strlen("PORT")) == 0 ||
|
||||
strncmp(ftpData.clients[processingElement].theCommandReceived, "port", strlen("port")) == 0)
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "PORT", strlen("PORT")) == 1)
|
||||
{
|
||||
printf("\nPORT command received");
|
||||
//To implement
|
||||
}
|
||||
else if(strncmp(ftpData.clients[processingElement].theCommandReceived, "QUIT", strlen("QUIT")) == 0 ||
|
||||
strncmp(ftpData.clients[processingElement].theCommandReceived, "quit", strlen("quit")) == 0)
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "QUIT", strlen("QUIT")) == 1)
|
||||
{
|
||||
printf("\nQUIT command received");
|
||||
toReturn = parseCommandQuit(&ftpData, processingElement);
|
||||
}
|
||||
else if(strncmp(ftpData.clients[processingElement].theCommandReceived, "RMD", strlen("RMD")) == 0 ||
|
||||
strncmp(ftpData.clients[processingElement].theCommandReceived, "rmd", strlen("rmd")) == 0)
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "RMD", strlen("RMD")) == 1)
|
||||
{
|
||||
printf("\nRMD command received");
|
||||
toReturn = parseCommandRmd(&ftpData.clients[processingElement]);
|
||||
}
|
||||
else if(strncmp(ftpData.clients[processingElement].theCommandReceived, "RNFR", strlen("RNFR")) == 0 ||
|
||||
strncmp(ftpData.clients[processingElement].theCommandReceived, "rnfr", strlen("rnfr")) == 0)
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "RNFR", strlen("RNFR")) == 1)
|
||||
{
|
||||
printf("\nRNFR command received");
|
||||
toReturn = parseCommandRnfr(&ftpData.clients[processingElement]);
|
||||
|
||||
}
|
||||
else if(strncmp(ftpData.clients[processingElement].theCommandReceived, "RNTO", strlen("RNTO")) == 0 ||
|
||||
strncmp(ftpData.clients[processingElement].theCommandReceived, "rnto", strlen("rnto")) == 0)
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "RNTO", strlen("RNTO")) == 1)
|
||||
{
|
||||
printf("\nRNTO command received");
|
||||
toReturn = parseCommandRnto(&ftpData.clients[processingElement]);
|
||||
}
|
||||
else if(strncmp(ftpData.clients[processingElement].theCommandReceived, "SIZE", strlen("SIZE")) == 0 ||
|
||||
strncmp(ftpData.clients[processingElement].theCommandReceived, "size", strlen("size")) == 0)
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "SIZE", strlen("SIZE")) == 1)
|
||||
{
|
||||
printf("\nSIZE command received");
|
||||
toReturn = parseCommandSize(&ftpData.clients[processingElement]);
|
||||
}
|
||||
else if(strncmp(ftpData.clients[processingElement].theCommandReceived, "APPE", strlen("APPE")) == 0 ||
|
||||
strncmp(ftpData.clients[processingElement].theCommandReceived, "appe", strlen("appe")) == 0)
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "APPE", strlen("APPE")) == 1)
|
||||
{
|
||||
printf("\nAPPE command received");
|
||||
//To implement
|
||||
}
|
||||
else if(strncmp(ftpData.clients[processingElement].theCommandReceived, "NOOP", strlen("NOOP")) == 0 ||
|
||||
strncmp(ftpData.clients[processingElement].theCommandReceived, "noop", strlen("noop")) == 0)
|
||||
else if(compareStringCaseInsensitive(ftpData.clients[processingElement].theCommandReceived, "NOOP", strlen("NOOP")) == 1)
|
||||
{
|
||||
printf("\nNOOP command received");
|
||||
toReturn = parseCommandNoop(&ftpData.clients[processingElement]);
|
||||
}
|
||||
else
|
||||
{
|
||||
//Parse unsupported command
|
||||
|
||||
; //Parse unsupported command not needed
|
||||
}
|
||||
|
||||
ftpData.clients[processingElement].commandIndex = 0;
|
||||
memset(ftpData.clients[processingElement].theCommandReceived, 0, CLIENT_COMMAND_STRING_SIZE);
|
||||
|
||||
return toReturn;
|
||||
}
|
||||
|
||||
|
17
ftpServer.h
17
ftpServer.h
@ -23,20 +23,6 @@
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* To change this license header, choose License Headers in Project Properties.
|
||||
* To change this template file, choose Tools | Templates
|
||||
* and open the template in the editor.
|
||||
*/
|
||||
|
||||
/*
|
||||
* File: ftpServer.h
|
||||
* Author: ugo
|
||||
*
|
||||
* Created on 7 ottobre 2017, 17.37
|
||||
*/
|
||||
|
||||
#ifndef FTPSERVER_H
|
||||
#define FTPSERVER_H
|
||||
|
||||
@ -44,8 +30,7 @@
|
||||
|
||||
|
||||
void runFtpServer(void);
|
||||
int createPassiveSocket(int port);
|
||||
int createActiveSocket(int port, char *ipAddress);
|
||||
|
||||
|
||||
void *connectionWorkerHandle(void * socketId);
|
||||
void workerCleanup(void *socketId);
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* The MIT License
|
||||
*
|
||||
* Copyright 2018 ugo.
|
||||
* Copyright 2018 Ugo Cirmignani.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
@ -29,14 +29,13 @@
|
||||
#include <arpa/inet.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "../ftpData.h"
|
||||
#include "connection.h"
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <pthread.h>
|
||||
|
||||
|
||||
|
||||
#include "../ftpData.h"
|
||||
#include "connection.h"
|
||||
|
||||
/* Return the higher socket available*/
|
||||
int getMaximumSocketFd(int mainSocket, ftpDataType * ftpData)
|
||||
@ -50,7 +49,8 @@ int getMaximumSocketFd(int mainSocket, ftpDataType * ftpData)
|
||||
toReturn = ftpData->clients[i].socketDescriptor;
|
||||
}
|
||||
}
|
||||
|
||||
//Must be incremented by one
|
||||
toReturn++;
|
||||
return toReturn;
|
||||
}
|
||||
|
||||
@ -85,6 +85,80 @@ int createSocket(ftpDataType * ftpData)
|
||||
return sock;
|
||||
}
|
||||
|
||||
int createPassiveSocket(int port)
|
||||
{
|
||||
int sock, returnCode;
|
||||
struct sockaddr_in temp;
|
||||
|
||||
//Socket creation
|
||||
sock = socket(AF_INET, SOCK_STREAM, 0);
|
||||
temp.sin_family = AF_INET;
|
||||
temp.sin_addr.s_addr = INADDR_ANY;
|
||||
temp.sin_port = htons(port);
|
||||
|
||||
|
||||
int reuse = 1;
|
||||
if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (const char*)&reuse, sizeof(reuse)) < 0)
|
||||
perror("setsockopt(SO_REUSEADDR) failed");
|
||||
|
||||
if (setsockopt(sock, SOL_SOCKET, SO_REUSEPORT, (const char*)&reuse, sizeof(reuse)) < 0)
|
||||
perror("setsockopt(SO_REUSEPORT) failed");
|
||||
|
||||
|
||||
//Bind socket
|
||||
returnCode = bind(sock,(struct sockaddr*) &temp,sizeof(temp));
|
||||
|
||||
//Number of client allowed
|
||||
returnCode = listen(sock, 1);
|
||||
|
||||
return sock;
|
||||
}
|
||||
|
||||
int createActiveSocket(int port, char *ipAddress)
|
||||
{
|
||||
int sockfd;
|
||||
struct sockaddr_in serv_addr;
|
||||
|
||||
memset(&serv_addr, 0, sizeof(struct sockaddr_in));
|
||||
serv_addr.sin_family = AF_INET;
|
||||
serv_addr.sin_port = htons(port);
|
||||
if(inet_pton(AF_INET, ipAddress, &serv_addr.sin_addr)<=0)
|
||||
{
|
||||
printf("\n inet_pton error occured\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
|
||||
{
|
||||
printf("\n Error : Could not create socket \n");
|
||||
return -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("\n sockfd = %d \n", sockfd);
|
||||
}
|
||||
|
||||
|
||||
int reuse = 1;
|
||||
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (const char*)&reuse, sizeof(reuse)) < 0)
|
||||
perror("setsockopt(SO_REUSEADDR) failed");
|
||||
|
||||
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEPORT, (const char*)&reuse, sizeof(reuse)) < 0)
|
||||
perror("setsockopt(SO_REUSEPORT) failed");
|
||||
|
||||
|
||||
|
||||
if(connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
|
||||
{
|
||||
printf("\n Error : Connect Failed \n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
printf("\n Connection socket %d is going to start ip: %s:%d \n",sockfd, ipAddress, port);
|
||||
|
||||
return sockfd;
|
||||
}
|
||||
|
||||
void fdInit(ftpDataType * ftpData)
|
||||
{
|
||||
FD_ZERO(&ftpData->connectionData.rset);
|
||||
@ -99,6 +173,21 @@ void fdInit(ftpDataType * ftpData)
|
||||
FD_SET(ftpData->connectionData.theMainSocket, &ftpData->connectionData.esetAll);
|
||||
}
|
||||
|
||||
void fdAdd(ftpDataType * ftpData, int index)
|
||||
{
|
||||
FD_SET(ftpData->clients[index].socketDescriptor, &ftpData->connectionData.rsetAll);
|
||||
FD_SET(ftpData->clients[index].socketDescriptor, &ftpData->connectionData.wsetAll);
|
||||
FD_SET(ftpData->clients[index].socketDescriptor, &ftpData->connectionData.esetAll);
|
||||
ftpData->connectionData.maxSocketFD = getMaximumSocketFd(ftpData->connectionData.theMainSocket, ftpData) + 1;
|
||||
}
|
||||
|
||||
void fdRemove(ftpDataType * ftpData, int index)
|
||||
{
|
||||
FD_CLR(ftpData->clients[index].socketDescriptor, &ftpData->connectionData.rsetAll);
|
||||
FD_CLR(ftpData->clients[index].socketDescriptor, &ftpData->connectionData.wsetAll);
|
||||
FD_CLR(ftpData->clients[index].socketDescriptor, &ftpData->connectionData.esetAll);
|
||||
}
|
||||
|
||||
void closeSocket(ftpDataType * ftpData, int processingSocket)
|
||||
{
|
||||
//Close the socket
|
||||
@ -175,3 +264,104 @@ int selectWait(ftpDataType * ftpData)
|
||||
ftpData->connectionData.eset = ftpData->connectionData.esetAll;
|
||||
return select(ftpData->connectionData.maxSocketFD, &ftpData->connectionData.rset, NULL, &ftpData->connectionData.eset, &selectMaximumLockTime);
|
||||
}
|
||||
|
||||
int isClientConnected(ftpDataType * ftpData, int cliendId)
|
||||
{
|
||||
if (ftpData->clients[cliendId].socketDescriptor < 0 ||
|
||||
ftpData->clients[cliendId].socketIsConnected == 0)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int getAvailableClientSocketIndex(ftpDataType * ftpData)
|
||||
{
|
||||
int socketIndex;
|
||||
for (socketIndex = 0; socketIndex < ftpData->ftpParameters.maxClients; socketIndex++)
|
||||
{
|
||||
if (isClientConnected(ftpData, socketIndex) == 0)
|
||||
{
|
||||
return socketIndex;
|
||||
}
|
||||
}
|
||||
|
||||
/* no socket are available for a new client connection */
|
||||
return -1;
|
||||
}
|
||||
|
||||
int evaluateClientSocketConnection(ftpDataType * ftpData)
|
||||
{
|
||||
if (FD_ISSET(ftpData->connectionData.theMainSocket, &ftpData->connectionData.rset))
|
||||
{
|
||||
int availableSocketIndex;
|
||||
if ((availableSocketIndex = getAvailableClientSocketIndex(ftpData)) != -1) //get available socket
|
||||
{
|
||||
if ((ftpData->clients[availableSocketIndex].socketDescriptor = accept(ftpData->connectionData.theMainSocket, (struct sockaddr *)&ftpData->clients[availableSocketIndex].client_sockaddr_in, (socklen_t*)&ftpData->clients[availableSocketIndex].sockaddr_in_size))!=-1)
|
||||
{
|
||||
int error;
|
||||
ftpData->connectedClients++;
|
||||
ftpData->clients[availableSocketIndex].socketIsConnected = 1;
|
||||
|
||||
error = fcntl(ftpData->clients[availableSocketIndex].socketDescriptor, F_SETFL, O_NONBLOCK);
|
||||
|
||||
fdAdd(ftpData, availableSocketIndex);
|
||||
|
||||
error = getsockname(ftpData->clients[availableSocketIndex].socketDescriptor, (struct sockaddr *)&ftpData->clients[availableSocketIndex].server_sockaddr_in, (socklen_t*)&ftpData->clients[availableSocketIndex].sockaddr_in_server_size);
|
||||
inet_ntop(AF_INET,
|
||||
&(ftpData->clients[availableSocketIndex].server_sockaddr_in.sin_addr),
|
||||
ftpData->clients[availableSocketIndex].serverIpAddress,
|
||||
INET_ADDRSTRLEN);
|
||||
printf("\n Server IP: %s", ftpData->clients[availableSocketIndex].serverIpAddress);
|
||||
printf("Server: New client connected with id: %d", availableSocketIndex);
|
||||
printf("\nServer: Clients connected: %d", ftpData->connectedClients);
|
||||
sscanf (ftpData->clients[availableSocketIndex].serverIpAddress,"%d.%d.%d.%d", &ftpData->clients[availableSocketIndex].serverIpAddressInteger[0],
|
||||
&ftpData->clients[availableSocketIndex].serverIpAddressInteger[1],
|
||||
&ftpData->clients[availableSocketIndex].serverIpAddressInteger[2],
|
||||
&ftpData->clients[availableSocketIndex].serverIpAddressInteger[3]);
|
||||
|
||||
inet_ntop(AF_INET,
|
||||
&(ftpData->clients[availableSocketIndex].client_sockaddr_in.sin_addr),
|
||||
ftpData->clients[availableSocketIndex].clientIpAddress,
|
||||
INET_ADDRSTRLEN);
|
||||
printf("\n Client IP: %s", ftpData->clients[availableSocketIndex].clientIpAddress);
|
||||
ftpData->clients[availableSocketIndex].clientPort = (int) ntohs(ftpData->clients[availableSocketIndex].client_sockaddr_in.sin_port);
|
||||
printf("\nClient port is: %d\n", ftpData->clients[availableSocketIndex].clientPort);
|
||||
|
||||
ftpData->clients[availableSocketIndex].connectionTimeStamp = (int)time(NULL);
|
||||
ftpData->clients[availableSocketIndex].lastActivityTimeStamp = (int)time(NULL);
|
||||
write(ftpData->clients[availableSocketIndex].socketDescriptor, ftpData->welcomeMessage, strlen(ftpData->welcomeMessage));
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("\nErrno = %d", errno);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
int socketRefuseFd, socketRefuse_in_size;
|
||||
socketRefuse_in_size = sizeof(struct sockaddr_in);
|
||||
struct sockaddr_in socketRefuse_sockaddr_in;
|
||||
if ((socketRefuseFd = accept(ftpData->connectionData.theMainSocket, (struct sockaddr *)&socketRefuse_sockaddr_in, (socklen_t*)&socketRefuse_in_size))!=-1)
|
||||
{
|
||||
char *messageToWrite = "530 Server reached the maximum number of connection, please try later.\r\n";
|
||||
write(socketRefuseFd, messageToWrite, strlen(messageToWrite));
|
||||
shutdown(socketRefuseFd, SHUT_RDWR);
|
||||
close(socketRefuseFd);
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("\nErrno = %d", errno);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* The MIT License
|
||||
*
|
||||
* Copyright 2018 ugo.
|
||||
* Copyright 2018 Ugo Cirmignani.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
@ -22,12 +22,6 @@
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/*
|
||||
* File: connection.h
|
||||
* Author: ugo
|
||||
*
|
||||
* Created on 25 febbraio 2018, 18.43
|
||||
*/
|
||||
|
||||
#ifndef CONNECTION_H
|
||||
#define CONNECTION_H
|
||||
@ -40,12 +34,21 @@ extern "C" {
|
||||
|
||||
int getMaximumSocketFd(int mainSocket, ftpDataType * data);
|
||||
int createSocket(ftpDataType * ftpData);
|
||||
int createPassiveSocket(int port);
|
||||
int createActiveSocket(int port, char *ipAddress);
|
||||
void fdInit(ftpDataType * ftpData);
|
||||
void fdAdd(ftpDataType * ftpData, int index);
|
||||
void fdRemove(ftpDataType * ftpData, int index);
|
||||
|
||||
void checkClientConnectionTimeout(ftpDataType * ftpData);
|
||||
void closeSocket(ftpDataType * ftpData, int processingSocket);
|
||||
void closeClient(ftpDataType * ftpData, int processingSocket);
|
||||
int selectWait(ftpDataType * ftpData);
|
||||
int isClientConnected(ftpDataType * ftpData, int cliendId);
|
||||
int getAvailableClientSocketIndex(ftpDataType * ftpData);
|
||||
int evaluateClientSocketConnection(ftpDataType * ftpData);
|
||||
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
@ -50,9 +50,9 @@ int isProcessAlreadyRunning(void)
|
||||
syslog(LOG_ERR, "can’t open %s: %s", LOCKFILE, strerror(errno));
|
||||
exit(1);
|
||||
}
|
||||
printf("\nFile pid opened.");
|
||||
//printf("\nFile pid opened.");
|
||||
|
||||
if (returnCode = FILE_LockFile(fd) < 0)
|
||||
if ((returnCode = FILE_LockFile(fd)) < 0)
|
||||
{
|
||||
if (errno == EACCES || errno == EAGAIN)
|
||||
{
|
||||
@ -63,7 +63,7 @@ int isProcessAlreadyRunning(void)
|
||||
exit(1);
|
||||
}
|
||||
|
||||
printf("\nFILE_LockFile returnCode = %d", returnCode);
|
||||
//printf("\nFILE_LockFile returnCode = %d", returnCode);
|
||||
ftruncate(fd, 0);
|
||||
sprintf(buf, "%ld", (long)getpid());
|
||||
write(fd, buf, strlen(buf)+1);
|
||||
@ -132,5 +132,4 @@ void daemonize(const char *cmd)
|
||||
fd0 = open("/dev/null", O_RDWR);
|
||||
fd1 = dup(0);
|
||||
fd2 = dup(0);
|
||||
|
||||
}
|
@ -22,13 +22,6 @@
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/*
|
||||
* File: signals.h
|
||||
* Author: ugo
|
||||
*
|
||||
* Created on 24 febbraio 2018, 19.15
|
||||
*/
|
||||
|
||||
#ifndef SIGNALS_H
|
||||
#define SIGNALS_H
|
||||
|
||||
|
@ -6,6 +6,10 @@
|
||||
</data>
|
||||
<editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/2" lastBookmarkId="0"/>
|
||||
<open-files xmlns="http://www.netbeans.org/ns/projectui-open-files/2">
|
||||
<group/>
|
||||
<group>
|
||||
<file>file:/home/ugo/NetBeansProjects/uFTP/ftpServer.c</file>
|
||||
<file>file:/home/ugo/NetBeansProjects/uFTP/uFTP.c</file>
|
||||
<file>file:/home/ugo/NetBeansProjects/uFTP/ftpData.h</file>
|
||||
</group>
|
||||
</open-files>
|
||||
</project-private>
|
||||
|
Reference in New Issue
Block a user