Annotation of sbbs/sbbs2/scfg/scfgnode.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.