|
|
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.