Skip to content
Snippets Groups Projects
Commit b2601ca8 authored by Rob Swindell's avatar Rob Swindell :speech_balloon:
Browse files

Add support for 31-line DOOR.SYS file format (alternative to 52-line version)

Removed UTIDOOR.TXT file format: nobody uses this drop file format and we
removed the UTI driver long ago, so this was just an artifact.

If you previously had an external program (door) configured in SCFG to use
the "GAP DOOR.SYS" file format, SBBS will create the same (52 line) format
as before (no change).

But for doors that have compatibilty issues with the 52-line DOOR.SYS file
created by Synchronet (e.g. Thunder cat V3.30), a sysop can now choose "GAP
(original)" for the drop file type and Synchronet will create a 31-line
DOOR.SYS file instead.
parent 47eb42e6
No related branches found
No related tags found
No related merge requests found
Pipeline #6835 passed
...@@ -355,12 +355,12 @@ enum { /* Values for xtrn_t.type */ ...@@ -355,12 +355,12 @@ enum { /* Values for xtrn_t.type */
XTRN_NONE /* No data file needed */ XTRN_NONE /* No data file needed */
,XTRN_SBBS /* Synchronet external */ ,XTRN_SBBS /* Synchronet external */
,XTRN_WWIV /* WWIV external */ ,XTRN_WWIV /* WWIV external */
,XTRN_GAP /* Gap door */ ,XTRN_DOOR_SYS /* 52-line door.sys file */
,XTRN_RBBS /* RBBS, QBBS, or Remote Access */ ,XTRN_RBBS /* RBBS, QBBS, or Remote Access */
,XTRN_WILDCAT /* Wildcat */ ,XTRN_WILDCAT /* Wildcat */
,XTRN_PCBOARD /* PCBoard */ ,XTRN_PCBOARD /* PCBoard */
,XTRN_SPITFIRE /* SpitFire */ ,XTRN_SPITFIRE /* SpitFire */
,XTRN_UTI /* UTI Doors - MegaMail */ ,XTRN_GAP /* 31-line doors.sys file */
,XTRN_SR /* Solar Realms */ ,XTRN_SR /* Solar Realms */
,XTRN_RBBS1 /* DORINFO1.DEF always */ ,XTRN_RBBS1 /* DORINFO1.DEF always */
,XTRN_TRIBBS /* TRIBBS.SYS */ ,XTRN_TRIBBS /* TRIBBS.SYS */
......
...@@ -216,92 +216,52 @@ static char* mdaystr(long mdays) ...@@ -216,92 +216,52 @@ static char* mdaystr(long mdays)
static char* dropfile(int type, ulong misc) static char* dropfile(int type, ulong misc)
{ {
static char str[128]; static char str[128];
char fname[64]="";
switch(type) { switch(type) {
case XTRN_SBBS: case XTRN_SBBS:
strcpy(fname,"XTRN.DAT"); strcpy(str,"XTRN.DAT");
break; break;
case XTRN_WWIV: case XTRN_WWIV:
strcpy(fname,"CHAIN.TXT"); strcpy(str,"CHAIN.TXT");
break; break;
case XTRN_GAP: case XTRN_GAP:
strcpy(fname,"DOOR.SYS"); strcpy(str,"DOOR.SYS (31 lines)");
break; break;
case XTRN_RBBS: case XTRN_DOOR_SYS:
strcpy(fname,"DORINFO#.DEF"); strcpy(str,"DOOR.SYS (52 lines)");
break;
case XTRN_RBBS1:
strcpy(fname,"DORINFO1.DEF");
break;
case XTRN_WILDCAT:
strcpy(fname,"CALLINFO.BBS");
break;
case XTRN_PCBOARD:
strcpy(fname,"PCBOARD.SYS");
break;
case XTRN_SPITFIRE:
strcpy(fname,"SFDOORS.DAT");
break;
case XTRN_UTI:
strcpy(fname,"UTIDOOR.TXT");
break;
case XTRN_SR:
strcpy(fname,"DOORFILE.SR");
break;
case XTRN_TRIBBS:
strcpy(fname,"TRIBBS.SYS");
break;
case XTRN_DOOR32:
strcpy(fname,"DOOR32.SYS");
break;
}
if(misc&XTRN_LWRCASE)
strlwr(fname);
switch(type) {
case XTRN_SBBS:
sprintf(str,"%-15s %s","Synchronet",fname);
break;
case XTRN_WWIV:
sprintf(str,"%-15s %s","WWIV",fname);
break;
case XTRN_GAP:
sprintf(str,"%-15s %s","GAP",fname);
break; break;
case XTRN_RBBS: case XTRN_RBBS:
sprintf(str,"%-15s %s","RBBS/QuickBBS",fname); strcpy(str,"DORINFO#.DEF");
break; break;
case XTRN_RBBS1: case XTRN_RBBS1:
sprintf(str,"%-15s %s","RBBS/QuickBBS",fname); strcpy(str,"DORINFO1.DEF");
break; break;
case XTRN_WILDCAT: case XTRN_WILDCAT:
sprintf(str,"%-15s %s","Wildcat",fname); strcpy(str,"CALLINFO.BBS");
break; break;
case XTRN_PCBOARD: case XTRN_PCBOARD:
sprintf(str,"%-15s %s","PCBoard",fname); strcpy(str,"PCBOARD.SYS");
break; break;
case XTRN_SPITFIRE: case XTRN_SPITFIRE:
sprintf(str,"%-15s %s","SpitFire",fname); strcpy(str,"SFDOORS.DAT");
break;
case XTRN_UTI:
sprintf(str,"%-15s %s","MegaMail",fname);
break; break;
case XTRN_SR: case XTRN_SR:
sprintf(str,"%-15s %s","Solar Realms",fname); strcpy(str,"DOORFILE.SR");
break; break;
case XTRN_TRIBBS: case XTRN_TRIBBS:
sprintf(str,"%-15s %s","TriBBS",fname); strcpy(str,"TRIBBS.SYS");
break; break;
case XTRN_DOOR32: case XTRN_DOOR32:
sprintf(str,"%-15s %s","Mystic",fname); strcpy(str,"DOOR32.SYS");
break; break;
default: default:
strcpy(str,"None"); strcpy(str,"None");
break; return str;
} }
return(str);
if(misc&XTRN_LWRCASE)
strlwr(str);
return str;
} }
void xprogs_cfg() void xprogs_cfg()
...@@ -1225,7 +1185,7 @@ void xtrn_cfg(int section) ...@@ -1225,7 +1185,7 @@ void xtrn_cfg(int section)
snprintf(opt[k++],MAX_OPLN,"%-27.27s%s","Disable Local Display" snprintf(opt[k++],MAX_OPLN,"%-27.27s%s","Disable Local Display"
,cfg.xtrn[i]->misc&XTRN_NODISPLAY ? "Yes" : "No"); ,cfg.xtrn[i]->misc&XTRN_NODISPLAY ? "Yes" : "No");
snprintf(opt[k++],MAX_OPLN,"%-23.23s%-4s%s","BBS Drop File Type" snprintf(opt[k++],MAX_OPLN,"%-23.23s%-4s%s","BBS Drop File Type"
,cfg.xtrn[i]->misc&REALNAME ? "(R)":nulstr ,(cfg.xtrn[i]->type != XTRN_NONE && (cfg.xtrn[i]->misc&REALNAME)) ? "(R)":nulstr
,dropfile(cfg.xtrn[i]->type,cfg.xtrn[i]->misc)); ,dropfile(cfg.xtrn[i]->type,cfg.xtrn[i]->misc));
snprintf(opt[k++],MAX_OPLN,"%-27.27s%s","Place Drop File In" snprintf(opt[k++],MAX_OPLN,"%-27.27s%s","Place Drop File In"
,cfg.xtrn[i]->misc&STARTUPDIR ? "Start-Up Directory":cfg.xtrn[i]->misc&XTRN_TEMP_DIR ? "Temp Directory" : "Node Directory"); ,cfg.xtrn[i]->misc&STARTUPDIR ? "Start-Up Directory":cfg.xtrn[i]->misc&XTRN_TEMP_DIR ? "Temp Directory" : "Node Directory");
...@@ -1518,12 +1478,12 @@ void xtrn_cfg(int section) ...@@ -1518,12 +1478,12 @@ void xtrn_cfg(int section)
strcpy(opt[k++],"None"); strcpy(opt[k++],"None");
snprintf(opt[k++], MAX_OPLN, "%-15s %s","Synchronet","XTRN.DAT"); snprintf(opt[k++], MAX_OPLN, "%-15s %s","Synchronet","XTRN.DAT");
snprintf(opt[k++], MAX_OPLN, "%-15s %s","WWIV","CHAIN.TXT"); snprintf(opt[k++], MAX_OPLN, "%-15s %s","WWIV","CHAIN.TXT");
snprintf(opt[k++], MAX_OPLN, "%-15s %s","GAP","DOOR.SYS"); snprintf(opt[k++], MAX_OPLN, "%-15s %s","GAP (extended)","DOOR.SYS (52 lines)");
snprintf(opt[k++], MAX_OPLN, "%-15s %s","RBBS/QuickBBS","DORINFO#.DEF"); snprintf(opt[k++], MAX_OPLN, "%-15s %s","RBBS/QuickBBS","DORINFO#.DEF");
snprintf(opt[k++], MAX_OPLN, "%-15s %s","Wildcat","CALLINFO.BBS"); snprintf(opt[k++], MAX_OPLN, "%-15s %s","Wildcat","CALLINFO.BBS");
snprintf(opt[k++], MAX_OPLN, "%-15s %s","PCBoard","PCBOARD.SYS"); snprintf(opt[k++], MAX_OPLN, "%-15s %s","PCBoard","PCBOARD.SYS");
snprintf(opt[k++], MAX_OPLN, "%-15s %s","SpitFire","SFDOORS.DAT"); snprintf(opt[k++], MAX_OPLN, "%-15s %s","SpitFire","SFDOORS.DAT");
snprintf(opt[k++], MAX_OPLN, "%-15s %s","MegaMail","UTIDOOR.TXT"); snprintf(opt[k++], MAX_OPLN, "%-15s %s","GAP (original)","DOOR.SYS (31 lines)");
snprintf(opt[k++], MAX_OPLN, "%-15s %s","Solar Realms","DOORFILE.SR"); snprintf(opt[k++], MAX_OPLN, "%-15s %s","Solar Realms","DOORFILE.SR");
snprintf(opt[k++], MAX_OPLN, "%-15s %s","RBBS/QuickBBS","DORINFO1.DEF"); snprintf(opt[k++], MAX_OPLN, "%-15s %s","RBBS/QuickBBS","DORINFO1.DEF");
snprintf(opt[k++], MAX_OPLN, "%-15s %s","TriBBS","TRIBBS.SYS"); snprintf(opt[k++], MAX_OPLN, "%-15s %s","TriBBS","TRIBBS.SYS");
...@@ -1547,9 +1507,15 @@ void xtrn_cfg(int section) ...@@ -1547,9 +1507,15 @@ void xtrn_cfg(int section)
" Wildcat! 2.x CALLINFO.BBS\n" " Wildcat! 2.x CALLINFO.BBS\n"
" SpitFire SFDOORS.DAT\n" " SpitFire SFDOORS.DAT\n"
" TriBBS TRIBBS.SYS\n" " TriBBS TRIBBS.SYS\n"
" MegaMail UTIDOOR.TXT\n"
" Solar Realms DOORFILE.SR\n" " Solar Realms DOORFILE.SR\n"
" Synchronet XTRN.DAT MODUSER.DAT\n" " Synchronet XTRN.DAT MODUSER.DAT\n"
"\n"
"The drop file format compatible with the largest number of online\n"
"programs (e.g. door games) written for MS-DOS based BBSes is the\n"
"`DOOR.SYS` file format. Synchronet supports both the original (GAP)\n"
"31-line DOOR.SYS file format and the extended 52-line format.\n"
"If you encounter door compatibility issues with the original 32-line\n"
"format, try using the 52-line format (or vice versa).\n"
; ;
k=uifc.list(WIN_MID|WIN_ACT,0,0,0,&k,0 k=uifc.list(WIN_MID|WIN_ACT,0,0,0,&k,0
,"BBS Drop File Type",opt); ,"BBS Drop File Type",opt);
...@@ -2263,12 +2229,12 @@ void xedit_cfg() ...@@ -2263,12 +2229,12 @@ void xedit_cfg()
strcpy(opt[k++],"None"); strcpy(opt[k++],"None");
snprintf(opt[k++], MAX_OPLN, "%-15s %s","Synchronet","XTRN.DAT"); snprintf(opt[k++], MAX_OPLN, "%-15s %s","Synchronet","XTRN.DAT");
snprintf(opt[k++], MAX_OPLN, "%-15s %s","WWIV","CHAIN.TXT"); snprintf(opt[k++], MAX_OPLN, "%-15s %s","WWIV","CHAIN.TXT");
snprintf(opt[k++], MAX_OPLN, "%-15s %s","GAP","DOOR.SYS"); snprintf(opt[k++], MAX_OPLN, "%-15s %s","GAP (extended)","DOOR.SYS (52 lines)");
snprintf(opt[k++], MAX_OPLN, "%-15s %s","RBBS/QuickBBS","DORINFO#.DEF"); snprintf(opt[k++], MAX_OPLN, "%-15s %s","RBBS/QuickBBS","DORINFO#.DEF");
snprintf(opt[k++], MAX_OPLN, "%-15s %s","Wildcat","CALLINFO.BBS"); snprintf(opt[k++], MAX_OPLN, "%-15s %s","Wildcat","CALLINFO.BBS");
snprintf(opt[k++], MAX_OPLN, "%-15s %s","PCBoard","PCBOARD.SYS"); snprintf(opt[k++], MAX_OPLN, "%-15s %s","PCBoard","PCBOARD.SYS");
snprintf(opt[k++], MAX_OPLN, "%-15s %s","SpitFire","SFDOORS.DAT"); snprintf(opt[k++], MAX_OPLN, "%-15s %s","SpitFire","SFDOORS.DAT");
snprintf(opt[k++], MAX_OPLN, "%-15s %s","MegaMail","UTIDOOR.TXT"); snprintf(opt[k++], MAX_OPLN, "%-15s %s","GAP (original)","DOOR.SYS (31 lines)");
snprintf(opt[k++], MAX_OPLN, "%-15s %s","Solar Realms","DOORFILE.SR"); snprintf(opt[k++], MAX_OPLN, "%-15s %s","Solar Realms","DOORFILE.SR");
snprintf(opt[k++], MAX_OPLN, "%-15s %s","RBBS/QuickBBS","DORINFO1.DEF"); snprintf(opt[k++], MAX_OPLN, "%-15s %s","RBBS/QuickBBS","DORINFO1.DEF");
snprintf(opt[k++], MAX_OPLN, "%-15s %s","TriBBS","TRIBBS.SYS"); snprintf(opt[k++], MAX_OPLN, "%-15s %s","TriBBS","TRIBBS.SYS");
......
...@@ -352,7 +352,7 @@ void sbbs_t::xtrndat(const char *name, const char *dropdir, uchar type, uint tle ...@@ -352,7 +352,7 @@ void sbbs_t::xtrndat(const char *name, const char *dropdir, uchar type, uint tle
fclose(fp); fclose(fp);
} }
else if(type==XTRN_GAP) { /* Gap DOOR.SYS File */ else if(type==XTRN_GAP || type==XTRN_DOOR_SYS) { /* Gap DOOR.SYS File */
SAFECOPY(tmp,"DOOR.SYS"); SAFECOPY(tmp,"DOOR.SYS");
if(misc&XTRN_LWRCASE) if(misc&XTRN_LWRCASE)
strlwr(tmp); strlwr(tmp);
...@@ -429,10 +429,16 @@ void sbbs_t::xtrndat(const char *name, const char *dropdir, uchar type, uint tle ...@@ -429,10 +429,16 @@ void sbbs_t::xtrndat(const char *name, const char *dropdir, uchar type, uint tle
t = getnextevent(&cfg, NULL); t = getnextevent(&cfg, NULL);
localtime_r(&t, &tm); localtime_r(&t, &tm);
safe_snprintf(str, sizeof(str), "%u\n%" PRIu64 "\n%s\n%s\n%s\n%s" safe_snprintf(str, sizeof(str), "%u\n%" PRIu64 "\n"
"\n%s\n%02d:%02d\n%c\n"
,0 /* 30: Kbytes downloaded today */ ,0 /* 30: Kbytes downloaded today */
,user_available_credits(&useron)/1024UL /* 31: Max Kbytes to download today */ ,user_available_credits(&useron)/1024UL /* 31: Max Kbytes to download today */
);
lfexpand(str,misc);
fwrite(str,strlen(str),1,fp);
if(type == XTRN_DOOR_SYS) { // 52-line variant
safe_snprintf(str, sizeof(str), "%s\n%s\n%s\n%s"
"\n%s\n%02d:%02d\n%c\n"
,getbirthmmddyy(&cfg, '/', useron.birth, tmp, sizeof(tmp)) /* 32: User birthday (MM/DD/YY) */ ,getbirthmmddyy(&cfg, '/', useron.birth, tmp, sizeof(tmp)) /* 32: User birthday (MM/DD/YY) */
,node_dir /* 33: Path to MAIN directory */ ,node_dir /* 33: Path to MAIN directory */
,data_dir /* 34: Path to GEN directory */ ,data_dir /* 34: Path to GEN directory */
...@@ -474,7 +480,7 @@ void sbbs_t::xtrndat(const char *name, const char *dropdir, uchar type, uint tle ...@@ -474,7 +480,7 @@ void sbbs_t::xtrndat(const char *name, const char *dropdir, uchar type, uint tle
,MIN(useron.posts, INT16_MAX)); /* 52: User message left */ ,MIN(useron.posts, INT16_MAX)); /* 52: User message left */
lfexpand(str,misc); lfexpand(str,misc);
fwrite(str,strlen(str),1,fp); fwrite(str,strlen(str),1,fp);
}
fclose(fp); fclose(fp);
} }
...@@ -862,31 +868,6 @@ void sbbs_t::xtrndat(const char *name, const char *dropdir, uchar type, uint tle ...@@ -862,31 +868,6 @@ void sbbs_t::xtrndat(const char *name, const char *dropdir, uchar type, uint tle
fclose(fp); fclose(fp);
} }
else if(type==XTRN_UTI) { /* UTI v2.1 - UTIDOOR.TXT */
SAFECOPY(tmp,"UTIDOOR.TXT");
if(misc&XTRN_LWRCASE)
strlwr(tmp);
SAFEPRINTF2(str,"%s%s",dropdir,tmp);
(void)removecase(str);
if((fp = fnopen(NULL,str,O_WRONLY|O_CREAT|O_TRUNC|O_TEXT)) == NULL) {
errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_TRUNC|O_TEXT);
return;
}
SAFECOPY(tmp,name);
strupr(tmp);
safe_snprintf(str, sizeof(str), "%s\n%u\n%u\n%u\n%u\n"
,tmp /* User name */
,cur_rate /* Actual BPS rate */
,online==ON_LOCAL ? 0: cfg.com_port /* COM Port */
,dte_rate /* DTE rate */
,tleft); /* Time left in sec */
lfexpand(str,misc);
fwrite(str, strlen(str), 1, fp);
fclose(fp);
}
else if(type==XTRN_SR) { /* Solar Realms DOORFILE.SR */ else if(type==XTRN_SR) { /* Solar Realms DOORFILE.SR */
SAFECOPY(tmp,"DOORFILE.SR"); SAFECOPY(tmp,"DOORFILE.SR");
if(misc&XTRN_LWRCASE) if(misc&XTRN_LWRCASE)
...@@ -1029,7 +1010,7 @@ void sbbs_t::moduserdat(uint xtrnnum) ...@@ -1029,7 +1010,7 @@ void sbbs_t::moduserdat(uint xtrnnum)
} }
return; return;
} }
else if(cfg.xtrn[xtrnnum]->type==XTRN_GAP) { else if(cfg.xtrn[xtrnnum]->type == XTRN_GAP || cfg.xtrn[xtrnnum]->type == XTRN_DOOR_SYS) {
SAFEPRINTF(path,"%sDOOR.SYS", xtrn_dropdir(cfg.xtrn[xtrnnum], startup, sizeof(startup))); SAFEPRINTF(path,"%sDOOR.SYS", xtrn_dropdir(cfg.xtrn[xtrnnum], startup, sizeof(startup)));
fexistcase(path); fexistcase(path);
if((stream=fopen(path,"rb"))!=NULL) { if((stream=fopen(path,"rb"))!=NULL) {
...@@ -1083,6 +1064,7 @@ void sbbs_t::moduserdat(uint xtrnnum) ...@@ -1083,6 +1064,7 @@ void sbbs_t::moduserdat(uint xtrnnum)
} }
} }
if(cfg.xtrn[xtrnnum]->type == XTRN_DOOR_SYS) {
for(;i<42;i++) for(;i<42;i++)
if(!fgets(str,128,stream)) if(!fgets(str,128,stream))
break; break;
...@@ -1090,6 +1072,7 @@ void sbbs_t::moduserdat(uint xtrnnum) ...@@ -1090,6 +1072,7 @@ void sbbs_t::moduserdat(uint xtrnnum)
useron.min=atol(str); useron.min=atol(str);
putuserdec32(useron.number, USER_MIN, useron.min); putuserdec32(useron.number, USER_MIN, useron.min);
} }
}
fclose(stream); fclose(stream);
} }
...@@ -1328,7 +1311,7 @@ bool sbbs_t::exec_xtrn(uint xtrnnum, bool user_event) ...@@ -1328,7 +1311,7 @@ bool sbbs_t::exec_xtrn(uint xtrnnum, bool user_event)
case XTRN_WWIV: case XTRN_WWIV:
SAFECOPY(name,"CHAIN.TXT"); SAFECOPY(name,"CHAIN.TXT");
break; break;
case XTRN_GAP: case XTRN_DOOR_SYS:
SAFECOPY(name,"DOOR.SYS"); SAFECOPY(name,"DOOR.SYS");
break; break;
case XTRN_RBBS: case XTRN_RBBS:
...@@ -1343,9 +1326,6 @@ bool sbbs_t::exec_xtrn(uint xtrnnum, bool user_event) ...@@ -1343,9 +1326,6 @@ bool sbbs_t::exec_xtrn(uint xtrnnum, bool user_event)
case XTRN_PCBOARD: case XTRN_PCBOARD:
SAFECOPY(name,"PCBOARD.SYS"); SAFECOPY(name,"PCBOARD.SYS");
break; break;
case XTRN_UTI:
SAFECOPY(name,"UTIDOOR.TXT");
break;
case XTRN_SR: case XTRN_SR:
SAFECOPY(name,"DOORFILE.SR"); SAFECOPY(name,"DOORFILE.SR");
break; break;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment