From b1cfd2628d54d6252fa924984876ed06e081d5c7 Mon Sep 17 00:00:00 2001
From: rswindell <>
Date: Thu, 14 May 2020 01:25:32 +0000
Subject: [PATCH] Need to wait for output buffer to flush so that any messages
 printed by this script will be displayed before sbbs gets control and calls
 rioctl(IOFB).

---
 exec/localcopy.js | 154 ++++++++++++++++++++++++++--------------------
 1 file changed, 88 insertions(+), 66 deletions(-)

diff --git a/exec/localcopy.js b/exec/localcopy.js
index 5c01f7efdb..8870c2bc70 100644
--- a/exec/localcopy.js
+++ b/exec/localcopy.js
@@ -17,85 +17,107 @@
 // Supports DSZLOG               No                                  
 // Socket I/O                    No                                  
 
-var cmd = argv[0];
-if(!cmd) {
-	alert("usage: <install | send | recv> [<file> [...]]");
-	exit(1);
-}
-
 // Copy a file, confirm over-write, preserving original date/time stamp
 function fcopy(src, dest)
 {
 	if(file_exists(dest) && !confirm("Overwrite \1w" + dest))
-		exit(1);
+		return false;
 	if(!file_copy(src, dest)) {
 		alert(format("Error %d copying '%s' to '%s'", errno, src, dest));
-		exit(2);
+		return false;
 	}
 	if(!file_utime(dest, time(), file_date(src)))
-		exit(3);
+		return false;
 	log(LOG_DEBUG, format("'%s' copied to '%s'", src, dest));
+	return true;
 }
 
-switch(cmd) {
-	case 'install':
-		var cnflib = load({}, "cnflib.js");
-		var file_cnf = cnflib.read("file.cnf");
-		if(!file_cnf) {
-			alert("Failed to read file.cnf");
-			exit(-1);
-		}
-		file_cnf.prot.push({ 
-			  key: 'L'
-			, name: 'Local Copy'
-			, ulcmd: '?localcopy send %f' 
-			, dlcmd: '?localcopy recv %f'
-			, batulcmd: '?localcopy send %g'
-			, batdlcmd: '?localcopy recv %s'
-			, ars: 'SYSOP'
-			});
+function main(cmd) {
+
+	if(!cmd) {
+		alert("usage: <install | send | recv> [<file> [...]]");
+		return 1;
+	}
+
+	switch(cmd) {
+		case 'install':
+			var cnflib = load({}, "cnflib.js");
+			var file_cnf = cnflib.read("file.cnf");
+			if(!file_cnf) {
+				alert("Failed to read file.cnf");
+				return(-1);
+			}
+			file_cnf.prot.push({ 
+				  key: 'L'
+				, name: 'Local Copy'
+				, ulcmd: '?localcopy send %f' 
+				, dlcmd: '?localcopy recv %f'
+				, batulcmd: '?localcopy send %g'
+				, batdlcmd: '?localcopy recv %s'
+				, ars: 'SYSOP'
+				});
 		
-		if(!cnflib.write("file.cnf", undefined, file_cnf)) {
-			alert("Failed to write file.cnf");
-			exit(-1);
-		}
-		exit(0);
+			if(!cnflib.write("file.cnf", undefined, file_cnf)) {
+				alert("Failed to write file.cnf");
+				return(-1);
+			}
+			return(0);
 	
-	case 'send':
-		if(file_isdir(argv[1])) { /* batch upload */
-			var dest = backslash(argv[1]);
-			var src = prompt("Source files (with wildcards, e.g. *)");
-			var list = directory(src);
-			for(var i in list) {
-				var path = dest + file_getname(list[i]);
-				fcopy(list[i], path)
+		case 'send':
+			if(file_isdir(argv[1])) { /* batch upload */
+				var dest = backslash(argv[1]);
+				var src = prompt("Source files (with wildcards, e.g. *)");
+				if(!src)
+					return(1);
+				var list = directory(src);
+				if(!list || !list.length) {
+					alert("No files found: " + src);
+					return(1);
+				}
+				print(list.length + " files found");
+				var count = 0;
+				for(var i in list) {
+					if(js.terminated || console.aborted || !bbs.online)
+						break;
+					var path = dest + file_getname(list[i]);
+					if(fcopy(list[i], path))
+						count++;
+				}
+				print(count + " files copied");
+				return(0);
+			}
+			var src = prompt("Source file or directory");
+			if(!src)
+				return(1);
+			if(file_isdir(src))
+				src = backslash(src);
+			for(var i = 1; i < argc; i++) {
+				var path = src;
+				if(file_isdir(path))
+					path += file_getname(argv[i]);
+				fcopy(path, argv[i]);
 			}
-			exit(0);
-		}
-		var src = prompt("Source file or directory");
-		if(!src)
-			exit(1);
-		if(file_isdir(src))
-			src = backslash(src);
-		for(var i = 1; i < argc; i++) {
-			var path = src;
-			if(file_isdir(path))
-				path += file_getname(argv[i]);
-			fcopy(path, argv[i]);
-		}
-		exit(0);
+			return(0);
 		
-	case 'recv':
-		var dest = prompt("Destination file or directory");
-		if(!dest)
-			exit(1);
-		if(file_isdir(dest))
-			dest = backslash(dest);
-		for(var i = 1; i < argc; i++) {
-			var path = dest;
-			if(file_isdir(path))
-				path += file_getname(argv[i]);
-			fcopy(argv[i], path);
-		}
-		exit(0);
+		case 'recv':
+			var dest = prompt("Destination file or directory");
+			if(!dest)
+				return(1);
+			if(file_isdir(dest))
+				dest = backslash(dest);
+			for(var i = 1; i < argc; i++) {
+				var path = dest;
+				if(file_isdir(path))
+					path += file_getname(argv[i]);
+				fcopy(argv[i], path);
+			}
+			return(0);
+	}
+}
+
+var result = main(argv[0]);
+// The BBS flushes I/O buffers when returning from transfer prots:
+while(bbs.online && console.output_buffer_level && !js.terminated) {
+	sleep(100);
 }
+result;
-- 
GitLab