mirror of
https://github.com/kingk85/uFTP.git
synced 2025-07-25 13:16:12 +03:00
thread hang up fix
This commit is contained in:
8
Makefile
8
Makefile
@ -4,9 +4,9 @@ CC=gcc
|
|||||||
OUTPATH=./build/
|
OUTPATH=./build/
|
||||||
SOURCE_MODULES_PATH=./library/
|
SOURCE_MODULES_PATH=./library/
|
||||||
|
|
||||||
#FOR DEBUG PURPOSE
|
#FOR DEBUG PURPOSE
|
||||||
#CFLAGSTEMP=-c -Wall -I. -g -O0
|
CFLAGSTEMP=-c -Wall -I. -g -O0
|
||||||
CFLAGSTEMP=-c -Wall -I.
|
#CFLAGSTEMP=-c -Wall -I.
|
||||||
OPTIMIZATION=-O3
|
OPTIMIZATION=-O3
|
||||||
HEADERS=-I
|
HEADERS=-I
|
||||||
LIBPATH=./build/modules/
|
LIBPATH=./build/modules/
|
||||||
@ -38,7 +38,7 @@ end:
|
|||||||
@echo Build process end
|
@echo Build process end
|
||||||
|
|
||||||
uFTP: uFTP.c fileManagement.o configRead.o logFunctions.o ftpCommandElaborate.o ftpData.o ftpServer.o daemon.o signals.o connection.o openSsl.o
|
uFTP: uFTP.c fileManagement.o configRead.o logFunctions.o ftpCommandElaborate.o ftpData.o ftpServer.o daemon.o signals.o connection.o openSsl.o
|
||||||
@$(CC) $(ENABLE_LARGE_FILE_SUPPORT) $(ENABLE_OPENSSL_SUPPORT) uFTP.c $(LIBPATH)dynamicVectors.o $(LIBPATH)fileManagement.o $(LIBPATH)configRead.o $(LIBPATH)logFunctions.o $(LIBPATH)ftpCommandElaborate.o $(LIBPATH)ftpData.o $(LIBPATH)ftpServer.o $(LIBPATH)daemon.o $(LIBPATH)signals.o $(LIBPATH)connection.o $(LIBPATH)openSsl.o -o $(OUTPATH)uFTP $(LIBS)
|
@$(CC) $(ENABLE_LARGE_FILE_SUPPORT) $(ENABLE_OPENSSL_SUPPORT) uFTP.c $(LIBPATH)dynamicVectors.o $(LIBPATH)fileManagement.o $(LIBPATH)configRead.o $(LIBPATH)logFunctions.o $(LIBPATH)ftpCommandElaborate.o $(LIBPATH)ftpData.o $(LIBPATH)ftpServer.o $(LIBPATH)daemon.o $(LIBPATH)signals.o $(LIBPATH)connection.o $(LIBPATH)openSsl.o -o $(OUTPATH)uFTP $(LIBS)
|
||||||
|
|
||||||
daemon.o:
|
daemon.o:
|
||||||
@$(CC) $(CFLAGS) $(SOURCE_MODULES_PATH)daemon.c -o $(LIBPATH)daemon.o
|
@$(CC) $(CFLAGS) $(SOURCE_MODULES_PATH)daemon.c -o $(LIBPATH)daemon.o
|
||||||
|
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.
@ -459,14 +459,17 @@ int parseCommandPasv(ftpDataType * data, int socketId)
|
|||||||
/* Create worker thread */
|
/* Create worker thread */
|
||||||
void *pReturn;
|
void *pReturn;
|
||||||
int returnCode;
|
int returnCode;
|
||||||
//printf("\n data->clients[%d].workerData.workerThread = %d",socketId, (int)data->clients[socketId].workerData.workerThread);
|
printf("\n data->clients[%d].workerData.workerThread = %d",socketId, (int)data->clients[socketId].workerData.workerThread);
|
||||||
|
|
||||||
if (data->clients[socketId].workerData.threadIsAlive == 1)
|
//if (data->clients[socketId].workerData.threadIsAlive == 1)
|
||||||
{
|
// {
|
||||||
returnCode = pthread_cancel(data->clients[socketId].workerData.workerThread);
|
|
||||||
}
|
returnCode = pthread_cancel(data->clients[socketId].workerData.workerThread);
|
||||||
|
printf("\npasv pthread_cancel = %d", returnCode);
|
||||||
|
//}
|
||||||
|
printf("\npasv join ");
|
||||||
returnCode = pthread_join(data->clients[socketId].workerData.workerThread, &pReturn);
|
returnCode = pthread_join(data->clients[socketId].workerData.workerThread, &pReturn);
|
||||||
|
printf("\npasv join ok");
|
||||||
data->clients[socketId].workerData.passiveModeOn = 1;
|
data->clients[socketId].workerData.passiveModeOn = 1;
|
||||||
data->clients[socketId].workerData.activeModeOn = 0;
|
data->clients[socketId].workerData.activeModeOn = 0;
|
||||||
returnCode = pthread_create(&data->clients[socketId].workerData.workerThread, NULL, connectionWorkerHandle, (void *) &data->clients[socketId].clientProgressiveNumber);
|
returnCode = pthread_create(&data->clients[socketId].workerData.workerThread, NULL, connectionWorkerHandle, (void *) &data->clients[socketId].clientProgressiveNumber);
|
||||||
|
11
ftpServer.c
11
ftpServer.c
@ -55,6 +55,8 @@ void workerCleanup(void *socketId)
|
|||||||
int theSocketId = *(int *)socketId;
|
int theSocketId = *(int *)socketId;
|
||||||
int returnCode = 0;
|
int returnCode = 0;
|
||||||
|
|
||||||
|
printf("\nWorker %d cleanup", theSocketId);
|
||||||
|
|
||||||
#ifdef OPENSSL_ENABLED
|
#ifdef OPENSSL_ENABLED
|
||||||
if (ftpData.clients[theSocketId].dataChannelIsTls == 1)
|
if (ftpData.clients[theSocketId].dataChannelIsTls == 1)
|
||||||
{
|
{
|
||||||
@ -62,7 +64,7 @@ void workerCleanup(void *socketId)
|
|||||||
{
|
{
|
||||||
printf("\nSSL worker Shutdown 1");
|
printf("\nSSL worker Shutdown 1");
|
||||||
returnCode = SSL_shutdown(ftpData.clients[theSocketId].workerData.serverSsl);
|
returnCode = SSL_shutdown(ftpData.clients[theSocketId].workerData.serverSsl);
|
||||||
printf(" return code : %d", returnCode);
|
printf("\nnSSL worker Shutdown 1 return code : %d", returnCode);
|
||||||
|
|
||||||
if (returnCode < 0)
|
if (returnCode < 0)
|
||||||
{
|
{
|
||||||
@ -70,7 +72,9 @@ void workerCleanup(void *socketId)
|
|||||||
}
|
}
|
||||||
else if (returnCode == 0)
|
else if (returnCode == 0)
|
||||||
{
|
{
|
||||||
|
printf("\nSSL worker Shutdown 2");
|
||||||
returnCode = SSL_shutdown(ftpData.clients[theSocketId].workerData.serverSsl);
|
returnCode = SSL_shutdown(ftpData.clients[theSocketId].workerData.serverSsl);
|
||||||
|
printf("\nnSSL worker Shutdown 2 return code : %d", returnCode);
|
||||||
|
|
||||||
if (returnCode <= 0)
|
if (returnCode <= 0)
|
||||||
{
|
{
|
||||||
@ -107,6 +111,7 @@ void workerCleanup(void *socketId)
|
|||||||
close(ftpData.clients[theSocketId].workerData.socketConnection);
|
close(ftpData.clients[theSocketId].workerData.socketConnection);
|
||||||
close(ftpData.clients[theSocketId].workerData.passiveListeningSocket);
|
close(ftpData.clients[theSocketId].workerData.passiveListeningSocket);
|
||||||
resetWorkerData(&ftpData, theSocketId, 0);
|
resetWorkerData(&ftpData, theSocketId, 0);
|
||||||
|
printf("\nWorker cleaned!");
|
||||||
}
|
}
|
||||||
|
|
||||||
void *connectionWorkerHandle(void * socketId)
|
void *connectionWorkerHandle(void * socketId)
|
||||||
@ -248,7 +253,7 @@ void *connectionWorkerHandle(void * socketId)
|
|||||||
|
|
||||||
if (ftpData.clients[theSocketId].workerData.socketIsConnected > 0)
|
if (ftpData.clients[theSocketId].workerData.socketIsConnected > 0)
|
||||||
{
|
{
|
||||||
printf("\nWorker is waiting for commands!");
|
printf("\nWorker %d is waiting for commands!", theSocketId);
|
||||||
//Conditional lock on thread actions
|
//Conditional lock on thread actions
|
||||||
pthread_mutex_lock(&ftpData.clients[theSocketId].workerData.conditionMutex);
|
pthread_mutex_lock(&ftpData.clients[theSocketId].workerData.conditionMutex);
|
||||||
while (ftpData.clients[theSocketId].workerData.commandReceived == 0)
|
while (ftpData.clients[theSocketId].workerData.commandReceived == 0)
|
||||||
@ -257,6 +262,8 @@ void *connectionWorkerHandle(void * socketId)
|
|||||||
}
|
}
|
||||||
pthread_mutex_unlock(&ftpData.clients[theSocketId].workerData.conditionMutex);
|
pthread_mutex_unlock(&ftpData.clients[theSocketId].workerData.conditionMutex);
|
||||||
|
|
||||||
|
printf("\nWorker %d unlocked", theSocketId);
|
||||||
|
|
||||||
if (ftpData.clients[theSocketId].workerData.commandReceived == 1 &&
|
if (ftpData.clients[theSocketId].workerData.commandReceived == 1 &&
|
||||||
compareStringCaseInsensitive(ftpData.clients[theSocketId].workerData.theCommandReceived, "STOR", strlen("STOR")) == 1 &&
|
compareStringCaseInsensitive(ftpData.clients[theSocketId].workerData.theCommandReceived, "STOR", strlen("STOR")) == 1 &&
|
||||||
ftpData.clients[theSocketId].fileToStor.textLen > 0)
|
ftpData.clients[theSocketId].fileToStor.textLen > 0)
|
||||||
|
@ -233,11 +233,11 @@ int socketWorkerPrintf(ftpDataType * ftpData, int clientId, const char *__restri
|
|||||||
#ifdef OPENSSL_ENABLED
|
#ifdef OPENSSL_ENABLED
|
||||||
if (ftpData->clients[clientId].workerData.passiveModeOn == 1){
|
if (ftpData->clients[clientId].workerData.passiveModeOn == 1){
|
||||||
theReturnCode = SSL_write(ftpData->clients[clientId].workerData.serverSsl, theBuffer, theStringSize);
|
theReturnCode = SSL_write(ftpData->clients[clientId].workerData.serverSsl, theBuffer, theStringSize);
|
||||||
printf("passive: %s", theBuffer);
|
printf("%s", theBuffer);
|
||||||
}
|
}
|
||||||
else if (ftpData->clients[clientId].workerData.activeModeOn == 1){
|
else if (ftpData->clients[clientId].workerData.activeModeOn == 1){
|
||||||
theReturnCode = SSL_write(ftpData->clients[clientId].workerData.clientSsl, theBuffer, theStringSize);
|
theReturnCode = SSL_write(ftpData->clients[clientId].workerData.clientSsl, theBuffer, theStringSize);
|
||||||
printf("Active: %s", theBuffer);
|
printf("%s", theBuffer);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,19 @@
|
|||||||
#NOTES ONLY FOR DEVELOPERS
|
#NOTES ONLY FOR DEVELOPERS
|
||||||
#OPENSSL TEST COMMANDS
|
#OPENSSL TEST COMMANDS
|
||||||
|
|
||||||
|
#Required packages to compile
|
||||||
|
sudo apt-get install libssl-dev
|
||||||
|
|
||||||
|
|
||||||
|
#Remove password from a certificate
|
||||||
|
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365
|
||||||
|
openssl rsa -in key.pem -out newkey.pem
|
||||||
|
|
||||||
|
|
||||||
|
#Testing ssl
|
||||||
openssl s_client -starttls ftp -connect 192.168.1.237:21
|
openssl s_client -starttls ftp -connect 192.168.1.237:21
|
||||||
sudo openssl s_server -key key.pem -cert cert.pem -accept 123
|
sudo openssl s_server -key key.pem -cert cert.pem -accept 123
|
||||||
|
openssl s_client -connect 127.0.0.1:49473
|
||||||
USER username
|
USER username
|
||||||
PASS password
|
PASS password
|
||||||
PROT P
|
PROT P
|
||||||
|
@ -10,7 +10,7 @@ MAXIMUM_ALLOWED_FTP_CONNECTION = 30
|
|||||||
FTP_PORT = 21
|
FTP_PORT = 21
|
||||||
#TCP/IP PORT SETTINGS (DEFAULT 21)
|
#TCP/IP PORT SETTINGS (DEFAULT 21)
|
||||||
|
|
||||||
SINGLE_INSTANCE = true
|
SINGLE_INSTANCE = false
|
||||||
#Allow only one server instance (true or false)
|
#Allow only one server instance (true or false)
|
||||||
|
|
||||||
DAEMON_MODE = false
|
DAEMON_MODE = false
|
||||||
|
Reference in New Issue
Block a user