...
 
Commits (10)
......@@ -241,6 +241,7 @@ Options = ALLOW_POP3 | USE_SUBMISSION_PORT | TLS_SUBMISSION | TLS_POP3
; INDEX_FILE
; DEBUG_TX
; ALLOW_QWK
; ALLOW_BOUNCE
; NO_LOCAL_FSYS
; DIR_FILES
; KEEP_TEMP_FILES
......
......@@ -219,7 +219,7 @@ var tests = {
try {
finger_obj = JSON.parse(finger_result.join(''));
} catch(e) {
return 'finger ' + finger_query + '@' + finger_host + ' result: ' + e;
return finger_result.join('');
}
var bbs = list[lib.system_index(list, system.name)];
bbs.entry = undefined;
......
......@@ -220,10 +220,7 @@ HTTPRequest.prototype.Get=function(url, referer, base) {
&& this.response_headers_parsed.Location.length
) {
this.follow_redirects--;
const re = /([a-z]+:\/\/.+:{0,1}\d{0,5})\//i;
var loc = this.response_headers_parsed.Location[0];
if (loc.search(re) < 0) loc = url.match(re)[1] + loc; // Assumes 'url' will match 're', but if it doesn't you'll have other problems anyway
return this.Get(loc, url); // To-do: be less tired and think about referer,base
return this.Get(this.response_headers_parsed.Location[0], this.url.url, this.url.url);
}
return(this.body);
};
......
......@@ -78,7 +78,7 @@ void __fastcall TFtpCfgDlg::FormShow(TObject *Sender)
CmdLogCheckBox->Checked=MainForm->ftp_startup.options&FTP_OPT_DEBUG_RX;
DebugTxCheckBox->Checked=MainForm->ftp_startup.options&FTP_OPT_DEBUG_TX;
DebugDataCheckBox->Checked=MainForm->ftp_startup.options&FTP_OPT_DEBUG_DATA;
DirFilesCheckBox->Checked=MainForm->ftp_startup.options&FTP_OPT_DIR_FILES;
AllowBounceCheckBox->Checked=MainForm->ftp_startup.options&FTP_OPT_ALLOW_BOUNCE;
AllowQWKCheckBox->Checked
=MainForm->ftp_startup.options&FTP_OPT_ALLOW_QWK;
LocalFileSysCheckBox->Checked
......@@ -162,10 +162,10 @@ void __fastcall TFtpCfgDlg::OKBtnClick(TObject *Sender)
MainForm->ftp_startup.options|=FTP_OPT_ALLOW_QWK;
else
MainForm->ftp_startup.options&=~FTP_OPT_ALLOW_QWK;
if(DirFilesCheckBox->Checked==true)
MainForm->ftp_startup.options|=FTP_OPT_DIR_FILES;
if(AllowBounceCheckBox->Checked==true)
MainForm->ftp_startup.options|=FTP_OPT_ALLOW_BOUNCE;
else
MainForm->ftp_startup.options&=~FTP_OPT_DIR_FILES;
MainForm->ftp_startup.options&=~FTP_OPT_ALLOW_BOUNCE;
if(LocalFileSysCheckBox->Checked==false)
MainForm->ftp_startup.options|=FTP_OPT_NO_LOCAL_FSYS;
else
......
......@@ -164,13 +164,13 @@ object FtpCfgDlg: TFtpCfgDlg
ShowHint = True
TabOrder = 1
end
object DirFilesCheckBox: TCheckBox
object AllowBounceCheckBox: TCheckBox
Left = 148
Top = 86
Width = 125
Height = 20
Hint = 'Allow users access to files in directory, but not in database'
Caption = 'Directory File Access'
Hint = 'Allow authenticated users to use FTP Bounce (not recommended)'
Caption = 'Allow Bouncing'
ParentShowHint = False
ShowHint = True
TabOrder = 8
......
......@@ -69,7 +69,7 @@ __published:
TButton *OKBtn;
TButton *CancelBtn;
TButton *ApplyBtn;
TCheckBox *DirFilesCheckBox;
TCheckBox *AllowBounceCheckBox;
TTabSheet *IndexTabSheet;
TCheckBox *AutoIndexCheckBox;
TEdit *IndexFileNameEdit;
......
......@@ -2873,7 +2873,7 @@ static void ctrl_thread(void* arg)
if(pasv_sock!=INVALID_SOCKET) {
ftp_close_socket(&pasv_sock,&pasv_sess,__LINE__);
}
memcpy(&data_addr, &ftp.client_addr, ftp.client_addr_len);
p=cmd+5;
SKIP_WHITESPACE(p);
if(strnicmp(cmd, "PORT ",5)==0) {
......@@ -3009,7 +3009,9 @@ static void ctrl_thread(void* arg)
}
inet_addrtop(&data_addr, data_ip, sizeof(data_ip));
if(data_port< IPPORT_RESERVED) {
bool bounce_allowed = (startup->options & FTP_OPT_ALLOW_BOUNCE) && !(user.rest & FLAG('G'));
if(data_port < IPPORT_RESERVED
|| (memcmp(&data_addr, &ftp.client_addr, ftp.client_addr_len) != 0 && !bounce_allowed)) {
lprintf(LOG_WARNING,"%04d <%s> !SUSPECTED BOUNCE ATTACK ATTEMPT to %s port %u"
,sock,user.alias
,data_ip,data_port);
......
......@@ -106,6 +106,7 @@ static struct init_field ftp_init_fields[] = {
#define FTP_OPT_NO_LOCAL_FSYS (1<<5)
#define FTP_OPT_DIR_FILES (1<<6) /* Allow access to files in dir but not in database */
#define FTP_OPT_KEEP_TEMP_FILES (1<<7) /* Don't delete temp files (for debugging) */
#define FTP_OPT_ALLOW_BOUNCE (1<<8)
#define FTP_OPT_LOOKUP_PASV_IP (1<<9) /* resolve public IP address for PASV response */
#define FTP_OPT_NO_HOST_LOOKUP (1<<11)
#define FTP_OPT_NO_RECYCLE (1<<27) /* Disable recycling of server */
......@@ -125,6 +126,7 @@ static ini_bitdesc_t ftp_options[] = {
{ FTP_OPT_NO_LOCAL_FSYS ,"NO_LOCAL_FSYS" },
{ FTP_OPT_DIR_FILES ,"DIR_FILES" },
{ FTP_OPT_KEEP_TEMP_FILES ,"KEEP_TEMP_FILES" },
{ FTP_OPT_ALLOW_BOUNCE ,"ALLOW_BOUNCE" },
{ FTP_OPT_LOOKUP_PASV_IP ,"LOOKUP_PASV_IP" },
{ FTP_OPT_NO_HOST_LOOKUP ,"NO_HOST_LOOKUP" },
{ FTP_OPT_NO_RECYCLE ,"NO_RECYCLE" },
......
......@@ -2749,7 +2749,7 @@ js_listening_socket_constructor(JSContext *cx, uintN argc, jsval *arglist)
uint16_t port;
jsrefcount rc;
scfg_t *scfg;
struct xpms_set *set;
struct xpms_set *set = NULL;
struct ls_cb_data cb;
jsuint count;
int i;
......
......@@ -854,6 +854,7 @@ js_uifc_list(JSContext *cx, uintN argc, jsval *arglist)
return(JS_FALSE);
for(; argn<argc; argn++) {
if(JSVAL_IS_STRING(argv[argn])) {
free(title);
JSVALUE_TO_MSTRING(cx, argv[argn], title, NULL);
HANDLE_PENDING(cx, title);
continue;
......
......@@ -3522,6 +3522,7 @@ sbbs_t::sbbs_t(ushort node_num, union xp_sockaddr *addr, size_t addr_len, const
getstr_offset = 0;
lastnodemsg = 0;
xtrn_mode = 0;
last_ns_time = 0;
}
//****************************************************************************
......
......@@ -135,7 +135,7 @@ uint getsub(void)
opt[k][0]=0;
sprintf(str,"Select %s Sub-board",cfg.grp[i]->sname);
j=uifc.list(WIN_RHT|WIN_BOT|WIN_SAV,0,0,45,&sub_dflt,&sub_bar,str,opt);
if(j==-1 || j >= cfg.total_subs)
if(j==-1 || j >= k)
continue;
sub_dflt++;
sub_bar++;
......
......@@ -632,14 +632,24 @@ bool sbbs_t::writemsg(const char *fname, const char *top, char *subj, long mode,
return(false);
}
length=(long)filelength(file);
if(length < 0) {
errormsg(WHERE, ERR_LEN, msgtmp, length);
free(buf);
return false;
}
l=strlen((char *)buf); /* reserve space for top and terminating null */
/* truncate if too big */
if(length>(long)((cfg.level_linespermsg[useron_level]*MAX_LINE_LEN)-(l+1))) {
length=(cfg.level_linespermsg[useron_level]*MAX_LINE_LEN)-(l+1);
bputs(text[OutOfBytes]);
}
lread(file,buf+l,length);
long rd = read(file,buf+l,length);
close(file);
if(rd != length) {
errormsg(WHERE, ERR_READ, msgtmp, length);
free(buf);
return false;
}
// remove(msgtmp); /* no need to save the temp input file */
buf[l+length]=0;
}
......@@ -845,7 +855,7 @@ void sbbs_t::removeline(char *str, char *str2, char num, char skip)
errormsg(WHERE,ERR_ALLOC,str,flen);
return;
}
if(lread(file,buf,flen)!=flen) {
if(read(file,buf,flen)!=flen) {
close(file);
errormsg(WHERE,ERR_READ,str,flen);
free(buf);
......
......@@ -133,6 +133,7 @@ struct xpmapping* DLLCALL xpmap(const char *filename, enum xpmap_type type)
ret=(struct xpmapping *)malloc(sizeof(struct xpmapping));
if(ret==NULL) {
CloseHandle(md);
UnmapViewOfFile(addr);
return NULL;
}
ret->addr=addr;
......
Name: Exitilus
Desc: Turn-based, RPG set in medieval times
By: Tao Ge,Ricky Link,ECI Software
Cats: Games
Subs: RPG
exe: EXITILUS.EXE
; "player file in use" during maintenance - do "touch player.dat"
; "news not found" on game reset - create dir pnews
[md5:5c8efef0badeeb892f501c09b7356f95]
ver = 3.20
url = http://www.breakintochat.com/files/doors/ECI/exitv320.zip
[md5:42ca4136942667eaba789fafbf9874e4]
ver = 3.17
url = http://www.breakintochat.com/files/doors/ECI/exitv317.zip
[md5:d34e367ed483e5fc4753830127e780fb]
ver = 3.15
url = http://www.breakintochat.com/files/doors/ECI/exitv315.zip
[md5:10e5b07f035bf2dac9a1356cee290c33]
ver = 2.05
url = http://www.breakintochat.com/files/doors/Ge/EXS205-1.ZIP
; ALSO url = http://www.breakintochat.com/files/doors/Ge/EXS205-2.ZIP
[prog:EXITILUS]
name = Exitilus
cmd = exitilus %#
ars = DOS
execution_ars = NOT GUEST
settings = XTRN_ANSI | XTRN_MULTIUSER | XTRN_SH
type = XTRN_GAP
[exec:../3rdp-install/exitilus.js]
prompt = false
required = true
"use strict";
var gamedir = fullpath(js.startup_dir);
var lines = [];
lines[1] = gamedir;
lines[2] = gamedir;
lines[3] = " 0";
writeln("Beginning node config generation...");
for(i = 0; i < system.nodes; i++) {
var nodenum = i + 1;
file_backup(gamedir + 'exnod' + nodenum + '.cfg');
lines[0] = system.node_list[i].dir + 'door.sys';
var file = new File(gamedir + 'exnod' + nodenum + '.cfg');
if (!file.open("w")) {
writeln("Error " + file.error + " opening " + file.name + " for writing");
exit(1)
}
file.writeAll(lines);
file.close();
}
writeln("Config file generation complete");
exit(0);
Name: Boxcars
Desc: Dice BBS door game
By: Scott Jibben
Cats: Games
Subs: Chance,Blackjack.Dice
exe: BOXCARS.EXE
[md5:da57581a1cca804881d3b0d2a7c01de6]
ver = 1.01
url = https://jibbensoftware.com/download/BOX101.ZIP
;keyfile at https://jibbensoftware.com/download/RBOX777.ZIP
[prog:BOXCARS]
name = Boxcars
cmd = boxcars %#
ars = DOS
execution_ars = NOT GUEST
settings = XTRN_ANSI | XTRN_MULTIUSER | XTRN_SH
type = XTRN_GAP
[exec:../3rdp-install/jibben.js]
prompt = false
required = true
Name: Galactic Overlord
Desc: Up to 6 plays play against each other to control a universe of planets.
By: Scott Jibben
Cats: Games
Subs: War,Space
exe: GO.EXE
[md5:3b6e4c118b08f7604701fa713c839396]
ver = 1.36
url = https://jibbensoftware.com/download/GO136.ZIP
;key at https://jibbensoftware.com/download/RGO777.ZIP
[md5:2c55001ab710901db3fff4f4ca799c2e]
ver = 1.37b
url = https://jibbensoftware.com/download/GO137B.ZIP
[md5:40741e0be3911a7aa75849cc3a0e0bbd]
ver = 1.35
[prog:GOVERLD]
name = Galactic Overlord
cmd = go %#
ars = DOS
execution_ars = NOT GUEST
settings = XTRN_ANSI | XTRN_MULTIUSER | XTRN_SH
type = XTRN_GAP
[exec:../3rdp-install/jibben.js]
prompt = false
required = true
[event:GOMAINT]
prompt = false
cmd = gomaint.exe
name = Galactic Overlord Maintenance
; all days
days = 127
time = 0:00
\ No newline at end of file
Name: Mines of Gorr
Desc: 3D Medieval Role Playing Game
By: Scott Jibben
Cats: Games
Subs: RPG
exe: GORR.EXE
; Run gengorr prior to first game
; Key at https://jibbensoftware.com/download/RMOG777.ZIP
[md5:a4875312b7372e43bea86d4234257179]
ver = 1.00
url = https://jibbensoftware.com/download/MOG100.ZIP
[md5:7ed23d2bdae4942f8bdbad030cbca066]
ver = .30
[prog:GORR]
name = Mines of Gorr
cmd = gorr %#
ars = DOS
execution_ars = NOT GUEST
settings = XTRN_ANSI | XTRN_MULTIUSER | XTRN_SH
type = XTRN_GAP
[exec:../3rdp-install/jibben.js]
prompt = false
required = true
Name: Roll the Bones
Desc: Dice game
By: Scott Jibben
Cats: Games
Subs: Chance,Dice
exe: RTB.EXE
[md5:ffc4b66aad960f271048834b757b70fb]
ver = 1.02
url = https://jibbensoftware.com/download/RTB102.ZIP
[prog:RTB]
name = Roll the Bones
cmd = rtb %#
ars = DOS
execution_ars = NOT GUEST
settings = XTRN_ANSI | XTRN_MULTIUSER | XTRN_SH
type = XTRN_GAP
[exec:../3rdp-install/jibben-rollthebones.js]
prompt = false
required = true
"use strict";
writeln("Generating config files...");
var gamedir = fullpath(js.startup_dir);
var configfile = gamedir + "RTB.CFG";
var nodefile = gamedir + "NODES.CFG";
file_backup(configfile);
file_backup(nodefile);
var conf = new File(configfile);
if (conf.open(file_exists(configfile) ? 'r+' : 'w+')) {
conf.iniSetValue("DOOR SETTINGS", "BBSNAME", system.name);
conf.close();
} else {
writeln("Could not open " + configfile + " for writing");
exit(1);
}
var nodeconf = new File(nodefile);
if (nodeconf.open(file_exists(nodefile) ? 'r+' : 'w+')) {
for(i = 0; i < system.nodes; i++) {
var nodenum = i + 1;
nodeconf.iniSetValue("NODE" + nodenum, "DROPFILE", system.node_list[i].dir + 'door.sys');
nodeconf.iniSetValue("NODE" + nodenum, "FOSSIL", "Y");
}
nodeconf.close();
} else {
writeln("Could not open " + nodefile + " for writing");
exit(1);
}
writeln("Config generation complete");
exit(0);
"use strict";
writeln("Generating config files...");
var gamedir = fullpath(js.startup_dir);
var nodefile = gamedir + "NODES.CFG";
file_backup(nodefile);
var nodeconf = new File(nodefile);
if (nodeconf.open(file_exists(nodefile) ? 'r+' : 'w+')) {
for(i = 0; i < system.nodes; i++) {
var nodenum = i + 1;
nodeconf.iniSetValue("NODE" + nodenum, "DROPFILE", system.node_list[i].dir + 'door.sys');
nodeconf.iniSetValue("NODE" + nodenum, "FOSSIL", "Y");
}
nodeconf.close();
} else {
writeln("Could not open " + nodefile + " for writing");
exit(1);
}
writeln("Config generation complete");
exit(0);
Name: Amazing Memory
Desc: Simon clone where the game displays a sequence and the user repeats it.
By: Rusty Johnson,JNS Software
Cats: Games
Subs: Board
exe: AMAZING.EXE
[md5:80939a979b6ce816f8178a011775a695]
ver = 4.25
url = http://bbsfiles.com/ftp/JNS/jnsam425.zip
[prog:jnsam]
name = Amazing Memory
cmd = amazing.exe FOSSIL ALIAS
ars = DOS
execution_ars = NOT GUEST
settings = XTRN_ANSI | XTRN_MULTIUSER | XTRN_SH
type = XTRN_GAP
[exec:../3rdp-install/jns-amazingmemory.js]
prompt = false
required = true
"use strict";
writeln("Generating config files...");
var i;
var gamedir = fullpath(js.startup_dir);
var configfile = gamedir + "AMAZING.CFG";
var nodedat = gamedir + "DOORINFO.DAT";
file_backup(configfile);
var lines = [];
var file = new File(configfile);
if (file.open(configfile, 'r')) {
lines = file.readAll();
file.close();
} else {
// new config
lines[2] = 'Y';
lines[3] = 'NOLOG';
lines[6] = gamedir + 'amazing.asc';
lines[7] = gamedir + 'amazing.ans';
lines[8] = "";
lines[11] = "2";
lines[12] = "27";
}
lines[0] = system.name;
lines[1] = system.operator;
var mfile = new File(gamedir + "AMAZING.KEY");
if(mfile.open("rb")) {
var md5 = mfile.md5_hex;
writeln("Check key " + md5);
if (md5 == "14989a3a738bf58f651f6e5a31d4a48b") {
writeln("Restoring free key sysop info");
lines[0] = "BBSFILES.COM";
lines[1] = "FREE COPY";
}
mfile.close();
}
lines[4] = "Synchronet";
lines[5] = "DOOR.SYS";
lines[9] = "PCBNODE";
lines[10] = gamedir;
if (file.open(configfile, file_exists(configfile) ? 'r+' : 'w+')) {
file.writeAll(lines);
file.close();
} else {
writeln("Error " + file.error + " opening " + file.name + " for writing");
exit(1)
}
writeln("Beginning node config generation...");
file_backup(nodedat);
var nodedata = "";
for(i = 0; i < 250; i++) {
var nodenum = i + 1;
// you can use COM1 for every node
var nodeentry = (typeof system.node_list[i] !== "undefined") ?
"03F8" : "0000"
nodeentry = nodeentry + "0" + " ";
if (typeof system.node_list[i] !== "undefined") {
nodeentry = nodeentry + system.node_list[i].dir;
}
while (nodeentry.length < 46) {
nodeentry = nodeentry + " ";
}
nodedata = nodedata + nodeentry;
}
var file = new File(nodedat);
if (!file.open("w+")) {
writeln("Error " + file.error + " opening " + file.name + " for writing");
exit(1)
}
file.write(nodedata);
file.close();
writeln("Config generation complete");
exit(0);
"use strict";
writeln("Generating config files...");
var i;
var gamedir = fullpath(js.startup_dir);
var configfile = gamedir + "BOXPOKER.CFG";
var nodedat = gamedir + "DOORINFO.DAT";
file_backup(configfile);
var lines = [];
var file = new File(configfile);
if (file.open(configfile, 'r')) {
lines = file.readAll();
file.close();
} else {
// new config
lines[2] = 'Y';
lines[3] = 'NOLOG';
lines[6] = gamedir + 'boxpoker.asc';
lines[7] = gamedir + 'boxpoker.ans';
lines[8] = "";
lines[11] = "3";
lines[12] = "2";
lines[13] = "27";
}
lines[0] = system.name;
lines[1] = system.operator;
var mfile = new File(gamedir + "BOXPOKER.KEY");
if(mfile.open("rb")) {
var md5 = mfile.md5_hex;
writeln("Check key " + md5);
if (md5 == "5a2069529d7a981f2dc1adca3c51c7c1") {
writeln("Restoring free key sysop info");
lines[0] = "BBSFILES.COM";
lines[1] = "FREE COPY";
}
mfile.close();
}
lines[4] = "Synchronet";
lines[5] = "DOOR.SYS";
lines[9] = "PCBNODE";
lines[10] = gamedir;
if (file.open(configfile, file_exists(configfile) ? 'r+' : 'w+')) {
file.writeAll(lines);
file.close();
} else {
writeln("Error " + file.error + " opening " + file.name + " for writing");
exit(1)
}
writeln("Beginning node config generation...");
file_backup(nodedat);
var nodedata = "";
for(i = 0; i < 250; i++) {
var nodenum = i + 1;
// you can use COM1 for every node
var nodeentry = (typeof system.node_list[i] !== "undefined") ?
"03F8" : "0000"
nodeentry = nodeentry + "0" + " ";
if (typeof system.node_list[i] !== "undefined") {
nodeentry = nodeentry + system.node_list[i].dir;
}
while (nodeentry.length < 46) {
nodeentry = nodeentry + " ";
}
nodedata = nodedata + nodeentry;
}
var file = new File(nodedat);
if (!file.open("w+")) {
writeln("Error " + file.error + " opening " + file.name + " for writing");
exit(1)
}
file.write(nodedata);
file.close();
writeln("Config generation complete");
exit(0);
Name: Bomb Squad
Desc: A power of deduction game where you try to deactivate bombs before they explode
By: Rusty Johnson,JNS Software
Cats: Games
Subs: Puzzle
exe: BOMBSQAD.EXE
[md5:53b97215ab0218a744f54dae8d46f968]
ver = 1.0
url = http://bbsfiles.com/ftp/JNS/jns_bs10.zip
[prog:BOMBSQAD]
name = Bomb Squad
cmd = bombsqad.exe /fossil
ars = DOS
execution_ars = NOT GUEST
settings = XTRN_ANSI | XTRN_MULTIUSER | XTRN_SH
type = XTRN_GAP
[exec:../3rdp-install/jns-bombsquad.js]
prompt = false
required = true
"use strict";
writeln("Generating config files...");
var i;
var gamedir = fullpath(js.startup_dir);
var configfile = gamedir + "BOMBSQAD.CFG";
var nodedat = gamedir + "NODEINFO.DAT";
file_backup(configfile);
var lines = [];
var file = new File(configfile);
if (file.open(configfile, 'r')) {
lines = file.readAll();
file.close();
} else {
// new config
lines[2] = 'Y';
lines[3] = 'NOLOG';
lines[6] = gamedir + 'bombsqad.asc';
lines[7] = gamedir + 'bombsqad.ans';
lines[11] = "5";
lines[12] = "2";
lines[13] = "2";
lines[14] = "300";
}
lines[0] = system.name;
lines[1] = system.operator;
var mfile = new File(gamedir + "BOMBSQAD.KEY");
if(mfile.open("rb")) {
var md5 = mfile.md5_hex;
writeln("Check key " + md5);
if (md5 == "70356999d5473d3fb05693dc7aa36407") {
writeln("Restoring free key sysop info");
lines[0] = "BBSFILES.COM";
lines[1] = "FREE COPY";
}
mfile.close();
}
lines[4] = "Synchronet";
lines[5] = "DOOR.SYS";
lines[9] = "PCBNODE";
lines[10] = gamedir;
if (file.open(configfile, file_exists(configfile) ? 'r+' : 'w+')) {
file.writeAll(lines);
file.close();
} else {
writeln("Error " + file.error + " opening " + file.name + " for writing");
exit(1)
}
writeln("Beginning node config generation...");
file_backup(nodedat);
var nodedata = "";
for(i = 0; i < 250; i++) {
var nodenum = i + 1;
// you can use COM1 for every node
var nodeentry = (typeof system.node_list[i] !== "undefined") ?
"03F8" : "0000"
nodeentry = nodeentry + "0" + " ";
if (typeof system.node_list[i] !== "undefined") {
nodeentry = nodeentry + system.node_list[i].dir;
}
while (nodeentry.length < 46) {
nodeentry = nodeentry + " ";
}
nodedata = nodedata + nodeentry;
}
var file = new File(nodedat);
if (!file.open("w+")) {
writeln("Error " + file.error + " opening " + file.name + " for writing");
exit(1)
}
file.write(nodedata);
file.close();
writeln("Config generation complete");
exit(0);
Name: Boxed Poker
Desc: Place Cards in a 5x5 grid to come up with the best ten poker hands
By: Rusty Johnson,JNS Software
Cats: Games
Subs: Chance,Cards,Poker
exe: BOXPOKER.EXE
[md5:94ffec12a9142c904b77855482015f76]
ver = 4.15
url = http://bbsfiles.com/ftp/JNS/jnsbp415.zip
[prog:boxedpkr]
name = Boxed Poker
cmd = boxpoker.exe FOSSIL ALIAS
ars = DOS
execution_ars = NOT GUEST
settings = XTRN_ANSI | XTRN_MULTIUSER | XTRN_SH
type = XTRN_GAP
[exec:../3rdp-install/jns-bokedpoker.js]
prompt = false
required = true
Name: Double Solitree
Desc: Like Soli-Tree With 2 Decks
By: Rusty Johnson,JNS Software
Cats: Games
Subs: Cards,Solitaire
exe: DOUBLEST.EXE
[md5:4ec138e079a2d9579be43623905955bb]
ver = 2.2
url = http://bbsfiles.com/ftp/JNS/jns_ds22.zip
[prog:SOLITREE]
name = Double Solitree
cmd = doublest.exe /fossil
ars = DOS
execution_ars = NOT GUEST
settings = XTRN_ANSI | XTRN_MULTIUSER | XTRN_SH
type = XTRN_GAP
[exec:../3rdp-install/jns-doublesolitree.js]
prompt = false
required = true
"use strict";
writeln("Generating config files...");
var i;
var gamedir = fullpath(js.startup_dir);
var configfile = gamedir + "DOUBLEST.CFG";
var nodedat = gamedir + "NODEINFO.DAT";
file_backup(configfile);
var lines = [];
var file = new File(configfile);
if (file.open(configfile, 'r')) {
lines = file.readAll();
file.close();
} else {
// new config
lines[2] = 'Y';
lines[3] = 'NOLOG';
lines[6] = gamedir + 'solitree.asc';
lines[7] = gamedir + 'solitree.ans';
lines[8] = "";
lines[11] = "2";
lines[12] = "2";
lines[13] = "2";
lines[14] = "JOKERS";
}
lines[0] = system.name;
lines[1] = system.operator;
var mfile = new File(gamedir + "DOUBLEST.KEY");
if(mfile.open("rb")) {
var md5 = mfile.md5_hex;
writeln("Check key " + md5);
if (md5 == "3ffb73eb3ca49349eaec562eeb82ec6e") {
writeln("Restoring free key sysop info");
lines[0] = "BBSFILES.COM";
lines[1] = "FREE COPY";
}
mfile.close();
}
lines[4] = "Synchronet";
lines[5] = "DOOR.SYS";
lines[9] = "PCBNODE";
lines[10] = gamedir;
if (file.open(configfile, file_exists(configfile) ? 'r+' : 'w+')) {
file.writeAll(lines);
file.close();
} else {
writeln("Error " + file.error + " opening " + file.name + " for writing");
exit(1)
}
writeln("Beginning node config generation...");
file_backup(nodedat);
var nodedata = "";
for(i = 0; i < 250; i++) {
var nodenum = i + 1;
// you can use COM1 for every node
var nodeentry = (typeof system.node_list[i] !== "undefined") ?
"03F8" : "0000"
nodeentry = nodeentry + "0" + " ";
if (typeof system.node_list[i] !== "undefined") {
nodeentry = nodeentry + system.node_list[i].dir;
}
while (nodeentry.length < 46) {
nodeentry = nodeentry + " ";
}
nodedata = nodedata + nodeentry;
}
var file = new File(nodedat);
if (!file.open("w+")) {
writeln("Error " + file.error + " opening " + file.name + " for writing");
exit(1)
}
file.write(nodedata);
file.close();
writeln("Config generation complete");
exit(0);
"use strict";
writeln("Generating config files...");
var i;
var gamedir = fullpath(js.startup_dir);
var configfile = gamedir + "DRAWPOKE.CFG";
var nodedat = gamedir + "DOORINFO.DAT";
file_backup(configfile);
var lines = [];
var file = new File(configfile);
if (file.open(configfile, 'r')) {
lines = file.readAll();
file.close();
} else {
// new config
lines[2] = 'Y';
lines[3] = 'NOLOG';
lines[6] = gamedir + 'drawpoke.asc';
lines[7] = gamedir + 'drawpoke.ans';
lines[8] = "";
lines[11] = "15";
lines[12] = "2";
lines[13] = "27";
}
lines[0] = system.name;
lines[1] = system.operator;
var mfile = new File(gamedir + "DRAWPOKE.KEY");
if(mfile.open("rb")) {
var md5 = mfile.md5_hex;
writeln("Check key " + md5);
if (md5 == "cee24fb1e8d4035f7f63097e262091b1") {
writeln("Restoring free key sysop info");
lines[0] = "BBSFILES.COM";
lines[1] = "FREE COPY";
}
mfile.close();
}
lines[4] = "Synchronet";
lines[5] = "DOOR.SYS";
lines[9] = "PCBNODE";
lines[10] = gamedir;
if (file.open(configfile, file_exists(configfile) ? 'r+' : 'w+')) {
file.writeAll(lines);
file.close();
} else {
writeln("Error " + file.error + " opening " + file.name + " for writing");
exit(1)
}
writeln("Beginning node config generation...");
file_backup(nodedat);
var nodedata = "";
for(i = 0; i < 250; i++) {
var nodenum = i + 1;
// you can use COM1 for every node
var nodeentry = (typeof system.node_list[i] !== "undefined") ?
"03F8" : "0000"
nodeentry = nodeentry + "0" + " ";
if (typeof system.node_list[i] !== "undefined") {
nodeentry = nodeentry + system.node_list[i].dir;
}
while (nodeentry.length < 46) {
nodeentry = nodeentry + " ";
}
nodedata = nodedata + nodeentry;
}
var file = new File(nodedat);
if (!file.open("w+")) {
writeln("Error " + file.error + " opening " + file.name + " for writing");
exit(1)
}
file.write(nodedata);
file.close();
writeln("Config generation complete");
exit(0);
Name: Five Card Draw Poker
Desc: A nice poker game where the user plays against the dealing computer
By: Rusty Johnson,JNS Software
Cats: Games
Subs: Chance,Cards,Poker
exe: DRAWPOKE.EXE
[md5:3afb3a9e4cfc78b59e65658edce5a06d]
ver = 2.15
url = http://bbsfiles.com/ftp/JNS/jnsdp215.zip
[prog:drawpoke]
name = Five Card Draw Poker
cmd = drawpoke.exe FOSSIL ALIAS
ars = DOS
execution_ars = NOT GUEST
settings = XTRN_ANSI | XTRN_MULTIUSER | XTRN_SH
type = XTRN_GAP
[exec:../3rdp-install/jns-fivecarddrawpoker.js]
prompt = false
required = true
Name: Forty Thieves Solitaire
Desc: Nice Solitaire Card game where the user must win to play. Similar To Golf-St.
By: Rusty Johnson,JNS Software
Cats: Games
Subs: Cards,Solitaire
exe: FTHIEVES.EXE
[md5:e8d44a1b003a7f1720bfcda5e76b4259]
ver = 1.2
url = http://bbsfiles.com/ftp/JNS/jns_ft12.zip
[prog:forty]
name = Forty Thieves Solitaire
cmd = fthieves.exe /fossil
ars = DOS
execution_ars = NOT GUEST
settings = XTRN_ANSI | XTRN_MULTIUSER | XTRN_SH
type = XTRN_GAP
[exec:../3rdp-install/jns-fortythievessolitaire.js]
prompt = false
required = true
"use strict";
writeln("Generating config files...");
var i;
var gamedir = fullpath(js.startup_dir);
var configfile = gamedir + "FTHIEVES.CFG";
var nodedat = gamedir + "NODEINFO.DAT";
file_backup(configfile);
var lines = [];
var file = new File(configfile);
if (file.open(configfile, 'r')) {
lines = file.readAll();
file.close();
} else {
// new config
lines[2] = 'Y';
lines[3] = 'NOLOG';
lines[6] = gamedir + 'forty.asc';
lines[7] = gamedir + 'forty.ans';
lines[8] = "";
lines[11] = "Y";
lines[12] = "2";
lines[13] = "25";
}
lines[0] = system.name;
lines[1] = system.operator;
var mfile = new File(gamedir + "FTHIEVES.KEY");
if(mfile.open("rb")) {
var md5 = mfile.md5_hex;
writeln("Check key " + md5);
if (md5 == "f7730187c0ddfa54eaa1a4abcea18ece") {
writeln("Restoring free key sysop info");
lines[0] = "BBSFILES.COM";
lines[1] = "FREE COPY";
}
mfile.close();
}
lines[4] = "Synchronet";
lines[5] = "DOOR.SYS";
lines[9] = "PCBNODE";
lines[10] = nodedat;
if (file.open(configfile, file_exists(configfile) ? 'r+' : 'w+')) {
file.writeAll(lines);
file.close();
} else {
writeln("Error " + file.error + " opening " + file.name + " for writing");
exit(1)
}
writeln("Beginning node config generation...");
file_backup(nodedat);
var nodedata = "";
for(i = 0; i < 250; i++) {
var nodenum = i + 1;
// you can use COM1 for every node
var nodeentry = (typeof system.node_list[i] !== "undefined") ?
"03F8" : "0000"
nodeentry = nodeentry + "0" + " ";
if (typeof system.node_list[i] !== "undefined") {
nodeentry = nodeentry + system.node_list[i].dir;
}
while (nodeentry.length < 46) {
nodeentry = nodeentry + " ";
}
nodedata = nodedata + nodeentry;
}
var file = new File(nodedat);
if (!file.open("w+")) {
writeln("Error " + file.error + " opening " + file.name + " for writing");
exit(1)
}
file.write(nodedata);
file.close();
writeln("Config generation complete");
exit(0);
Name: Free Cell Solitree
Desc: Solitaire Card game that takes a lot of skill to remove cards from table
By: Rusty Johnson,JNS Software
Cats: Games
Subs: Cards,Solitaire
exe: FREECELL.EXE
[md5:c5d98d5b76cb53f415a626c4c8a2443a]
ver = 1.0
url = http://bbsfiles.com/ftp/JNS/jns_fc10.zip
[prog:freecell]
name = Free Cell Solitree
cmd = freecell.exe /fossil
ars = DOS
execution_ars = NOT GUEST
settings = XTRN_ANSI | XTRN_MULTIUSER | XTRN_SH
type = XTRN_GAP
[exec:../3rdp-install/jns-freecellsolitaire.js]
prompt = false
required = true
"use strict";
writeln("Generating config files...");
var i;
var gamedir = fullpath(js.startup_dir);
var configfile = gamedir + "FREECELL.CFG";
var nodedat = gamedir + "NODEINFO.DAT";
file_backup(configfile);
var lines = [];
var file = new File(configfile);
if (file.open(configfile, 'r')) {
lines = file.readAll();
file.close();
} else {
// new config
lines[2] = 'Y';
lines[3] = 'NOLOG';
lines[6] = gamedir + 'freecell.asc';
lines[7] = gamedir + 'freecell.ans';
lines[8] = "";
lines[11] = "2";
lines[12] = "2";
lines[13] = "2";
}
lines[0] = system.name;
lines[1] = system.operator;
var mfile = new File(gamedir + "FREECELL.KEY");
if(mfile.open("rb")) {
var md5 = mfile.md5_hex;
writeln("Check key " + md5);
if (md5 == "93b6cbd1e08b4a5a451b6584f4fe114b") {
writeln("Restoring free key sysop info");
lines[0] = "BBSFILES.COM";
lines[1] = "FREE COPY";
}
mfile.close();
}
lines[4] = "Synchronet";
lines[5] = "DOOR.SYS";
lines[9] = "PCBNODE";
lines[10] = gamedir;
if (file.open(configfile, file_exists(configfile) ? 'r+' : 'w+')) {
file.writeAll(lines);
file.close();
} else {
writeln("Error " + file.error + " opening " + file.name + " for writing");
exit(1)
}
writeln("Beginning node config generation...");
file_backup(nodedat);
var nodedata = "";
for(i = 0; i < 250; i++) {
var nodenum = i + 1;
// you can use COM1 for every node
var nodeentry = (typeof system.node_list[i] !== "undefined") ?
"03F8" : "0000"
nodeentry = nodeentry + "0" + " ";
if (typeof system.node_list[i] !== "undefined") {
nodeentry = nodeentry + system.node_list[i].dir;
}
while (nodeentry.length < 46) {
nodeentry = nodeentry + " ";
}
nodedata = nodedata + nodeentry;
}
var file = new File(nodedat);
if (!file.open("w+")) {
writeln("Error " + file.error + " opening " + file.name + " for writing");
exit(1)
}
file.write(nodedata);
file.close();
writeln("Config generation complete");
exit(0);
Name: Golf Solitaire
Desc: This is a solitaire card game which features Tournament Play for a very competitive game.
By: Rusty Johnson,JNS Software
Cats: Games
Subs: Cards,Board
exe: GOLF-ST.EXE
[md5:7f6ee77b01d518064315beefd78e677b]
ver = 4.5
url = http://bbsfiles.com/ftp/JNS/jns_gs45.zip
[prog:golfso]
name = Golf Solitaire
cmd = golf-st /fossil
ars = DOS
execution_ars = NOT GUEST
settings = XTRN_ANSI | XTRN_MULTIUSER | XTRN_SH
type = XTRN_GAP
[exec:../3rdp-install/jns-golfsolitaire.js]
prompt = false
required = true
"use strict";
writeln("Generating config files...");
var i;
var gamedir = fullpath(js.startup_dir);
var configfile = gamedir + "GOLF-ST.CFG";
var nodedat = gamedir + "NODEINFO.DAT";
file_backup(configfile);
var lines = [];
var file = new File(configfile);
if (file.open(configfile, 'r')) {
lines = file.readAll();
file.close();
} else {
// new config
lines[2] = 'Y';
lines[3] = 'NOLOG';
lines[6] = gamedir + 'golfso.asc';
lines[7] = gamedir + 'golfso.ans';
lines[8] = "";
lines[11] = "3";
lines[12] = "2";
lines[13] = "25";
lines[14] = "y";
}
lines[0] = system.name;
lines[1] = system.operator;
var mfile = new File(gamedir + "GOLF-ST.KEY");
if(mfile.open("rb")) {
var md5 = mfile.md5_hex;
writeln("Check key " + md5);
if (md5 == "a48fa3fa696ca1027022a28e0f4d5302") {
writeln("Restoring free key sysop info");
lines[0] = "BBSFILES.COM";
lines[1] = "FREE COPY";
}
mfile.close();
}
lines[4] = "Synchronet";
lines[5] = "DOOR.SYS";
lines[9] = "PCBNODE";
lines[10] = nodedat;
if (file.open(configfile, file_exists(configfile) ? 'r+' : 'w+')) {
file.writeAll(lines);
file.close();
} else {
writeln("Error " + file.error + " opening " + file.name + " for writing");
exit(1)
}
writeln("Beginning node config generation...");
file_backup(nodedat);
var nodedata = "";
for(i = 0; i < 250; i++) {
var nodenum = i + 1;
// you can use COM1 for every node
var nodeentry = (typeof system.node_list[i] !== "undefined") ?
"03F8" : "0000"
nodeentry = nodeentry + "0" + " ";
if (typeof system.node_list[i] !== "undefined") {
nodeentry = nodeentry + system.node_list[i].dir;
}
while (nodeentry.length < 46) {
nodeentry = nodeentry + " ";
}
nodedata = nodedata + nodeentry;
}
var file = new File(nodedat);
if (!file.open("w+")) {
writeln("Error " + file.error + " opening " + file.name + " for writing");
exit(1)
}
file.write(nodedata);
file.close();
writeln("Config generation complete");
exit(0);