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