diff --git a/src/sbbs3/ftpsrvr.c b/src/sbbs3/ftpsrvr.c index 52c58426cbb77f8772b109ed09b2e9addcb786a4..5874da0f97171242d24f6b727d7f35dcc5534088 100644 --- a/src/sbbs3/ftpsrvr.c +++ b/src/sbbs3/ftpsrvr.c @@ -254,7 +254,8 @@ static int ftp_close_socket(SOCKET* sock, int line) #ifndef _WIN32 #define ReleaseMutex(x) #else - if((result=WaitForSingleObject(socket_mutex,5000))!=WAIT_OBJECT_0) + if(socket_mutex!=NULL + && (result=WaitForSingleObject(socket_mutex,5000))!=WAIT_OBJECT_0) lprintf("%04d !ERROR %d getting socket mutex from line %u" ,*sock,ERROR_VALUE,line); @@ -281,7 +282,8 @@ static int ftp_close_socket(SOCKET* sock, int line) if(result!=0) { if(ERROR_VALUE!=ENOTSOCK) lprintf("%04d !ERROR %d closing socket from line %u",*sock,ERROR_VALUE,line); - } + } else if(sock==&server_socket || *sock==server_socket) + lprintf("%04d Server socket closed (%u sockets in use) from line %u",*sock,sockets,line); #ifdef _DEBUG else lprintf("%04d Socket closed (%u sockets in use) from line %u",*sock,sockets,line); @@ -2233,6 +2235,7 @@ static void ctrl_thread(void* arg) FILE* fp; FILE* alias_fp; SOCKET sock; + SOCKET tmp_sock; SOCKET pasv_sock=INVALID_SOCKET; SOCKET data_sock=INVALID_SOCKET; HOSTENT* host; @@ -4202,16 +4205,14 @@ static void ctrl_thread(void* arg) #endif - status(STATUS_WFC); - - active_clients--; - update_clients(); - client_off(sock); +/* status(STATUS_WFC); server thread should control status display */ - thread_down(); + if(pasv_sock!=INVALID_SOCKET) + ftp_close_socket(&pasv_sock,__LINE__); + if(data_sock!=INVALID_SOCKET) + ftp_close_socket(&data_sock,__LINE__); - lprintf("%04d CTRL thread terminated (%u clients, %u threads remain)" - ,sock, active_clients, thread_count); + client_off(sock); #ifdef _DEBUG socket_debug[sock]&=~SOCKET_DEBUG_CTRL; @@ -4221,12 +4222,15 @@ static void ctrl_thread(void* arg) socket_debug[sock]&=~SOCKET_DEBUG_TERMINATE; #endif - /* Free up resources here (MUST BE LAST) */ - ftp_close_socket(&sock,__LINE__); - if(pasv_sock!=INVALID_SOCKET) - ftp_close_socket(&pasv_sock,__LINE__); - if(data_sock!=INVALID_SOCKET) - ftp_close_socket(&data_sock,__LINE__); + tmp_sock=sock; + ftp_close_socket(&tmp_sock,__LINE__); + + active_clients--; + update_clients(); + + thread_down(); + lprintf("%04d CTRL thread terminated (%u clients, %u threads remain)" + ,sock, active_clients, thread_count); } static void cleanup(int code) @@ -4563,11 +4567,25 @@ void DLLCALL ftp_server(void* arg) start=time(NULL); while(active_clients) { if(time(NULL)-start>TIMEOUT_THREAD_WAIT) { - lprintf("0000 !TIMEOUT waiting for %d active clients ",active_clients); + lprintf("0000 !TIMEOUT waiting for %d active clients",active_clients); + break; + } + mswait(100); + } + lprintf("000 Done waiting"); + } + + if(thread_count>1) { + lprintf("0000 Waiting for %d threads to terminate...", thread_count-1); + start=time(NULL); + while(thread_count>1) { + if(time(NULL)-start>TIMEOUT_THREAD_WAIT) { + lprintf("0000 !TIMEOUT waiting for %d threads",thread_count-1); break; } mswait(100); } + lprintf("000 Done waiting"); } cleanup(0);