Commit f4fedac6 authored by rswindell's avatar rswindell
Browse files

The beginnings of auto-echo-add:

- SBBSecho will now maintain a file called the Bad Area File
  (default name is data/badarea.lst), in BACKBONE.NA format
- This file is suitable for importing in SCFG->Message Areas now, but expect
  some automation in the near future
- To get area descriptions (not just echo tags) in the Bad Area File, be sure
  to configure at least one "Additional EchoList" to point a comprehensive echo
  list (e.g. BACKBONE.NA or similar)
- SBBSecho will automatically add new areas (when new messages are received for
  msg areas you don't carry) or remove areas that you start to carry - no sysop
  maintenance of this file should be needed. And the file does not have to be
  deleted after being imported (e.g. with SCFG).
- SBBSecho does not (and may never) actually modify your Synchronet Message
  Areas configuration directly, that is yet to be determined

Another new feature: Area File (areas.bbs) backups:
- Whenever the Area File is modified via AreaFix, the current file is backed
  up  (e.g. areas.0.bbs, etc.)
- This feature can be tweaked or disabled via the AreaFileBackups key in
  sbbsecho.ini (not yet in echocfg), default backup level is 100

* Numerous EchoCfg help text updates.
* Some minor terminology updates (e.g. AREAS.BBS->areas.bbs, Areafix->AreaFix).
* Incremented SBBSecho version from 3.00 to 3.01.
parent 518048d1
/* echocfg.c */
/* SBBSecho configuration utility */
/* $Id$ */
......@@ -263,9 +261,9 @@ int main(int argc, char **argv)
"directory and file paths used by SBBSecho.\r\n"
"\r\n"
"The `Additional EchoLists` sub-menu is for configuring additional\r\n"
"(optional) lists of FidoNet-style message areas in `FIDONET.NA` format.\r\n"
"(optional) lists of FidoNet-style message areas in `BACKBONE.NA` format.\r\n"
"These lists, if configured, are used in addition to your main\r\n"
"`Area File` (e.g. AREAS.BBS) for advanced AreaFix/AreaMgr operations."
"`Area File` (e.g. areas.bbs) for advanced AreaFix/AreaMgr operations."
;
i=0;
sprintf(opt[i++],"%-25s %s","Mailer Type"
......@@ -407,12 +405,12 @@ int main(int argc, char **argv)
"the same password value if this password is configured (not blank).\r\n"
"Packet passwords are case insensitive.\r\n"
"\r\n"
"`Areafix Password` is an optional password used to enable Areafix\r\n"
"`AreaFix Password` is an optional password used to enable AreaFix\r\n"
"NetMail requests from this node.\r\n"
"Areafix Passwords are case insensitive.\r\n"
"AreaFix Passwords are case insensitive.\r\n"
"This setting may be managed by the node using NetMail/AreaFix requests.\r\n"
"\r\n"
"`Areafix Keys` is a list of keys which enable access to one or more\r\n"
"`AreaFix Keys` is a list of keys which enable access to one or more\r\n"
"Additional EchoLists.\r\n"
"\r\n"
"`Status` is the default mode for sending mail to this node: `Normal`, `Hold`\r\n"
......@@ -452,9 +450,9 @@ int main(int argc, char **argv)
,pktTypeStringList[cfg.nodecfg[i].pkt_type]);
snprintf(opt[j++],MAX_OPLN-1,"%-30.30s %s","Packet Password"
,cfg.nodecfg[i].pktpwd);
snprintf(opt[j++],MAX_OPLN-1,"%-30.30s %s","Areafix Password"
snprintf(opt[j++],MAX_OPLN-1,"%-30.30s %s","AreaFix Password"
,cfg.nodecfg[i].password);
snprintf(opt[j++],MAX_OPLN-1,"%-30.30s %s","Areafix Keys"
snprintf(opt[j++],MAX_OPLN-1,"%-30.30s %s","AreaFix Keys"
,strListCombine(cfg.nodecfg[i].keys,str,sizeof(str),","));
snprintf(opt[j++],MAX_OPLN-1,"%-30.30s %s","Status"
,mailStatusStringList[cfg.nodecfg[i].status]);
......@@ -552,17 +550,17 @@ int main(int argc, char **argv)
break;
case 5:
uifc.helpbuf=
"~ Areafix Password ~\r\n\r\n"
"~ AreaFix Password ~\r\n\r\n"
"This is the password that will be used by this node when doing remote\r\n"
"AreaManager / Areafix functions.\r\n";
"AreaManager / AreaFix functions.\r\n";
uifc.input(WIN_MID|WIN_SAV,0,0
,"Areafix Password"
,"AreaFix Password"
,cfg.nodecfg[i].password,sizeof(cfg.nodecfg[i].password)-1
,K_EDIT|K_UPPER);
break;
case 6:
uifc.helpbuf=
"~ Areafix Keys ~\r\n\r\n"
"~ AreaFix Keys ~\r\n\r\n"
"This is a named-key to to be given to this node allowing access to one or\r\n"
"more of the configured echolists\r\n";
while(1) {
......@@ -571,13 +569,13 @@ int main(int argc, char **argv)
opt[j][0]=0;
k=uifc.list(WIN_SAV|WIN_INS|WIN_DEL|WIN_ACT|
WIN_XTR|WIN_INSACT|WIN_DELACT|WIN_RHT
,0,0,0,&k,0,"Areafix Keys",opt);
,0,0,0,&k,0,"AreaFix Keys",opt);
if(k==-1)
break;
if((k&MSK_ON)==MSK_INS) {
k&=MSK_OFF;
if(uifc.input(WIN_MID|WIN_SAV,0,0
,"Areafix Key",str,SBBSECHO_MAX_KEY_LEN
,"AreaFix Key",str,SBBSECHO_MAX_KEY_LEN
,K_UPPER)<1)
continue;
strListInsert(&cfg.nodecfg[i].keys, str, k);
......@@ -592,7 +590,7 @@ int main(int argc, char **argv)
continue;
}
SAFECOPY(str,cfg.nodecfg[i].keys[k]);
uifc.input(WIN_MID|WIN_SAV,0,0,"Areafix Key"
uifc.input(WIN_MID|WIN_SAV,0,0,"AreaFix Key"
,str,SBBSECHO_MAX_KEY_LEN,K_EDIT|K_UPPER);
strListReplace(cfg.nodecfg[i].keys, k, str);
uifc.changes=TRUE;
......@@ -684,6 +682,8 @@ int main(int argc, char **argv)
,cfg.outbound);
snprintf(opt[i++],MAX_OPLN-1,"%-30.30s %s","Area File"
,cfg.areafile);
snprintf(opt[i++],MAX_OPLN-1,"%-30.30s %s","Bad Area File"
,cfg.badareafile);
snprintf(opt[i++],MAX_OPLN-1,"%-30.30s %s","Log File"
,cfg.logfile[0] ? cfg.logfile
: "SCFG->data/sbbsecho.log");
......@@ -703,10 +703,10 @@ int main(int argc, char **argv)
case 0:
uifc.helpbuf=
"~ Non-secure Inbound Directory ~\r\n\r\n"
"This is the complete path (drive and directory) where your FTN\r\n"
"mailer stores, and where SBBSecho will look for, incoming files\r\n"
"(potentially including message bundles and packets) from unauthenticated\r\n"
"(non-secure) mailer sessions.";
"This is the path where your FTN mailer stores, and where SBBSecho will\r\n"
"look for, incoming files (potentially including message bundles and\r\n"
"packets) from unauthenticated (non-secure) mailer sessions."
;
uifc.input(WIN_MID|WIN_SAV,0,0,"Non-secure Inbound Directory"
,cfg.inbound,sizeof(cfg.inbound)-1
,K_EDIT);
......@@ -715,9 +715,9 @@ int main(int argc, char **argv)
case 1:
uifc.helpbuf=
"~ Secure Inbound Directory ~\r\n\r\n"
"This is the complete path (drive and directory) where your FTN\r\n"
"mailer stores, and where SBBSecho will look for, incoming message\r\n"
"bundles and packets for SECURE (password-protected) sessions.";
"This is the path where your FTN mailer stores, and where SBBSecho will\r\n"
"look for, incoming message bundles and packets for `Secure` (password\r\n"
"protected) sessions.";
uifc.input(WIN_MID|WIN_SAV,0,0,"Secure Inbound Directory"
,cfg.secure_inbound,sizeof(cfg.secure_inbound)-1
,K_EDIT);
......@@ -726,11 +726,10 @@ int main(int argc, char **argv)
case 2:
uifc.helpbuf=
"~ Outbound Directory ~\r\n\r\n"
"This is the complete path (drive and directory) where your FTN\r\n"
"mailer will look for, and where SBBSecho will place, outgoing\r\n"
"message bundles and packets."
"This is the path where your FTN mailer will look for, and where SBBSecho\r\n"
"will place, outgoing message bundles and packets.\r\n"
"\r\n"
"In Binkely-Style Outbound mode, this serves as the base directory\r\n"
"In Binkley-Style Outbound mode, this serves as the base directory\r\n"
"name for special foreign zone and point destination nodes as well."
;
uifc.input(WIN_MID|WIN_SAV,0,0,"Outbound Directory"
......@@ -741,9 +740,30 @@ int main(int argc, char **argv)
case 3:
uifc.helpbuf=
"~ Area File ~\r\n\r\n"
"This is the complete path (drive, directory, and filename) of the\r\n"
"file SBBSecho will use as your main FidoNet-style Area File (e.g.\r\n"
"`AREAS.BBS`).";
"This is the path of the file SBBSecho will use as your primary\r\n"
"list of FidoNet-style message areas (default is `data/areas.bbs`).\r\n"
"\r\n"
"Each line in the file defines an FTN message area (echo) of the format:\r\n"
"\r\n"
" <`code`> <`tag`> [[`link`] [`link`] [...]]\r\n"
"\r\n"
"Each field is separated by one or more white-space characters:\r\n"
"\r\n"
" `<code>` is the Synchronet `internal code` for the local sub-board\r\n"
" `<tag>` is the network's agreed-upon `echo tag` for the message area\r\n"
" `[link]` is an `FTN address` to send and receive messages for this area\r\n"
" (there may be many linked nodes for each area)\r\n"
"\r\n"
"Notes:\r\n"
"\r\n"
" * Only the `<code>` and `<tag>` fields are required\r\n"
" * The '`<`' and '`>`', '`[`' and '`]`' characters are not part of the syntax\r\n"
" * Lines beginning with a semicolon (`;`) are ignored (i.e. comments)\r\n"
" * Leading white-space characters are ignored\r\n"
" * Blank lines are ignored\r\n"
" * This file may be import/exported to/from your `Message Areas` in `SCFG`\r\n"
" * This file may be remotely modified by authorized nodes using `AreaFix`\r\n"
;
uifc.input(WIN_MID|WIN_SAV,0,0,"Area File"
,cfg.areafile,sizeof(cfg.areafile)-1
,K_EDIT);
......@@ -751,16 +771,38 @@ int main(int argc, char **argv)
case 4:
uifc.helpbuf=
"~ Bad Area File ~\r\n\r\n"
"This is the path of the file SBBSecho will use to record the names\r\n"
"(echo tags) and descriptions of FTN message areas (echoes) that your\r\n"
"system has received EchoMail for, but does not carry locally (default\r\n"
"is `data/badarea.lst`).\r\n"
"\r\n"
"The descriptions of the areas will only be included if the corresponding\r\n"
"echo tags can be located in one of your configured `Additional EchoLists`.\r\n"
"\r\n"
"The format of the file is the same as `BACKBONE.NA` and suitable for\r\n"
"importing into a Synchronet Message Group using `SCFG`.";
"\r\n"
"SBBSecho will automatically remove areas from this list when they\r\n"
"are added to your configuration (local message areas and Area File).\r\n"
;
uifc.input(WIN_MID|WIN_SAV,0,0,"Bad Area File"
,cfg.badareafile,sizeof(cfg.badareafile)-1
,K_EDIT);
break;
case 5:
uifc.helpbuf=
"~ Log File ~\r\n\r\n"
"This is the complete path (drive, directory, and filename) of the\r\n"
"file SBBSecho will use to log information each time it is run\r\n"
"(default is `sbbsecho.log`)."
"This is the path of the file SBBSecho will use to log information each time\r\n"
"it is run (default is `data/sbbsecho.log`)."
;
uifc.input(WIN_MID|WIN_SAV,0,0,"Log File"
,cfg.logfile,sizeof(cfg.logfile)-1
,K_EDIT);
break;
case 5:
case 6:
uifc.helpbuf=
"~ Temporary File Directory ~\r\n\r\n"
"This is the directory where SBBSecho will store temporary files that\r\n"
......@@ -970,7 +1012,7 @@ int main(int argc, char **argv)
" normally create (in bytes).\r\n"
" This settings defaults to `250K` (250 Kilobytes, or 256,000 bytes).\r\n"
"\r\n"
"`Secure Operation` tells SBBSecho to check the Area File (e.g. AREAS.BBS)\r\n"
"`Secure Operation` tells SBBSecho to check the Area File (e.g. areas.bbs)\r\n"
" to insure that the packet origin (FTN address) of EchoMail messages\r\n"
" is already linked to the EchoMail area where the message was posted.\r\n"
" This setting defaults to `No`.\r\n"
......@@ -985,7 +1027,7 @@ int main(int argc, char **argv)
" This setting defaults to `No`.\r\n"
"\r\n"
"`Allow Nodes to Add Areas from Area File` when set to `Yes` allows linked\r\n"
" nodes to add areas listed in your Area File (e.g. `AREAS.BBS`).\r\n"
" nodes to add areas listed in your Area File (e.g. `areas.bbs`).\r\n"
" This setting defaults to `Yes`.\r\n"
"\r\n"
"`Strip Line Feeds From Outgoing Messages` when set to `Yes` instructs\r\n"
......@@ -1361,9 +1403,9 @@ int main(int argc, char **argv)
case 7:
uifc.helpbuf=
"~ Additional EchoLists ~\r\n\r\n"
"This feature allows you to specify lists of echoes, in FIDONET.NA format\r\n"
"which are utilized in addition to your Area File (e.g. `AREAS.BBS`)\r\n"
"for advanced AreaFix/AreaMgr operations.\r\n";
"This feature allows you to specify lists of echoes, in `BACKBONE.NA` format\r\n"
"which are utilized in addition to your Area File (e.g. `areas.bbs`)\r\n"
"for advanced AreaFix (Area Management) operations.\r\n";
i=0;
while(1) {
for(u=0;u<cfg.listcfgs;u++)
......
......@@ -182,6 +182,7 @@ SBBSECHO_OBJS = \
$(OBJODIR)$(DIRSEP)load_cfg$(OFILE) \
$(OBJODIR)$(DIRSEP)scfglib1$(OFILE) \
$(OBJODIR)$(DIRSEP)scfglib2$(OFILE) \
$(OBJODIR)$(DIRSEP)scfgsave$(OFILE) \
$(OBJODIR)$(DIRSEP)nopen$(OFILE) \
$(OBJODIR)$(DIRSEP)str_util$(OFILE) \
$(OBJODIR)$(DIRSEP)dat_rec$(OFILE) \
......
......@@ -222,6 +222,7 @@ void get_default_echocfg(sbbsecho_cfg_t* cfg)
cfg->strict_packet_passwords = true;
cfg->relay_filtered_msgs = false;
cfg->umask = 077;
cfg->areafile_backups = 100;
}
char* pktTypeStringList[] = {"2+", "2e", "2.2", "2", NULL}; // Must match enum pkt_type
......@@ -248,6 +249,7 @@ bool sbbsecho_read_ini(sbbsecho_cfg_t* cfg)
SAFECOPY(cfg->secure_inbound, iniGetString(ini, ROOT_SECTION, "SecureInbound", "../fido/inbound", value));
SAFECOPY(cfg->outbound , iniGetString(ini, ROOT_SECTION, "Outbound", "../fido/outbound", value));
SAFECOPY(cfg->areafile , iniGetString(ini, ROOT_SECTION, "AreaFile", "../data/areas.bbs", value));
SAFECOPY(cfg->badareafile , iniGetString(ini, ROOT_SECTION, "BadAreaFile", "../data/badareas.lst", value));
SAFECOPY(cfg->logfile , iniGetString(ini, ROOT_SECTION, "LogFile", "../data/sbbsecho.log", value));
SAFECOPY(cfg->logtime , iniGetString(ini, ROOT_SECTION, "LogTimeFormat", "%Y-%m-%d %H:%M:%S", value));
SAFECOPY(cfg->temp_dir , iniGetString(ini, ROOT_SECTION, "TempDirectory", "../temp/sbbsecho", value));
......@@ -262,6 +264,7 @@ bool sbbsecho_read_ini(sbbsecho_cfg_t* cfg)
cfg->strict_packet_passwords= iniGetBool(ini, ROOT_SECTION, "StrictPacketPasswords", cfg->strict_packet_passwords);
cfg->relay_filtered_msgs = iniGetBool(ini, ROOT_SECTION, "RelayFilteredMsgs", cfg->relay_filtered_msgs);
cfg->umask = iniGetInteger(ini, ROOT_SECTION, "umask", cfg->umask);
cfg->areafile_backups = iniGetInteger(ini, ROOT_SECTION, "AreaFileBackups", cfg->areafile_backups);
/* EchoMail options: */
cfg->maxbdlsize = (ulong)iniGetBytes(ini, ROOT_SECTION, "BundleSize", 1, cfg->maxbdlsize);
......@@ -450,6 +453,8 @@ bool sbbsecho_write_ini(sbbsecho_cfg_t* cfg)
iniSetString(&ini, ROOT_SECTION, "SecureInbound" ,cfg->secure_inbound ,NULL);
iniSetString(&ini, ROOT_SECTION, "Outbound" ,cfg->outbound ,NULL);
iniSetString(&ini, ROOT_SECTION, "AreaFile" ,cfg->areafile ,NULL);
iniSetInteger(&ini, ROOT_SECTION, "AreaFileBackups" ,cfg->areafile_backups ,NULL);
iniSetString(&ini, ROOT_SECTION, "BadAreaFile" ,cfg->badareafile ,NULL);
if(cfg->logfile[0])
iniSetString(&ini, ROOT_SECTION, "LogFile" ,cfg->logfile ,NULL);
if(cfg->logtime[0])
......
......@@ -86,6 +86,7 @@ ulong packed_netmail=0;
int cur_smb=0;
FILE *fidologfile=NULL;
bool twit_list;
str_list_t bad_areas;
fidoaddr_t sys_faddr = {1,1,1,0}; /* Default system address: 1:1/1.0 */
sbbsecho_cfg_t cfg;
......@@ -1378,7 +1379,8 @@ void alter_areas(str_list_t add_area, str_list_t del_area, fidoaddr_t addr, cons
file_to_netmail(nmfile,"Area Change Request",addr,to);
fclose(nmfile);
fclose(afileout);
delfile(cfg.areafile, __LINE__); /* Delete AREAS.BBS */
if(cfg.areafile_backups == 0 || !backup(cfg.areafile, cfg.areafile_backups, /* ren: */TRUE))
delfile(cfg.areafile, __LINE__); /* Delete AREAS.BBS */
if(rename(outname,cfg.areafile)) /* Rename new AREAS.BBS file */
lprintf(LOG_ERR,"ERROR line %d renaming %s to %s",__LINE__,outname,cfg.areafile);
free(outname);
......@@ -2285,13 +2287,66 @@ ulong loadmsgs(post_t** post, ulong ptr)
return(l);
}
const char* area_desc(const char* areatag)
{
char tag[FIDO_AREATAG_LEN+1];
static char desc[LEN_GLNAME+1];
for(int i=0; i<cfg.listcfgs; i++) {
FILE* fp = fopen(cfg.listcfg[i].listpath, "r");
if(fp == NULL) {
lprintf(LOG_ERR, "ERROR %d (%s) opening %s", errno, strerror(errno), cfg.listcfg[i].listpath);
continue;
}
str_list_t list = strListReadFile(fp, NULL, 0);
fclose(fp);
if(list == NULL)
continue;
strListTruncateTrailingWhitespaces(list);
for(int l=0; list[l] != NULL; l++) {
SAFECOPY(tag, list[l]);
truncstr(tag, " \t");
if(stricmp(tag, areatag))
continue;
char* p = list[l];
FIND_WHITESPACE(p); // Skip the tag
if(*p == 0)
break;
SKIP_WHITESPACE(p); // Find the desc
if(*p == 0)
break;
SAFECOPY(desc, p);
return desc;
}
}
return "";
}
void cleanup(void)
{
char* p;
char path[MAX_PATH+1];
while((p=strListPop(&locked_bso_nodes)) != NULL)
if(bad_areas != NULL) {
lprintf(LOG_DEBUG, "Writing %u areas to %s", strListCount(bad_areas), cfg.badareafile);
FILE* fp = fopen(cfg.badareafile, "wt");
if(fp == NULL) {
lprintf(LOG_ERR, "ERROR %d (%s) opening %s", errno, strerror(errno), cfg.badareafile);
} else {
while((p=strListPop(&bad_areas)) != NULL) {
lprintf(LOG_DEBUG, "Writing '%s' (%p) to %s", p, p, cfg.badareafile);
fprintf(fp, "%-*s %s\n", FIDO_AREATAG_LEN, p, area_desc(p));
free(p);
}
fclose(fp);
}
strListFree(&bad_areas);
}
while((p=strListPop(&locked_bso_nodes)) != NULL) {
delfile(p, __LINE__);
free(p);
}
if(mtxfile_locked) {
SAFEPRINTF(path,"%ssbbsecho.bsy", scfg.ctrl_dir);
......@@ -4396,7 +4451,7 @@ void pack_netmail(void)
else
SAFEPRINTF3(req,"%s%04x%04x.req",outbound,addr.net,addr.node);
if((fp=fopen(req,"a")) == NULL)
lprintf(LOG_ERR,"ERROR %d creating/opening %s", errno, req);
lprintf(LOG_ERR,"ERROR %d (%s) creating/opening %s", errno, strerror(errno), req);
else {
fprintf(fp,"%s\n",getfname(hdr.subj));
fclose(fp);
......@@ -4559,8 +4614,10 @@ void find_stray_packets(void)
if(terminator == FIDO_PACKET_TERMINATOR)
lprintf(LOG_DEBUG, "Stray packet already finalized: %s", packet);
else
if((pkt->fp = fopen(pkt->filename, "ab")) == NULL)
if((pkt->fp = fopen(pkt->filename, "ab")) == NULL) {
lprintf(LOG_ERR, "ERROR %d (%s) opening %s", errno, strerror(errno), pkt->filename);
continue;
}
pkt->orig = pkt_orig;
pkt->dest = pkt_dest;
listAddNode(&outpkt_list, pkt, 0, LAST_NODE);
......@@ -4784,6 +4841,8 @@ void import_packets(const char* inbound, nodecfg_t* inbox, bool secure)
gen_psb(&msg_seen,&msg_path,fmsgbuf,pkt_orig.zone); /* was destzone */
} else {
printf("(Unknown) ");
if(bad_areas != NULL && strListFind(bad_areas, areatag, /* case_sensitive: */false) < 0)
strListPush(&bad_areas, areatag);
if(cfg.badecho>=0) {
i=cfg.badecho;
if(cfg.area[i].sub!=INVALID_SUB)
......@@ -5314,6 +5373,31 @@ int main(int argc, char **argv)
}
}
if(cfg.badareafile[0]) {
int i;
int before, after;
FILE* fp;
printf("Reading bad area file: %s\n", cfg.badareafile);
fp = fopen(cfg.badareafile,"r");
bad_areas = strListReadFile(fp, NULL, 0);
before = strListCount(bad_areas);
printf("Read %u areas from %s\n", before, cfg.badareafile);
if(fp!=NULL)
fclose(fp);
strListTruncateStrings(bad_areas, " \t\r\n");
for(i=0; bad_areas[i] != NULL; i++) {
if(area_is_valid(find_area(bad_areas[i]))) { /* Do we carry this area? */
lprintf(LOG_DEBUG, "Removing area '%s' from bad areas list (since it is now carried locally)", bad_areas[i]);
free(strListRemove(&bad_areas, i));
i--;
}
}
after = strListCount(bad_areas);
if(before != after)
lprintf(LOG_NOTICE, "Removed %d areas from bad area file: %s", before-after, cfg.badareafile);
}
if(opt_gen_notify_list && !terminated) {
lprintf(LOG_DEBUG,"Generating AreaFix Notifications...");
gen_notify_list();
......
/* sbbsecho.h */
/* Synchronet FidoNet Echomail tosser/scanner/areafix program */
/* $Id$ */
......@@ -44,7 +42,7 @@
#include "fidodefs.h"
#define SBBSECHO_VERSION_MAJOR 3
#define SBBSECHO_VERSION_MINOR 00
#define SBBSECHO_VERSION_MINOR 1
#define SBBSECHO_PRODUCT_CODE 0x12FF /* from http://ftsc.org/docs/ftscprod.013 */
......@@ -133,7 +131,9 @@ typedef struct {
char inbound[MAX_PATH+1]; /* Inbound directory */
char secure_inbound[MAX_PATH+1]; /* Secure Inbound directory */
char outbound[MAX_PATH+1]; /* Outbound directory */
char areafile[MAX_PATH+1]; /* AREAS.BBS path/filename */
char areafile[MAX_PATH+1]; /* Area file (default: data/areas.bbs) */
uint areafile_backups; /* Number of backups to keep of area file */
char badareafile[MAX_PATH+1];/* Bad area file (default: data/badareas.lst) */
char logfile[MAX_PATH+1]; /* LOG path/filename */
char logtime[64]; /* format of log timestamp */
char cfgfile[MAX_PATH+1]; /* Configuration path/filename */
......
......@@ -205,6 +205,7 @@
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
<ClCompile Include="scfgsave.c" />
<ClCompile Include="str_util.c">
<AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(PreprocessorDefinitions)</PreprocessorDefinitions>
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment