|
|
1.1 root 1: #line 2 "SCFGNODE.C"
2:
3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
4:
5: /****************************************************************************/
6: /* Synchronet configuration utility */
7: /****************************************************************************/
8:
9: #include "scfg.h"
10: #include "spawno.h"
11:
12: int com_type()
13: {
14: int i;
15:
16: i=0;
17: strcpy(opt[0],"UART");
18: strcpy(opt[1],"FOSSIL Int 14h");
19: strcpy(opt[2],"PC BIOS Int 14h");
20: strcpy(opt[3],"PS/2 BIOS Int 14h");
21: strcpy(opt[4],"DigiBoard Int 14h");
22: opt[5][0]=0;
23: SETHELP(WHERE);
24: /*
25: &COM Port Type:&
26:
27: Select the type of serial COM port for this node. If you are unsure,
28: select &UART&. If you have a &FOSSIL& driver installed, you &do not& have to
29: select &FOSSIL& unless you specifically want to override Synchronet's
30: internal COM functions.
31: */
32: i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0
33: ,"COM Port Type",opt);
34: if(i==-1)
35: return(0);
36: changes=1;
37: if(i) {
38: com_irq=com_port-1;
39: if(i==1) {
40: savnum=0;
41: umsg("WARNING: This is not a recommended setting for most systems");
42: umsg("The default DSZ command lines will not work with this setting");
43: com_base=0xf; }
44: else if(i==2)
45: com_base=0xb;
46: else if(i==3)
47: com_base=0xe;
48: else if(i==4)
49: com_base=0xd; }
50:
51: else { /* UART */
52: if(com_port && com_port<5) {
53: i=0;
54: strcpy(opt[0],"Yes");
55: strcpy(opt[1],"No");
56: opt[2][0]=0;
57: SETHELP(WHERE);
58: /*
59: &Use Default UART IRQ and I/O Address:&
60:
61: If your COM Port's UART is using the normal IRQ and Base I/O Address
62: for the configured COM Port number, select &Yes&. If your COM Port
63: is using a non-standard IRQ or I/O Address, select &No& and be sure
64: to set the &UART IRQ& and &UART I/O Address& options. If you are not
65: sure what IRQ and I/O Address your COM Port is using, select &Yes&.
66: */
67: i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0
68: ,"Use Default UART IRQ and I/O Address"
69: ,opt);
70: if(i==0) {
71: switch(com_port) {
72: case 1:
73: com_irq=4;
74: com_base=0x3f8;
75: break;
76: case 2:
77: com_irq=3;
78: com_base=0x2f8;
79: break;
80: case 3:
81: com_irq=4;
82: com_base=0x3e8;
83: break;
84: case 4:
85: com_irq=3;
86: com_base=0x2e8;
87: break; }
88: changes=1;
89: return(1); } }
90: else {
91: if(com_base<0x100)
92: com_base=0x100;
93: if(com_irq<2 || com_irq>15)
94: com_irq=5; } }
95: return(0);
96: }
97:
98: void node_menu()
99: {
100: char done,str[81],savnode=0;
101: int i,j;
102: static int node_menu_dflt,node_bar;
103:
104: while(1) {
105: for(i=0;i<sys_nodes;i++)
106: sprintf(opt[i],"Node %d",i+1);
107: opt[i][0]=0;
108: j=WIN_ORG|WIN_ACT|WIN_INSACT|WIN_DELACT;
109: if(sys_nodes>1)
110: j|=WIN_DEL|WIN_GET;
111: if(sys_nodes<MAX_NODES && sys_nodes<MAX_OPTS)
112: j|=WIN_INS;
113: if(savnode)
114: j|=WIN_PUT;
115: SETHELP(WHERE);
116: /*
117: &Node List:&
118:
119: This is the list of configured nodes in your system.
120:
121: To add a node, hit INS .
122:
123: To delete a node, hit DEL .
124:
125: To configure a node, select it using the arrow keys and hit ENTER .
126:
127: To copy a node's configuration to another node, first select the source
128: node with the arrow keys and hit F5 . Then select the destination
129: node and hit F6 .
130: */
131:
132: i=ulist(j,0,0,13,&node_menu_dflt,&node_bar,"Nodes",opt);
133: if(i==-1) {
134: if(savnode) {
135: free_node_cfg();
136: savnode=0; }
137: return; }
138:
139: if((i&MSK_ON)==MSK_DEL) {
140: strcpy(opt[0],"Yes");
141: strcpy(opt[1],"No");
142: opt[2][0]=0;
143: sprintf(str,"Delete Node %d",sys_nodes);
144: i=1;
145: SETHELP(WHERE);
146: /*
147: &Delete Node:&
148:
149: If you are positive you want to delete this node, select &Yes&. Otherwise,
150: select &No& or hit ESC .
151: */
152: i=ulist(WIN_MID,0,0,0,&i,0,str,opt);
153: if(!i) {
154: --sys_nodes;
155: FREE(node_path[sys_nodes]);
156: write_main_cfg(); }
157: continue; }
158: if((i&MSK_ON)==MSK_INS) {
159: strcpy(node_dir,node_path[sys_nodes-1]);
160: i=sys_nodes+1;
161: upop("Reading NODE.CNF...");
162: read_node_cfg(txt);
163: upop(0);
164: sprintf(str,"..\\NODE%d\\",i);
165: sprintf(tmp,"Node %d Path",i);
166: SETHELP(WHERE);
167: /*
168: &Node Path:&
169:
170: This is the path to this node's private directory where its separate
171: configuration and data files are stored.
172:
173: The drive and directory of this path can be set to any valid DOS
174: directory that can be accessed by &ALL& nodes and &MUST NOT& be on a RAM disk
175: or other volatile media.
176:
177: If you want to abort the creation of this new node, hit ESC .
178: */
179: j=uinput(WIN_MID,0,0,tmp,str,50,K_EDIT|K_UPPER);
180: changes=0;
181: if(j<2)
182: continue;
183: truncsp(str);
184: if((node_path=(char **)REALLOC(node_path,sizeof(char *)*(sys_nodes+1)))
185: ==NULL) {
186: errormsg(WHERE,ERR_ALLOC,nulstr,sys_nodes+1);
187: continue; }
188: if((node_path[i-1]=MALLOC(strlen(str)+2))==NULL) {
189: errormsg(WHERE,ERR_ALLOC,str,strlen(str)+2);
190: continue; }
191: strcpy(node_path[i-1],str);
192: if(str[strlen(str)-1]=='\\')
193: str[strlen(str)-1]=0;
194: mkdir(str);
195: node_num=++sys_nodes;
196: sprintf(node_name,"Node %u",node_num);
197: write_node_cfg();
198: write_main_cfg();
199: free_node_cfg();
200: continue; }
201: if((i&MSK_ON)==MSK_GET) {
202: if(savnode)
203: free_node_cfg();
204: i&=MSK_OFF;
205: strcpy(node_dir,node_path[i]);
206: upop("Reading NODE.CNF...");
207: read_node_cfg(txt);
208: upop(0);
209: savnode=1;
210: continue; }
211: if((i&MSK_ON)==MSK_PUT) {
212: i&=MSK_OFF;
213: strcpy(node_dir,node_path[i]);
214: node_num=i+1;
215: write_node_cfg();
216: changes=1;
217: continue; }
218:
219: if(savnode) {
220: free_node_cfg();
221: savnode=0; }
222: strcpy(node_dir,node_path[i]);
223: upop("Reading NODE.CNF...");
224: read_node_cfg(txt);
225: upop(0);
226: if(node_num!=i+1) { /* Node number isn't right? */
227: node_num=i+1; /* so fix it */
228: write_node_cfg(); } /* and write it back */
229: node_cfg();
230:
231: free_node_cfg(); }
232: }
233:
234: void node_cfg()
235: {
236: static int node_dflt;
237: char done,str[81];
238: static int mdm_dflt,adv_dflt,tog_dflt,tog_bar;
239: int i,j,dflt=0,bar=0;
240:
241: while(1) {
242: i=0;
243: sprintf(opt[i++],"%-27.27s%s","Name",node_name);
244: sprintf(opt[i++],"%-27.27s%s","Phone Number",node_phone);
245: sprintf(opt[i++],"%-27.27s%ubps","Minimum Connect Rate",node_minbps);
246: sprintf(opt[i++],"%-27.27s%.40s","Logon Requirements",node_ar);
247: sprintf(opt[i++],"%-27.27s%.40s","Local Text Editor",node_editor);
248: sprintf(opt[i++],"%-27.27s%.40s","Local Text Viewer",node_viewer);
249: sprintf(opt[i++],"%-27.27s%.40s","Configuration Command",scfg_cmd);
250: sprintf(opt[i++],"%-27.27s%.40s","DOS Command Interpreter"
251: ,node_comspec[0] ? node_comspec : "%COMSPEC%");
252: strcpy(opt[i++],"Toggle Options...");
253: strcpy(opt[i++],"Advanced Options...");
254: strcpy(opt[i++],"Modem Configuration...");
255: strcpy(opt[i++],"Wait for Call Number Keys...");
256: strcpy(opt[i++],"Wait for Call Function Keys...");
257: opt[i][0]=0;
258: sprintf(str,"Node %d Configuration",node_num);
259: SETHELP(WHERE);
260: /*
261: &Node Configuration Menu:&
262:
263: This is the node configuration menu. The options available from this
264: menu will only affect the selected node's configuration.
265:
266: Options with a trailing &...& will produce a sub-menu of more options.
267: */
268: switch(ulist(WIN_ACT|WIN_CHE|WIN_BOT|WIN_RHT,0,0,60,&node_dflt,0
269: ,str,opt)) {
270: case -1:
271: i=save_changes(WIN_MID);
272: if(!i)
273: write_node_cfg();
274: if(i!=-1)
275: return;
276: break;
277: case 0:
278: SETHELP(WHERE);
279: /*
280: &Node Name:&
281:
282: This is the name of the selected node. It is used for documentary
283: purposes only.
284: */
285: uinput(WIN_MID|WIN_SAV,0,10,"Name",node_name,40,K_EDIT);
286: break;
287: case 1:
288: SETHELP(WHERE);
289: /*
290: &Node Phone Number:&
291:
292: This is the phone number to access the selected node. It is used for
293: documentary purposes only.
294: */
295: uinput(WIN_MID|WIN_SAV,0,10,"Phone Number",node_phone,12,K_EDIT);
296: break;
297: case 2:
298: SETHELP(WHERE);
299: /*
300: &Minimum Connect Rate:&
301:
302: This is the lowest modem connection speed allowed for the selected node.
303: The speed is a decimal number representing bits per second (bps) or more
304: inaccurately referred to as baud.
305:
306: If a user attempts to logon this node at a speed lower than the minimum
307: connect rate, a message is displayed explaining the minimum connect
308: rate and the user is disconnected.
309:
310: If the file TEXT\TOOSLOW.MSG exists, it will be displayed to the user
311: before the user is disconnected.
312:
313: Users with the &M& exemption can log onto any node at any speed.
314: */
315: sprintf(str,"%u",node_minbps);
316: uinput(WIN_MID|WIN_SAV,0,10,"Minimum Connect Rate",str,5
317: ,K_NUMBER|K_EDIT);
318: node_minbps=atoi(str);
319: break;
320: case 3:
321: sprintf(str,"Node %u Logon",node_num);
322: getar(str,node_ar);
323: break;
324: case 4:
325: SETHELP(WHERE);
326: /*
327: &Local Text Editor:&
328:
329: This is the command line to execute to edit text files locally in
330: Synchronet. If this command line is blank, the default editor of the
331: sysop (user #1) will be used.
332:
333: This command line can be used to create posts and e-mail locally, if the
334: toggle option &Use Editor for Messages& is set to &Yes&.
335:
336: The &%f& command line specifier is used for the filename to edit.
337: */
338: uinput(WIN_MID|WIN_SAV,0,13,"Editor",node_editor
339: ,50,K_EDIT);
340: break;
341: case 5:
342: SETHELP(WHERE);
343: /*
344: &Local Text Viewer:&
345:
346: This is the command line used to view log files from the wait for call
347: screen.
348:
349: The &%f& command line specifier is used for the filename to view.
350: */
351: uinput(WIN_MID|WIN_SAV,0,14,"Viewer",node_viewer
352: ,50,K_EDIT);
353: break;
354: case 6:
355: SETHELP(WHERE);
356: /*
357: &Configuration Command Line:&
358:
359: This is the command line used to launch the Synchronet configuration
360: program (&SCFG&) from this node's Waiting for Call (WFC) screen.
361: */
362: uinput(WIN_MID|WIN_SAV,0,14,"Configuration Command",scfg_cmd
363: ,40,K_EDIT);
364: break;
365: case 7:
366: SETHELP(WHERE);
367: /*
368: &DOS Command Interpreter:&
369:
370: This is the complete path to your DOS command interpreter (normally
371: &COMMAND.COM&). Leaving this option blank (designated by &%COMSPEC%&)
372: specifies that the path contained in the &COMSPEC& environment variable
373: should be used.
374:
375: When running Synchronet for &OS/2&, this option should be set to:
376: &C:\OS2\MDOS\COMMAND.COM&.
377: */
378: uinput(WIN_MID|WIN_SAV,0,14,"DOS Command Interpreter"
379: ,node_comspec,40,K_EDIT);
380: break;
381: case 8:
382: done=0;
383: while(!done) {
384: i=0;
385: sprintf(opt[i++],"%-27.27s%s","Alarm When Answering"
386: ,node_misc&NM_ANSALARM ? "Yes":"No");
387: sprintf(opt[i++],"%-27.27s%s","Status Screen While WFC"
388: ,node_misc&NM_WFCSCRN ? "Yes":"No");
389: sprintf(opt[i++],"%-27.27s%s","Total Msgs/Files on WFC"
390: ,node_misc&NM_WFCMSGS ? "Yes":"No");
391: sprintf(opt[i++],"%-27.27s%s","Use Editor for Messages"
392: ,node_misc&NM_LCL_EDIT ? "Yes":"No");
393: sprintf(opt[i++],"%-27.27s%s","Use EMS for Overlays"
394: ,node_misc&NM_EMSOVL ? "Yes":"No");
395: sprintf(opt[i++],"%-27.27s%s","Allow Swapping"
396: ,node_swap&SWAP_NONE ? "No":"Yes");
397: sprintf(opt[i++],"%-27.27s%s","Swap to EMS Memory"
398: ,node_swap&SWAP_EMS ? "Yes":"No");
399: sprintf(opt[i++],"%-27.27s%s","Swap to XMS Memory"
400: ,node_swap&SWAP_XMS ? "Yes":"No");
401: sprintf(opt[i++],"%-27.27s%s","Swap to Extended Memory"
402: ,node_swap&SWAP_EXT ? "Yes":"No");
403: sprintf(opt[i++],"%-27.27s%s","Windows/OS2 Time Slice API"
404: ,node_misc&NM_WINOS2 ? "Yes":"No");
405: sprintf(opt[i++],"%-27.27s%s","DESQview Time Slice API"
406: ,node_misc&NM_NODV ? "No":"Yes");
407: sprintf(opt[i++],"%-27.27s%s","DOS Idle Interrupts"
408: ,node_misc&NM_INT28 ? "Yes":"No");
409: sprintf(opt[i++],"%-27.27s%s","Low Priority String Input"
410: ,node_misc&NM_LOWPRIO ? "Yes":"No");
411: sprintf(opt[i++],"%-27.27s%s","Allow Logon by Number"
412: ,node_misc&NM_NO_NUM ? "No":"Yes");
413: sprintf(opt[i++],"%-27.27s%s","Allow Logon by Real Name"
414: ,node_misc&NM_LOGON_R ? "Yes":"No");
415: sprintf(opt[i++],"%-27.27s%s","Always Prompt for Password"
416: ,node_misc&NM_LOGON_P ? "Yes":"No");
417: sprintf(opt[i++],"%-27.27s%s","Disable Local Inactivity"
418: ,node_misc&NM_NO_INACT ? "Yes":"No");
419: sprintf(opt[i++],"%-27.27s%s","Disable Local Keyboard"
420: ,node_misc&NM_NO_LKBRD ? "Yes":"No");
421: sprintf(opt[i++],"%-27.27s%s","Local System Protection"
422: ,node_misc&NM_SYSPW ? "Yes":"No");
423: sprintf(opt[i++],"%-27.27s%s","Beep Locally"
424: ,node_misc&NM_NOBEEP ? "No":"Yes");
425: sprintf(opt[i++],"%-27.27s%s","Allow 8-bit Remote Logons"
426: ,node_misc&NM_7BITONLY ? "No":"Yes");
427: sprintf(opt[i++],"%-27.27s%s","Reset Video Between Calls"
428: ,node_misc&NM_RESETVID ? "Yes":"No");
429:
430: opt[i][0]=0;
431: savnum=0;
432: SETHELP(WHERE);
433: /*
434: &Node Toggle Options:&
435:
436: This is the toggle options menu for the selected node's configuration.
437:
438: The available options from this menu can all be toggled between two or
439: more states, such as &Yes& and &No&.
440: */
441: switch(ulist(WIN_BOT|WIN_RHT|WIN_ACT|WIN_SAV,3,2,35,&tog_dflt
442: ,&tog_bar,"Toggle Options",opt)) {
443: case -1:
444: done=1;
445: break;
446: case 0:
447: i=1;
448: strcpy(opt[0],"Yes");
449: strcpy(opt[1],"No");
450: opt[2][0]=0;
451: savnum=1;
452: SETHELP(WHERE);
453: /*
454: &Alarm When Answering:&
455:
456: Set this option to &Yes& if want this node to make an alarm sound each
457: time it answers an incoming call. Usually, the modem's speaker is a
458: sufficient alarm if one is desired.
459: */
460: i=ulist(WIN_MID|WIN_SAV,0,15,0,&i,0
461: ,"Sound Alarm When Answering",opt);
462: if(i==0 && !(node_misc&NM_ANSALARM)) {
463: node_misc|=NM_ANSALARM;
464: changes=1; }
465: else if(i==1 && (node_misc&NM_ANSALARM)) {
466: node_misc&=~NM_ANSALARM;
467: changes=1; }
468: break;
469: case 1:
470: i=0;
471: strcpy(opt[0],"Yes");
472: strcpy(opt[1],"No");
473: opt[2][0]=0;
474: savnum=1;
475: SETHELP(WHERE);
476: /*
477: &Status Screen While WFC:&
478:
479: If you want the current system statistics and current status of all
480: active nodes to be displayed while this node is waiting for a caller,
481: set this option to &Yes&.
482: */
483: i=ulist(WIN_MID|WIN_SAV,0,10,0,&i,0
484: ,"Display Status Screen While Waiting for Call",opt);
485: if(i==0 && !(node_misc&NM_WFCSCRN)) {
486: node_misc|=NM_WFCSCRN;
487: changes=1; }
488: else if(i==1 && (node_misc&NM_WFCSCRN)) {
489: node_misc&=~NM_WFCSCRN;
490: changes=1; }
491: break;
492: case 2:
493: i=0;
494: strcpy(opt[0],"Yes");
495: strcpy(opt[1],"No");
496: opt[2][0]=0;
497: savnum=1;
498: SETHELP(WHERE);
499: /*
500: &Total Messages and Files on WFC Status Screen:&
501:
502: If you want the total number of messages and files to be retrieved
503: and displayed on the WFC status screen, set this option to &Yes&.
504:
505: Setting this option to &No& will significantly reduce the amount of
506: time required to retrieve the system statistics on systems with large
507: numbers of message and file areas.
508: */
509: i=ulist(WIN_MID|WIN_SAV,0,10,0,&i,0
510: ,"Display Total Messages and Files while WFC",opt);
511: if(i==0 && !(node_misc&NM_WFCMSGS)) {
512: node_misc|=(NM_WFCMSGS|NM_WFCSCRN);
513: changes=1; }
514: else if(i==1 && (node_misc&NM_WFCMSGS)) {
515: node_misc&=~NM_WFCMSGS;
516: changes=1; }
517: break;
518: case 3:
519: i=1;
520: strcpy(opt[0],"Yes");
521: strcpy(opt[1],"No");
522: opt[2][0]=0;
523: savnum=1;
524: SETHELP(WHERE);
525: /*
526: &Use Local Text Editor for Messages:&
527:
528: If a local text editor command has been specified, it can be used to
529: create messages (posts and e-mail) locally by setting this option to
530: &Yes&.
531: */
532: i=ulist(WIN_MID|WIN_SAV,0,10,0,&i,0
533: ,"Use Local Text Editor to Create Messages",opt);
534: if(i==0 && !(node_misc&NM_LCL_EDIT)) {
535: node_misc|=NM_LCL_EDIT;
536: changes=1; }
537: else if(i==1 && (node_misc&NM_LCL_EDIT)) {
538: node_misc&=~NM_LCL_EDIT;
539: changes=1; }
540: break;
541: case 4:
542: i=0;
543: strcpy(opt[0],"Yes");
544: strcpy(opt[1],"No");
545: opt[2][0]=0;
546: savnum=1;
547: SETHELP(WHERE);
548: /*
549: &Use Available Expanded Memory (EMS) for Swapping Overlays:&
550:
551: If you wish to use any available expanded memory (EMS) for swapping
552: overlays, set this option to &Yes&. Swapping overlays to memory is much
553: faster than swapping to disk.
554:
555: If this option is set to &Yes&, Synchronet will attempt to allocation &360K&
556: of EMS for swapping overlays into.
557: */
558: i=ulist(WIN_MID|WIN_SAV,0,10,0,&i,0
559: ,"Use Available EMS for Overlays",opt);
560: if(i==0 && !(node_misc&NM_EMSOVL)) {
561: node_misc|=NM_EMSOVL;
562: changes=1; }
563: else if(i==1 && (node_misc&NM_EMSOVL)) {
564: node_misc&=~NM_EMSOVL;
565: changes=1; }
566: break;
567: case 5:
568: i=0;
569: strcpy(opt[0],"Yes");
570: strcpy(opt[1],"No");
571: opt[2][0]=0;
572: savnum=1;
573: SETHELP(WHERE);
574: /*
575: &Allow Swapping:&
576:
577: If this option is set to &Yes&, Synchronet will use one of the available
578: &Swap to& options when swapping out of memory. If you have no Extended,
579: EMS, or XMS memory available, and this option is set to &Yes&, Synchronet
580: will swap to disk.
581: */
582: i=ulist(WIN_MID|WIN_SAV,0,10,0,&i,0
583: ,"Allow Swapping",opt);
584: if(i==0 && node_swap&SWAP_NONE) {
585: node_swap&=~SWAP_NONE;
586: changes=1; }
587: else if(i==1 && !(node_swap&SWAP_NONE)) {
588: node_swap|=SWAP_NONE;
589: changes=1; }
590: break;
591: case 6:
592: i=0;
593: strcpy(opt[0],"Yes");
594: strcpy(opt[1],"No");
595: opt[2][0]=0;
596: savnum=1;
597: SETHELP(WHERE);
598: /*
599: &Swap to EMS Memory:&
600:
601: If this option is set to &Yes&, and the &Allow Swapping& option is set to
602: &Yes& Synchronet will use EMS memory (when available) for swapping out
603: of memory.
604: */
605: i=ulist(WIN_MID|WIN_SAV,0,10,0,&i,0
606: ,"Swap to EMS Memory",opt);
607: if(i==1 && node_swap&SWAP_EMS) {
608: node_swap&=~SWAP_EMS;
609: changes=1; }
610: else if(i==0 && !(node_swap&SWAP_EMS)) {
611: node_swap|=SWAP_EMS;
612: changes=1; }
613: break;
614: case 7:
615: i=0;
616: strcpy(opt[0],"Yes");
617: strcpy(opt[1],"No");
618: opt[2][0]=0;
619: savnum=1;
620: SETHELP(WHERE);
621: /*
622: &Swap to XMS Memory:&
623:
624: If this option is set to &Yes&, and the &Allow Swapping& option is set to
625: &Yes& Synchronet will use XMS memory (when available) for swapping out
626: of memory.
627: */
628: i=ulist(WIN_MID|WIN_SAV,0,10,0,&i,0
629: ,"Swap to XMS Memory",opt);
630: if(i==1 && node_swap&SWAP_XMS) {
631: node_swap&=~SWAP_XMS;
632: changes=1; }
633: else if(i==0 && !(node_swap&SWAP_XMS)) {
634: node_swap|=SWAP_XMS;
635: changes=1; }
636: break;
637: case 8:
638: i=0;
639: strcpy(opt[0],"Yes");
640: strcpy(opt[1],"No");
641: opt[2][0]=0;
642: savnum=1;
643: SETHELP(WHERE);
644: /*
645: &Swap to Extended Memory:&
646:
647: If this option is set to &Yes&, and the &Allow Swapping& option is set to
648: &Yes& Synchronet will use non-XMS Extended memory (when available) for
649: swapping out of memory.
650:
651: If you are running under a DOS multitasker (e.g. Windows, DESQview, or
652: OS/2) set this option to &No&.
653: */
654: i=ulist(WIN_MID|WIN_SAV,0,10,0,&i,0
655: ,"Swap to Extended Memory",opt);
656: if(i==1 && node_swap&SWAP_EXT) {
657: node_swap&=~SWAP_EXT;
658: changes=1; }
659: else if(i==0 && !(node_swap&SWAP_EXT)) {
660: node_swap|=SWAP_EXT;
661: changes=1; }
662: break;
663: case 9:
664: i=0;
665: strcpy(opt[0],"Yes");
666: strcpy(opt[1],"No");
667: opt[2][0]=0;
668: savnum=1;
669: SETHELP(WHERE);
670: /*
671: &Windows/OS2 Time Slice API:&
672:
673: If you wish to have Synchronet specifically use the Windows and OS/2
674: API call to surrender time slices when in a low priority task, set this
675: option to &Yes&. If setting this option to &Yes& causes erratic pauses
676: or performance problems, leave the option on &No&. This type of behavior
677: has been witnessed under &Windows& 3.1 when using this API call.
678:
679: If running in an &OS/2& DOS session, you will most likely want this
680: option set to &Yes& for the best aggregate performance for your system.
681: */
682: i=ulist(WIN_MID|WIN_SAV,0,10,0,&i,0
683: ,"Use Windows/OS2 Time Slice API",opt);
684: if(i==0 && !(node_misc&NM_WINOS2)) {
685: node_misc|=NM_WINOS2;
686: changes=1; }
687: else if(i==1 && (node_misc&NM_WINOS2)) {
688: node_misc&=~NM_WINOS2;
689: changes=1; }
690: break;
691: case 10:
692: i=0;
693: strcpy(opt[0],"Yes");
694: strcpy(opt[1],"No");
695: opt[2][0]=0;
696: savnum=1;
697: SETHELP(WHERE);
698: /*
699: &DESQview Time Slice API:&
700:
701: If this option is set to &Yes&, and this node is run under &DESQview&,
702: Synchronet will use the DESQview Time Slice API calls for intelligent
703: variable time slicing.
704:
705: Since Synchronet automatically detects DESQview, there is no harm in
706: having this option set to &Yes& if you are not running DESQview. Only set
707: this option to &No&, if you wish to disable the DESQview API for some
708: reason.
709: */
710: i=ulist(WIN_MID|WIN_SAV,0,10,0,&i,0
711: ,"DESQview Time Slice API",opt);
712: if(i==0 && node_misc&NM_NODV) {
713: node_misc&=~NM_NODV;
714: changes=1; }
715: else if(i==1 && !(node_misc&NM_NODV)) {
716: node_misc|=NM_NODV;
717: changes=1; }
718: break;
719: case 11:
720: i=0;
721: strcpy(opt[0],"Yes");
722: strcpy(opt[1],"No");
723: opt[2][0]=0;
724: savnum=1;
725: SETHELP(WHERE);
726: /*
727: &DOS Idle Interrupts:&
728:
729: If you want Synchronet to make DOS Idle Interrupts when waiting for user
730: input or in other low priority loops, set this option to &Yes&.
731:
732: For best aggregate multinode performance under multitaskers, you should
733: set this option to &Yes&.
734:
735: For best single node performance under multitaskers, you should set this
736: option to &No&.
737: */
738: i=ulist(WIN_MID|WIN_SAV,0,10,0,&i,0
739: ,"DOS Idle Interrupts",opt);
740: if(i==0 && !(node_misc&NM_INT28)) {
741: node_misc|=NM_INT28;
742: changes=1; }
743: else if(i==1 && (node_misc&NM_INT28)) {
744: node_misc&=~NM_INT28;
745: changes=1; }
746: break;
747: case 12:
748: i=1;
749: strcpy(opt[0],"Yes");
750: strcpy(opt[1],"No");
751: opt[2][0]=0;
752: savnum=1;
753: SETHELP(WHERE);
754: /*
755: &Low Priority String Input:&
756:
757: Normally, Synchronet will not give up time slices (under a multitasker)
758: when users are prompted for a string of characters. This is considered
759: a high priority task.
760:
761: Setting this option to &Yes& will force Synchronet to give up time slices
762: during string input, possibly causing jerky keyboard input from the
763: user, but improving aggregate system performance under multitaskers.
764: */
765: i=ulist(WIN_MID|WIN_SAV,0,10,0,&i,0
766: ,"Low Priority String Input",opt);
767: if(i==0 && !(node_misc&NM_LOWPRIO)) {
768: node_misc|=NM_LOWPRIO;
769: changes=1; }
770: else if(i==1 && (node_misc&NM_LOWPRIO)) {
771: node_misc&=~NM_LOWPRIO;
772: changes=1; }
773: break;
774: case 13:
775: i=0;
776: strcpy(opt[0],"Yes");
777: strcpy(opt[1],"No");
778: opt[2][0]=0;
779: savnum=1;
780: SETHELP(WHERE);
781: /*
782: &Allow Logon by Number:&
783:
784: If you want users to be able logon using their user number at the &NN:&
785: set this option to &Yes&.
786: */
787: i=ulist(WIN_MID|WIN_SAV,0,10,0,&i,0
788: ,"Allow Logon by Number",opt);
789: if(i==0 && node_misc&NM_NO_NUM) {
790: node_misc&=~NM_NO_NUM;
791: changes=1; }
792: else if(i==1 && !(node_misc&NM_NO_NUM)) {
793: node_misc|=NM_NO_NUM;
794: changes=1; }
795: break;
796: case 14:
797: i=1;
798: strcpy(opt[0],"Yes");
799: strcpy(opt[1],"No");
800: opt[2][0]=0;
801: savnum=1;
802: SETHELP(WHERE);
803: /*
804: &Allow Logon by Real Name:&
805:
806: If you want users to be able logon using their real name as well as
807: their alias, set this option to &Yes&.
808: */
809: i=ulist(WIN_MID|WIN_SAV,0,10,0,&i,0
810: ,"Allow Logon by Real Name",opt);
811: if(i==0 && !(node_misc&NM_LOGON_R)) {
812: node_misc|=NM_LOGON_R;
813: changes=1; }
814: else if(i==1 && (node_misc&NM_LOGON_R)) {
815: node_misc&=~NM_LOGON_R;
816: changes=1; }
817: break;
818: case 15:
819: i=1;
820: strcpy(opt[0],"Yes");
821: strcpy(opt[1],"No");
822: opt[2][0]=0;
823: savnum=1;
824: SETHELP(WHERE);
825: /*
826: &Always Prompt for Password:&
827:
828: If you want to have attempted logons using an unknown user name still
829: prompt for a password, set this option to &Yes&.
830: */
831: i=ulist(WIN_MID|WIN_SAV,0,10,0,&i,0
832: ,"Always Prompt for Password",opt);
833: if(i==0 && !(node_misc&NM_LOGON_P)) {
834: node_misc|=NM_LOGON_P;
835: changes=1; }
836: else if(i==1 && (node_misc&NM_LOGON_P)) {
837: node_misc&=~NM_LOGON_P;
838: changes=1; }
839: break;
840: case 16:
841: i=1;
842: strcpy(opt[0],"Yes");
843: strcpy(opt[1],"No");
844: opt[2][0]=0;
845: savnum=1;
846: SETHELP(WHERE);
847: /*
848: &Disable Local Inactivity Warning/Logoff:&
849:
850: Setting this option to &Yes& will disable the user inactivity warning
851: and automatic logoff for local logons.
852: */
853: i=ulist(WIN_MID|WIN_SAV,0,10,0,&i,0
854: ,"Disable Local Inactivity",opt);
855: if(i==0 && !(node_misc&NM_NO_INACT)) {
856: node_misc|=NM_NO_INACT;
857: changes=1; }
858: else if(i==1 && (node_misc&NM_NO_INACT)) {
859: node_misc&=~NM_NO_INACT;
860: changes=1; }
861: break;
862: case 17:
863: i=1;
864: strcpy(opt[0],"Yes");
865: strcpy(opt[1],"No");
866: opt[2][0]=0;
867: savnum=1;
868: SETHELP(WHERE);
869: /*
870: &Disable Local Keyboard (Entirely):&
871:
872: Setting this option to &Yes& will disable the local keyboard when the
873: BBS is running. Use this option only for the absolute highest degree
874: of local system security. If this option is set to &Yes&, the BBS cannot
875: be exited until the node is downed from another process or the machine
876: is rebooted.
877: */
878: i=ulist(WIN_MID|WIN_SAV,0,10,0,&i,0
879: ,"Disable Local Keyboard (Entirely)",opt);
880: if(i==0 && !(node_misc&NM_NO_LKBRD)) {
881: node_misc|=NM_NO_LKBRD;
882: changes=1; }
883: else if(i==1 && (node_misc&NM_NO_LKBRD)) {
884: node_misc&=~NM_NO_LKBRD;
885: changes=1; }
886: break;
887: case 18:
888: i=1;
889: strcpy(opt[0],"Yes");
890: strcpy(opt[1],"No");
891: opt[2][0]=0;
892: savnum=1;
893: SETHELP(WHERE);
894: /*
895: &Local System Protection:&
896:
897: When this option is set to &Yes&, all local system functions from the
898: Waiting for Call screen and Alt-Key combinations will require the user
899: to enter the system password.
900: */
901: i=ulist(WIN_MID|WIN_SAV,0,10,0,&i,0
902: ,"Local System Protection (Password)",opt);
903: if(i==0 && !(node_misc&NM_SYSPW)) {
904: node_misc|=NM_SYSPW;
905: changes=1; }
906: else if(i==1 && (node_misc&NM_SYSPW)) {
907: node_misc&=~NM_SYSPW;
908: changes=1; }
909: break;
910: case 19:
911: i=0;
912: strcpy(opt[0],"Yes");
913: strcpy(opt[1],"No");
914: opt[2][0]=0;
915: savnum=1;
916: SETHELP(WHERE);
917: /*
918: &Beep Locally:&
919:
920: If you want the local speaker to be disabled for online beeps, set this
921: option to &No&.
922: */
923: i=ulist(WIN_MID|WIN_SAV,0,10,0,&i,0
924: ,"Beep Locally",opt);
925: if(i==1 && !(node_misc&NM_NOBEEP)) {
926: node_misc|=NM_NOBEEP;
927: changes=1; }
928: else if(i==0 && (node_misc&NM_NOBEEP)) {
929: node_misc&=~NM_NOBEEP;
930: changes=1; }
931: break;
932: case 20:
933: i=0;
934: strcpy(opt[0],"Yes");
935: strcpy(opt[1],"No");
936: opt[2][0]=0;
937: savnum=1;
938: SETHELP(WHERE);
939: /*
940: &Allow 8-bit Remote Input During Logon:&
941:
942: If you wish to allow E-7-1 terminals to use this node, you must set this
943: option to &No&. This will also eliminate the ability of 8-bit remote users
944: to send IBM extended ASCII characters during the logon sequence.
945: */
946: i=ulist(WIN_MID|WIN_SAV,0,10,0,&i,0
947: ,"Allow 8-bit Remote Input During Logon",opt);
948: if(i==1 && !(node_misc&NM_7BITONLY)) {
949: node_misc|=NM_7BITONLY;
950: changes=1; }
951: else if(i==0 && (node_misc&NM_7BITONLY)) {
952: node_misc&=~NM_7BITONLY;
953: changes=1; }
954: break;
955: case 21:
956: i=0;
957: strcpy(opt[0],"Yes");
958: strcpy(opt[1],"No");
959: opt[2][0]=0;
960: savnum=1;
961: SETHELP(WHERE);
962: /*
963: &Reset Video Mode Between Calls:&
964:
965: If you wish to have SBBS reset the video mode between calls, set this
966: option to &Yes&. This is to reverse the effects of some external programs
967: that change the video mode without permission.
968: */
969: i=ulist(WIN_MID|WIN_SAV,0,10,0,&i,0
970: ,"Reset Video Mode Beteween Calls",opt);
971: if(i==0 && !(node_misc&NM_RESETVID)) {
972: node_misc|=NM_RESETVID;
973: changes=1; }
974: else if(i==1 && (node_misc&NM_RESETVID)) {
975: node_misc&=~NM_RESETVID;
976: changes=1; }
977: break;
978: } }
979: break;
980: case 9:
981: done=0;
982: while(!done) {
983: i=0;
984: sprintf(opt[i++],"%-27.27s%s","Validation User"
985: ,node_valuser ? itoa(node_valuser,tmp,10) : "Nobody");
986: sprintf(opt[i++],"%-27.27s%s","Screen Length"
987: ,node_scrnlen ? itoa(node_scrnlen,tmp,10)
988: : "Auto-Detect");
989: sprintf(opt[i++],"%-27.27s%s","Screen Blanker"
990: ,node_scrnblank ? itoa(node_scrnblank,tmp,10)
991: : "Disabled");
992: sprintf(opt[i++],"%-27.27s%u seconds","Semaphore Frequency"
993: ,node_sem_check);
994: sprintf(opt[i++],"%-27.27s%u seconds","Statistics Frequency"
995: ,node_stat_check);
996: sprintf(opt[i++],"%-27.27s%u seconds","Inactivity Warning"
997: ,sec_warn);
998: sprintf(opt[i++],"%-27.27s%u seconds","Inactivity Disconnection"
999: ,sec_hangup);
1000: sprintf(tmp,"$%d.00",node_dollars_per_call);
1001: sprintf(opt[i++],"%-27.27s%s","Cost Per Call",tmp);
1002: sprintf(opt[i++],"%-27.27s%.40s","Daily Event",node_daily);
1003: sprintf(opt[i++],"%-27.27s%.40s","Control Directory",ctrl_dir);
1004: sprintf(opt[i++],"%-27.27s%.40s","Text Directory",text_dir);
1005: sprintf(opt[i++],"%-27.27s%.40s","Temporary Directory"
1006: ,temp_dir);
1007: sprintf(opt[i++],"%-27.27s%.40s","Swap Directory"
1008: ,node_swapdir);
1009: opt[i][0]=0;
1010: savnum=0;
1011: SETHELP(WHERE);
1012: /*
1013: &Node Advanced Options:&
1014:
1015: This is the advanced options menu for the selected node. The available
1016: options are of an advanced nature and should not be modified unless you
1017: are sure of the consequences and necessary preparation.
1018: */
1019: switch(ulist(WIN_T2B|WIN_RHT|WIN_ACT|WIN_SAV,2,0,60,&adv_dflt,0
1020: ,"Advanced Options",opt)) {
1021: case -1:
1022: done=1;
1023: break;
1024: case 0:
1025: itoa(node_valuser,str,10);
1026: SETHELP(WHERE);
1027: /*
1028: &Validation User Number:&
1029:
1030: When a caller logs onto the system as &New&, he or she must send
1031: validation feedback to the sysop. This feature can be disabled by
1032: setting this value to &0&, allowing new users to logon without sending
1033: validation feedback. If you want new users on this node to be forced to
1034: send validation feedback, set this value to the number of the user to
1035: whom the feedback is sent. The normal value of this option is &1& for
1036: user number one.
1037: */
1038: uinput(WIN_MID,0,13,"Validation User Number (0=Nobody)"
1039: ,str,4,K_NUMBER|K_EDIT);
1040: node_valuser=atoi(str);
1041: break;
1042: case 1:
1043: itoa(node_scrnlen,str,10);
1044: SETHELP(WHERE);
1045: /*
1046: &Screen Length:&
1047:
1048: Synchronet automatically senses the number of lines on your display and
1049: uses all of them. If for some reason you want to override the detected
1050: screen length, set this value to the number of lines (rows) you want
1051: Synchronet to use.
1052: */
1053: uinput(WIN_MID,0,14,"Screen Length (0=Auto-Detect)"
1054: ,str,2,K_NUMBER|K_EDIT);
1055: node_scrnlen=atoi(str);
1056: break;
1057: case 2:
1058: itoa(node_scrnblank,str,10);
1059: SETHELP(WHERE);
1060: /*
1061: &Screen Blanker:&
1062:
1063: This option allows you to have this node blank its Waiting for Call
1064: screen after this number of minutes of inactivity. Setting this option
1065: to &0& disables the screen blanker.
1066: */
1067: uinput(WIN_MID|WIN_SAV,0,14
1068: ,"Minutes Inactive Before Blanking Screen "
1069: "(0=Disabled)"
1070: ,str,2,K_NUMBER|K_EDIT);
1071: node_scrnblank=atoi(str);
1072: break;
1073: case 3:
1074: itoa(node_sem_check,str,10);
1075: SETHELP(WHERE);
1076: /*
1077: &Semaphore Check Frequency While Waiting for Call (in seconds):&
1078:
1079: This is the number of seconds between semaphore checks while this node
1080: is waiting for a caller. Default is &60& seconds.
1081: */
1082: uinput(WIN_MID|WIN_SAV,0,14
1083: ,"Seconds Between Semaphore Checks"
1084: ,str,3,K_NUMBER|K_EDIT);
1085: node_sem_check=atoi(str);
1086: break;
1087: case 4:
1088: itoa(node_stat_check,str,10);
1089: SETHELP(WHERE);
1090: /*
1091: &Statistics Check Frequency While Waiting for Call (in seconds):&
1092:
1093: This is the number of seconds between static checks while this node
1094: is waiting for a caller. Default is &10& seconds.
1095: */
1096: uinput(WIN_MID|WIN_SAV,0,14
1097: ,"Seconds Between Statistic Checks"
1098: ,str,3,K_NUMBER|K_EDIT);
1099: node_stat_check=atoi(str);
1100: break;
1101: case 5:
1102: itoa(sec_warn,str,10);
1103: SETHELP(WHERE);
1104: /*
1105: &Seconds Before Inactivity Warning:&
1106:
1107: This is the number of seconds the user must be inactive before a
1108: warning will be given. Default is &180& seconds.
1109: */
1110: uinput(WIN_MID|WIN_SAV,0,14
1111: ,"Seconds Before Inactivity Warning"
1112: ,str,4,K_NUMBER|K_EDIT);
1113: sec_warn=atoi(str);
1114: break;
1115: case 6:
1116: itoa(sec_hangup,str,10);
1117: SETHELP(WHERE);
1118: /*
1119: &Seconds Before Inactivity Disconnection:&
1120:
1121: This is the number of seconds the user must be inactive before they
1122: will be automatically disconnected. Default is &300& seconds.
1123: */
1124: uinput(WIN_MID|WIN_SAV,0,14
1125: ,"Seconds Before Inactivity Disconnection"
1126: ,str,4,K_NUMBER|K_EDIT);
1127: sec_hangup=atoi(str);
1128: break;
1129: case 7:
1130: itoa(node_dollars_per_call,str,10);
1131: SETHELP(WHERE);
1132: /*
1133: &Billing Node Cost Per Call:&
1134:
1135: If you have an automated billing phone number (usually area code 900
1136: or prefix 976) and you wish to use this node as an automated billing
1137: node, set this value to the dollar amount that is billed for the first
1138: minute. Subsequent minutes should be charged the minimum amount as the
1139: maximum connect time for a billing node is 90 seconds.
1140:
1141: If this feature is used, when a caller connects to the node, he or she
1142: will be notified of the eminent charge amount if they do not drop
1143: carrier within the allotted free period. If the caller is still
1144: connected after 30 seconds, he or she will be prompted to enter a valid
1145: user name or number. After a valid user name or number has been entered,
1146: the caller is disconnected and the entered user is immediately given the
1147: purchased credits based on this dollar amount multiplied by the
1148: &Credits per Dollar& system option.
1149: */
1150: uinput(WIN_MID,0,0,"Billing Node Cost Per Call "
1151: "(in dollars)",str,2,K_NUMBER|K_EDIT);
1152: node_dollars_per_call=atoi(str);
1153: break;
1154: case 8:
1155: SETHELP(WHERE);
1156: /*
1157: &Daily Event:&
1158:
1159: If you have an event that this node should run every day, enter the
1160: command line for that event here.
1161:
1162: An event can be any valid DOS command line. If multiple programs or
1163: commands are required, use a batch file.
1164:
1165: Remember: The &%!& command line specifier is an abreviation for your
1166: configured &EXEC& directory path.
1167: */
1168: uinput(WIN_MID|WIN_SAV,0,10,"Daily Event"
1169: ,node_daily,50,K_EDIT);
1170: break;
1171: case 9:
1172: strcpy(str,ctrl_dir);
1173: if(strstr(str,"\\CTRL\\")!=NULL)
1174: *strstr(str,"\\CTRL\\")=0;
1175: SETHELP(WHERE);
1176: /*
1177: &Control Directory Parent:&
1178:
1179: Your control directory contains important configuration and data files
1180: that &ALL& nodes share. This directory &MUST NOT& be located on a RAM disk
1181: or other volatile media.
1182:
1183: This option allows you to change the parent of your control directory.
1184: The &\CTRL\& suffix (sub-directory) cannot be changed or removed.
1185: */
1186: if(uinput(WIN_MID|WIN_SAV,0,9,"Control Dir Parent"
1187: ,str,50,K_EDIT|K_UPPER)>0) {
1188: if(str[strlen(str)-1]!='\\')
1189: strcat(str,"\\");
1190: strcat(str,"CTRL\\");
1191: strcpy(ctrl_dir,str); }
1192: break;
1193: case 10:
1194: strcpy(str,text_dir);
1195: if(strstr(str,"\\TEXT\\")!=NULL)
1196: *strstr(str,"\\TEXT\\")=0;
1197: SETHELP(WHERE);
1198: /*
1199: &Text Directory Parent:&
1200:
1201: Your text directory contains &read-only& text files. Synchronet never
1202: &writes& to any files in this directory so it &CAN& be placed on a RAM
1203: disk or other volatile media. This directory contains the system's menus
1204: and other important text files, so be sure the files and directories are
1205: moved to this directory if you decide to change it.
1206:
1207: This option allows you to change the parent of your control directory.
1208: The &\TEXT\& suffix (sub-directory) cannot be changed or removed.
1209: */
1210: if(uinput(WIN_MID|WIN_SAV,0,10,"Text Dir Parent"
1211: ,str,50,K_EDIT|K_UPPER)>0) {
1212: if(str[strlen(str)-1]!='\\')
1213: strcat(str,"\\");
1214: strcat(str,"TEXT\\");
1215: strcpy(text_dir,str); }
1216: break;
1217: case 11:
1218: strcpy(str,temp_dir);
1219: SETHELP(WHERE);
1220: /*
1221: &Temp Directory:&
1222:
1223: Your temp directory is where Synchronet stores files of a temporary
1224: nature for this node. Each node &MUST& have its own &unique& temp directory.
1225: This directory &can& exist on a RAM disk or other volatile media. For
1226: the best batch upload performance, it should be located on the &same&
1227: drive as the majority of your &upload& directories.
1228: */
1229: uinput(WIN_MID|WIN_SAV,0,10,"Temp Directory"
1230: ,str,50,K_EDIT|K_UPPER);
1231: if(!strlen(str))
1232: umsg("Temp directory cannot be blank");
1233: else
1234: strcpy(temp_dir,str);
1235: break;
1236: case 12:
1237: strcpy(str,node_swapdir);
1238: SETHELP(WHERE);
1239: /*
1240: &Swap Directory:&
1241:
1242: Your swap directory is where Synchronet will swap out to if you have
1243: swapping enabled, and it is necessary to swap to disk. The default is
1244: the node directory. If you do specify a swap directory, it must not
1245: be a relative path (i.e. "..\etc"). Specify the entire path and include
1246: the drive letter specification (i.e. "D:\SBBS\SWAP").
1247: */
1248: uinput(WIN_MID|WIN_SAV,0,10,"Swap Directory"
1249: ,str,50,K_EDIT|K_UPPER);
1250: if(str[0] && strcmp(str,".") && strcmp(str,".\\")
1251: && (strstr(str,"..") || str[1]!=':'
1252: || str[2]!='\\'))
1253: umsg("Must specify full path");
1254: else
1255: strcpy(node_swapdir,str);
1256: break; } }
1257: break;
1258: case 11:
1259: SETHELP(WHERE);
1260: /*
1261: &Wait for Call Number Key Commands:&
1262:
1263: Each of the number keys (0 through 9) can be assigned a command to
1264: execute when entered at the wait for call screen. This is a list of
1265: those keys and the assigned commands. Since Synchronet is still in
1266: memory when these command are executed, the number keys should be used
1267: for small program execution or command lines with small memory
1268: requirements.
1269:
1270: If you have a program or command line with large memory requirements,
1271: use a &Wait for Call Function Key Command&.
1272: */
1273: j=0;
1274: while(1) {
1275: for(i=0;i<10;i++)
1276: sprintf(opt[i],"%d %s",i,wfc_cmd[i]);
1277: opt[i][0]=0;
1278: savnum=0;
1279:
1280: i=ulist(WIN_T2B|WIN_RHT|WIN_ACT|WIN_SAV,2,0,50,&j,0
1281: ,"Number Key Commands",opt);
1282: if(i==-1)
1283: break;
1284: sprintf(str,"%d Key Command Line",i);
1285: uinput(WIN_MID|WIN_SAV,0,0,str,wfc_cmd[i],50,K_EDIT); }
1286: break;
1287: case 12:
1288: SETHELP(WHERE);
1289: /*
1290: &Wait for Call Function Key Commands:&
1291:
1292: Each of the function keys (F1 through F12) can be assigned a command to
1293: execute when entered at the wait for call screen. This is a list of
1294: those keys and the currently assigned commands. Synchronet will shrink
1295: to 16K of RAM before executing one of these command lines.
1296:
1297: If you have a command line with small memory requirements, you should
1298: probably use a &Wait for Call Number Key Command& for faster execution.
1299: */
1300: j=0;
1301: while(1) {
1302: for(i=0;i<12;i++)
1303: sprintf(opt[i],"F%-2d %s",i+1,wfc_scmd[i]);
1304: opt[i][0]=0;
1305: savnum=0;
1306: i=ulist(WIN_T2B|WIN_RHT|WIN_ACT|WIN_SAV,2,0,50,&j,0
1307: ,"Function Key (Shrinking) Commands",opt);
1308: if(i==-1)
1309: break;
1310: sprintf(str,"F%d Key Command Line",i+1);
1311: uinput(WIN_MID|WIN_SAV,0,0,str,wfc_scmd[i],50,K_EDIT); }
1312: break;
1313: case 10:
1314: done=0;
1315: while(!done) {
1316: i=0;
1317: sprintf(opt[i++],"%-27.27s%s","COM Port"
1318: ,com_port ? itoa(com_port,tmp,10) : "Disabled");
1319: sprintf(opt[i++],"%-27.27s%u"
1320: ,com_base && com_base<0x100 ? "COM Channel"
1321: :"UART IRQ Line"
1322: ,com_irq);
1323: if(com_base==0xd)
1324: strcpy(str,"DigiBoard");
1325: else if(com_base==0xf)
1326: strcpy(str,"FOSSIL");
1327: else if(com_base==0xb)
1328: strcpy(str,"PC BIOS");
1329: else if(com_base==0xe)
1330: strcpy(str,"PS/2 BIOS");
1331: else
1332: sprintf(str,"%Xh",com_base);
1333: sprintf(opt[i++],"%-27.27s%s"
1334: ,com_base<0x100 ? "COM Type":"UART I/O Address",str);
1335: sprintf(opt[i++],"%-27.27s%lu","DTE Rate",com_rate);
1336: sprintf(opt[i++],"%-27.27s%s","Fixed DTE Rate"
1337: ,mdm_misc&MDM_STAYHIGH ? "Yes" : "No");
1338: if(!(mdm_misc&(MDM_RTS|MDM_CTS)))
1339: strcpy(str,"None");
1340: else {
1341: if(mdm_misc&MDM_CTS) {
1342: strcpy(str,"CTS");
1343: if(mdm_misc&MDM_RTS)
1344: strcat(str,"/"); }
1345: else str[0]=0;
1346: if(mdm_misc&MDM_RTS)
1347: strcat(str,"RTS"); }
1348: sprintf(opt[i++],"%-27.27s%s","Hardware Flow Control",str);
1349: sprintf(opt[i++],"%-27.27s%u ring%c","Answer After"
1350: ,mdm_rings,mdm_rings>1 ? 's':' ');
1351: sprintf(opt[i++],"%-27.27s%u second%c","Answer Delay"
1352: ,mdm_ansdelay,mdm_ansdelay>1 ? 's':' ');
1353: sprintf(opt[i++],"%-27.27s%s","Reinitialization Timer"
1354: ,mdm_reinit ? itoa(mdm_reinit,tmp,10) : "Disabled");
1355: strcpy(opt[i++],"Result Codes...");
1356: strcpy(opt[i++],"Toggle Options...");
1357: strcpy(opt[i++],"Control Strings...");
1358: strcpy(opt[i++],"Auto-Configuration...");
1359: strcpy(opt[i++],"Import Configuration...");
1360: strcpy(opt[i++],"Export Configuration...");
1361: opt[i][0]=0;
1362: savnum=0;
1363: SETHELP(WHERE);
1364: /*
1365: &Modem Configuration Menu:&
1366:
1367: This menu contains the configuration options for this node's modem.
1368: If you do not have a modem attached to this node or do not want to use
1369: an attached modem, you can disable the Synchronet modem communications
1370: by setting the &COM Port& to &0&.
1371:
1372: If your modem is listed in the &Auto-Configuration&, you should probably
1373: just set the &COM Port& and run the auto-configuration for your modem
1374: type.
1375: */
1376: switch(ulist(WIN_T2B|WIN_RHT|WIN_ACT|WIN_SAV,2,0,44,&mdm_dflt,0
1377: ,"Modem Configuration",opt)) {
1378: case -1:
1379: done=1;
1380: break;
1381: case 0:
1382: itoa(com_port,str,10);
1383: SETHELP(WHERE);
1384: /*
1385: &COM Port:&
1386:
1387: This is the serial communications port that the modem for this node is
1388: connected to. If you do not have a modem connected to this node, or
1389: do not wish to use a connected modem, you can disable the Synchronet
1390: modem communications by setting this value to &0&.
1391: */
1392: if(uinput(WIN_MID|WIN_SAV,0,10,"COM Port (0=Disabled)"
1393: ,str,2,K_EDIT|K_NUMBER)==-1)
1394: break;
1395: com_port=atoi(str);
1396: if(!com_port)
1397: break;
1398: savnum=1;
1399: com_type();
1400: break;
1401: case 1:
1402: itoa(com_irq,str,10);
1403: SETHELP(WHERE);
1404: /*
1405: &UART IRQ Line or Channel Number:&
1406:
1407: If you are using a standard UART serial interface for this COM port,
1408: this is the IRQ line that your COM Port's UART is using. If you have
1409: configured your COM Port and selected the default IRQ and I/O address,
1410: you should not need to change the value of this option.
1411:
1412: If this COM port is accessed via Int 14h, this is the channel number
1413: for this COM port (normally, the COM port number minus one).
1414: */
1415: uinput(WIN_MID|WIN_SAV,0,10
1416: ,com_base && com_base<0x100 ? "Channel"
1417: : "UART IRQ Line"
1418: ,str,2,K_EDIT|K_NUMBER);
1419: com_irq=atoi(str);
1420: break;
1421: case 2:
1422: savnum=1;
1423: if(com_type() || com_base<0x100)
1424: break;
1425: SETHELP(WHERE);
1426: /*
1427: &UART I/O Address in Hex:&
1428:
1429: This is the base I/O address of your COM Port's UART. If you have
1430: configured your COM Port and selected the default IRQ and I/O address,
1431: you should not need to change the value of this option. If this node's
1432: COM Port's UART is using a non-standard I/O address, enter that address
1433: (in hexadecimal) using this option.
1434: */
1435: itoa(com_base,str,16);
1436: strupr(str);
1437: uinput(WIN_MID|WIN_SAV,0,10
1438: ,"UART I/O Address in Hex"
1439: ,str,4,K_EDIT|K_UPPER);
1440: com_base=ahtoul(str);
1441: break;
1442: case 3:
1443: savnum=1;
1444: SETHELP(WHERE);
1445: /*
1446: &UART (DTE) Rate:&
1447:
1448: This is the data transfer rate between your COM Port's UART (Data
1449: Terminal Equipment) and your modem. This is &NOT& the connect rate of
1450: your modem (Data Communications Equipment). Most high-speed (9600bps+)
1451: modems use a fixed DTE rate that is higher than the highest DCE rate to
1452: allow for data compression and error correction. This value should be
1453: set to the highest DTE rate your modem supports. If you have a 1200 or
1454: 2400bps modem without data compression capabilities, this value should
1455: be set to 1200 or 2400 respectively. If you have a high-speed modem,
1456: refer to the modem's manual to find the highest supported DTE rate.
1457: */
1458: i=0;
1459: strcpy(opt[i++],"300");
1460: strcpy(opt[i++],"1200");
1461: strcpy(opt[i++],"2400");
1462: strcpy(opt[i++],"4800");
1463: strcpy(opt[i++],"9600");
1464: strcpy(opt[i++],"19200");
1465: strcpy(opt[i++],"38400");
1466: strcpy(opt[i++],"57600");
1467: strcpy(opt[i++],"115200");
1468: opt[i][0]=0;
1469: switch(com_rate) {
1470: default:
1471: i=0;
1472: break;
1473: case 1200:
1474: i=1;
1475: break;
1476: case 2400:
1477: i=2;
1478: break;
1479: case 4800:
1480: i=3;
1481: break;
1482: case 9600:
1483: i=4;
1484: break;
1485: case 19200:
1486: i=5;
1487: break;
1488: case 38400:
1489: i=6;
1490: break;
1491: case 57600:
1492: i=7;
1493: break;
1494: case 115200L:
1495: i=8;
1496: break; }
1497: i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0,"UART (DTE) Rate"
1498: ,opt);
1499: if(i==-1)
1500: break;
1501: changes=1;
1502: switch(i) {
1503: default:
1504: com_rate=300;
1505: break;
1506: case 1:
1507: com_rate=1200;
1508: break;
1509: case 2:
1510: com_rate=2400;
1511: break;
1512: case 3:
1513: com_rate=4800;
1514: break;
1515: case 4:
1516: com_rate=9600;
1517: break;
1518: case 5:
1519: com_rate=19200;
1520: break;
1521: case 6:
1522: com_rate=38400;
1523: break;
1524: case 7:
1525: com_rate=57600;
1526: break;
1527: case 8:
1528: com_rate=115200L;
1529: break; }
1530: break;
1531: case 4:
1532: i=1;
1533: savnum=1;
1534: strcpy(opt[0],"Yes");
1535: strcpy(opt[1],"No");
1536: opt[2][0]=0;
1537: SETHELP(WHERE);
1538: /*
1539: &Use Fixed DTE Rate:&
1540:
1541: If this node is using a modem with error correction or data compression
1542: capabilities, set this option to &Yes&. If you are using a 2400bps or
1543: slower modem, it is most likely this value should be set to &No&.
1544: */
1545: i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0,"Use Fixed "
1546: "DTE Rate",opt);
1547: if(i==0 && !(mdm_misc&MDM_STAYHIGH)) {
1548: mdm_misc|=MDM_STAYHIGH;
1549: changes=1; }
1550: else if(i==1 && mdm_misc&MDM_STAYHIGH) {
1551: mdm_misc&=~MDM_STAYHIGH;
1552: changes=1; }
1553: break;
1554: case 5:
1555: i=1;
1556: savnum=1;
1557: strcpy(opt[0],"Both");
1558: strcpy(opt[1],"CTS Only");
1559: strcpy(opt[2],"RTS Only");
1560: strcpy(opt[3],"None");
1561: opt[4][0]=0;
1562: i=0;
1563: SETHELP(WHERE);
1564: /*
1565: &Hardware Flow Control (CTS/RTS):&
1566:
1567: If your modem supports the use of hardware flow control via CTS/RTS
1568: (Clear to Send/Request to Send), set this option to &Both&. If are using
1569: a high-speed modem or a modem with data compression or error correction
1570: capabilities, it is most likely this option should be set to &Both&. If
1571: you are using a 2400bps or slower modem without data compression or
1572: error correction capabilities, set this option to &None&.
1573: */
1574: i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0,"Hardware "
1575: "Flow Control (CTS/RTS)",opt);
1576: if(i==0
1577: && (mdm_misc&(MDM_CTS|MDM_RTS))
1578: !=(MDM_CTS|MDM_RTS)) {
1579: mdm_misc|=(MDM_CTS|MDM_RTS);
1580: changes=1; }
1581: else if(i==1
1582: && (mdm_misc&(MDM_CTS|MDM_RTS))!=MDM_CTS) {
1583: mdm_misc|=MDM_CTS;
1584: mdm_misc&=~MDM_RTS;
1585: changes=1; }
1586: else if(i==2
1587: && (mdm_misc&(MDM_CTS|MDM_RTS))!=MDM_RTS) {
1588: mdm_misc|=MDM_RTS;
1589: mdm_misc&=~MDM_CTS;
1590: changes=1; }
1591: else if(i==3
1592: && mdm_misc&(MDM_CTS|MDM_RTS)) {
1593: mdm_misc&=~(MDM_RTS|MDM_CTS);
1594: changes=1; }
1595: break;
1596:
1597: case 6:
1598: SETHELP(WHERE);
1599: /*
1600: &Number of Rings to Answer After:&
1601:
1602: This is the number of rings to let pass before answering the phone.
1603: */
1604: itoa(mdm_rings,str,10);
1605: uinput(WIN_MID|WIN_SAV,0,0
1606: ,"Number of Rings to Answer After"
1607: ,str,2,K_EDIT|K_NUMBER);
1608: mdm_rings=atoi(str);
1609: if(!mdm_rings)
1610: mdm_rings=1;
1611: break;
1612:
1613: case 7:
1614: SETHELP(WHERE);
1615: /*
1616: &Seconds to Delay after Answer:&
1617:
1618: This is the length of time (in seconds) to delay after connection and
1619: before the terminal detection sequence is trasmitted to the remote user
1620: and the logon prompt is displayed.
1621: */
1622: itoa(mdm_ansdelay,str,10);
1623: uinput(WIN_MID|WIN_SAV,0,0
1624: ,"Answer Delay (in seconds)"
1625: ,str,4,K_EDIT|K_NUMBER);
1626: mdm_ansdelay=atoi(str);
1627: break;
1628:
1629: case 8:
1630: SETHELP(WHERE);
1631: /*
1632: &Minutes Between Reinitialization:&
1633:
1634: If you want your modem to be periodically reinitialized while waiting
1635: for a caller, set this option to the maximum number of minutes between
1636: initializations. Setting this value to &0& disables this feature.
1637: */
1638: itoa(mdm_reinit,str,10);
1639: uinput(WIN_MID|WIN_SAV,0,0
1640: ,"Minutes Between Reinitialization (0=Disabled)"
1641: ,str,4,K_EDIT|K_NUMBER);
1642: mdm_reinit=atoi(str);
1643: break;
1644: case 9:
1645: dflt=bar=0;
1646: while(1) {
1647: for(i=0;i<mdm_results;i++) {
1648: sprintf(opt[i],"%3u %5ubps %4ucps %s"
1649: ,mdm_result[i].code,mdm_result[i].rate
1650: ,mdm_result[i].cps,mdm_result[i].str); }
1651: opt[i][0]=0;
1652: i=WIN_ACT|WIN_SAV|WIN_RHT;
1653: if(mdm_results<MAX_OPTS)
1654: i|=WIN_INS;
1655: if(mdm_results>1)
1656: i|=WIN_DEL;
1657: savnum=1;
1658: SETHELP(WHERE);
1659: /*
1660: &Modem Result Codes:&
1661:
1662: This is the list of configured numeric connection result codes that this
1663: node's modem supports. If this node is getting &Invalid Result Code&
1664: errors when answer incoming calls, those result codes should be added
1665: to this list. Refer to your modem's manual for a list of supported
1666: result codes. Using the &Auto-Configuration& option automatically
1667: configures this list for you.
1668: To add a result code, hit INS .
1669:
1670: To delete a result code, select it using the arrow keys and hit DEL .
1671: */
1672: i=ulist(i,0,0,34,&dflt,&bar
1673: ,"Modem Result Codes",opt);
1674: if(i==-1)
1675: break;
1676: if((i&MSK_ON)==MSK_DEL) {
1677: i&=MSK_OFF;
1678: mdm_results--;
1679: while(i<mdm_results) {
1680: mdm_result[i]=mdm_result[i+1];
1681: i++; }
1682: changes=1;
1683: continue; }
1684: if((i&MSK_ON)==MSK_INS) {
1685: i&=MSK_OFF;
1686: if((mdm_result=(mdm_result_t *)REALLOC(
1687: mdm_result,sizeof(mdm_result_t)
1688: *(mdm_results+1)))==NULL) {
1689: errormsg(WHERE,ERR_ALLOC,nulstr
1690: ,mdm_results+1);
1691: mdm_results=0;
1692: bail(1);
1693: continue; }
1694: for(j=mdm_results;j>i;j--)
1695: mdm_result[j]=mdm_result[j-1];
1696: mdm_result[i]=mdm_result[i+1];
1697: mdm_results++;
1698: changes=1;
1699: continue; }
1700: results(dflt); }
1701: break;
1702: case 10: /* Toggle Options */
1703: dflt=0;
1704: while(1) {
1705: savnum=1;
1706: i=0;
1707: sprintf(opt[i++],"%-27.27s%s"
1708: ,"Caller Identification"
1709: ,mdm_misc&MDM_CALLERID ? "Yes" : "No");
1710: sprintf(opt[i++],"%-27.27s%s"
1711: ,"Dumb Modem Connection"
1712: ,mdm_misc&MDM_DUMB ? "Yes" : "No");
1713: sprintf(opt[i++],"%-27.27s%s"
1714: ,"Drop DTR to Hang Up"
1715: ,mdm_misc&MDM_NODTR ? "No" : "Yes");
1716: sprintf(opt[i++],"%-27.27s%s"
1717: ,"Use Verbal Result Codes"
1718: ,mdm_misc&MDM_VERBAL ? "Yes" : "No");
1719: sprintf(opt[i++],"%-27.27s%s"
1720: ,"Allow Unknown Result Codes"
1721: ,mdm_misc&MDM_KNOWNRES ? "No" : "Yes");
1722: opt[i][0]=0;
1723: i=ulist(WIN_SAV|WIN_ACT,0,0,0,&dflt,0
1724: ,"Modem Toggle Options",opt);
1725: savnum=2;
1726: if(i==-1)
1727: break;
1728: if(i==0) {
1729: i=1;
1730: strcpy(opt[0],"Yes");
1731: strcpy(opt[1],"No");
1732: opt[2][0]=0;
1733: SETHELP(WHERE);
1734: /*
1735: &Caller Identification:&
1736:
1737: If your modem supports &Caller ID& and is configured to return caller
1738: number delivery messages, set this option to &Yes&.
1739:
1740: If this option is set to &Yes&, Synchronet will log caller number delivery
1741: messages. If a caller attempts to connect with a number listed in the
1742: file TEXT\CID.CAN, they will be displayed TEXT\BADCID.MSG (if it exists)
1743: and disconnected. Each user will have their most recent caller ID number
1744: stored in their note field.
1745: */
1746: i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0
1747: ,"Caller ID",opt);
1748: if(i==0 && !(mdm_misc&MDM_CALLERID)) {
1749: mdm_misc|=MDM_CALLERID;
1750: changes=1; }
1751: else if(i==1 && mdm_misc&MDM_CALLERID) {
1752: mdm_misc&=~MDM_CALLERID;
1753: changes=1; } }
1754: else if(i==1) {
1755: i=1;
1756: strcpy(opt[0],"Yes");
1757: strcpy(opt[1],"No");
1758: opt[2][0]=0;
1759: SETHELP(WHERE);
1760: /*
1761: &Dumb Modem Connection:&
1762:
1763: If this node is connected to a serial line through a dumb modem, set
1764: this option to &Yes& to disable all modem commands and answer calls when
1765: &DCD& is raised.
1766: */
1767: i=ulist(WIN_SAV|WIN_MID,0,0,0,&i,0
1768: ,"Dumb Modem",opt);
1769: if(i==0 && !(mdm_misc&MDM_DUMB)) {
1770: mdm_misc|=MDM_DUMB;
1771: changes=1; }
1772: else if(i==1 && mdm_misc&MDM_DUMB) {
1773: mdm_misc&=~MDM_DUMB;
1774: changes=1; } }
1775: else if(i==2) {
1776: i=0;
1777: strcpy(opt[0],"Yes");
1778: strcpy(opt[1],"No");
1779: opt[2][0]=0;
1780: SETHELP(WHERE);
1781: /*
1782: &Drop DTR to Hang Up:&
1783:
1784: If you wish to have the BBS drop DTR to hang up the modem, set this
1785: option to &Yes&. If this option is set to &No&, the &Hang Up String& is sent
1786: to modem instead.
1787: */
1788: i=ulist(WIN_SAV|WIN_MID,0,0,0,&i,0
1789: ,"Drop DTR to Hang Up",opt);
1790: if(i==0 && mdm_misc&MDM_NODTR) {
1791: mdm_misc&=~MDM_NODTR;
1792: changes=1; }
1793: else if(i==1 && !(mdm_misc&MDM_NODTR)) {
1794: mdm_misc|=MDM_NODTR;
1795: changes=1; } }
1796: else if(i==3) {
1797: i=1;
1798: strcpy(opt[0],"Yes");
1799: strcpy(opt[1],"No");
1800: opt[2][0]=0;
1801: SETHELP(WHERE);
1802: /*
1803: &Use Verbal Result Codes:&
1804:
1805: If you wish to have the BBS expect &verbal& (or verbose) result codes
1806: from the modem instead of &numeric& (non-verbose) result codes, set this
1807: option to &Yes&.
1808:
1809: This option can be useful for modems that insist on returning multiple
1810: result codes upon connection (CARRIER, PROTOCOL, etc) or modems that
1811: do not report numeric result codes correctly. While this option is more
1812: flexible than numeric result codes, it may not be as accurate in
1813: describing the connection or estimating the CPS rate of the connection.
1814:
1815: If this option is set to &Yes&, the configured result code list will not
1816: be used (you may remove all entries from the list if you wish). The
1817: connection rate, description, and estimated CPS will be automatically
1818: generated by the BBS.
1819: */
1820: i=ulist(WIN_SAV|WIN_MID,0,0,0,&i,0
1821: ,"Use Verbal Result Codes",opt);
1822: if(i==0 && !(mdm_misc&MDM_VERBAL)) {
1823: mdm_misc|=MDM_VERBAL;
1824: changes=1; }
1825: else if(i==1 && mdm_misc&MDM_VERBAL) {
1826: mdm_misc&=~MDM_VERBAL;
1827: changes=1; } }
1828: else if(i==4) {
1829: i=0;
1830: strcpy(opt[0],"Yes");
1831: strcpy(opt[1],"No");
1832: opt[2][0]=0;
1833: SETHELP(WHERE);
1834: /*
1835: &Allow Unknown Result Codes:&
1836:
1837: If you wish to have the BBS allow modem connections with an unknown
1838: (un-configured) numeric result code by using the last known (configured)
1839: result code information by default, set this option to &Yes&.
1840:
1841: This option has no effect if &Verbal Result Codes& are used.
1842: */
1843: i=ulist(WIN_SAV|WIN_MID,0,0,0,&i,0
1844: ,"Allow Unknown Result Codes",opt);
1845: if(i==0 && mdm_misc&MDM_KNOWNRES) {
1846: mdm_misc&=~MDM_KNOWNRES;
1847: changes=1; }
1848: else if(i==1 && !(mdm_misc&MDM_KNOWNRES)) {
1849: mdm_misc|=MDM_KNOWNRES;
1850: changes=1; } }
1851: }
1852: break;
1853: case 11:
1854: SETHELP(WHERE);
1855: /*
1856: &Modem Control Strings:&
1857:
1858: This menu contains a list of available modem control strings. It is usually
1859: not necessary to modify these except under special circumstances.
1860: */
1861: j=0;
1862: while(1) {
1863: i=0;
1864: savnum=1;
1865: sprintf(opt[i++],"%-27.27s%.40s"
1866: ,"Initialization String",mdm_init);
1867: sprintf(opt[i++],"%-27.27s%.40s"
1868: ,"Special Init String",mdm_spec);
1869: sprintf(opt[i++],"%-27.27s%.40s"
1870: ,"Terminal Init String",mdm_term);
1871: sprintf(opt[i++],"%-27.27s%.40s"
1872: ,"Dial String",mdm_dial);
1873: sprintf(opt[i++],"%-27.27s%.40s"
1874: ,"Off Hook String",mdm_offh);
1875: sprintf(opt[i++],"%-27.27s%.40s"
1876: ,"Answer String",mdm_answ);
1877: sprintf(opt[i++],"%-27.27s%.40s"
1878: ,"Hang Up String",mdm_hang);
1879: opt[i][0]=0;
1880: j=ulist(WIN_ACT|WIN_MID|WIN_SAV,0,0,60,&j,0
1881: ,"Modem Control Strings",opt);
1882: if(j==-1)
1883: break;
1884: switch(j) {
1885: case 0:
1886: SETHELP(WHERE);
1887: /*
1888: &Initialization String:&
1889:
1890: This is one of the strings of characters sent to your modem upon
1891: modem initialization. If you find it necessary to send additional
1892: commands to the modem during initialization, use the &Special Init String&
1893: for that purpose.
1894: */
1895: uinput(WIN_MID|WIN_SAV,0,0
1896: ,"Initialization"
1897: ,mdm_init,50,K_EDIT|K_UPPER);
1898: break;
1899: case 1:
1900: SETHELP(WHERE);
1901: /*
1902: &Special Init String:&
1903:
1904: This is an additional optional string of characters to be sent to your
1905: modem during initialization. Many of the &Auto-Configuration& options
1906: automatically set this string. It is used for sending commands that are
1907: particular to this modem type. If you find it necessary to send
1908: additional commands to your modem during initialization, use this option
1909: for that purpose.
1910: */
1911: uinput(WIN_MID|WIN_SAV,0,0
1912: ,"Special Init"
1913: ,mdm_spec,50,K_EDIT|K_UPPER);
1914: break;
1915: case 2:
1916: SETHELP(WHERE);
1917: /*
1918: &Terminal Init String:&
1919:
1920: This is the string of characters sent to your modem when terminal mode
1921: is entered from the Synchronet wait for call screen.
1922: */
1923: uinput(WIN_MID|WIN_SAV,0,0
1924: ,"Terminal Init"
1925: ,mdm_term,50,K_EDIT|K_UPPER);
1926: break;
1927: case 3:
1928: SETHELP(WHERE);
1929: /*
1930: &Dial String:&
1931:
1932: This is the string used to dial the modem in Synchronet Callback
1933: (an optional callback verification module).
1934: */
1935: uinput(WIN_MID|WIN_SAV,0,0
1936: ,"Dial String",mdm_dial,40
1937: ,K_EDIT|K_UPPER);
1938: break;
1939: case 4:
1940: SETHELP(WHERE);
1941: /*
1942: &Off Hook String:&
1943:
1944: This is the string of characters sent to your modem to take it off hook
1945: (make busy).
1946: */
1947: uinput(WIN_MID|WIN_SAV,0,0
1948: ,"Off Hook String",mdm_offh
1949: ,40,K_EDIT|K_UPPER);
1950: break;
1951: case 5:
1952: SETHELP(WHERE);
1953: /*
1954: &Answer String:&
1955:
1956: This is the string of characters sent to your modem to answer an
1957: incoming call.
1958: */
1959: uinput(WIN_MID|WIN_SAV,0,0
1960: ,"Answer String",mdm_answ,40
1961: ,K_EDIT|K_UPPER);
1962: break;
1963: case 6:
1964: SETHELP(WHERE);
1965: /*
1966: &Hang Up String:&
1967:
1968: This is the string of characters sent to your modem to hang up the
1969: phone line (go on-hook).
1970: */
1971: uinput(WIN_MID|WIN_SAV,0,0
1972: ,"Hang Up String",mdm_hang,40
1973: ,K_EDIT|K_UPPER);
1974: break;
1975: } }
1976: break;
1977: case 12:
1978: dflt=bar=0;
1979: while(1) {
1980: for(i=0;i<mdm_types;i++)
1981: strcpy(opt[i],mdm_type[i]);
1982: opt[i][0]=0;
1983: savnum=1;
1984: SETHELP(WHERE);
1985: /*
1986: &Auto-Configuration Modem Type:&
1987:
1988: This is the list of modem types currently supported by Synchronet's
1989: automatic modem configuration feature. If your modem is listed, select
1990: it using the arrow keys and hit ENTER . If your modem is not listed,
1991: you may want to try using the auto-configuration of a compatible modem
1992: or one from the same manufacturer. If you have a 2400bps modem, select
1993: &Hayes SmartModem 2400&. If you have a high-speed modem that is not
1994: listed, you may want to try &Generic 9600& or &Generic 14400& and add
1995: the additional high-speed result codes by hand. Refer to your modem's
1996: manual for a list of result codes supported by your modem.
1997: */
1998: i=ulist(WIN_ACT|WIN_SAV|WIN_RHT,0,0,0
1999: ,&dflt,&bar,"Modem Type",opt);
2000: if(i==-1)
2001: break;
2002: strcpy(opt[0],"Yes");
2003: strcpy(opt[1],"No");
2004: opt[2][0]=0;
2005: j=1;
2006: savnum=2;
2007:
2008: j=ulist(WIN_MID|WIN_SAV,0,0,0,&j,0
2009: ,"Continue with Modem Auto-Configuration",opt);
2010: if(!j) {
2011: mdm_cfg(i);
2012: changes=1;
2013: sprintf(str
2014: ,"Modem configured as %s",mdm_type[i]);
2015: savnum=1;
2016: umsg(str); } }
2017: break;
2018: case 13:
2019: SETHELP(WHERE);
2020: /*
2021: &Import Modem Configuration File&
2022:
2023: Using this option, you can import modem settings from an MDM file in
2024: your CTRL directory (i.e. To import from &CTRL\MYMODEM.MDM&, type &MYMODEM&
2025: now).
2026: */
2027: i=changes;
2028: str[0]=0;
2029: uinput(WIN_MID|WIN_SAV,0,0,"MDM Filename",str
2030: ,8,K_UPPER);
2031: if(str[0]) {
2032: FREE(mdm_result);
2033: mdm_result=NULL;
2034:
2035: mdm_answ[0]=0;
2036: mdm_hang[0]=0;
2037: mdm_dial[0]=0;
2038: mdm_offh[0]=0;
2039: mdm_term[0]=0;
2040: mdm_init[0]=0;
2041: mdm_spec[0]=0;
2042: mdm_results=0;
2043:
2044: if(exec_mdm(str))
2045: umsg("Imported");
2046: else {
2047: umsg("File Not Found");
2048: changes=i; } }
2049: else
2050: changes=i;
2051: break;
2052:
2053: case 14:
2054: SETHELP(WHERE);
2055: /*
2056: &Export Current Modem Configuration to a File&
2057:
2058: Using this option, you can save the current modem settings to a file.
2059: The file will be placed into the CTRL directory and will be given an
2060: extension of MDM (i.e. To create &CTRL\MYMODEM.MDM&, type &MYMODEM& now).
2061: */
2062: i=changes;
2063: str[0]=0;
2064: uinput(WIN_MID|WIN_SAV,0,0,"MDM Filename",str
2065: ,8,K_UPPER);
2066: if(str[0]) {
2067: if(export_mdm(str))
2068: umsg("Exported");
2069: else
2070: umsg("Error Exporting"); }
2071: changes=i;
2072: break;
2073: } } } }
2074: }
2075:
2076: void results(int i)
2077: {
2078: char str[81];
2079: int n,dflt=0;
2080:
2081: while(1) {
2082: n=0;
2083: sprintf(opt[n++],"%-22.22s%u","Numeric Code",mdm_result[i].code);
2084: sprintf(opt[n++],"%-22.22s%ubps","Modem Connect Rate",mdm_result[i].rate);
2085: sprintf(opt[n++],"%-22.22s%ucps","Modem Average CPS",mdm_result[i].cps);
2086: sprintf(opt[n++],"%-22.22s%s","Description",mdm_result[i].str);
2087: opt[n][0]=0;
2088: savnum=2;
2089: SETHELP(WHERE);
2090: /*
2091: &Result Code:&
2092:
2093: This is one of the configured connect result codes for your modem. The
2094: available options are:
2095:
2096: Numeric Code : Numeric result code
2097: Modem Connect Rate : Connect speed (in bps) for this result code
2098: Modem Average CPS : Average file transfer throughput in cps
2099: Description : Description of this connection type
2100: */
2101: switch(ulist(WIN_SAV|WIN_MID|WIN_ACT,0,0,35,&dflt,0,"Result Code",opt)) {
2102: case -1:
2103: return;
2104: case 0:
2105: sprintf(str,"%u",mdm_result[i].code);
2106: SETHELP(WHERE);
2107: /*
2108: &Numeric Result Code:&
2109:
2110: This is the &numeric& (as opposed to verbal) result code your modem will
2111: send to your computer when it establishes a connection with another
2112: modem with this connect type. Your modem must have the &V0& setting
2113: enabled to return numeric result codes.
2114: */
2115: uinput(WIN_L2R|WIN_SAV,0,15,"Numeric Result Code",str,3
2116: ,K_EDIT|K_NUMBER);
2117: mdm_result[i].code=atoi(str);
2118: break;
2119: case 1:
2120: SETHELP(WHERE);
2121: /*
2122: &Connection (DCE) Rate:&
2123:
2124: This is the modem (DCE) rate established with this connect type. This is
2125: &NOT& the DTE rate of your modem. As an example, a 14,400bps modem may
2126: have a DTE rate of 38,400bps but a maximum DCE rate of 14,400bps.
2127: */
2128: sprintf(str,"%u",mdm_result[i].rate);
2129: uinput(WIN_L2R|WIN_SAV,0,15,"Connection (DCE) Rate",str,5
2130: ,K_EDIT|K_NUMBER);
2131: mdm_result[i].rate=atoi(str);
2132: break;
2133: case 2:
2134: SETHELP(WHERE);
2135: /*
2136: &Average File Transfer CPS:&
2137:
2138: This is the average file transfer through-put (characters per second)
2139: of connections with this result code. If you don't know the average
2140: through-put, just divide the &DCE Rate& by ten for an approximation.
2141: As an example, a 9600bps DCE Rate would have an approximate file
2142: transfer through-put of 960cps.
2143: */
2144: sprintf(str,"%u",mdm_result[i].cps);
2145: uinput(WIN_L2R|WIN_SAV,0,15,"Average File Transfer CPS",str,5
2146: ,K_EDIT|K_NUMBER);
2147: mdm_result[i].cps=atoi(str);
2148: break;
2149: case 3:
2150: SETHELP(WHERE);
2151: /*
2152: &Modem Description:&
2153:
2154: This is a description of the modem type used for a connection with
2155: this result code. It can be up to eight characters long. This
2156: description usually just contains the DCE rate and possibly the
2157: protocol type. Such as &2400& for a 2400bps connection, &9600/V32&
2158: for a 9600bps V.32 connection or &9600/HST& for a 9600bps HST connection.
2159: */
2160: uinput(WIN_L2R|WIN_SAV,0,15,"Modem Description"
2161: ,mdm_result[i].str,LEN_MODEM,K_EDIT);
2162: break; } }
2163: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.