Newer
Older
,"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:
i=0;
strncpy(opt[i++], "Area List (memory) Only", MAX_OPLN-1);
strncpy(opt[i++], "Area List and Area File", MAX_OPLN-1);
strncpy(opt[i++], "No", MAX_OPLN-1);
opt[i][0] = 0;
if(!cfg.auto_add_subs)
k = 2;
else if(cfg.auto_add_to_areafile)
k = 1;
else
k = 0;
,"Automatically Add New Sub-boards to Area List",opt)) {
case 0: cfg.auto_add_subs = true; cfg.auto_add_to_areafile = false; break;
case 1: cfg.auto_add_subs = true; cfg.auto_add_to_areafile = true; break;
case 2: cfg.auto_add_subs = false; break;
case 7:
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 8:
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 9:
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 10:
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 11:
{
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;
case 12:
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;
case 13:
"~ 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;
case 14:
k = !cfg.require_linked_node_cfg;
switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
,"Require Nodes Linked to Areas in Area File to be Configured",uifcYesNoOpts)) {
case 0: cfg.require_linked_node_cfg = true; break;
case 1: cfg.require_linked_node_cfg = false; break;
}
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,&archive_bar,"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");
}
SAFECOPY(cfg.arcdef[i].name,str);
}
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;
}
for(u=i;u<cfg.arcdefs;u++)
memcpy(&cfg.arcdef[u],&cfg.arcdef[u+1]
}
if (msk == MSK_COPY) {
memcpy(&savarcdef,&cfg.arcdef[i],sizeof(arcdef_t));
}
if (msk == MSK_PASTE) {
if(!new_arcdef(i))
continue;
memcpy(&cfg.arcdef[i],&savarcdef,sizeof(arcdef_t));
}
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
}
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
uifc.helpbuf=
"~ Robots ~\n\n"
"The `Robots` sub-menu is where NetMail Robots are configured.\n"
"\n"
"When a NetMail message is received addressed to one of the configured\n"
"Robot `Names`, it will be stored in the `mail` message base and the\n"
"associated `Semaphore File` (if non-blank) will be touched.\n"
"\n"
"If the NetMail message has the `In-Transit` attribute flag set, it\n"
"will not be exported by SBBSecho back into a stored message (*.msg)\n"
"file. Therefore, it is recommended to include the In-Transit attribute\n"
"flag (0x20) in the Robot's `Attributes` value if the Robot (e.g. script)\n"
"is going to expect the message to be in the mail base.\n"
;
i=0;
while(1) {
for(u=0; u < cfg.robot_count; u++)
snprintf(opt[u], MAX_OPLN-1, "%-*s %s"
,FIDO_DOMAIN_LEN, cfg.robot_list[u].name, cfg.robot_list[u].semfile);
opt[u][0]=0;
int mode = WIN_SAV | WIN_INS | WIN_DEL | WIN_ACT
| WIN_INSACT | WIN_DELACT | WIN_XTR;
if(cfg.robot_count)
mode |= WIN_COPY | WIN_CUT;
if(saverobot.name[0])
mode |= WIN_PASTE | WIN_PASTEXTR;
i=uifc.list(mode,0,0,0,&robot_opt,&robot_bar,"Robots",opt);
if(i==-1)
break;
int msk = i&MSK_ON;
i &= MSK_OFF;
if (msk == MSK_INS) {
str[0]=0;
if(uifc.input(WIN_MID|WIN_SAV,0,0
,"NetMail Robot Name", str, FIDO_DOMAIN_LEN, K_EDIT)<1)
continue;
if(!new_robot(i)) {
printf("\nMemory Allocation Error\n");
exit(1);
}
SAFECOPY(cfg.robot_list[i].name, str);
continue;
}
if (msk == MSK_DEL || msk == MSK_CUT) {
if(msk == MSK_CUT)
memcpy(&saverobot, &cfg.robot_list[i], sizeof(saverobot));
cfg.robot_count--;
if(cfg.robot_count <= 0) {
cfg.robot_count = 0;
continue;
}
for(u=i; u < cfg.robot_count; u++)
memcpy(&cfg.robot_list[u], &cfg.robot_list[u+1], sizeof(struct robot));
continue;
}
if (msk == MSK_COPY) {
memcpy(&saverobot, &cfg.robot_list[i], sizeof(saverobot));
continue;
}
if (msk == MSK_PASTE) {
if(!new_robot(i))
continue;
memcpy(&cfg.robot_list[i], &saverobot, sizeof(saverobot));
continue;
}
if (msk != 0)
continue;
while(1) {
j=0;
snprintf(opt[j++],MAX_OPLN-1,"%-30.30s %s","Name"
,cfg.robot_list[i].name);
snprintf(opt[j++],MAX_OPLN-1,"%-30.30s %s","Semaphore File"
,cfg.robot_list[i].semfile);
snprintf(opt[j++],MAX_OPLN-1,"%-30.30s 0x%04hX","Attributes"
,cfg.robot_list[i].attr);
opt[j][0]=0;
SAFEPRINTF(str, "Robot - %s", cfg.robot_list[i].name);
k=uifc.list(WIN_ACT|WIN_SAV|WIN_RHT|WIN_BOT,0,0,0,&listop,0,str,opt);
if(k==-1)
break;
switch(k) {
case 0:
uifc.input(WIN_MID|WIN_SAV,0,0
,"Robot Name"
,cfg.robot_list[i].name,sizeof(cfg.robot_list[i].name)-1
,K_EDIT);
break;
case 1:
uifc.input(WIN_MID|WIN_SAV,0,0
,"Semaphore Path/Filename"
,cfg.robot_list[i].semfile,sizeof(cfg.robot_list[i].semfile)-1
,K_EDIT);
break;
case 2:
sprintf(str, "%04hX", cfg.robot_list[i].attr);
if(uifc.input(WIN_MID|WIN_SAV,0,0
,"NetMail Attributes (in hexadecimal)"
,str, sizeof(str), K_EDIT) > 0)
cfg.robot_list[i].attr = (uint16_t)strtoul(str, NULL, 16);
break;
}
}
}
break;
uifc.helpbuf=
"~ Domains ~\n\n"
"The `Domains` sub-menu is where FidoNet-style domains (the '@domain'\n"
"of 5D FTN addresses) are mapped to zone numbers, DNS suffixes, NodeLists\n"
"and BSO root directories for use by the BinkIT mailer.\n"
"\n"
"The `DNS Suffix` is optional, but when specified, should point to a valid,\n"
"working Internet DNS service name for FTN address resolution (e.g.\n"
"`binkp.net` for FidoNet proper).\n"
"\n"
"The `NodeList` is optional, but when specified, should point to an\n"
"uncompressed, unarchived, NodeList in standard FidoNet NodeList format.\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,&domain_bar,"Domains",opt);
if(i==-1)
break;
int msk = i&MSK_ON;
i &= MSK_OFF;
if (msk == MSK_INS) {
str[0]=0;
if(uifc.input(WIN_MID|WIN_SAV,0,0
,"FTN Domain Name", str, FIDO_DOMAIN_LEN, K_EDIT)<1)
continue;
if(!new_domain(i)) {
printf("\nMemory Allocation Error\n");
}
SAFECOPY(cfg.domain_list[i].name, str);
}
if (msk == MSK_DEL || msk == MSK_CUT) {
if(msk == MSK_CUT)
memcpy(&savedomain, &cfg.domain_list[i], sizeof(savedomain));
cfg.domain_count--;
if(cfg.domain_count <= 0) {
cfg.domain_count = 0;
}
for(u=i; u < cfg.domain_count; u++)
memcpy(&cfg.domain_list[u], &cfg.domain_list[u+1], sizeof(struct fido_domain));
}
if (msk == MSK_COPY) {
memcpy(&savedomain, &cfg.domain_list[i], sizeof(savedomain));
}
if (msk == MSK_PASTE) {
if(!new_domain(i))
continue;
memcpy(&cfg.domain_list[i], &savedomain, sizeof(savedomain));
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
}
if (msk != 0)
continue;
while(1) {
j=0;
snprintf(opt[j++],MAX_OPLN-1,"%-30.30s %s","Name"
,cfg.domain_list[i].name);
snprintf(opt[j++],MAX_OPLN-1,"%-30.30s %s","Zones"
,int_list(cfg.domain_list[i].zone_list, cfg.domain_list[i].zone_count));
snprintf(opt[j++],MAX_OPLN-1,"%-30.30s %s","DNS Suffix"
,cfg.domain_list[i].dns_suffix);
snprintf(opt[j++],MAX_OPLN-1,"%-30.30s %s","Outbound Root"
,cfg.domain_list[i].root);
snprintf(opt[j++],MAX_OPLN-1,"%-30.30s %s","NodeList"
,cfg.domain_list[i].nodelist);
opt[j][0]=0;
SAFEPRINTF(str, "Domain - %s", cfg.domain_list[i].name);
k=uifc.list(WIN_ACT|WIN_SAV|WIN_RHT|WIN_BOT,0,0,0,&listop,0,str,opt);
if(k==-1)
break;
switch(k) {
case 0:
uifc.input(WIN_MID|WIN_SAV,0,0
,"Domain Name"
,cfg.domain_list[i].name,sizeof(cfg.domain_list[i].name)-1
,K_EDIT);
break;
case 1:
SAFECOPY(str, int_list(cfg.domain_list[i].zone_list, cfg.domain_list[i].zone_count));
if(uifc.input(WIN_MID|WIN_SAV, 0, 0
,"Zone List (comma-separated)"
,str, 40, K_EDIT) >= 0) {
FREE_AND_NULL(cfg.domain_list[i].zone_list);
cfg.domain_list[i].zone_list = parseIntList(str, ",", &cfg.domain_list[i].zone_count);
uifc.changes = TRUE;
}
break;
case 2:
uifc.input(WIN_MID|WIN_SAV,0,0
,"DNS Suffix"
,cfg.domain_list[i].dns_suffix,sizeof(cfg.domain_list[i].dns_suffix)-1
,K_EDIT);
break;
case 3:
uifc.input(WIN_MID|WIN_SAV,0,0
,"Outbound Root Directory"
,cfg.domain_list[i].root,sizeof(cfg.domain_list[i].root)-1
,K_EDIT);
break;
case 4:
uifc.input(WIN_MID|WIN_SAV,0,0
,"NodeList"
,cfg.domain_list[i].nodelist,sizeof(cfg.domain_list[i].nodelist)-1
,K_EDIT);
break;
}
break;
while(1) {
uifc.helpbuf=
"~ 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";
for(u=0;u<cfg.listcfgs;u++)
int mode = WIN_SAV | WIN_INS | WIN_DEL | WIN_ACT
| WIN_INSACT | WIN_DELACT | WIN_XTR;
if(cfg.listcfgs)
mode |= WIN_COPY | WIN_CUT;
if(savlistcfg.listpath[0])
mode |= WIN_PASTE | WIN_PASTEXTR;
i=uifc.list(mode,0,0,0,&echolist_opt,&echolist_bar,"EchoLists",opt);
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(!new_list(i)) {
printf("\nMemory Allocation Error\n");
}
SAFECOPY(cfg.listcfg[i].listpath,str);
}
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;
}
for(u=i;u<cfg.listcfgs;u++)
memcpy(&cfg.listcfg[u],&cfg.listcfg[u+1]
}
if (msk == MSK_COPY) {
memcpy(&savlistcfg,&cfg.listcfg[i],sizeof(echolist_t));
}
if (msk == MSK_PASTE) {
if(!new_list(i))
continue;
memcpy(&cfg.listcfg[i],&savlistcfg,sizeof(echolist_t));
}
if (msk != 0)
continue;
"~ Configuring an EchoList ~\n\n"
"The `EchoList Path/Name`, `Required Key` and `Hub Address` must be configured\n"
"correctly and any one of the Required Keys added to the `EchoList Keys`\n"
"of the `Linked Nodes` of interest.\n"
"\n"
"The other settings are only for forwarding received Area Manager\n"
"requests 'upstream' (to your hub) when needed.\n"
;
snprintf(opt[j++],MAX_OPLN-1,"%-30.30s %s","EchoList Path/Name"
snprintf(opt[j++],MAX_OPLN-1,"%-30.30s %s","Required Key"
,strListCombine(cfg.listcfg[i].keys, str, sizeof(str), ","));
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 AreaMgr Requests"
if(cfg.listcfg[i].forward) {
snprintf(opt[j++],MAX_OPLN-1,"%-30.30s %s","AreaMgr Name"
,cfg.listcfg[i].areamgr);
snprintf(opt[j++],MAX_OPLN-1,"%-30.30s %s","AreaMgr Password"
,cfg.listcfg[i].password);
}
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);
"~ Required Key ~\n\n"
"These keys determine which linked nodes have access to the selected\n"
"echolist file via AreaFix requests (e.g. query, add, remove).\n"
"\n"
"A linked node need only have one of the required keys to have access\n"
"the echolist."
;
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;
}
if((x&MSK_ON)==MSK_DEL) {
x&=MSK_OFF;
}
,str,SBBSECHO_MAX_KEY_LEN,K_EDIT|K_UPPER);
strListReplace(cfg.listcfg[i].keys,x,str);
}
SAFECOPY(str,faddrtoa(&cfg.listcfg[i].hub));
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
else
str[0]=0;
uifc.input(WIN_MID|WIN_SAV,0,0
,"Hub Address",str
,25,K_EDIT);
if(str[0])
cfg.listcfg[i].hub=atofaddr(str);
else
memset(&cfg.listcfg[i].hub,0
,sizeof(faddr_t));
break;
case 3:
cfg.listcfg[i].forward = !cfg.listcfg[i].forward;
break;
case 4:
uifc.input(WIN_MID|WIN_SAV,0,0
,"Name to use when forwarding AreaMgr requests"
,cfg.listcfg[i].areamgr,sizeof(cfg.listcfg[i].areamgr)-1
,K_EDIT);
break;
case 5:
uifc.input(WIN_MID|WIN_SAV,0,0
,"Password to use when forwarding AreaMgr requests"
,cfg.listcfg[i].password,sizeof(cfg.listcfg[i].password)-1
,K_EDIT|K_UPPER);
break;
}
uifc.pop("Writing config ...");
bool success = sbbsecho_write_ini(&cfg);
uifc.pop(NULL);
if(!success)
uifc.msg("Error saving configuration file");
else {
orig_cfg = cfg;
uifc.changes = FALSE;
}
if(cfg.used_include) {
if(uifc.msg("Changes made will not be saved"))
break;
} else {
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;
i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0,"Save Config File",uifcYesNoOpts);
if(i==-1) break;
if(i == 0) {
uifc.pop("Writing config ...");
bool success = sbbsecho_write_ini(&cfg);
uifc.pop(NULL);
if(!success)
uifc.msg("Error saving configuration file");
}
}
uifc.pop("Exiting");
break;