diff --git a/src/sbbs3/ftpsrvr.c b/src/sbbs3/ftpsrvr.c index 7a455c02b69a4ffbe43a11b847cf23b9af55169d..f3272a50b7147e8faa96940374f33bb030358cf7 100644 --- a/src/sbbs3/ftpsrvr.c +++ b/src/sbbs3/ftpsrvr.c @@ -37,21 +37,23 @@ /* Platform-specific headers */ #ifdef _WIN32 -#include <io.h> /* _findfirst */ -#include <share.h> /* SH_DENYNO */ -#include <direct.h> /* _mkdir/_rmdir() */ -#include <process.h> /* _beginthread */ + #include <io.h> /* _findfirst */ + #include <share.h> /* SH_DENYNO */ + #include <direct.h> /* _mkdir/_rmdir() */ + #include <process.h> /* _beginthread */ + #include <windows.h> /* required for mmsystem.h */ + #include <mmsystem.h> /* SND_ASYNC */ #endif /* ANSI C Library headers */ #include <stdio.h> -#include <stdlib.h> /* ltoa in GNU C lib */ -#include <stdarg.h> /* va_list, varargs */ -#include <string.h> /* strrchr */ -#include <fcntl.h> /* O_WRONLY, O_RDONLY, etc. */ -#include <errno.h> /* EACCES */ -#include <ctype.h> /* toupper */ -#include <sys/stat.h> /* S_IWRITE */ +#include <stdlib.h> /* ltoa in GNU C lib */ +#include <stdarg.h> /* va_list, varargs */ +#include <string.h> /* strrchr */ +#include <fcntl.h> /* O_WRONLY, O_RDONLY, etc. */ +#include <errno.h> /* EACCES */ +#include <ctype.h> /* toupper */ +#include <sys/stat.h> /* S_IWRITE */ /* Synchronet-specific headers */ #include "sbbsinet.h" @@ -150,6 +152,7 @@ static int lprintf(char *fmt, ...) #ifdef _WINSOCKAPI_ static WSADATA WSAData; +static BOOL WSAInitialized=FALSE; static BOOL winsock_startup(void) { @@ -157,6 +160,7 @@ static BOOL winsock_startup(void) if((status = WSAStartup(MAKEWORD(1,1), &WSAData))==0) { lprintf("%s %s",WSAData.szDescription, WSAData.szSystemStatus); + WSAInitialized=TRUE; return (TRUE); } @@ -494,6 +498,7 @@ static void send_thread(void* arg) char* p; char buf[8192]; char fname[MAX_PATH]; + int i; int rd; int wr; ulong total=0; @@ -525,7 +530,7 @@ static void send_thread(void* arg) *xfer.inprogress=TRUE; *xfer.aborted=FALSE; - if(startup->options&FTP_OPT_DEBUG_DATA) + if(startup->options&FTP_OPT_DEBUG_DATA || xfer.filepos) lprintf("%04d DATA socket %d sending from offset %ld" ,xfer.ctrl_sock,*xfer.data_sock,xfer.filepos); @@ -554,6 +559,8 @@ static void send_thread(void* arg) } rd=fread(buf,sizeof(char),sizeof(buf),fp); if(rd<1) { + lprintf("%04d !READ ERROR (%d) on %s",xfer.ctrl_sock,errno,xfer.filename); + error=TRUE; break; } wr=send(*xfer.data_sock,buf,rd,0); @@ -586,6 +593,9 @@ static void send_thread(void* arg) mswait(1); } + if((i=ferror(fp))!=0) + lprintf("%04d !FILE ERROR %d (%d)",xfer.ctrl_sock,i,errno); + close_socket(xfer.data_sock,__LINE__); /* Signal end of file */ if(startup->options&FTP_OPT_DEBUG_DATA) lprintf("%04d DATA socket closed",xfer.ctrl_sock); @@ -2904,7 +2914,7 @@ static void cleanup(int code) update_clients(); #ifdef _WINSOCKAPI_ - if(WSACleanup()!=0) + if(WSAInitialized && WSACleanup()!=0) lprintf("!WSACleanup ERROR %d",ERROR_VALUE); #endif @@ -2984,9 +2994,9 @@ void ftp_server(void* arg) srand(time(NULL)); +#ifndef __MINGW32__ if(PUTENV("TZ=UCT0")) lprintf("!putenv() FAILED"); - tzset(); if((t=checktime())!=0) { /* Check binary time */ @@ -2994,12 +3004,16 @@ void ftp_server(void* arg) cleanup(1); return; } +#endif if(!winsock_startup()) { cleanup(1); return; } + t=time(NULL); + lprintf("Initializing on %s",ctime(&t)); + #ifdef _WIN32 if((socket_mutex=CreateMutex(NULL,FALSE,NULL))==NULL) { lprintf("!ERROR %d creating socket_mutex", GetLastError());