From 23b06c9ed5a9a302c18612b6955c1c0ebb36846c Mon Sep 17 00:00:00 2001
From: Rob Swindell <rob@synchro.net>
Date: Sun, 5 Dec 2021 18:08:16 -0800
Subject: [PATCH] Allow local abort/cancel to abort (more) retries/loops

While debugging a SyncTERM upload issue, I came across some scenarios where an out of control file transfer could not be aborted via local key press (e.g. Ctrl-C, Ctrl-Break).

We use zm.local_abort for all local abort indications (even for X/YMODEM). <shrug>
---
 src/sbbs3/sexyz.c  | 2 +-
 src/sbbs3/xmodem.c | 5 +++--
 2 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/src/sbbs3/sexyz.c b/src/sbbs3/sexyz.c
index 7390e8cd64..83193819df 100755
--- a/src/sbbs3/sexyz.c
+++ b/src/sbbs3/sexyz.c
@@ -1094,7 +1094,7 @@ static int receive_files(char** fname_list, int fnames)
 	outbuf.highwater_mark=0;	/* don't delay ACK/NAK transmits */
 
 	/* Purge input buffer */
-	while(is_connected(NULL) && (i=recv_byte(NULL,0))!=NOINP)
+	while(is_connected(NULL) && (i=recv_byte(NULL,0))!=NOINP && !zm.local_abort)
 		lprintf(LOG_WARNING,"Throwing out received: %s",chr((uchar)i));
 
 	while(is_connected(NULL)) {
diff --git a/src/sbbs3/xmodem.c b/src/sbbs3/xmodem.c
index cb48ac0d6c..80b412bfc3 100755
--- a/src/sbbs3/xmodem.c
+++ b/src/sbbs3/xmodem.c
@@ -1,5 +1,4 @@
 /* Synchronet X/YMODEM Functions */
-/* Synchronet X/YMODEM Functions */
 
 /****************************************************************************
  * @format.tab-size 4		(Plain Text/Source Code File Header)			*
@@ -122,6 +121,8 @@ int xmodem_put_nak(xmodem_t* xm, unsigned block_num)
 		lprintf(xm,LOG_DEBUG,"Block %u: Dumping byte: %02Xh"
 			,block_num, (BYTE)i);
 		SLEEP(1);
+		if(is_cancelled(xm))
+			break;
 	}
 	if(dump_count)
 		lprintf(xm,LOG_INFO,"Block %u: Dumped %u bytes"
@@ -436,7 +437,7 @@ BOOL xmodem_put_eot(xmodem_t* xm)
 	unsigned errors;
 	unsigned cans=0;
 
-	for(errors=0;errors<=xm->max_errors && is_connected(xm);errors++) {
+	for(errors=0;errors<=xm->max_errors && is_connected(xm) && !is_cancelled(xm);errors++) {
 
 		lprintf(xm,LOG_INFO,"Sending End-of-Text (EOT) indicator (%d)",errors+1);
 
-- 
GitLab