Newer
Older
if(k==-1)
break;
if((k&MSK_ON)==MSK_INS) {
k&=MSK_OFF;
if(uifc.input(WIN_MID|WIN_SAV,0,0
strListInsert(&cfg.nodecfg[i].keys, str, k);
uifc.changes=TRUE;
continue;
}
if((k&MSK_ON)==MSK_DEL) {
k&=MSK_OFF;
strListRemove(&cfg.nodecfg[i].keys, k);
uifc.changes=TRUE;
continue;
}
,str,SBBSECHO_MAX_KEY_LEN,K_EDIT|K_UPPER);
strListReplace(cfg.nodecfg[i].keys, k, str);
uifc.changes=TRUE;
continue;
}
"~ Mail Status ~\n\n"
"Set the mail status for this node: `Normal`, `Hold`, or `Crash`.\n";
j=cfg.nodecfg[i].status;
k=uifc.list(WIN_RHT|WIN_SAV,0,0,0,&j,0,"Mail Status"
,mailStatusStringList);
if(k==-1)
break;
if(cfg.nodecfg[i].status!=k) {
cfg.nodecfg[i].status=k;
uifc.changes=TRUE;
}
k = !cfg.nodecfg[i].direct;
switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
,"Direct Delivery",uifcYesNoOpts)) {
case 0: cfg.nodecfg[i].direct = true; uifc.changes=TRUE; break;
case 1: cfg.nodecfg[i].direct = false; uifc.changes=TRUE; break;
}
k = !cfg.nodecfg[i].passive;
switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
,"Passive Node",uifcYesNoOpts)) {
case 0: cfg.nodecfg[i].passive = true; uifc.changes=TRUE; break;
case 1: cfg.nodecfg[i].passive = false; uifc.changes=TRUE; break;
}
k = !cfg.nodecfg[i].send_notify;
switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
,"Send AreaFix Notifications",uifcYesNoOpts)) {
case 0: cfg.nodecfg[i].send_notify = true; uifc.changes=TRUE; break;
case 1: cfg.nodecfg[i].send_notify = false; uifc.changes=TRUE; break;
}
break;
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
"~ Uplink for Message Groups ~\n\n"
"These are Message Group short names (as configured in SCFG) for which\n"
"this linked-node is your system's uplink (hub).\n"
"\n"
"Use of this setting allows your hub to be automatically linked with new\n"
"areas when new Sub-boards (within a listed group) are auto-added to the\n"
"Area File."
;
while(1) {
for(j=0; cfg.nodecfg[i].grphub!=NULL && cfg.nodecfg[i].grphub[j]!=NULL ;j++)
strcpy(opt[j],cfg.nodecfg[i].grphub[j]);
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,"Uplink for Message Groups",opt);
if(k==-1)
break;
if((k&MSK_ON)==MSK_INS) {
k&=MSK_OFF;
if(uifc.input(WIN_MID|WIN_SAV,0,0
,"Message Group (short name)",str,LEN_GSNAME
,/* kmode: */0) < 1)
continue;
strListInsert(&cfg.nodecfg[i].grphub, str, k);
uifc.changes=TRUE;
continue;
}
if((k&MSK_ON)==MSK_DEL) {
k&=MSK_OFF;
strListRemove(&cfg.nodecfg[i].grphub, k);
uifc.changes=TRUE;
continue;
}
SAFECOPY(str,cfg.nodecfg[i].grphub[k]);
uifc.input(WIN_MID|WIN_SAV,0,0,"Message Group (short name)"
,str,LEN_GSNAME,K_EDIT|K_UPPER);
strListReplace(cfg.nodecfg[i].grphub, k, str);
uifc.changes=TRUE;
continue;
}
break;
uifc.helpbuf=
"~ Route To ~\n\n"
"When using a BSO/FLO type mailer, this is the Fido address to route mail\n"
"for this node(s) to.\n"
"\n"
"This option is normally only used with wildcard type node entries\n"
"(e.g. `ALL`, or `1:ALL`, `2:ALL`, etc.) and is used to route non-direct\n"
"NetMail packets to your uplink node (hub).\n";
SAFECOPY(str,faddrtoa(&cfg.nodecfg[i].route));
,"Node Address to Route To",str
if(str[0])
cfg.nodecfg[i].route=atofaddr(str);
else
cfg.nodecfg[i].route.zone=0;
uifc.input(WIN_MID|WIN_SAV,0,0,"Inbound FileBox Directory"
,cfg.nodecfg[i].inbox, sizeof(cfg.nodecfg[i].inbox)-1
,K_EDIT);
break;
uifc.input(WIN_MID|WIN_SAV,0,0,"Outbound FileBox Directory"
,cfg.nodecfg[i].outbox, sizeof(cfg.nodecfg[i].outbox)-1
,K_EDIT);
case __COUNTER__:
binkp_settings(&cfg.nodecfg[i]);
break;
}
}
}
while(1) {
snprintf(opt[i++],MAX_OPLN-1,"%-30.30s %s","Non-secure Inbound Directory"
snprintf(opt[i++],MAX_OPLN-1,"%-30.30s %s","Secure Inbound Directory"
,cfg.secure_inbound[0] ? cfg.secure_inbound : DEFAULT_SECURE_INBOUND);
snprintf(opt[i++],MAX_OPLN-1,"%-30.30s %s","Outbound Directory"
snprintf(opt[i++],MAX_OPLN-1,"%-30.30s %s","Bad Area File"
,cfg.badareafile[0] ? cfg.badareafile : DEFAULT_BAD_AREA_FILE);
,cfg.logfile[0] ? cfg.logfile : DEFAULT_LOG_FILE);
snprintf(opt[i++],MAX_OPLN-1,"%-30.30s %s","Echo Statistics File"
,cfg.echostats[0] ? cfg.echostats : DEFAULT_ECHOSTATS_FILE);
snprintf(opt[i++],MAX_OPLN-1,"%-30.30s %s","Temporary File Directory"
,cfg.temp_dir[0] ? cfg.temp_dir : DEFAULT_TEMP_DIR);
snprintf(opt[i++],MAX_OPLN-1,"%-30.30s %s","Outgoing Semaphore File"
,cfg.outgoing_sem);
uifc.helpbuf=
"~ Paths and Filenames ~\n\n"
"From this menu you can configure the paths and filenames that SBBSecho\n"
"will use during its operation (e.g. importing and exporting messages).\n";
j=uifc.list(WIN_BOT|WIN_L2R|WIN_ACT|WIN_SAV,0,0,0,&path_opt,0
,"Paths and Filenames",opt);
if(j==-1)
break;
case 0:
"~ Non-secure Inbound Directory ~\n\n"
"This is the path where your FTN mailer stores, and where SBBSecho will\n"
"look for, incoming files (potentially including message bundles and\n"
"packets) from unauthenticated (non-secure) mailer sessions.\n"
"\n"
"Default value is `" DEFAULT_INBOUND "`."
uifc.input(WIN_L2R|WIN_SAV,0,0,"Non-secure Inbound Directory"
break;
case 1:
"~ Secure Inbound Directory ~\n\n"
"This is the path where your FTN mailer stores, and where SBBSecho will\n"
"look for, incoming message bundles and packets for `Secure` (password\n"
"protected) sessions.\n"
"\n"
"Default value is `" DEFAULT_SECURE_INBOUND "`."
;
uifc.input(WIN_L2R|WIN_SAV,0,0,"Secure Inbound Directory"
,cfg.secure_inbound,sizeof(cfg.secure_inbound)-1
,K_EDIT);
break;
case 2:
"~ Outbound Directory ~\n\n"
"This is the path where your FTN mailer will look for, and where SBBSecho\n"
"will place, outgoing message bundles and packets.\n"
"\n"
"In Binkley-Style Outbound mode, this serves as the base directory\n"
"name for special foreign zone and point destination nodes as well."
break;
case 3:
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
"~ Area File ~\n\n"
"This is the path of the file SBBSecho will use as your primary\n"
"list of FidoNet-style message areas (default is `data/areas.bbs`).\n"
"\n"
"Each line in the file defines an FTN message area (echo) of the format:\n"
"\n"
" <`code`> <`tag`> [[`link`] [`link`] [...]]\n"
"\n"
"Each field is separated by one or more white-space characters:\n"
"\n"
" `<code>` is the Synchronet `internal code` for the local sub-board\n"
" `<tag>` is the network's agreed-upon `echo tag` for the message area\n"
" `[link]` is an `FTN address` to send and receive messages for this area\n"
" (there may be many linked nodes for each area)\n"
" (often your FTN uplink/hub may be the only linked node)\n"
"\n"
"Example Area Line:\n"
"\n"
" `FIDO_BBS_CARN BBS_CARNIVAL 1:218/700`\n"
"\n"
"Notes:\n"
"\n"
" `*` Only the `<code>` and `<tag>` fields are required\n"
" `*` The `<code>` and `<tag>` fields are case in-sensitive\n"
" `*` The `[link]` fields must be 2D, 3D, or 4D FidoNet-style node addresses\n"
" `*` The '`<`' and '`>`', '`[`' and '`]`' characters are not part of the syntax\n"
" `*` Lines beginning with a semicolon (`;`) are ignored (i.e. comments)\n"
" `*` Leading white-space characters are ignored\n"
" `*` Blank lines are ignored\n"
" `*` A `<tag>` value of `*` indicates a `bad echo` (unknown) area\n"
" `*` A `<code>` value of `P` indicates a pass-through message area\n"
" `*` This file may be import/exported to/from your `Message Areas` in `SCFG`\n"
" `*` This file may be remotely modified by authorized nodes using `AreaFix`\n"
"\n"
"Default value is `" DEFAULT_AREA_FILE "`."
break;
case 4:
"~ Bad Area File ~\n\n"
"This is the path of the file SBBSecho will use to record the names\n"
"(echo tags) and descriptions of FTN message areas (echoes) that your\n"
"system has received EchoMail for, but does not carry locally. The\n"
"default path/filename is `" DEFAULT_BAD_AREA_FILE "`.\n"
"\n"
"Notes:\n"
"\n"
" `*` The descriptions of the areas will only be included if the\n"
" corresponding echo tags can be located in one of your configured\n"
" `EchoLists`.\n"
"\n"
" `*` The format of the file is the same as `BACKBONE.NA` and suitable for\n"
" importing into a Synchronet Message Group using `SCFG`.\n"
"\n"
" `*` SBBSecho will automatically sort and maintain this list, removing\n"
" areas if they are added to your configuration (`SCFG->Message Areas`)\n"
" and your `Area File`.\n"
,cfg.badareafile,sizeof(cfg.badareafile)-1
,K_EDIT);
break;
case 5:
uifc.helpbuf=
"~ Log File ~\n\n"
"This is the path of the file SBBSecho will use to log information each\n"
"time it is run (default is `" DEFAULT_LOG_FILE "`)."
;
break;
uifc.helpbuf=
"~ EchoStats File ~\n\n"
"This is the path of the file SBBSecho will use to track statistics for\n"
"EchoMail message areas (default is `" DEFAULT_ECHOSTATS_FILE "`)."
;
uifc.input(WIN_L2R|WIN_SAV,0,0,"EchoStats File"
,cfg.echostats,sizeof(cfg.echostats)-1
,K_EDIT);
break;
case 7:
uifc.helpbuf=
"~ Temporary File Directory ~\n\n"
"This is the directory where SBBSecho will store temporary files that\n"
"it creates and uses during its run-time (default is `" DEFAULT_TEMP_DIR "`)."
;
,cfg.temp_dir,sizeof(cfg.temp_dir)-1
,K_EDIT);
break;
case 8:
uifc.helpbuf=
"~ Outgoing Semaphore File ~\n\n"
"This is an optional file to create/touch whenever there are new outbound\n"
"files created or updated by SBBSecho."
;
uifc.input(WIN_L2R|WIN_SAV,0,0,"Outgoing Sem File"
,cfg.outgoing_sem,sizeof(cfg.outgoing_sem)-1
,K_EDIT);
break;
}
}
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
"~ NetMail Settings ~\n"
"\n"
"`Sysop Aliases` is a comma-separated list of names by which the sysop\n"
" (user #1) may receive NetMail messages, in addition to the alias\n"
" and real name associated with their BBS user account.\n"
" This setting defaults to just '`SYSOP`'.\n"
"\n"
"`Default Recipient` is the name of the user account you wish to receive\n"
" inbound NetMail messages that have been addressed to an unrecognized\n"
" user name or alias.\n"
"\n"
"`Fuzzy Zone Operation` when set to `Yes`, if SBBSecho receives an inbound\n"
" netmail with no international zone information, it will compare the\n"
" net/node of the destination to the net/node information in your AKAs\n"
" and assume the zone of a matching AKA.\n"
" This setting defaults to `No`.\n"
"\n"
"`Kill/Ignore Empty NetMail Messages` will instruct SBBSecho to simply\n"
" discard (not import or export) NetMail messages without any body.\n"
" This setting defaults to `Yes`.\n"
"\n"
"`Delete Processed NetMail Messages` will instruct SBBSecho to delete\n"
" NetMail messages/files after they have been sent or imported.\n"
" When set to `No`, SBBSecho will mark them as Sent or Received instead.\n"
" This setting defaults to `Yes`.\n"
"\n"
"`Ignore NetMail Destination Address` will instruct SBBSecho to treat\n"
" all NetMail as though it is destined for one of your systems's FTN\n"
" addresses (AKAs) and potentially import it.\n"
" This setting defaults to `No`.\n"
"\n"
"`Ignore Netmail 'Sent' Attribute` will instruct SBBSecho to export\n"
" NetMail messages even when their 'Sent' attribute flag is set.\n"
" This setting `should not` be set to `Yes` when `Delete NetMail` is\n"
" disabled.\n"
" This setting defaults to `No`.\n"
"\n"
"`Ignore Netmail 'KillSent' Attribute` will instruct SBBSecho to ignore\n"
" this attribute flag and will `not` delete Sent NetMail.\n"
" This setting defaults to `No`.\n"
"\n"
"`Ignore Netmail 'Received' Attribute` will instruct SBBSecho to import\n"
" NetMail messages even when their 'Received' attribute flag is set.\n"
" This setting defaults to `No`.\n"
"\n"
"`Ignore NetMail 'Local' Attribute` will instruct SBBSecho to import\n"
" NetMail messages even when their 'Local' attribute flag is set.\n"
" This setting defaults to `No`.\n"
"\n"
"`Maximum Age of Imported NetMail` allows you to optionally set an age\n"
" limit of NetMail messages that may be imported.\n"
" This setting defaults to `None` (no maximum age).\n"
strListCombine(cfg.sysop_alias_list, sysop_aliases, sizeof(sysop_aliases)-1, ",");
snprintf(opt[i++],MAX_OPLN-1,"%-40.40s%s", "Sysop Aliases",sysop_aliases);
snprintf(opt[i++],MAX_OPLN-1,"%-40.40s%s", "Default Recipient"
,cfg.default_recipient);
snprintf(opt[i++],MAX_OPLN-1,"%-40.40s%-3.3s","Fuzzy Zone Operation"
,cfg.fuzzy_zone ? "Yes":"No");
snprintf(opt[i++],MAX_OPLN-1,"%-40.40s%-3.3s","Kill/Ignore Empty NetMail "
"Messages",cfg.kill_empty_netmail ? "Yes":"No");
snprintf(opt[i++],MAX_OPLN-1,"%-40.40s%-3.3s","Delete Processed NetMail"
,cfg.delete_netmail ? "Yes":"No");
snprintf(opt[i++],MAX_OPLN-1,"%-40.40s%-3.3s","Ignore NetMail Destination Address"
,cfg.ignore_netmail_dest_addr ? "Yes" : "No");
snprintf(opt[i++],MAX_OPLN-1,"%-40.40s%-3.3s","Ignore NetMail 'Sent' Attribute"
,cfg.ignore_netmail_sent_attr ? "Yes" : "No");
snprintf(opt[i++],MAX_OPLN-1,"%-40.40s%-3.3s","Ignore NetMail 'KillSent' Attribute"
,cfg.ignore_netmail_kill_attr ? "Yes" : "No");
snprintf(opt[i++],MAX_OPLN-1,"%-40.40s%-3.3s","Ignore NetMail 'Received' Attribute"
,cfg.ignore_netmail_recv_attr ? "Yes" : "No");
snprintf(opt[i++],MAX_OPLN-1,"%-40.40s%-3.3s","Ignore NetMail 'Local' Attribute"
,cfg.ignore_netmail_local_attr ? "Yes" : "No");
if(cfg.max_netmail_age)
snprintf(opt[i++],MAX_OPLN-1,"%-40.40s%s","Maximum Age of Imported NetMail" , str);
j=uifc.list(WIN_ACT|WIN_SAV,0,0,0,&netmail_opt,0,"NetMail Settings",opt);
if(j==-1)
break;
switch(j) {
case 0:
"~ Sysop Aliases ~\n\n"
"This is a comma-separated list of additional `To` names that the sysop\n"
"(user #1) can receive netmail by. When specifying multiple aliases,\n"
"they must be separated by a single comma and no extra white-space\n"
"(e.g. \"SYSOP,COORDINATOR\"). The default value is just `SYSOP`.\n";
if(uifc.input(WIN_MID|WIN_BOT|WIN_SAV,0,0,"Sysop Aliases (comma separated)"
,sysop_aliases
,sizeof(sysop_aliases)-1,K_EDIT|K_UPPER) >= 0) {
strListFree(&cfg.sysop_alias_list);
cfg.sysop_alias_list = strListSplit(NULL, sysop_aliases, ",");
}
uifc.input(WIN_MID|WIN_SAV,0,0,"Default Recipient"
,cfg.default_recipient, sizeof(cfg.default_recipient)-1
,K_EDIT|K_UPPER);
k = !cfg.fuzzy_zone;
switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
,"Fuzzy Zone Operation",uifcYesNoOpts)) {
case 0: cfg.fuzzy_zone = true; break;
case 1: cfg.fuzzy_zone = false; break;
}
k = !cfg.kill_empty_netmail;
switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
,"Delete Empty NetMail",uifcYesNoOpts)) {
case 0: cfg.kill_empty_netmail = true; break;
case 1: cfg.kill_empty_netmail = false; break;
}
k = !cfg.delete_netmail;
switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
,"Delete Processed NetMail",uifcYesNoOpts)) {
case 0: cfg.delete_netmail = true; break;
case 1: cfg.delete_netmail = false; break;
}
break;
case 5:
k = !cfg.ignore_netmail_dest_addr;
switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
,"Ignore NetMail Destination Address",uifcYesNoOpts)) {
case 0: cfg.ignore_netmail_dest_addr = true; break;
case 1: cfg.ignore_netmail_dest_addr = false; break;
}
break;
case 6:
k = !cfg.ignore_netmail_sent_attr;
switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
,"Ignore NetMail 'Sent' Attribute",uifcYesNoOpts)) {
case 0: cfg.ignore_netmail_sent_attr = true; break;
case 1: cfg.ignore_netmail_sent_attr = false; break;
}
break;
case 7:
k = !cfg.ignore_netmail_kill_attr;
switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
,"Ignore NetMail 'KillSent' Attribute",uifcYesNoOpts)) {
case 0: cfg.ignore_netmail_kill_attr = true; break;
case 1: cfg.ignore_netmail_kill_attr = false; break;
}
break;
case 8:
k = !cfg.ignore_netmail_recv_attr;
switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
,"Ignore NetMail 'Received' Attribute",uifcYesNoOpts)) {
case 0: cfg.ignore_netmail_recv_attr = true; break;
case 1: cfg.ignore_netmail_recv_attr = false; break;
}
break;
k = !cfg.ignore_netmail_local_attr;
switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
,"Ignore NetMail 'Local' Attribute",uifcYesNoOpts)) {
case 0: cfg.ignore_netmail_local_attr = true; break;
case 1: cfg.ignore_netmail_local_attr = false; break;
}
break;
"~ Maximum Age of Imported NetMail ~\n\n"
"Maximum age of NetMail that may be imported. The age is based\n"
"on the date supplied in the message header and may be incorrect in some\n"
"conditions (e.g. erroneous software or incorrect system date).\n"
"Set this value to `0` to disable this feature (no maximum age imposed)."
;
if(cfg.max_netmail_age)
if(uifc.input(WIN_MID|WIN_BOT|WIN_SAV,0,0,"Maximum NetMail Age"
,str, 10, K_EDIT) >= 0)
cfg.max_netmail_age = (ulong)parse_duration(str);
break;
}
}
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
"~ EchoMail Settings ~\n"
"\n"
"`Area Manager` is the BBS user name or alias to notify (via email) of\n"
" AreaFix activities and errors. This setting defaults to `SYSOP`.\n"
"\n"
"`Maximum Packet Size` is the largest packet file size that SBBSecho will\n"
" normally create (in bytes).\n"
" This settings defaults to `250K` (250 Kilobytes, or 256,000 bytes).\n"
"\n"
"`Maximum Bundle Size` is the largest bundle file size that SBBSecho will\n"
" normally create (in bytes).\n"
" This settings defaults to `250K` (250 Kilobytes, or 256,000 bytes).\n"
"\n"
"`Secure Operation` tells SBBSecho to check the Area File (e.g. areas.bbs)\n"
" to insure that the packet origin (FTN address) of EchoMail messages\n"
" is already linked to the EchoMail area where the message was posted.\n"
" This setting defaults to `No`.\n"
"\n"
"`Notify Users of Received EchoMail` tells SBBSecho to send telegrams\n"
" (short messages) to BBS users when EchoMail addressed to their name\n"
" or alias has been imported into a message base that the user has\n"
" access to read.\n"
"\n"
"`Convert Existing Tear Lines` tells SBBSecho to convert any tear lines\n"
" (`---`) existing in the message text to `===`.\n"
" This setting defaults to `No`.\n"
"\n"
"`Strip Line Feeds From Outgoing Messages` when set to `Yes` instructs\n"
" SBBSecho to remove any line-feed (ASCII 10) characters from the body\n"
" text of messages being exported to FidoNet EchoMail.\n"
" This setting defaults to `No`.\n"
"\n"
"`Automatically Add New Subs to Area File`, when set to `Yes`, enables\n"
" SBBSecho to detect newly added Sub-boards in any Message Groups that\n"
" are listed with a `Linked Node` as their hub/uplink and add those\n"
" Sub-boards as new areas in your Area File.\n"
"\n"
"`Allow Nodes to Add Areas from Area File` when set to `Yes` allows linked\n"
" nodes to add areas listed in your Area File (e.g. `areas.bbs`).\n"
" When set to `No`, only areas found in one or more `EchoLists` may be\n"
" added via AreaFix, provided the linked node has access.\n"
" This setting defaults to `Yes`.\n"
"\n"
"`Maximum Backups to Maintain of Area File` defines the number of backup\n"
" versions SBBSecho will maintain of your Area File (e.g. `areas.bbs`).\n"
"\n"
"`Circular Path Detection` when `Enabled` will cause SBBSecho, during\n"
" EchoMail import, to check the PATH kludge lines for any of the\n"
" system's AKAs and if found (indicating a message loop), not import\n"
" the message.\n"
"\n"
"`Relay Filtered Messages` controls whether or not incoming messages that\n"
" have been filtered (e.g. due to maximum message age restrictions)\n"
" are to be forwarded to downlinks.\n"
"\n"
"`Outbound Bundle Attachments` may be either `Deleted` (killed) or `Truncated`\n"
" (changed to 0-bytes in length) after being sent by your mailer.\n"
" This only controls the bundle prefix that is written to the FLO\n"
" files (`#` for truncate, `^` for delete).\n"
"\n"
"`Zone Blind SEEN-BY and PATH Lines` when `Enabled` will cause SBBSecho\n"
" to assume that node numbers are not duplicated across zones and\n"
" that a net/node combination in either of these Kludge lines should\n"
" be used to identify a specific node regardless of which zone that\n"
" node is located (thus breaking the rules of FidoNet 3D addressing).\n"
"\n"
"`Maximum Age of Imported EchoMail` allows you to optionally set an age\n"
" limit of EchoMail messages that may be imported.\n"
" This setting defaults to `60 days`.\n"
snprintf(opt[i++],MAX_OPLN-1,"%-45.45s%s", "Area Manager",cfg.areamgr);
snprintf(opt[i++],MAX_OPLN-1,"%-45.45s%luK","Maximum Packet Size"
,cfg.maxpktsize/1024UL);
snprintf(opt[i++],MAX_OPLN-1,"%-45.45s%luK","Maximum Bundle Size"
,cfg.maxbdlsize/1024UL);
snprintf(opt[i++],MAX_OPLN-1,"%-45.45s%-3.3s","Secure Operation"
,cfg.secure_echomail ? "Yes":"No");
snprintf(opt[i++],MAX_OPLN-1,"%-45.45s%-3.3s","Notify Users of Received EchoMail"
,cfg.echomail_notify ? "Yes":"No");
snprintf(opt[i++],MAX_OPLN-1,"%-45.45s%-3.3s","Convert Existing Tear Lines"
,cfg.convert_tear ? "Yes":"No");
snprintf(opt[i++],MAX_OPLN-1,"%-45.45s%-3.3s","Strip Line Feeds "
"from Outgoing Messages",cfg.strip_lf ? "Yes":"No");
snprintf(opt[i++],MAX_OPLN-1,"%-45.45s%-3.3s","Automatically Add New Subs "
"to Area File",cfg.auto_add_subs ? "Yes":"No");
snprintf(opt[i++],MAX_OPLN-1,"%-45.45s%-3.3s","Allow Nodes to Add Areas "
"from Area File",cfg.add_from_echolists_only ? "No":"Yes");
snprintf(opt[i++],MAX_OPLN-1,"%-45.45s%u","Maximum Backups to Maintain of Area File"
,cfg.areafile_backups);
snprintf(opt[i++],MAX_OPLN-1,"%-45.45s%s","Circular Path Detection"
,cfg.check_path ? "Enabled" : "Disabled");
snprintf(opt[i++],MAX_OPLN-1,"%-45.45s%s","Relay Filtered Messages"
,cfg.relay_filtered_msgs ? "Yes" : "No");
snprintf(opt[i++],MAX_OPLN-1,"%-45.45s%s","Outbound Bundle Attachments"
,cfg.trunc_bundles ? "Truncate" : "Delete");
if(cfg.zone_blind)
sprintf(str,"Zones 1-%u", cfg.zone_blind_threshold);
else
SAFECOPY(str,"Disabled");
snprintf(opt[i++],MAX_OPLN-1,"%-45.45s%s","Zone Blind SEEN-BY and PATH Lines", str);
if(cfg.max_echomail_age)
snprintf(opt[i++],MAX_OPLN-1,"%-45.45s%s","Maximum Age of Imported EchoMail", str);
j=uifc.list(WIN_ACT|WIN_MID|WIN_SAV,0,0,0,&echomail_opt,0,"EchoMail Settings",opt);
break;
case 0:
"Local user to notify of AreaFix activity and errors.\n";
uifc.input(WIN_MID|WIN_BOT|WIN_SAV,0,0,"Area Manager (user name or alias)"
,cfg.areamgr
,LEN_ALIAS,K_EDIT);
break;
case 1:
"~ Maximum Packet Size ~\n\n"
"This is the maximum file size that SBBSecho will create when placing\n"
"outgoing messages into packets. The default max size is 250 Kilobytes.\n";
sprintf(str,"%lu",cfg.maxpktsize);
uifc.input(WIN_MID|WIN_BOT|WIN_SAV,0,0,"Maximum Packet Size (in Bytes)",str
,9,K_EDIT|K_NUMBER);
cfg.maxpktsize=atol(str);
case 2:
"~ Maximum Bundle Size ~\n\n"
"This is the maximum file size that SBBSecho will create when placing\n"
"outgoing packets into bundles. The default max size is 250 Kilobytes.\n";
sprintf(str,"%lu",cfg.maxbdlsize);
uifc.input(WIN_MID|WIN_BOT|WIN_SAV,0,0,"Maximum Bundle Size (in Bytes)",str
,9,K_EDIT|K_NUMBER);
cfg.maxbdlsize=atol(str);
break;
case 3:
k = !cfg.secure_echomail;
switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
,"Secure Operation",uifcYesNoOpts)) {
case 0: cfg.secure_echomail = true; break;
case 1: cfg.secure_echomail = false; break;
}
case 4:
k = !cfg.echomail_notify;
switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
,"Notify Users",uifcYesNoOpts)) {
case 0: cfg.echomail_notify = true; break;
case 1: cfg.echomail_notify = false; break;
}
break;
case 5:
k = !cfg.convert_tear;
switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
,"Convert Tear Lines",uifcYesNoOpts)) {
case 0: cfg.convert_tear = true; break;
case 1: cfg.convert_tear = false; break;
}
case 6:
k = !cfg.strip_lf;
switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
,"Strip Line Feeds",uifcYesNoOpts)) {
case 0: cfg.strip_lf = true; break;
case 1: cfg.strip_lf = false; break;
}
case 7:
k = !cfg.auto_add_subs;
switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
,"Automatically Add New Sub-boards to Area File",uifcYesNoOpts)) {
case 0: cfg.auto_add_subs = true; break;
case 1: cfg.auto_add_subs = false; break;
}
break;
case 8:
k = cfg.add_from_echolists_only;
switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
,"Allow AreaFix-Add from Area File",uifcYesNoOpts)) {
case 0: cfg.add_from_echolists_only = false; break;
case 1: cfg.add_from_echolists_only = true; break;
}
break;
case 9:
sprintf(str, "%u", cfg.areafile_backups);
if(uifc.input(WIN_MID|WIN_SAV, 0, 0, "Total Area File Backups to Maintain"
,str, 5, K_EDIT|K_NUMBER) >= 0)
cfg.areafile_backups = atoi(str);
break;
case 10:
k = !cfg.check_path;
switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
,"Circular Path Detection",uifcYesNoOpts)) {
case 0: cfg.check_path = true; break;
case 1: cfg.check_path = false; break;
}
break;
case 11:
k = !cfg.check_path;
switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
,"Relay Filtered EchoMail Messages",uifcYesNoOpts)) {
case 0: cfg.relay_filtered_msgs = true; break;
case 1: cfg.relay_filtered_msgs = false; break;
}
break;
case 12:
{
k = cfg.trunc_bundles;
char* opt[] = {"Delete after Sent", "Truncate after Sent", NULL };
switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
,"Outbound Bundles",opt)) {
case 0: cfg.trunc_bundles = false; break;
case 1: cfg.trunc_bundles = true; break;
}
break;
k = !cfg.zone_blind;
switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0,"Zone Blind",uifcYesNoOpts)) {
case 0:
cfg.zone_blind = true;
uifc.helpbuf=
"Zone Blind Threshold";
sprintf(str,"%u",cfg.zone_blind_threshold);
if(uifc.input(WIN_MID|WIN_SAV,0,0
,"Zone Blind Threshold (highest zone in the blind range)"
, str, 5, K_EDIT|K_NUMBER) >= 0)
cfg.zone_blind_threshold = (uint16_t)atol(str);
break;
case 1:
cfg.zone_blind = false;
break;
}
break;
"~ Maximum Age of Imported EchoMail ~\n\n"
"Maximum age of EchoMail that may be imported. The age is based\n"
"on the date supplied in the message header and may be incorrect in some\n"
"conditions (e.g. erroneous software or incorrect system date).\n"
"Set this value to `0` to disable this feature (no maximum age imposed)."
;
if(cfg.max_echomail_age)
if(uifc.input(WIN_MID|WIN_BOT|WIN_SAV,0,0,"Maximum EchoMail Age"
,str, 10, K_EDIT) >= 0)
cfg.max_echomail_age = (ulong)parse_duration(str);
break;
}
}
"~ Archive Types ~\n\n"
"These are the archive file types that have been configured along with\n"
"their corresponding archive programs and command-lines for the packing\n"
"and unpacking of EchoMail bundle files.\n"
"\n"
"The corresponding archive programs are sometimes referred to as `packers`."
;
for(u=0;u<cfg.arcdefs;u++)
int mode = WIN_SAV | WIN_INS | WIN_DEL | WIN_ACT
| WIN_INSACT | WIN_DELACT | WIN_XTR;
if(cfg.arcdefs)
mode |= WIN_COPY | WIN_CUT;
if(savarcdef.name[0])
mode |= WIN_PASTE | WIN_PASTEXTR;
i=uifc.list(mode,0,0,0,&archive_opt,0,"Archive Types",opt);
int msk = i & MSK_ON;
i &= MSK_OFF;
if (msk == MSK_INS) {
str[0]=0;
uifc.helpbuf=
"~ Archive Type ~\n\n"
"This is the identifying name of the archiving program (packer).\n";
if(uifc.input(WIN_MID|WIN_SAV,0,0
if(!new_arcdef(i)) {
printf("\nMemory Allocation Error\n");
exit(1);
}
SAFECOPY(cfg.arcdef[i].name,str);
continue;
}
if (msk == MSK_DEL || msk == MSK_CUT) {
if (msk == MSK_CUT)
memcpy(&savarcdef, &cfg.arcdef[i], sizeof(arcdef_t));
cfg.arcdefs--;
if(cfg.arcdefs<=0) {
cfg.arcdefs=0;
continue;
}
for(u=i;u<cfg.arcdefs;u++)
memcpy(&cfg.arcdef[u],&cfg.arcdef[u+1]
continue;
}
if (msk == MSK_COPY) {
memcpy(&savarcdef,&cfg.arcdef[i],sizeof(arcdef_t));
continue;
}
if (msk == MSK_PASTE) {
if(!new_arcdef(i))
continue;
memcpy(&cfg.arcdef[i],&savarcdef,sizeof(arcdef_t));
continue;
}
if (msk != 0)
continue;
uifc.helpbuf=
"Archive Type and Program configuration";
snprintf(opt[j++],MAX_OPLN-1,"%-30.30s %u","Signature Offset"
snprintf(opt[j++],MAX_OPLN-1,"%-30.30s %s","Pack Command Line"
snprintf(opt[j++],MAX_OPLN-1,"%-30.30s %s","Unpack Command Line"
,cfg.arcdef[i].unpack);
opt[j][0]=0;
k=uifc.list(WIN_ACT|WIN_SAV|WIN_RHT|WIN_BOT,0,0,0,&packop,0,str,opt);
if(k==-1)
break;
switch(k) {
case 0:
"~ Archive Type ~\n\n"
"This is the identifying name of the archive file type. Usually this name\n"
"corresponds with the common file extension or suffix denoting this type\n"
uifc.input(WIN_MID|WIN_SAV,0,0
,"Archive Type"
,cfg.arcdef[i].name,sizeof(cfg.arcdef[i].name)-1
,K_EDIT|K_UPPER);
break;
case 1:
"~ Archive Signature ~\n\n"
"This is the identifying signature of the archive file format (in\n"
"hexadecimal notation). This signature is used in combination with the\n"
"Archive `Signature Offset` for the automatic detection of proper archive\n"
"program to extract (unarchive) inbound EchoMail bundle files."
;
uifc.input(WIN_MID|WIN_SAV,0,0
,"Archive Signature"
,cfg.arcdef[i].hexid,sizeof(cfg.arcdef[i].hexid)-1
,K_EDIT|K_UPPER);
break;
case 2:
"~ Archive Signature Offset ~\n\n"
"This is the byte-offset of the identifying signature of the archive file\n"
"format. This offset is used in combination with the Archive `Signature`\n"
"for the automatic detection of proper archive program to extract\n"
sprintf(str,"%u",cfg.arcdef[i].byteloc);
if(uifc.input(WIN_MID|WIN_SAV,0,0
,"Archive Signature Offset",str,5
,K_NUMBER|K_EDIT) > 0)
cfg.arcdef[i].byteloc=atoi(str);
"~ Pack Command Line ~\n\n"
"This is the command-line to execute to create an archive file of the\n"
"selected type. The following command-line specifiers may be used for\n"
"dynamic variable replacement:\n"
"\n"
" `%f` The path/filename of the archive file to be created\n"
" `%s` The path/filename of the file(s) to be added to the archive\n"
" `%!` The Synchronet `exec` directory\n"
" `%@` The Synchronet `exec` directory only for non-Unix systems\n"
" `%.` Blank for Unix systems, '`.exe`' otherwise\n"
" `%?` The current platform description (e.g. 'linux', 'win32')\n"
" `%j` The Synchronet `data` directory\n"
" `%k` The Synchronet `ctrl` directory\n"
" `%o` The configured system operator name\n"
" `%q` The configured system QWK-ID\n"
" `%g` The configured temporary file directory\n"
uifc.input(WIN_MID|WIN_SAV,0,0
,"Pack Command Line"
,cfg.arcdef[i].pack,sizeof(cfg.arcdef[i].pack)-1
,K_EDIT);
break;
case 4:
"~ Unpack Command Line ~\n\n"
"This is the command-line to execute to extract an archive file of the\n"
"selected type. The following command-line specifiers may be used for\n"
"dynamic variable replacement:\n"
"\n"
" `%f` The path/filename of the archive file to be extracted\n"
" `%s` The destination directory for files extracted from the archive\n"
" `%!` The Synchronet `exec` directory\n"
" `%@` The Synchronet `exec` directory only for non-Unix systems\n"
" `%.` Blank for Unix systems, '`.exe`' otherwise\n"
" `%?` The current platform description (e.g. 'linux', 'win32')\n"
" `%j` The Synchronet `data` directory\n"
" `%k` The Synchronet `ctrl` directory\n"
" `%o` The configured system operator name\n"
" `%q` The configured system QWK-ID\n"
" `%g` The configured temporary file directory\n"
uifc.input(WIN_MID|WIN_SAV,0,0
,"Unpack Command Line"
,cfg.arcdef[i].unpack,sizeof(cfg.arcdef[i].unpack)-1
}
}
}
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
"~ Domains ~\n\n"
;
i=0;
while(1) {
for(u=0; u < cfg.domain_count; u++)
snprintf(opt[u], MAX_OPLN-1, "%-*s %s"
,FIDO_DOMAIN_LEN, cfg.domain_list[u].name, cfg.domain_list[u].dns_suffix);
opt[u][0]=0;
int mode = WIN_SAV | WIN_INS | WIN_DEL | WIN_ACT
| WIN_INSACT | WIN_DELACT | WIN_XTR;
if(cfg.domain_count)
mode |= WIN_COPY | WIN_CUT;
if(savedomain.name[0])
mode |= WIN_PASTE | WIN_PASTEXTR;
i=uifc.list(mode,0,0,0,&domain_opt,0,"Domains",opt);
if(i==-1)
break;
int msk = i&MSK_ON;
i &= MSK_OFF;
if (msk == MSK_INS) {
str[0]=0;
uifc.helpbuf=
"~ Domain ~\n\n"