Newer
Older
"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;
}
}
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
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
"~ 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 '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 '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)
else
strcpy(str, "None");
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_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;
case 8:
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;
case 9:
"~ 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;
}
}
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
"~ 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
strcpy(str,"Disabled");
snprintf(opt[i++],MAX_OPLN-1,"%-45.45s%s","Zone Blind SEEN-BY and PATH Lines", str);
if(cfg.max_echomail_age)
else
strcpy(str, "None");
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:
"~ Area Manager ~\n\n"
"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_GET
| WIN_INSACT | WIN_DELACT | WIN_XTR;
if(savarcdef.name[0])
mode |= WIN_PUT;
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((cfg.arcdef=(arcdef_t *)realloc(cfg.arcdef
,sizeof(arcdef_t)*(cfg.arcdefs+1)))==NULL) {
printf("\nMemory Allocation Error\n");
exit(1);
}
for(j=cfg.arcdefs;j>i;j--)
memcpy(&cfg.arcdef[j],&cfg.arcdef[j-1]
,sizeof(arcdef_t));
strcpy(cfg.arcdef[j].name
,cfg.arcdef[j-1].name);
cfg.arcdefs++;
memset(&cfg.arcdef[i],0,sizeof(arcdef_t));
strcpy(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]
if((cfg.arcdef=(arcdef_t *)realloc(cfg.arcdef
,sizeof(arcdef_t)*(cfg.arcdefs)))==NULL) {
printf("\nMemory Allocation Error\n");
exit(1);
}
continue;
}
memcpy(&savarcdef,&cfg.arcdef[i],sizeof(arcdef_t));
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 path/filename of the file(s) to 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
}
}
}
"~ EchoLists ~\n\n"
"This feature allows you to specify lists of echoes, in `BACKBONE.NA`\n"
"format, which are utilized in `addition` to your Area File (e.g. \n"
"`areas.bbs`) for advanced AreaFix (Area Management) operations.\n";
while(1) {
for(u=0;u<cfg.listcfgs;u++)
int mode = WIN_SAV | WIN_INS | WIN_DEL | WIN_ACT | WIN_GET
| WIN_INSACT | WIN_DELACT | WIN_XTR;
if(savlistcfg.listpath[0])
mode |= WIN_PUT;
break;
int msk = i&MSK_ON;
i &= MSK_OFF;
if (msk == MSK_INS) {
str[0]=0;
uifc.helpbuf=
"~ EchoList ~\n\n"
"This is the path and filename of the echolist file you wish\n"
"to add.\n";
if(uifc.input(WIN_MID|WIN_SAV,0,0
if((cfg.listcfg=(echolist_t *)realloc(cfg.listcfg
,sizeof(echolist_t)*(cfg.listcfgs+1)))==NULL) {
printf("\nMemory Allocation Error\n");
exit(1);
}
for(j=cfg.listcfgs;j>i;j--)
memcpy(&cfg.listcfg[j],&cfg.listcfg[j-1]
,sizeof(echolist_t));
cfg.listcfgs++;
memset(&cfg.listcfg[i],0,sizeof(echolist_t));
strcpy(cfg.listcfg[i].listpath,str);
continue;
}
if (msk == MSK_DEL || msk == MSK_CUT) {
if(msk == MSK_CUT)
memcpy(&savlistcfg, &cfg.listcfg[i], sizeof(echolist_t));
cfg.listcfgs--;
if(cfg.listcfgs<=0) {
cfg.listcfgs=0;
continue;
}
for(u=i;u<cfg.listcfgs;u++)
memcpy(&cfg.listcfg[u],&cfg.listcfg[u+1]
if((cfg.listcfg=(echolist_t *)realloc(cfg.listcfg
,sizeof(echolist_t)*(cfg.listcfgs)))==NULL) {
printf("\nMemory Allocation Error\n");
exit(1);
}
continue;
}
memcpy(&savlistcfg,&cfg.listcfg[i],sizeof(echolist_t));
continue;
}
memcpy(&cfg.listcfg[i],&savlistcfg,sizeof(echolist_t));
continue;
}
if (msk != 0)
continue;
;
snprintf(opt[j++],MAX_OPLN-1,"%-30.30s %s","EchoList Path/Name"
snprintf(opt[j++],MAX_OPLN-1,"%-30.30s %s","Hub Address"
,(cfg.listcfg[i].hub.zone) ?
faddrtoa(&cfg.listcfg[i].hub) : "None");
snprintf(opt[j++],MAX_OPLN-1,"%-30.30s %s","Forward Password"
,(cfg.listcfg[i].password[0]) ?
cfg.listcfg[i].password : "None");
snprintf(opt[j++],MAX_OPLN-1,"%-30.30s %s","Forward Requests"
,cfg.listcfg[i].forward ? "Yes" : "No");
snprintf(opt[j++],MAX_OPLN-1,"%-30.30s %s","AreaFix Keys"
,strListCombine(cfg.listcfg[i].keys, str, sizeof(str), ","));
SAFEPRINTF(str, "EchoList - %s", getfname(cfg.listcfg[i].listpath));
k=uifc.list(WIN_ACT|WIN_SAV|WIN_RHT|WIN_BOT,0,0,0,&listop,0,str,opt);
break;
uifc.input(WIN_MID|WIN_SAV,0,0
,"EchoList Path/Name"
,cfg.listcfg[i].listpath,sizeof(cfg.listcfg[i].listpath)-1
,K_EDIT);
if(cfg.listcfg[i].hub.zone)
strcpy(str,faddrtoa(&cfg.listcfg[i].hub));
str[0]=0;
uifc.input(WIN_MID|WIN_SAV,0,0
,"Hub Address",str
,25,K_EDIT);
if(str[0])
,sizeof(faddr_t));
break;
case 2:
uifc.input(WIN_MID|WIN_SAV,0,0
,"Password to use when forwarding requests"
,cfg.listcfg[i].password,sizeof(cfg.listcfg[i].password)-1
,K_EDIT|K_UPPER);
"~ AreaFix Keys ~\n\n"
"These keys determine which linked nodes have access to the current\n"
"echolist file via AreaFix requests (e.g. query, add, remove).\n";
for(u=0; cfg.listcfg[i].keys!=NULL && cfg.listcfg[i].keys[u] != NULL;u++)
strcpy(opt[u],cfg.listcfg[i].keys[u]);
x=uifc.list(WIN_SAV|WIN_INS|WIN_DEL|WIN_ACT|
WIN_XTR|WIN_INSACT|WIN_DELACT|WIN_RHT
if(x==-1)
break;
if((x&MSK_ON)==MSK_INS) {
x&=MSK_OFF;
str[0]=0;
if(uifc.input(WIN_MID|WIN_SAV,0,0
,K_EDIT|K_UPPER)<1)
continue;
continue;
}
if((x&MSK_ON)==MSK_DEL) {
x&=MSK_OFF;
continue;
}
uifc.input(WIN_MID|WIN_SAV,0,0,"AreaFix Keys"
,str,SBBSECHO_MAX_KEY_LEN,K_EDIT|K_UPPER);
strListReplace(cfg.listcfg[i].keys,x,str);
continue;
}
}
}
}
if(!sbbsecho_write_ini(&cfg))
uifc.msg("Error saving configuration file");
else {
orig_cfg = cfg;
uifc.changes = FALSE;
}
break;
case -1:
if(uifc.changes) {
uifc.helpbuf=
"~ Save Configuration File ~\n\n"
"Select `Yes` to save the config file, `No` to quit without saving,\n"
"or hit ~ ESC ~ to go back to the menu.\n\n";
i=0;
strcpy(opt[0],"Yes");
strcpy(opt[1],"No");
opt[2][0]=0;
i=uifc.list(WIN_MID,0,0,0,&i,0,"Save Config File",opt);
if(i==-1) break;
if(i) {uifc.bail(); exit(0);}
if(!sbbsecho_write_ini(&cfg))
uifc.msg("Error saving configuration file");
}
uifc.bail();
exit(0);
}