From 40e6db4cf947beae7d2d524a9ab9238bfb32057a Mon Sep 17 00:00:00 2001 From: rswindell <> Date: Wed, 1 Jun 2005 02:50:37 +0000 Subject: [PATCH] Install local control-c/break handler to locally abort transfers correctly. --- src/sbbs3/sexyz.c | 57 ++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 52 insertions(+), 5 deletions(-) diff --git a/src/sbbs3/sexyz.c b/src/sbbs3/sexyz.c index e60ed03815..53a63b28e2 100644 --- a/src/sbbs3/sexyz.c +++ b/src/sbbs3/sexyz.c @@ -99,6 +99,7 @@ BOOL telnet=TRUE; BOOL stdio=FALSE; struct termios origterm; #endif +BOOL aborted=FALSE; BOOL terminate=FALSE; BOOL debug_tx=FALSE; BOOL debug_rx=FALSE; @@ -154,7 +155,6 @@ static BOOL winsock_startup(void) #endif - static int lputs(void* unused, int level, const char* str) { FILE* fp=statfp; @@ -187,6 +187,26 @@ static int lprintf(int level, const char *fmt, ...) return(lputs(NULL,level,sbuf)); } +void break_handler(int type) +{ + lprintf(LOG_NOTICE,"-> Aborted Locally (signal: %d)",type); + + /* Flag to indicate local (as opposed to remote) abort */ + aborted=TRUE; + + /* Stop any transfers in progress immediately */ + xm.cancelled=TRUE; + zm.cancelled=TRUE; +} + +#if defined(_WIN32) +BOOL WINAPI ControlHandler(DWORD CtrlType) +{ + break_handler((int)CtrlType); + return TRUE; +} +#endif + static char *chr(uchar ch) { static char str[25]; @@ -824,6 +844,13 @@ static int send_files(char** fname, uint fnames) fflush(logfp); } total_bytes += sent_bytes; + + if(aborted) { + xm.cancelled=FALSE; + xmodem_cancel(&xm); + break; + } + } /* while(gi<(int)g.gl_pathc) */ if(gi<(int)g.gl_pathc)/* error occurred */ @@ -874,7 +901,6 @@ static int receive_files(char** fname_list, int fnames) uint cps; uint wr; BOOL success=FALSE; - BOOL cancelled=FALSE; long fmode; long serial_num=-1; ulong file_bytes=0,file_bytes_left=0; @@ -891,7 +917,7 @@ static int receive_files(char** fname_list, int fnames) while((i=getcom(0))!=NOINP) lprintf(LOG_WARNING,"Throwing out received: %s",chr((uchar)i)); - while(!terminate && !cancelled && is_connected(NULL)) { + while(is_connected(NULL)) { if(mode&XMODEM) { SAFECOPY(str,fname_list[0]); /* we'll have at least one fname */ file_bytes=file_bytes_left=0x7fffffff; @@ -1083,7 +1109,7 @@ static int receive_files(char** fname_list, int fnames) break; } if(i==CAN) { /* Cancel */ - cancelled=TRUE; + xm.cancelled=TRUE; break; } @@ -1155,6 +1181,13 @@ static int receive_files(char** fname_list, int fnames) ,serial_num); fflush(logfp); } + + if(aborted) { + xm.cancelled=FALSE; + xmodem_cancel(&xm); + break; + } + if(mode&XMODEM) /* maximum of one file */ break; if((cps=file_bytes/t)==0) @@ -1528,6 +1561,20 @@ int main(int argc, char **argv) } } + /* Install Ctrl-C/Break signal handler here */ +#if defined(_WIN32) + SetConsoleCtrlHandler(ControlHandler, TRUE /* Add */); +#elif defined(__unix__) + signal(SIGQUIT,break_handler); + signal(SIGINT,break_handler); + signal(SIGTERM,break_handler); + + signal(SIGHUP,SIG_IGN); + + /* Don't die on SIGPIPE */ + signal(SIGPIPE,SIG_IGN); +#endif + #if !SINGLE_THREADED _beginthread(output_thread,0,NULL); #endif @@ -1540,7 +1587,7 @@ int main(int argc, char **argv) #if !SINGLE_THREADED lprintf(LOG_DEBUG,"Waiting for output buffer to empty... "); if(WaitForEvent(outbuf_empty,5000)!=WAIT_OBJECT_0) - lprintf(LOG_DEBUG,"FAILURE\n"); + lprintf(LOG_DEBUG,"FAILURE"); #endif terminate=TRUE; /* stop output thread */ -- GitLab