Annotation of sbbs/sbbs2/scfg/scfgxtrn.c, revision 1.1

1.1     ! root        1: #line 2 "SCFGXTRN.C"
        !             2: 
        !             3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
        !             4: 
        !             5: extern char *wday[];
        !             6: 
        !             7: char *daystr(char days);
        !             8: 
        !             9: 
        !            10: /****************************************************************************/
        !            11: /* Synchronet configuration utility                                                                            */
        !            12: /****************************************************************************/
        !            13: 
        !            14: #include "scfg.h"
        !            15: 
        !            16: void xprogs_cfg()
        !            17: {
        !            18:        static int xprogs_dflt;
        !            19:        int     i;
        !            20:        char    str[81];
        !            21: 
        !            22: while(1) {
        !            23:        i=0;
        !            24:        strcpy(opt[i++],"Fixed Events");
        !            25:        strcpy(opt[i++],"Timed Events");
        !            26:        strcpy(opt[i++],"Global Swap List");
        !            27:        strcpy(opt[i++],"OS/2 Program List");
        !            28:        strcpy(opt[i++],"External Editors");
        !            29:        strcpy(opt[i++],"Online Programs");
        !            30:        opt[i][0]=0;
        !            31:        SETHELP(WHERE);
        !            32: /*
        !            33: &Online External Programs:&
        !            34: 
        !            35: From this menu, you can configure external events, external editors, or
        !            36: online external programs (doors).
        !            37: */
        !            38:        switch(ulist(WIN_ORG|WIN_CHE|WIN_ACT,0,0,0,&xprogs_dflt,0
        !            39:                ,"External Programs",opt)) {
        !            40:                case -1:
        !            41:                        i=save_changes(WIN_MID);
        !            42:             if(i==-1)
        !            43:                 break;
        !            44:                        if(!i) {
        !            45:                 write_xtrn_cfg();
        !            46:                                write_main_cfg(); }
        !            47:                        return;
        !            48:                case 0:
        !            49:                        fevents_cfg();
        !            50:                        break;
        !            51:                case 1:
        !            52:                        tevents_cfg();
        !            53:                        break;
        !            54:                case 2:
        !            55:                        swap_cfg();
        !            56:                        break;
        !            57:                case 3:
        !            58:                        os2pgm_cfg();
        !            59:                        break;
        !            60:                case 4:
        !            61:                        xedit_cfg();
        !            62:                        break;
        !            63:                case 5:
        !            64:                        xtrnsec_cfg();
        !            65:                        break; } }
        !            66: }
        !            67: 
        !            68: void fevents_cfg()
        !            69: {
        !            70:        static int event_dflt;
        !            71:        char str[81],*p;
        !            72:        int i;
        !            73: 
        !            74: while(1) {
        !            75:        i=0;
        !            76:        sprintf(opt[i++],"%-32.32s%.40s","Logon Event",sys_logon);
        !            77:        sprintf(opt[i++],"%-32.32s%.40s","Logout Event",sys_logout);
        !            78:        sprintf(opt[i++],"%-32.32s%.40s","Daily Event",sys_daily);
        !            79:        opt[i][0]=0;
        !            80:        savnum=0;
        !            81:        SETHELP(WHERE);
        !            82: /*
        !            83: &External Events:&
        !            84: 
        !            85: From this menu, you can configure the logon and logout events, and the
        !            86: system daily event.
        !            87: */
        !            88:        switch(ulist(WIN_ACT|WIN_SAV|WIN_CHE|WIN_BOT|WIN_RHT,0,0,60,&event_dflt,0
        !            89:                ,"Fixed Events",opt)) {
        !            90:                case -1:
        !            91:                        return;
        !            92:                case 0:
        !            93:                        SETHELP(WHERE);
        !            94: /*
        !            95: &Logon Event:&
        !            96: 
        !            97: This is the command line for a program that will execute during the
        !            98: logon sequence of every user. The program cannot have user interaction.
        !            99: The program will be executed after the LOGON message is displayed and
        !           100: before the logon user list is displayed. If you wish to place a program
        !           101: in the logon sequence of users that includes interaction or requires
        !           102: account information, you probably want to use an online external
        !           103: program configured to run as a logon event.
        !           104: */
        !           105:                        uinput(WIN_MID|WIN_SAV,0,0,"Logon Event"
        !           106:                                ,sys_logon,50,K_EDIT);
        !           107:                        break;
        !           108:                case 1:
        !           109:                        SETHELP(WHERE);
        !           110: /*
        !           111: &Logout Event:&
        !           112: 
        !           113: This is the command line for a program that will execute during the
        !           114: logout sequence of every user. This program cannot have user
        !           115: interaction because it is executed after carrier is dropped. If you
        !           116: wish to have a program execute before carrier is dropped, you probably
        !           117: want to use an &Online External Program& configured to run as a logoff
        !           118: event.
        !           119: */
        !           120:                        uinput(WIN_MID|WIN_SAV,0,0,"Logout Event"
        !           121:                                ,sys_logout,50,K_EDIT);
        !           122:                        break;
        !           123:                case 2:
        !           124:                        SETHELP(WHERE);
        !           125: /*
        !           126: &Daily Event:&
        !           127: 
        !           128: This is the command line for a program that will run after the first
        !           129: user that logs on after midnight, logs off (regardless of what node).
        !           130: */
        !           131:                        uinput(WIN_MID|WIN_SAV,0,0,"Daily Event"
        !           132:                                ,sys_daily,50,K_EDIT);
        !           133: 
        !           134:                        break; } }
        !           135: }
        !           136: 
        !           137: void tevents_cfg()
        !           138: {
        !           139:        static int dflt,dfltopt,bar;
        !           140:        char str[81],done=0,*p;
        !           141:        int j,k;
        !           142:        uint i;
        !           143:        static event_t savevent;
        !           144: 
        !           145: while(1) {
        !           146:        for(i=0;i<total_events && i<MAX_OPTS;i++)
        !           147:                sprintf(opt[i],"%-8.8s      %.50s",event[i]->code,event[i]->cmd);
        !           148:        opt[i][0]=0;
        !           149:        j=WIN_SAV|WIN_ACT|WIN_CHE|WIN_RHT;
        !           150:        savnum=0;
        !           151:        if(total_events)
        !           152:                j|=WIN_DEL|WIN_GET;
        !           153:        if(total_events<MAX_OPTS)
        !           154:                j|=WIN_INS|WIN_INSACT;
        !           155:        if(savevent.code[0])
        !           156:                j|=WIN_PUT;
        !           157:        SETHELP(WHERE);
        !           158: /*
        !           159: &Timed Events:&
        !           160: 
        !           161: This is a list of the configured timed external events.
        !           162: 
        !           163: To add an event hit  INS .
        !           164: 
        !           165: To delete an event, select it and hit  DEL .
        !           166: 
        !           167: To configure an event, select it and hit  ENTER .
        !           168: */
        !           169:        i=ulist(j,0,0,45,&dflt,&bar,"Timed Events",opt);
        !           170:        if((signed)i==-1)
        !           171:                return;
        !           172:        if((i&MSK_ON)==MSK_INS) {
        !           173:                i=total_events;
        !           174:                SETHELP(WHERE);
        !           175: /*
        !           176: &Timed Event Internal Code:&
        !           177: 
        !           178: This is the internal code for the timed event.
        !           179: */
        !           180:                if(uinput(WIN_MID|WIN_SAV,0,0,"Event Internal Code",str,8
        !           181:                        ,K_UPPER)<1)
        !           182:             continue;
        !           183:                if((event=(event_t **)REALLOC(event
        !           184:                        ,sizeof(event_t *)*(total_events+1)))==NULL) {
        !           185:                        errormsg(WHERE,ERR_ALLOC,nulstr,total_events+1);
        !           186:                        total_events=0;
        !           187:                        bail(1);
        !           188:             continue; }
        !           189:                if((event[i]=(event_t *)MALLOC(sizeof(event_t)))==NULL) {
        !           190:                        errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(event_t));
        !           191:                        continue; }
        !           192:                memset((event_t *)event[i],0,sizeof(event_t));
        !           193:                strcpy(event[i]->code,str);
        !           194:                event[i]->node=1;
        !           195:                event[i]->days=0xff;
        !           196:                total_events++;
        !           197:                changes=1;
        !           198:                continue; }
        !           199:        if((i&MSK_ON)==MSK_DEL) {
        !           200:                i&=MSK_OFF;
        !           201:                FREE(event[i]);
        !           202:                total_events--;
        !           203:                for(j=i;j<total_events;j++)
        !           204:                        event[j]=event[j+1];
        !           205:                changes=1;
        !           206:                continue; }
        !           207:        if((i&MSK_ON)==MSK_GET) {
        !           208:                i&=MSK_OFF;
        !           209:                savevent=*event[i];
        !           210:                continue; }
        !           211:        if((i&MSK_ON)==MSK_PUT) {
        !           212:                i&=MSK_OFF;
        !           213:                *event[i]=savevent;
        !           214:                changes=1;
        !           215:         continue; }
        !           216:        done=0;
        !           217:        while(!done) {
        !           218:                k=0;
        !           219:                sprintf(opt[k++],"%-32.32s%s","Internal Code",event[i]->code);
        !           220:                sprintf(opt[k++],"%-32.32s%.40s","Start-up Directory",event[i]->dir);
        !           221:                sprintf(opt[k++],"%-32.32s%.40s","Command Line",event[i]->cmd);
        !           222:                sprintf(opt[k++],"%-32.32s%u","Execution Node",event[i]->node);
        !           223:                sprintf(opt[k++],"%-32.32s%s","Execution Days",daystr(event[i]->days));
        !           224:                sprintf(opt[k++],"%-32.32s%02u:%02u","Execution Time"
        !           225:                        ,event[i]->time/60,event[i]->time%60);
        !           226:                sprintf(opt[k++],"%-32.32s%s","Requires Exclusive Execution"
        !           227:                        ,event[i]->misc&EVENT_EXCL ? "Yes":"No");
        !           228:                sprintf(opt[k++],"%-32.32s%s","Force Users Off-line For Event"
        !           229:                        ,event[i]->misc&EVENT_FORCE ? "Yes":"No");
        !           230:                opt[k][0]=0;
        !           231:                SETHELP(WHERE);
        !           232: /*
        !           233: &Timed Event:&
        !           234: 
        !           235: This is the configuration menu for a timed event. An event is an
        !           236: external program that performs some type of automated function on the
        !           237: system. Use this menu to configure how and when this event will be
        !           238: executed.
        !           239: 
        !           240: If you need the BBS to swap out of memory for this event (to make more
        !           241: available memory), add the program name (first word of the command line)
        !           242: to &Global Swap List& from the &External Programs& menu.
        !           243: */
        !           244:                savnum=1;
        !           245:                sprintf(str,"%s Timed Event",event[i]->code);
        !           246:                switch(ulist(WIN_SAV|WIN_ACT|WIN_L2R|WIN_BOT,0,0,70,&dfltopt,0
        !           247:                        ,str,opt)) {
        !           248:                        case -1:
        !           249:                                done=1;
        !           250:                                break;
        !           251:                        case 0:
        !           252:                                strcpy(str,event[i]->code);
        !           253:                                SETHELP(WHERE);
        !           254: /*
        !           255: &Timed Event Internal Code:&
        !           256: 
        !           257: Every timed event must have its own unique internal code for Synchronet
        !           258: to reference it by. It is helpful if this code is an abreviation of the
        !           259: command line.
        !           260: */
        !           261:                                uinput(WIN_MID|WIN_SAV,0,17,"Internal Code (unique)"
        !           262:                                        ,str,8,K_EDIT|K_UPPER);
        !           263:                                if(code_ok(str))
        !           264:                                        strcpy(event[i]->code,str);
        !           265:                                else {
        !           266:                                        helpbuf=invalid_code;
        !           267:                                        umsg("Invalid Code");
        !           268:                                        helpbuf=0; }
        !           269:                 break;
        !           270:                        case 1:
        !           271:                                SETHELP(WHERE);
        !           272: /*
        !           273: &Timed Event Start-up Directory:&
        !           274: 
        !           275: This is the DOS drive/directory where the event program is located.
        !           276: If a path is specified here, it will be made the current directory
        !           277: before the event's command line is executed. This eliminates the need
        !           278: for batch files that just change the current drive and directory before
        !           279: executing the event.
        !           280: 
        !           281: If this option is not used, the current NODE's directory will be the
        !           282: current DOS drive/directory before the command line is executed.
        !           283: */
        !           284:                                uinput(WIN_MID|WIN_SAV,0,10,"Directory"
        !           285:                                        ,event[i]->dir,50,K_EDIT|K_UPPER);
        !           286:                 break;
        !           287:                        case 2:
        !           288:                                SETHELP(WHERE);
        !           289: /*
        !           290: &Timed Event Command Line:&
        !           291: 
        !           292: This is the command line to execute upon this timed event.
        !           293: */
        !           294:                                uinput(WIN_MID|WIN_SAV,0,10,"Command"
        !           295:                                        ,event[i]->cmd,50,K_EDIT);
        !           296:                                break;
        !           297:                        case 3:
        !           298:                                SETHELP(WHERE);
        !           299: /*
        !           300: &Timed Event Node:&
        !           301: 
        !           302: This is the node number to execute the timed event.
        !           303: */
        !           304:                                sprintf(str,"%u",event[i]->node);
        !           305:                                uinput(WIN_MID|WIN_SAV,0,0,"Node Number"
        !           306:                                        ,str,3,K_EDIT|K_NUMBER);
        !           307:                                event[i]->node=atoi(str);
        !           308:                                break;
        !           309:                        case 4:
        !           310:                                j=0;
        !           311:                                while(1) {
        !           312:                                        for(k=0;k<7;k++)
        !           313:                                                sprintf(opt[k],"%s        %s"
        !           314:                                                        ,wday[k],(event[i]->days&(1<<k)) ? "Yes":"No");
        !           315:                                        opt[k][0]=0;
        !           316:                                        savnum=2;
        !           317:                                        SETHELP(WHERE);
        !           318: /*
        !           319: &Days to Execute Event:&
        !           320: 
        !           321: These are the days of the week that this event will be executed.
        !           322: */
        !           323:                                        k=ulist(WIN_MID|WIN_SAV,0,0,0,&j,0
        !           324:                                                ,"Days to Execute Event",opt);
        !           325:                                        if(k==-1)
        !           326:                                                break;
        !           327:                                        event[i]->days^=(1<<k);
        !           328:                                        changes=1; }
        !           329:                                break;
        !           330:                        case 5:
        !           331:                                sprintf(str,"%2.2d:%2.2d",event[i]->time/60
        !           332:                                        ,event[i]->time%60);
        !           333:                                SETHELP(WHERE);
        !           334: /*
        !           335: &Time to Execute Event:&
        !           336: 
        !           337: This is the time (in 24 hour HH:MM format) to execute the event.
        !           338: */
        !           339:                                if(uinput(WIN_MID|WIN_SAV,0,0
        !           340:                                        ,"Time to Execute Event (HH:MM)"
        !           341:                                        ,str,5,K_UPPER|K_EDIT)>0) {
        !           342:                                        event[i]->time=atoi(str)*60;
        !           343:                                        if((p=strchr(str,':'))!=NULL)
        !           344:                                                event[i]->time+=atoi(p+1); }
        !           345:                                break;
        !           346:                        case 6:
        !           347:                                k=1;
        !           348:                                strcpy(opt[0],"Yes");
        !           349:                                strcpy(opt[1],"No");
        !           350:                                opt[2][0]=0;
        !           351:                                savnum=2;
        !           352:                                SETHELP(WHERE);
        !           353: /*
        !           354: &Exclusive Event Execution:&
        !           355: 
        !           356: If this event must be run exclusively (all nodes inactive), set this
        !           357: option to &Yes&.
        !           358: */
        !           359:                                k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0,"Exclusive Execution"
        !           360:                                        ,opt);
        !           361:                                if(!k && !(event[i]->misc&EVENT_EXCL)) {
        !           362:                                        event[i]->misc|=EVENT_EXCL;
        !           363:                                        changes=1; }
        !           364:                                else if(k==1 && event[i]->misc&EVENT_EXCL) {
        !           365:                                        event[i]->misc&=~EVENT_EXCL;
        !           366:                                        changes=1; }
        !           367:                 break;
        !           368:                        case 7:
        !           369:                                k=1;
        !           370:                                strcpy(opt[0],"Yes");
        !           371:                                strcpy(opt[1],"No");
        !           372:                                opt[2][0]=0;
        !           373:                                savnum=2;
        !           374:                                SETHELP(WHERE);
        !           375: /*
        !           376: &Force Users Off-line for Event:&
        !           377: 
        !           378: If you want to have your users' on-line time reduced so the event can
        !           379: execute precisely on time, set this option to &Yes&.
        !           380: */
        !           381:                                k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0
        !           382:                                        ,"Force Users Off-line for Event",opt);
        !           383:                                if(!k && !(event[i]->misc&EVENT_FORCE)) {
        !           384:                                        event[i]->misc|=EVENT_FORCE;
        !           385:                                        changes=1; }
        !           386:                                else if(k==1 && event[i]->misc&EVENT_FORCE) {
        !           387:                                        event[i]->misc&=~EVENT_FORCE;
        !           388:                     changes=1; }
        !           389:                 break;
        !           390: 
        !           391:                                } } }
        !           392: }
        !           393: 
        !           394: 
        !           395: void xtrn_cfg(uint section)
        !           396: {
        !           397:        static int ext_dflt,ext_bar,opt_dflt,time_dflt;
        !           398:        char str[128],code[9],done=0,*p;
        !           399:        int j,k;
        !           400:        uint i,n,xtrnnum[MAX_OPTS+1];
        !           401:        static xtrn_t savxtrn;
        !           402: 
        !           403: while(1) {
        !           404:        for(i=0,j=0;i<total_xtrns && j<MAX_OPTS;i++)
        !           405:                if(xtrn[i]->sec==section) {
        !           406:                        sprintf(opt[j],"%-25s",xtrn[i]->name);
        !           407:                        xtrnnum[j++]=i; }
        !           408:        xtrnnum[j]=total_xtrns;
        !           409:        opt[j][0]=0;
        !           410:        savnum=2;
        !           411:        i=WIN_ACT|WIN_CHE|WIN_SAV|WIN_RHT;
        !           412:        if(j)
        !           413:                i|=WIN_DEL|WIN_GET;
        !           414:        if(total_xtrns<MAX_OPTS)
        !           415:                i|=WIN_INS|WIN_INSACT|WIN_XTR;
        !           416:        if(savxtrn.name[0])
        !           417:                i|=WIN_PUT;
        !           418:        SETHELP(WHERE);
        !           419: /*
        !           420: &Online External Programs:&
        !           421: 
        !           422: This is a list of the configured online external programs (doors).
        !           423: 
        !           424: To add a program, select the desired location with the arrow keys and
        !           425: hit  INS .
        !           426: 
        !           427: To delete a program, select it with the arrow keys and hit  DEL .
        !           428: 
        !           429: To configure a program, select it with the arrow keys and hit  ENTER .
        !           430: */
        !           431:        sprintf(str,"%s Online Programs",xtrnsec[section]->name);
        !           432:        i=ulist(i,0,0,45,&ext_dflt,&ext_bar,str,opt);
        !           433:        if((signed)i==-1)
        !           434:                return;
        !           435:        if((i&MSK_ON)==MSK_INS) {
        !           436:                i&=MSK_OFF;
        !           437:                SETHELP(WHERE);
        !           438: /*
        !           439: &Online Program Name:&
        !           440: 
        !           441: This is the name or description of the online program (door).
        !           442: */
        !           443:                if(uinput(WIN_MID|WIN_SAV,0,0,"Online Program Name",str,25
        !           444:                        ,0)<1)
        !           445:             continue;
        !           446:                sprintf(code,"%.8s",str);
        !           447:                p=strchr(code,SP);
        !           448:                if(p) *p=0;
        !           449:         strupr(code);
        !           450:                SETHELP(WHERE);
        !           451: /*
        !           452: &Online Program Internal Code:&
        !           453: 
        !           454: Every online program must have its own unique code for Synchronet to
        !           455: refer to it internally. This code is usually an abreviation of the
        !           456: online program name.
        !           457: */
        !           458:                if(uinput(WIN_MID|WIN_SAV,0,0,"Internal Code"
        !           459:                        ,code,8,K_EDIT|K_UPPER)<1)
        !           460:                        continue;
        !           461:                if(!code_ok(code)) {
        !           462:                        helpbuf=invalid_code;
        !           463:                        umsg("Invalid Code");
        !           464:                        helpbuf=0;
        !           465:             continue; }
        !           466:                if((xtrn=(xtrn_t **)REALLOC(xtrn,sizeof(xtrn_t *)*(total_xtrns+1)))
        !           467:             ==NULL) {
        !           468:             errormsg(WHERE,ERR_ALLOC,nulstr,total_xtrns+1);
        !           469:                        total_xtrns=0;
        !           470:                        bail(1);
        !           471:             continue; }
        !           472:                if(j)
        !           473:                        for(n=total_xtrns;n>xtrnnum[i];n--)
        !           474:                                xtrn[n]=xtrn[n-1];
        !           475:                if((xtrn[xtrnnum[i]]=(xtrn_t *)MALLOC(sizeof(xtrn_t)))==NULL) {
        !           476:                        errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(xtrn_t));
        !           477:                        continue; }
        !           478:                memset((xtrn_t *)xtrn[xtrnnum[i]],0,sizeof(xtrn_t));
        !           479:                strcpy(xtrn[xtrnnum[i]]->name,str);
        !           480:                strcpy(xtrn[xtrnnum[i]]->code,code);
        !           481:                xtrn[xtrnnum[i]]->sec=section;
        !           482:                total_xtrns++;
        !           483:                changes=1;
        !           484:                continue; }
        !           485:        if((i&MSK_ON)==MSK_DEL) {
        !           486:                i&=MSK_OFF;
        !           487:                FREE(xtrn[xtrnnum[i]]);
        !           488:                total_xtrns--;
        !           489:                for(j=xtrnnum[i];j<total_xtrns;j++)
        !           490:                        xtrn[j]=xtrn[j+1];
        !           491:                changes=1;
        !           492:                continue; }
        !           493:        if((i&MSK_ON)==MSK_GET) {
        !           494:                i&=MSK_OFF;
        !           495:                savxtrn=*xtrn[xtrnnum[i]];
        !           496:                continue; }
        !           497:        if((i&MSK_ON)==MSK_PUT) {
        !           498:                i&=MSK_OFF;
        !           499:                *xtrn[xtrnnum[i]]=savxtrn;
        !           500:                xtrn[xtrnnum[i]]->sec=section;
        !           501:                changes=1;
        !           502:         continue; }
        !           503:        done=0;
        !           504:        i=xtrnnum[i];
        !           505:        while(!done) {
        !           506:                k=0;
        !           507:                sprintf(opt[k++],"%-27.27s%s","Name",xtrn[i]->name);
        !           508:                sprintf(opt[k++],"%-27.27s%s","Internal Code",xtrn[i]->code);
        !           509:                sprintf(opt[k++],"%-27.27s%.40s","Start-up Directory",xtrn[i]->path);
        !           510:                sprintf(opt[k++],"%-27.27s%.40s","Command Line",xtrn[i]->cmd);
        !           511:                sprintf(opt[k++],"%-27.27s%.40s","Clean-up Command Line",xtrn[i]->clean);
        !           512:                if(xtrn[i]->cost)
        !           513:                        sprintf(str,"%lu credits",xtrn[i]->cost);
        !           514:                else
        !           515:                        strcpy(str,"None");
        !           516:                sprintf(opt[k++],"%-27.27s%s","Execution Cost",str);
        !           517:                sprintf(opt[k++],"%-27.27s%.40s","Access Requirements",xtrn[i]->ar);
        !           518:                sprintf(opt[k++],"%-27.27s%.40s","Execution Requirements"
        !           519:                        ,xtrn[i]->run_ar);
        !           520:                sprintf(opt[k++],"%-27.27s%s","Multiple Concurrent Users"
        !           521:                        ,xtrn[i]->misc&MULTIUSER ? "Yes" : "No");
        !           522:                sprintf(opt[k++],"%-27.27s%s%s","Intercept I/O Interrupts"
        !           523:                        ,xtrn[i]->misc&IO_INTS ? "Yes" : "No"
        !           524:                        ,xtrn[i]->misc&WWIVCOLOR ? ", WWIV" : nulstr);
        !           525:                sprintf(opt[k++],"%-27.27s%s","Swap BBS out of Memory"
        !           526:                        ,xtrn[i]->misc&SWAP ? "Yes" : "No");
        !           527:                sprintf(opt[k++],"%-27.27s%s","Modify User Data"
        !           528:             ,xtrn[i]->misc&MODUSERDAT ? "Yes" : "No");
        !           529:                switch(xtrn[i]->event) {
        !           530:                        case EVENT_LOGON:
        !           531:                                strcpy(str,"Logon");
        !           532:                                break;
        !           533:                        case EVENT_LOGOFF:
        !           534:                                strcpy(str,"Logoff");
        !           535:                                break;
        !           536:                        case EVENT_NEWUSER:
        !           537:                                strcpy(str,"New User");
        !           538:                                break;
        !           539:                        case EVENT_BIRTHDAY:
        !           540:                                strcpy(str,"Birthday");
        !           541:                                break;
        !           542:                        default:
        !           543:                                strcpy(str,"No");
        !           544:                                break; }
        !           545:                if(xtrn[i]->misc&EVENTONLY && xtrn[i]->event)
        !           546:                        strcat(str,", Only");
        !           547:                sprintf(opt[k++],"%-27.27s%s","Execute on Event",str);
        !           548:                switch(xtrn[i]->type) {
        !           549:                        case XTRN_SBBS:
        !           550:                                sprintf(str,"%-15s %s","Synchronet","XTRN.DAT");
        !           551:                                break;
        !           552:                        case XTRN_WWIV:
        !           553:                                sprintf(str,"%-15s %s","WWIV","CHAIN.TXT");
        !           554:                                break;
        !           555:                        case XTRN_GAP:
        !           556:                                sprintf(str,"%-15s %s","GAP","DOOR.SYS");
        !           557:                                break;
        !           558:                        case XTRN_RBBS:
        !           559:                                sprintf(str,"%-15s %s","RBBS/QuickBBS","DORINFO#.DEF");
        !           560:                                break;
        !           561:                        case XTRN_RBBS1:
        !           562:                                sprintf(str,"%-15s %s","RBBS/QuickBBS","DORINFO1.DEF");
        !           563:                 break;
        !           564:                        case XTRN_WILDCAT:
        !           565:                                sprintf(str,"%-15s %s","Wildcat","CALLINFO.BBS");
        !           566:                                break;
        !           567:                        case XTRN_PCBOARD:
        !           568:                                sprintf(str,"%-15s %s","PCBoard","PCBOARD.SYS");
        !           569:                                break;
        !           570:                        case XTRN_SPITFIRE:
        !           571:                                sprintf(str,"%-15s %s","SpitFire","SFDOORS.DAT");
        !           572:                                break;
        !           573:                        case XTRN_UTI:
        !           574:                                sprintf(str,"%-15s %s","MegaMail","UTIDOOR.TXT");
        !           575:                                break;
        !           576:                        case XTRN_SR:
        !           577:                                sprintf(str,"%-15s %s","Solar Realms","DOORFILE.SR");
        !           578:                                break;
        !           579:                        case XTRN_TRIBBS:
        !           580:                                sprintf(str,"%-15s %s","TriBBS","TRIBBS.SYS");
        !           581:                                break;
        !           582:                        default:
        !           583:                                strcpy(str,"None");
        !           584:                                break; }
        !           585:                sprintf(opt[k++],"%-23.23s%-4s%s","BBS Drop File Type"
        !           586:                        ,xtrn[i]->misc&REALNAME ? "(R)":nulstr,str);
        !           587:                sprintf(opt[k++],"%-27.27s%s","Place Drop File In"
        !           588:                        ,xtrn[i]->misc&STARTUPDIR ? "Start-Up Directory":"Node Directory");
        !           589:                sprintf(opt[k++],"Time Options...");
        !           590:                opt[k][0]=0;
        !           591:                savnum=3;
        !           592:                SETHELP(WHERE);
        !           593: /*
        !           594: &Online Program Configuration:&
        !           595: 
        !           596: This menu is for configuring the selected online program.
        !           597: */
        !           598:                switch(ulist(WIN_SAV|WIN_ACT|WIN_MID,0,0,60,&opt_dflt,0,xtrn[i]->name
        !           599:                        ,opt)) {
        !           600:                        case -1:
        !           601:                                done=1;
        !           602:                                break;
        !           603:                        case 0:
        !           604:                                SETHELP(WHERE);
        !           605: /*
        !           606: &Online Program Name:&
        !           607: 
        !           608: This is the name or description of the online program (door).
        !           609: */
        !           610:                                strcpy(str,xtrn[i]->name);
        !           611:                                if(!uinput(WIN_MID|WIN_SAV,0,10,"Online Program Name"
        !           612:                                        ,xtrn[i]->name,25,K_EDIT))
        !           613:                                        strcpy(xtrn[i]->name,str);
        !           614:                                break;
        !           615:                        case 1:
        !           616:                                SETHELP(WHERE);
        !           617: /*
        !           618: &Online Program Internal Code:&
        !           619: 
        !           620: Every online program must have its own unique code for Synchronet to
        !           621: refer to it internally. This code is usually an abreviation of the
        !           622: online program name.
        !           623: */
        !           624:                                strcpy(str,xtrn[i]->code);
        !           625:                                uinput(WIN_MID|WIN_SAV,0,10,"Internal Code"
        !           626:                                        ,str,8,K_UPPER|K_EDIT);
        !           627:                                if(code_ok(str))
        !           628:                                        strcpy(xtrn[i]->code,str);
        !           629:                                else {
        !           630:                                        helpbuf=invalid_code;
        !           631:                                        umsg("Invalid Code");
        !           632:                     helpbuf=0; }
        !           633:                 break;
        !           634:                        case 2:
        !           635:                 SETHELP(WHERE);
        !           636: /*
        !           637: &Online Program Start-up Directory:&
        !           638: 
        !           639: This is the DOS drive/directory where the online program is located.
        !           640: If a path is specified here, it will be made the current directory
        !           641: before the program's command line is executed. This eliminates the need
        !           642: for batch files that just change the current drive and directory before
        !           643: executing the program.
        !           644: 
        !           645: If this option is not used, the current NODE's directory will be the
        !           646: current DOS drive/directory before the command line is executed.
        !           647: */
        !           648:                                uinput(WIN_MID|WIN_SAV,0,10,"Directory"
        !           649:                                        ,xtrn[i]->path,50,K_EDIT|K_UPPER);
        !           650:                 break;
        !           651:                        case 3:
        !           652:                                SETHELP(WHERE);
        !           653: /*
        !           654: &Online Program Command Line:&
        !           655: 
        !           656: This is the command line to execute to run the online program.
        !           657: */
        !           658:                                uinput(WIN_MID|WIN_SAV,0,10,"Command"
        !           659:                                        ,xtrn[i]->cmd,50,K_EDIT);
        !           660:                                break;
        !           661:                        case 4:
        !           662:                                SETHELP(WHERE);
        !           663: /*
        !           664: &Online Program Clean-up Command:&
        !           665: 
        !           666: This is the command line to execute after the main command line. This
        !           667: option is usually only used for multiuser online programs.
        !           668: */
        !           669:                                uinput(WIN_MID|WIN_SAV,0,10,"Clean-up"
        !           670:                                        ,xtrn[i]->clean,50,K_EDIT);
        !           671:                 break;
        !           672:                        case 5:
        !           673:                 ultoa(xtrn[i]->cost,str,10);
        !           674:                 SETHELP(WHERE);
        !           675: /*
        !           676: &Online Program Cost to Run:&
        !           677: 
        !           678: If you want users to be charged credits to run this online program,
        !           679: set this value to the number of credits to charge. If you want this
        !           680: online program to be free, set this value to &0&.
        !           681: */
        !           682:                 uinput(WIN_MID|WIN_SAV,0,0,"Cost to Run (in Credits)"
        !           683:                     ,str,10,K_EDIT|K_NUMBER);
        !           684:                 xtrn[i]->cost=atol(str);
        !           685:                 break;
        !           686:                        case 6:
        !           687:                                savnum=4;
        !           688:                                sprintf(str,"%s Access",xtrn[i]->name);
        !           689:                                getar(str,xtrn[i]->ar);
        !           690:                 break;
        !           691:                        case 7:
        !           692:                                savnum=4;
        !           693:                                sprintf(str,"%s Execution",xtrn[i]->name);
        !           694:                                getar(str,xtrn[i]->run_ar);
        !           695:                 break;
        !           696:                        case 8:
        !           697:                                k=1;
        !           698:                                strcpy(opt[0],"Yes");
        !           699:                                strcpy(opt[1],"No");
        !           700:                                opt[2][0]=0;
        !           701:                                SETHELP(WHERE);
        !           702: /*
        !           703: &Supports Multiple Users:&
        !           704: 
        !           705: If this online program supports multiple simultaneous users (nodes),
        !           706: set this option to &Yes&.
        !           707: */
        !           708:                                savnum=4;
        !           709:                                k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0,"Supports Multiple Users"
        !           710:                                        ,opt);
        !           711:                                if(!k && !(xtrn[i]->misc&MULTIUSER)) {
        !           712:                                        xtrn[i]->misc|=MULTIUSER;
        !           713:                                        changes=1; }
        !           714:                                else if(k==1 && xtrn[i]->misc&MULTIUSER) {
        !           715:                                        xtrn[i]->misc&=~MULTIUSER;
        !           716:                                        changes=1; }
        !           717:                 break;
        !           718:                        case 9:
        !           719:                                k=1;
        !           720:                                strcpy(opt[0],"Yes");
        !           721:                                strcpy(opt[1],"No");
        !           722:                                opt[2][0]=0;
        !           723:                                SETHELP(WHERE);
        !           724: /*
        !           725: &Intercept I/O Interrupts:&
        !           726: 
        !           727: If this online program has its own serial communication abilities, set
        !           728: this option to &No&.
        !           729: */
        !           730:                                savnum=4;
        !           731:                                k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0,"Intercept I/O Interrupts"
        !           732:                                        ,opt);
        !           733:                                if(!k && !(xtrn[i]->misc&IO_INTS)) {
        !           734:                                        xtrn[i]->misc|=IO_INTS;
        !           735:                                        changes=1; }
        !           736:                                else if(k==1 && xtrn[i]->misc&IO_INTS) {
        !           737:                                        xtrn[i]->misc&=~(IO_INTS|WWIVCOLOR);
        !           738:                                        changes=1; }
        !           739:                                if(!(xtrn[i]->misc&IO_INTS))
        !           740:                                        break;
        !           741:                                k=1;
        !           742:                                strcpy(opt[0],"Yes");
        !           743:                                strcpy(opt[1],"No");
        !           744:                                opt[2][0]=0;
        !           745:                                SETHELP(WHERE);
        !           746: /*
        !           747: &Program Uses WWIV Color Codes:&
        !           748: 
        !           749: If this program was written for use exclusively under WWIV, set this
        !           750: option to &Yes&.
        !           751: */
        !           752:                                savnum=4;
        !           753:                                k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0
        !           754:                                        ,"Program Uses WWIV Color Codes"
        !           755:                                        ,opt);
        !           756:                                if(!k && !(xtrn[i]->misc&WWIVCOLOR)) {
        !           757:                                        xtrn[i]->misc|=WWIVCOLOR;
        !           758:                                        changes=1; }
        !           759:                                else if(k==1 && xtrn[i]->misc&WWIVCOLOR) {
        !           760:                                        xtrn[i]->misc&=~WWIVCOLOR;
        !           761:                     changes=1; }
        !           762:                 break;
        !           763:                        case 10:
        !           764:                                k=0;
        !           765:                                strcpy(opt[0],"Yes");
        !           766:                                strcpy(opt[1],"No");
        !           767:                                opt[2][0]=0;
        !           768:                                SETHELP(WHERE);
        !           769: /*
        !           770: &Swap BBS out of Memory to Run Executable:&
        !           771: 
        !           772: If this online programs requires a large amount of free memory,
        !           773: set this option to &Yes& to have the BBS swapped out of memory.
        !           774: */
        !           775:                                savnum=4;
        !           776:                                k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0
        !           777:                                        ,"Swap BBS out of Memory",opt);
        !           778:                                if(!k && !(xtrn[i]->misc&SWAP)) {
        !           779:                                        xtrn[i]->misc|=SWAP;
        !           780:                                        changes=1; }
        !           781:                                else if(k==1 && xtrn[i]->misc&SWAP) {
        !           782:                                        xtrn[i]->misc&=~SWAP;
        !           783:                                        changes=1; }
        !           784:                                break;
        !           785:                        case 11:
        !           786:                                k=1;
        !           787:                                strcpy(opt[0],"Yes");
        !           788:                                strcpy(opt[1],"No");
        !           789:                                opt[2][0]=0;
        !           790:                                SETHELP(WHERE);
        !           791: /*
        !           792: &Program Can Modify User Data:&
        !           793: 
        !           794: If this online programs recognizes the Synchronet MODUSER.DAT format
        !           795: or the RBBS/QuickBBS EXITINFO.BBS format and you want it to be able to
        !           796: modify the data of users who run the program, set this option to &Yes&.
        !           797: */
        !           798:                                savnum=4;
        !           799:                                k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0
        !           800:                                        ,"Program Can Modify User Data",opt);
        !           801:                                if(!k && !(xtrn[i]->misc&MODUSERDAT)) {
        !           802:                                        xtrn[i]->misc|=MODUSERDAT;
        !           803:                                        changes=1; }
        !           804:                                else if(k==1 && xtrn[i]->misc&MODUSERDAT) {
        !           805:                                        xtrn[i]->misc&=~MODUSERDAT;
        !           806:                                        changes=1; }
        !           807:                 break;
        !           808:                        case 12:
        !           809:                                k=0;
        !           810:                                strcpy(opt[k++],"No");
        !           811:                                strcpy(opt[k++],"Logon");
        !           812:                                strcpy(opt[k++],"Logoff");
        !           813:                                strcpy(opt[k++],"New User");
        !           814:                                strcpy(opt[k++],"Birthday");
        !           815:                                opt[k][0]=0;
        !           816:                                switch(xtrn[i]->event) {
        !           817:                                        default:
        !           818:                                                k=0;
        !           819:                                                break;
        !           820:                                        case EVENT_LOGON:
        !           821:                                                k=1;
        !           822:                                                break;
        !           823:                                        case EVENT_LOGOFF:
        !           824:                                                k=2;
        !           825:                                                break;
        !           826:                                        case EVENT_NEWUSER:
        !           827:                                                k=3;
        !           828:                                                break;
        !           829:                                        case EVENT_BIRTHDAY:
        !           830:                                                k=4;
        !           831:                                                break; }
        !           832:                                SETHELP(WHERE);
        !           833: /*
        !           834: &Execute Online Program on Event:&
        !           835: 
        !           836: If you would like this online program to automatically execute on a
        !           837: specific user event, select the event. Otherwise, select &No&.
        !           838: */
        !           839:                                savnum=4;
        !           840:                                k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0
        !           841:                                        ,"Execute on Event",opt);
        !           842:                                if(k==-1)
        !           843:                                        break;
        !           844:                                if(xtrn[i]->event!=k) {
        !           845:                                        xtrn[i]->event=k;
        !           846:                                        changes=1; }
        !           847:                                if(!xtrn[i]->event)
        !           848:                                        break;
        !           849:                                k=1;
        !           850:                 strcpy(opt[0],"Yes");
        !           851:                 strcpy(opt[1],"No");
        !           852:                                opt[2][0]=0;
        !           853:                                SETHELP(WHERE);
        !           854: /*
        !           855: &Execute Online Program as Event Only:&
        !           856: 
        !           857: If you would like this online program to execute as an event only
        !           858: (not available to users on the online program menu), set this option
        !           859: to &Yes&.
        !           860: */
        !           861:                                savnum=4;
        !           862:                                k=ulist(WIN_MID|WIN_SAV,0,0,0,&k
        !           863:                                        ,0,"Execute as Event Only"
        !           864:                     ,opt);
        !           865:                 if(!k && !(xtrn[i]->misc&EVENTONLY)) {
        !           866:                     xtrn[i]->misc|=EVENTONLY;
        !           867:                     changes=1; }
        !           868:                 else if(k==1 && xtrn[i]->misc&EVENTONLY) {
        !           869:                     xtrn[i]->misc&=~EVENTONLY;
        !           870:                     changes=1; }
        !           871:                 break;
        !           872:                        case 13:
        !           873:                                k=0;
        !           874:                                strcpy(opt[k++],"None");
        !           875:                                sprintf(opt[k++],"%-15s %s","Synchronet","XTRN.DAT");
        !           876:                                sprintf(opt[k++],"%-15s %s","WWIV","CHAIN.TXT");
        !           877:                                sprintf(opt[k++],"%-15s %s","GAP","DOOR.SYS");
        !           878:                                sprintf(opt[k++],"%-15s %s","RBBS/QuickBBS","DORINFO#.DEF");
        !           879:                                sprintf(opt[k++],"%-15s %s","Wildcat","CALLINFO.BBS");
        !           880:                                sprintf(opt[k++],"%-15s %s","PCBoard","PCBOARD.SYS");
        !           881:                                sprintf(opt[k++],"%-15s %s","SpitFire","SFDOORS.DAT");
        !           882:                                sprintf(opt[k++],"%-15s %s","MegaMail","UTIDOOR.TXT");
        !           883:                                sprintf(opt[k++],"%-15s %s","Solar Realms","DOORFILE.SR");
        !           884:                                sprintf(opt[k++],"%-15s %s","RBBS/QuickBBS","DORINFO1.DEF");
        !           885:                                sprintf(opt[k++],"%-15s %s","TriBBS","TRIBBS.SYS");
        !           886:                                opt[k][0]=0;
        !           887:                                k=xtrn[i]->type;
        !           888:                                SETHELP(WHERE);
        !           889: /*
        !           890: &Online Program BBS Drop File Type:&
        !           891: 
        !           892: If this online program requires a specific BBS data (drop) file
        !           893: format, select the file format from the list.
        !           894: */
        !           895:                                savnum=4;
        !           896:                                k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0
        !           897:                                        ,"BBS Drop File Type",opt);
        !           898:                                if(k==-1)
        !           899:                                        break;
        !           900:                                if(xtrn[i]->type!=k) {
        !           901:                                        xtrn[i]->type=k;
        !           902:                                        changes=1; }
        !           903:                                if(xtrn[i]->type && uq&UQ_ALIASES) {
        !           904:                                        strcpy(opt[0],"Yes");
        !           905:                                        strcpy(opt[1],"No");
        !           906:                                        opt[2][0]=0;
        !           907:                                        k=1;
        !           908:                                        k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0,"Use Real Names",opt);
        !           909:                                        if(k==0 && !(xtrn[i]->misc&REALNAME)) {
        !           910:                                                xtrn[i]->misc|=REALNAME;
        !           911:                                                changes=1; }
        !           912:                                        else if(k==1 && xtrn[i]->misc&REALNAME) {
        !           913:                                                xtrn[i]->misc&=~REALNAME;
        !           914:                                                changes=1; } }
        !           915:                                break;
        !           916:                        case 14:
        !           917:                                k=0;
        !           918:                                strcpy(opt[0],"Node Directory");
        !           919:                                strcpy(opt[1],"Start-up Directory");
        !           920:                                opt[2][0]=0;
        !           921:                                SETHELP(WHERE);
        !           922: /*
        !           923: &Directory for Drop File:&
        !           924: 
        !           925: You can have the data file created in the current &Node Directory& or the
        !           926: &Start-up Directory& (if one is specified).
        !           927: */
        !           928:                                savnum=4;
        !           929:                                k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0,"Create Drop File In"
        !           930:                     ,opt);
        !           931:                                if(!k && xtrn[i]->misc&STARTUPDIR) {
        !           932:                                        xtrn[i]->misc&=~STARTUPDIR;
        !           933:                     changes=1; }
        !           934:                                else if(k==1 && !(xtrn[i]->misc&STARTUPDIR)) {
        !           935:                                        xtrn[i]->misc|=STARTUPDIR;
        !           936:                     changes=1; }
        !           937:                                break;
        !           938:                        case 15:
        !           939:                                while(1) {
        !           940:                                        k=0;
        !           941:                                        if(xtrn[i]->textra)
        !           942:                                                sprintf(str,"%u minutes",xtrn[i]->textra);
        !           943:                                        else
        !           944:                                                strcpy(str,"None");
        !           945:                                        sprintf(opt[k++],"%-25.25s%s","Extra Time",str);
        !           946:                                        if(xtrn[i]->maxtime)
        !           947:                                                sprintf(str,"%u minutes",xtrn[i]->maxtime);
        !           948:                                        else
        !           949:                                                strcpy(str,"None");
        !           950:                                        sprintf(opt[k++],"%-25.25s%s","Maximum Time",str);
        !           951:                                        sprintf(opt[k++],"%-25.25s%s","Suspended (Free) Time"
        !           952:                                                ,xtrn[i]->misc&FREETIME ? "Yes" : "No");
        !           953:                                        opt[k][0]=0;
        !           954:                                        SETHELP(WHERE);
        !           955: /*
        !           956: &Online Program Time Options:&
        !           957: 
        !           958: This sub-menu allows you to define specific preferences regarding the
        !           959: time users spend running this program.
        !           960: */
        !           961:                                        savnum=4;
        !           962:                                        k=ulist(WIN_SAV|WIN_ACT|WIN_RHT|WIN_BOT,0,0,40
        !           963:                                                ,&time_dflt,0
        !           964:                                                ,"Online Program Time Options",opt);
        !           965:                                        if(k==-1)
        !           966:                                                break;
        !           967:                                        savnum=5;
        !           968:                                        switch(k) {
        !           969:                                                case 0:
        !           970:                                                        itoa(xtrn[i]->textra,str,10);
        !           971:                                                        SETHELP(WHERE);
        !           972: /*
        !           973: &Extra Time to Give User in Program:&
        !           974: 
        !           975: If you want to give users extra time while in this online program,
        !           976: set this value to the number of minutes to add to their current time
        !           977: left online.
        !           978: */
        !           979:                                                        uinput(WIN_MID|WIN_SAV,0,0
        !           980:                                                                ,"Extra Time to Give User (in minutes)"
        !           981:                                                                ,str,2,K_EDIT|K_NUMBER);
        !           982:                                                        xtrn[i]->textra=atoi(str);
        !           983:                                                        break;
        !           984:                                                case 1:
        !           985:                                                        itoa(xtrn[i]->maxtime,str,10);
        !           986:                                                        SETHELP(WHERE);
        !           987: /*
        !           988: &Maximum Time Allowed in Program:&
        !           989: 
        !           990: If this program supports a drop file that contains the number of minutes
        !           991: left online for the current user, this option allows the sysop to set
        !           992: the maximum number of minutes that will be allowed in the drop file.
        !           993: 
        !           994: Setting this option to &0&, disables this feature.
        !           995: */
        !           996:                                                        uinput(WIN_MID|WIN_SAV,0,0
        !           997:                                                                ,"Maximum Time (in minutes, 0=disabled)"
        !           998:                                                                ,str,2,K_EDIT|K_NUMBER);
        !           999:                                                        xtrn[i]->maxtime=atoi(str);
        !          1000:                                                        break;
        !          1001:                                                case 2:
        !          1002:                                                        k=1;
        !          1003:                                                        strcpy(opt[0],"Yes");
        !          1004:                                                        strcpy(opt[1],"No");
        !          1005:                                                        opt[2][0]=0;
        !          1006:                                                        SETHELP(WHERE);
        !          1007: /*
        !          1008: &Suspended (Free) Time:&
        !          1009: 
        !          1010: If you want the user's time online to be suspended while running this
        !          1011: online program (e.g. Free Time), set this option to &Yes&.
        !          1012: */
        !          1013:                                                        k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0
        !          1014:                                                                ,"Suspended (Free) Time",opt);
        !          1015:                                                        if(!k && !(xtrn[i]->misc&FREETIME)) {
        !          1016:                                                                xtrn[i]->misc|=FREETIME;
        !          1017:                                                                changes=1; }
        !          1018:                                                        else if(k==1 && xtrn[i]->misc&FREETIME) {
        !          1019:                                                                xtrn[i]->misc&=~FREETIME;
        !          1020:                                                                changes=1; }
        !          1021:                                                        break; } }
        !          1022:                                        break;
        !          1023: 
        !          1024:                                } } }
        !          1025: }
        !          1026: 
        !          1027: void xedit_cfg()
        !          1028: {
        !          1029:        static int dflt,dfltopt,bar;
        !          1030:        char str[81],code[81],done=0,*p;
        !          1031:        int j,k;
        !          1032:        uint i;
        !          1033:        static xedit_t savxedit;
        !          1034: 
        !          1035: while(1) {
        !          1036:        for(i=0;i<total_xedits && i<MAX_OPTS;i++)
        !          1037:                sprintf(opt[i],"%-8.8s    %.40s",xedit[i]->code,xedit[i]->lcmd);
        !          1038:        opt[i][0]=0;
        !          1039:        j=WIN_SAV|WIN_ACT|WIN_CHE|WIN_RHT;
        !          1040:        savnum=0;
        !          1041:        if(total_xedits)
        !          1042:                j|=WIN_DEL|WIN_GET;
        !          1043:        if(total_xedits<MAX_OPTS)
        !          1044:                j|=WIN_INS|WIN_INSACT|WIN_XTR;
        !          1045:        if(savxedit.name[0])
        !          1046:                j|=WIN_PUT;
        !          1047:        SETHELP(WHERE);
        !          1048: /*
        !          1049: &External Editors:&
        !          1050: 
        !          1051: This is a list of the configured external editors.
        !          1052: 
        !          1053: To add an editor, select the desired location and hit  INS .
        !          1054: 
        !          1055: To delete an editor, select it and hit  DEL .
        !          1056: 
        !          1057: To configure an editor, select it and hit  ENTER .
        !          1058: */
        !          1059:        i=ulist(j,0,0,45,&dflt,&bar,"External Editors",opt);
        !          1060:        if((signed)i==-1)
        !          1061:                return;
        !          1062:        if((i&MSK_ON)==MSK_INS) {
        !          1063:                i&=MSK_OFF;
        !          1064:                SETHELP(WHERE);
        !          1065: /*
        !          1066: &External Editor Name:&
        !          1067: 
        !          1068: This is the name or description of the external editor.
        !          1069: */
        !          1070:                if(uinput(WIN_MID|WIN_SAV,0,0,"External Editor Name",str,40
        !          1071:                        ,0)<1)
        !          1072:             continue;
        !          1073:                sprintf(code,"%.8s",str);
        !          1074:                p=strchr(code,SP);
        !          1075:                if(p) *p=0;
        !          1076:         strupr(code);
        !          1077:                SETHELP(WHERE);
        !          1078: /*
        !          1079: &External Editor Internal Code:&
        !          1080: 
        !          1081: This is the internal code for the external editor.
        !          1082: */
        !          1083:                if(uinput(WIN_MID|WIN_SAV,0,0,"External Editor Internal Code",code,8
        !          1084:                        ,K_UPPER|K_EDIT)<1)
        !          1085:             continue;
        !          1086:                if(!code_ok(code)) {
        !          1087:                        helpbuf=invalid_code;
        !          1088:                        umsg("Invalid Code");
        !          1089:                        helpbuf=0;
        !          1090:             continue; }
        !          1091: 
        !          1092:                if((xedit=(xedit_t **)REALLOC(xedit
        !          1093:             ,sizeof(xedit_t *)*(total_xedits+1)))==NULL) {
        !          1094:             errormsg(WHERE,ERR_ALLOC,nulstr,total_xedits+1);
        !          1095:                        total_xedits=0;
        !          1096:                        bail(1);
        !          1097:             continue; }
        !          1098:                if(total_xedits)
        !          1099:                        for(j=total_xedits;j>i;j--)
        !          1100:                                xedit[j]=xedit[j-1];
        !          1101:                if((xedit[i]=(xedit_t *)MALLOC(sizeof(xedit_t)))==NULL) {
        !          1102:                        errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(xedit_t));
        !          1103:                        continue; }
        !          1104:                memset((xedit_t *)xedit[i],0,sizeof(xedit_t));
        !          1105:                strcpy(xedit[i]->name,str);
        !          1106:                strcpy(xedit[i]->code,code);
        !          1107:                total_xedits++;
        !          1108:                changes=1;
        !          1109:                continue; }
        !          1110:        if((i&MSK_ON)==MSK_DEL) {
        !          1111:                i&=MSK_OFF;
        !          1112:                FREE(xedit[i]);
        !          1113:                total_xedits--;
        !          1114:                for(j=i;j<total_xedits;j++)
        !          1115:                        xedit[j]=xedit[j+1];
        !          1116:                changes=1;
        !          1117:                continue; }
        !          1118:        if((i&MSK_ON)==MSK_GET) {
        !          1119:                i&=MSK_OFF;
        !          1120:                savxedit=*xedit[i];
        !          1121:                continue; }
        !          1122:        if((i&MSK_ON)==MSK_PUT) {
        !          1123:                i&=MSK_OFF;
        !          1124:                *xedit[i]=savxedit;
        !          1125:                changes=1;
        !          1126:         continue; }
        !          1127:        done=0;
        !          1128:        while(!done) {
        !          1129:                k=0;
        !          1130:                sprintf(opt[k++],"%-32.32s%s","Name",xedit[i]->name);
        !          1131:                sprintf(opt[k++],"%-32.32s%s","Internal Code",xedit[i]->code);
        !          1132:                sprintf(opt[k++],"%-32.32s%.40s","Local Command Line",xedit[i]->lcmd);
        !          1133:                sprintf(opt[k++],"%-32.32s%.40s","Remote Command Line",xedit[i]->rcmd);
        !          1134:                sprintf(opt[k++],"%-32.32s%.40s","Access Requirements",xedit[i]->ar);
        !          1135:                sprintf(opt[k++],"%-32.32s%s%s","Intercept I/O Interrupts"
        !          1136:                        ,xedit[i]->misc&IO_INTS ? "Yes":"No"
        !          1137:                        ,xedit[i]->misc&WWIVCOLOR ? ", WWIV" : nulstr);
        !          1138:                sprintf(opt[k++],"%-32.32s%s","Quoted Text"
        !          1139:                        ,xedit[i]->misc&QUOTEALL ? "All":xedit[i]->misc&QUOTENONE
        !          1140:                                ? "None" : "Prompt User");
        !          1141:                sprintf(opt[k++],"%-32.32s%s","QuickBBS Style (MSGTMP)"
        !          1142:                        ,xedit[i]->misc&QUICKBBS ? "Yes":"No");
        !          1143:                sprintf(opt[k++],"%-32.32s%s","Expand Line Feeds to CRLF"
        !          1144:                        ,xedit[i]->misc&EXPANDLF ? "Yes":"No");
        !          1145:                switch(xedit[i]->type) {
        !          1146:                        case XTRN_SBBS:
        !          1147:                                sprintf(str,"%-15s %s","Synchronet","XTRN.DAT");
        !          1148:                                break;
        !          1149:                        case XTRN_WWIV:
        !          1150:                                sprintf(str,"%-15s %s","WWIV","CHAIN.TXT");
        !          1151:                                break;
        !          1152:                        case XTRN_GAP:
        !          1153:                                sprintf(str,"%-15s %s","GAP","DOOR.SYS");
        !          1154:                                break;
        !          1155:                        case XTRN_RBBS:
        !          1156:                                sprintf(str,"%-15s %s","RBBS/QuickBBS","DORINFO#.DEF");
        !          1157:                                break;
        !          1158:                        case XTRN_RBBS1:
        !          1159:                                sprintf(str,"%-15s %s","RBBS/QuickBBS","DORINFO1.DEF");
        !          1160:                 break;
        !          1161:                        case XTRN_WILDCAT:
        !          1162:                                sprintf(str,"%-15s %s","Wildcat","CALLINFO.BBS");
        !          1163:                                break;
        !          1164:                        case XTRN_PCBOARD:
        !          1165:                                sprintf(str,"%-15s %s","PCBoard","PCBOARD.SYS");
        !          1166:                                break;
        !          1167:                        case XTRN_SPITFIRE:
        !          1168:                                sprintf(str,"%-15s %s","SpitFire","SFDOORS.DAT");
        !          1169:                                break;
        !          1170:                        case XTRN_UTI:
        !          1171:                                sprintf(str,"%-15s %s","MegaMail","UTIDOOR.TXT");
        !          1172:                                break;
        !          1173:                        case XTRN_SR:
        !          1174:                                sprintf(str,"%-15s %s","Solar Realms","DOORFILE.SR");
        !          1175:                                break;
        !          1176:                        case XTRN_TRIBBS:
        !          1177:                                sprintf(str,"%-15s %s","TriBBS","TRIBBS.SYS");
        !          1178:                 break;
        !          1179:                        default:
        !          1180:                                strcpy(str,"None");
        !          1181:                 break; }
        !          1182:                sprintf(opt[k++],"%-32.32s%s","BBS Drop File Type",str);
        !          1183:         opt[k][0]=0;
        !          1184:                SETHELP(WHERE);
        !          1185: /*
        !          1186: &External Editor Configuration:&
        !          1187: 
        !          1188: This menu allows you to change the settings for the selected external
        !          1189: message editor. External message editors are very common on BBSs. Some
        !          1190: popular editors include &SyncEdit&, &WWIVedit&, &FEdit&, &GEdit&, &IceEdit&,
        !          1191: and many others.
        !          1192: */
        !          1193: 
        !          1194:                savnum=1;
        !          1195:                sprintf(str,"%s Editor",xedit[i]->name);
        !          1196:                switch(ulist(WIN_SAV|WIN_ACT|WIN_L2R|WIN_BOT,0,0,70,&dfltopt,0
        !          1197:                        ,str,opt)) {
        !          1198:                        case -1:
        !          1199:                                done=1;
        !          1200:                                break;
        !          1201:                        case 0:
        !          1202:                                SETHELP(WHERE);
        !          1203: /*
        !          1204: &External Editor Name:&
        !          1205: 
        !          1206: This is the name or description of the external editor.
        !          1207: */
        !          1208:                                strcpy(str,xedit[i]->name);
        !          1209:                                if(!uinput(WIN_MID|WIN_SAV,0,10,"External Editor Name"
        !          1210:                                        ,xedit[i]->name,40,K_EDIT))
        !          1211:                                        strcpy(xedit[i]->name,str);
        !          1212:                                break;
        !          1213:                        case 1:
        !          1214:                                strcpy(str,xedit[i]->code);
        !          1215:                                SETHELP(WHERE);
        !          1216: /*
        !          1217: &External Editor Internal Code:&
        !          1218: 
        !          1219: Every external editor must have its own unique internal code for
        !          1220: Synchronet to reference it by. It is helpful if this code is an
        !          1221: abreviation of the name.
        !          1222: */
        !          1223:                                uinput(WIN_MID|WIN_SAV,0,17,"Internal Code (unique)"
        !          1224:                                        ,str,8,K_EDIT|K_UPPER);
        !          1225:                                if(code_ok(str))
        !          1226:                                        strcpy(xedit[i]->code,str);
        !          1227:                                else {
        !          1228:                                        helpbuf=invalid_code;
        !          1229:                                        umsg("Invalid Code");
        !          1230:                                        helpbuf=0; }
        !          1231:                 break;
        !          1232:                        case 2:
        !          1233:                                SETHELP(WHERE);
        !          1234: /*
        !          1235: &External Editor Local Command Line:&
        !          1236: 
        !          1237: This is the command line to execute when using this editor locally.
        !          1238: */
        !          1239:                                uinput(WIN_MID|WIN_SAV,0,10,"Local"
        !          1240:                                        ,xedit[i]->lcmd,50,K_EDIT);
        !          1241:                                break;
        !          1242: 
        !          1243:                   case 3:
        !          1244:                                SETHELP(WHERE);
        !          1245: /*
        !          1246: &External Editor Remote Command Line:&
        !          1247: 
        !          1248: This is the command line to execute when using this editor remotely.
        !          1249: */
        !          1250:                                uinput(WIN_MID|WIN_SAV,0,10,"Remote"
        !          1251:                                        ,xedit[i]->rcmd,50,K_EDIT);
        !          1252:                                break;
        !          1253:                        case 4:
        !          1254:                                savnum=2;
        !          1255:                                sprintf(str,"%s External Editor",xedit[i]->name);
        !          1256:                                getar(str,xedit[i]->ar);
        !          1257:                                break;
        !          1258:                        case 5:
        !          1259:                                k=1;
        !          1260:                                strcpy(opt[0],"Yes");
        !          1261:                                strcpy(opt[1],"No");
        !          1262:                                opt[2][0]=0;
        !          1263:                                savnum=2;
        !          1264:                                SETHELP(WHERE);
        !          1265: /*
        !          1266: &Intercept I/O Interrupts:&
        !          1267: 
        !          1268: If this external editor has its own serial communication abilities or
        !          1269: requires a FOSSIL driver, set this option to &No&.
        !          1270: */
        !          1271:                                k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0,"Intercept I/O Interrupts"
        !          1272:                                        ,opt);
        !          1273:                                if(!k && !(xedit[i]->misc&IO_INTS)) {
        !          1274:                                        xedit[i]->misc|=IO_INTS;
        !          1275:                                        changes=1; }
        !          1276:                                else if(k==1 && xedit[i]->misc&IO_INTS) {
        !          1277:                                        xedit[i]->misc&=~(IO_INTS|WWIVCOLOR);
        !          1278:                                        changes=1; }
        !          1279:                                if(!(xedit[i]->misc&IO_INTS))
        !          1280:                                        break;
        !          1281:                                k=1;
        !          1282:                                strcpy(opt[0],"Yes");
        !          1283:                                strcpy(opt[1],"No");
        !          1284:                                opt[2][0]=0;
        !          1285:                                savnum=2;
        !          1286:                                SETHELP(WHERE);
        !          1287: /*
        !          1288: &Editor Uses WWIV Color Codes:&
        !          1289: 
        !          1290: If this editor was written for use exclusively under WWIV, set this
        !          1291: option to &Yes&.
        !          1292: */
        !          1293:                                k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0
        !          1294:                                        ,"Editor Uses WWIV Color Codes",opt);
        !          1295:                                if(!k && !(xedit[i]->misc&WWIVCOLOR)) {
        !          1296:                                        xedit[i]->misc|=WWIVCOLOR;
        !          1297:                                        changes=1; }
        !          1298:                                else if(k==1 && xedit[i]->misc&WWIVCOLOR) {
        !          1299:                                        xedit[i]->misc&=~WWIVCOLOR;
        !          1300:                     changes=1; }
        !          1301:                 break;
        !          1302:                        case 6:
        !          1303:                                k=3;
        !          1304:                                strcpy(opt[0],"All");
        !          1305:                                strcpy(opt[1],"None");
        !          1306:                                strcpy(opt[2],"Prompt User");
        !          1307:                                opt[3][0]=0;
        !          1308:                                savnum=2;
        !          1309:                                SETHELP(WHERE);
        !          1310: /*
        !          1311: &Quoted Text:&
        !          1312: 
        !          1313: If you want all the message text to be automatically entered into the
        !          1314: message edit/quote file (&INPUT.MSG& or &MSGTMP&), select &All&.
        !          1315: 
        !          1316: If you want the user to be prompted for which lines to quote before
        !          1317: running the editor, select &Prompt User&.
        !          1318: 
        !          1319: If you want none of the lines to be automatically quoted, select &None&.
        !          1320: This option is mainly for use with editors that support the "ES.TXT&
        !          1321: drop file (like &SyncEdit v2.x&).
        !          1322: */
        !          1323:                                k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0,"Quoted Text"
        !          1324:                                        ,opt);
        !          1325:                                if(!k && !(xedit[i]->misc&QUOTEALL)) {
        !          1326:                                        xedit[i]->misc|=QUOTEALL;
        !          1327:                                        xedit[i]->misc&=~QUOTENONE;
        !          1328:                                        changes=1; }
        !          1329:                                else if(k==1 && !(xedit[i]->misc&QUOTENONE)) {
        !          1330:                                        xedit[i]->misc|=QUOTENONE;
        !          1331:                                        xedit[i]->misc&=~QUOTEALL;
        !          1332:                     changes=1; }
        !          1333:                                else if(k==2 && xedit[i]->misc&(QUOTENONE|QUOTEALL)) {
        !          1334:                                        xedit[i]->misc&=~(QUOTENONE|QUOTEALL);
        !          1335:                                        changes=1; }
        !          1336:                 break;
        !          1337:                        case 7:
        !          1338:                                k=1;
        !          1339:                                strcpy(opt[0],"Yes");
        !          1340:                                strcpy(opt[1],"No");
        !          1341:                                opt[2][0]=0;
        !          1342:                                savnum=2;
        !          1343:                                SETHELP(WHERE);
        !          1344: /*
        !          1345: &QuickBBS Style (MSGTMP):&
        !          1346: 
        !          1347: If this external editor uses the QuickBBS style MSGTMP interface, set
        !          1348: this option to &Yes&.
        !          1349: */
        !          1350:                                k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0,"QuickBBS Style (MSGTMP)"
        !          1351:                                        ,opt);
        !          1352:                                if(!k && !(xedit[i]->misc&QUICKBBS)) {
        !          1353:                                        xedit[i]->misc|=QUICKBBS;
        !          1354:                                        changes=1; }
        !          1355:                                else if(k==1 && xedit[i]->misc&QUICKBBS) {
        !          1356:                                        xedit[i]->misc&=~QUICKBBS;
        !          1357:                     changes=1; }
        !          1358:                                break;
        !          1359:                        case 8:
        !          1360:                                k=1;
        !          1361:                                strcpy(opt[0],"Yes");
        !          1362:                                strcpy(opt[1],"No");
        !          1363:                                opt[2][0]=0;
        !          1364:                                savnum=2;
        !          1365:                                SETHELP(WHERE);
        !          1366: /*
        !          1367: &Expand Line Feeds to Carriage Return/Line Feed Pairs:&
        !          1368: 
        !          1369: If this external editor saves new lines as a single line feed character
        !          1370: instead of a carriage return/line feed pair, set this option to &Yes&.
        !          1371: */
        !          1372:                                k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0,"Expand LF to CRLF"
        !          1373:                                        ,opt);
        !          1374:                                if(!k && !(xedit[i]->misc&EXPANDLF)) {
        !          1375:                                        xedit[i]->misc|=EXPANDLF;
        !          1376:                                        changes=1; }
        !          1377:                                else if(k==1 && xedit[i]->misc&EXPANDLF) {
        !          1378:                                        xedit[i]->misc&=~EXPANDLF;
        !          1379:                     changes=1; }
        !          1380:                                break;
        !          1381:                        case 9:
        !          1382:                                k=0;
        !          1383:                                strcpy(opt[k++],"None");
        !          1384:                                sprintf(opt[k++],"%-15s %s","Synchronet","XTRN.DAT");
        !          1385:                                sprintf(opt[k++],"%-15s %s","WWIV","CHAIN.TXT");
        !          1386:                                sprintf(opt[k++],"%-15s %s","GAP","DOOR.SYS");
        !          1387:                                sprintf(opt[k++],"%-15s %s","RBBS/QuickBBS","DORINFO#.DEF");
        !          1388:                                sprintf(opt[k++],"%-15s %s","Wildcat","CALLINFO.BBS");
        !          1389:                                sprintf(opt[k++],"%-15s %s","PCBoard","PCBOARD.SYS");
        !          1390:                                sprintf(opt[k++],"%-15s %s","SpitFire","SFDOORS.DAT");
        !          1391:                                sprintf(opt[k++],"%-15s %s","MegaMail","UTIDOOR.TXT");
        !          1392:                                sprintf(opt[k++],"%-15s %s","Solar Realms","DOORFILE.SR");
        !          1393:                                sprintf(opt[k++],"%-15s %s","RBBS/QuickBBS","DORINFO1.DEF");
        !          1394:                                sprintf(opt[k++],"%-15s %s","TriBBS","TRIBBS.SYS");
        !          1395:                                opt[k][0]=0;
        !          1396:                                k=xedit[i]->type;
        !          1397:                                SETHELP(WHERE);
        !          1398: /*
        !          1399: &External Program BBS Drop File Type:&
        !          1400: 
        !          1401: If this external editor requires a specific BBS data (drop) file
        !          1402: format, select the file format from the list.
        !          1403: */
        !          1404:                                savnum=2;
        !          1405:                                k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0
        !          1406:                                        ,"BBS Drop File Type",opt);
        !          1407:                                if(k==-1)
        !          1408:                                        break;
        !          1409:                                if(xedit[i]->type!=k) {
        !          1410:                                        xedit[i]->type=k;
        !          1411:                                        changes=1; }
        !          1412:                                break;
        !          1413: 
        !          1414:                                } } }
        !          1415: }
        !          1416: 
        !          1417: 
        !          1418: void swap_cfg()
        !          1419: {
        !          1420:        static int dflt,bar;
        !          1421:        char str[81];
        !          1422:        int j,k;
        !          1423:        uint i;
        !          1424: 
        !          1425: while(1) {
        !          1426:        for(i=0;i<MAX_OPTS && i<total_swaps;i++)
        !          1427:                sprintf(opt[i],"%-25s",swap[i]->cmd);
        !          1428:        opt[i][0]=0;
        !          1429:        j=WIN_ACT|WIN_CHE|WIN_L2R|WIN_SAV;
        !          1430:        savnum=0;
        !          1431:        if(total_swaps)
        !          1432:                j|=WIN_DEL;
        !          1433:        if(total_swaps<MAX_OPTS)
        !          1434:                j|=WIN_INS|WIN_INSACT|WIN_XTR;
        !          1435:        SETHELP(WHERE);
        !          1436: /*
        !          1437: &External Program Global Swap List:&
        !          1438: 
        !          1439: This is a list of the external program (executable file) names to swap
        !          1440: the BBS out of memory for. They are termed &Global& because if you add
        !          1441: a program name to this list, the BBS will swap to run it regardless of
        !          1442: when, where, or why the program is run from the BBS.
        !          1443: 
        !          1444: Use  INS  and  DELETE  to add and remove swappable programs.
        !          1445: 
        !          1446: To change the filename of a program, hit  ENTER .
        !          1447: 
        !          1448: To swap whenever &PKZIP& is run, add &PKZIP& to the list.
        !          1449: 
        !          1450: To swap for all &DOS Shells&, add &COMMAND.COM& to the list.
        !          1451: */
        !          1452:        i=ulist(j,0,0,17,&dflt,&bar,"Global Swap List",opt);
        !          1453:        if((signed)i==-1)
        !          1454:                return;
        !          1455:        if((i&MSK_ON)==MSK_INS) {
        !          1456:                i&=MSK_OFF;
        !          1457:                SETHELP(WHERE);
        !          1458: /*
        !          1459: &Swappable Program Name:&
        !          1460: 
        !          1461: This is the executable filename of the external program.
        !          1462: */
        !          1463:                if(uinput(WIN_MID|WIN_SAV,0,0,"Program Name",str,12
        !          1464:                        ,K_UPPER)<1)
        !          1465:             continue;
        !          1466:                if((swap=(swap_t **)REALLOC(swap
        !          1467:                        ,sizeof(swap_t *)*(total_swaps+1)))==NULL) {
        !          1468:                        errormsg(WHERE,ERR_ALLOC,nulstr,total_swaps+1);
        !          1469:                        total_swaps=0;
        !          1470:                        bail(1);
        !          1471:             continue; }
        !          1472:                if(total_swaps)
        !          1473:                        for(j=total_swaps;j>i;j--)
        !          1474:                                swap[j]=swap[j-1];
        !          1475:                if((swap[i]=(swap_t *)MALLOC(sizeof(swap_t)))==NULL) {
        !          1476:                        errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(swap_t));
        !          1477:                        continue; }
        !          1478:                memset((swap_t *)swap[i],0,sizeof(swap_t));
        !          1479:                strcpy(swap[i]->cmd,str);
        !          1480:                total_swaps++;
        !          1481:                changes=1;
        !          1482:                continue; }
        !          1483:        if((i&MSK_ON)==MSK_DEL) {
        !          1484:                i&=MSK_OFF;
        !          1485:                FREE(swap[i]);
        !          1486:                total_swaps--;
        !          1487:                for(j=i;j<total_swaps;j++)
        !          1488:                        swap[j]=swap[j+1];
        !          1489:                changes=1;
        !          1490:                continue; }
        !          1491:        SETHELP(WHERE);
        !          1492: /*
        !          1493: &Swappable Program Name:&
        !          1494: 
        !          1495: This is the executable filename of the external program.
        !          1496: */
        !          1497:        strcpy(str,swap[i]->cmd);
        !          1498:        if(uinput(WIN_MID|WIN_SAV,0,5,"Program Name",str,12
        !          1499:                ,K_UPPER|K_EDIT)>0)
        !          1500:                strcpy(swap[i]->cmd,str); }
        !          1501: }
        !          1502: 
        !          1503: int os2pgm_cfg()
        !          1504: {
        !          1505:        static int dflt,bar;
        !          1506:        char str[81];
        !          1507:        int j,k;
        !          1508:        uint i;
        !          1509: 
        !          1510: while(1) {
        !          1511:        for(i=0;i<MAX_OPTS && i<total_os2pgms;i++)
        !          1512:                sprintf(opt[i],"%-12s %-12s",os2pgm[i]->name
        !          1513:                        ,os2pgm[i]->misc&OS2_POPEN ? "(port open)":nulstr);
        !          1514:        opt[i][0]=0;
        !          1515:        j=WIN_ACT|WIN_CHE|WIN_L2R|WIN_SAV;
        !          1516:        savnum=0;
        !          1517:        if(total_os2pgms)
        !          1518:                j|=WIN_DEL;
        !          1519:        if(total_os2pgms<MAX_OPTS)
        !          1520:                j|=WIN_INS|WIN_INSACT|WIN_XTR;
        !          1521:        SETHELP(WHERE);
        !          1522: /*
        !          1523: &OS/2 Program List:&
        !          1524: 
        !          1525: This is a list of all native OS/2 external program (executable file)
        !          1526: names that you may execute under &Synchronet for OS/2&. This list is not
        !          1527: used in Synchronet for DOS. Any programs not listed here will be assumed
        !          1528: to be DOS programs and executed accordingly.
        !          1529: 
        !          1530: Use  INS  and  DELETE  to add and remove OS/2 programs.
        !          1531: 
        !          1532: To change the filename of a program, hit  ENTER .
        !          1533: */
        !          1534:        i=ulist(j,0,0,30,&dflt,&bar,"OS/2 Program List",opt);
        !          1535:        if((signed)i==-1)
        !          1536:                break;
        !          1537:        if((i&MSK_ON)==MSK_INS) {
        !          1538:                i&=MSK_OFF;
        !          1539:                SETHELP(WHERE);
        !          1540: /*
        !          1541: &OS/2 Program Name:&
        !          1542: 
        !          1543: This is the executable filename of the OS/2 external program.
        !          1544: */
        !          1545:                if(uinput(WIN_MID|WIN_SAV,0,0,"OS/2 Program Name",str,12
        !          1546:                        ,K_UPPER)<1)
        !          1547:             continue;
        !          1548:                if((os2pgm=(os2pgm_t **)REALLOC(os2pgm
        !          1549:                        ,sizeof(os2pgm_t *)*(total_os2pgms+1)))==NULL) {
        !          1550:                        errormsg(WHERE,ERR_ALLOC,nulstr,total_os2pgms+1);
        !          1551:                        total_os2pgms=0;
        !          1552:                        bail(1);
        !          1553:             continue; }
        !          1554:                if(total_os2pgms)
        !          1555:                        for(j=total_os2pgms;j>i;j--)
        !          1556:                                os2pgm[j]=os2pgm[j-1];
        !          1557:                if((os2pgm[i]=(os2pgm_t *)MALLOC(sizeof(os2pgm_t)))==NULL) {
        !          1558:                        errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(os2pgm_t));
        !          1559:                        continue; }
        !          1560:                memset((os2pgm_t *)os2pgm[i],0,sizeof(os2pgm_t));
        !          1561:                strcpy(os2pgm[i]->name,str);
        !          1562: 
        !          1563:                SETHELP(WHERE);
        !          1564: /*
        !          1565: &Leave COM Port Open During Execution:&
        !          1566: 
        !          1567: If this program accesses the COM port via handle (currently open COM
        !          1568: port), set this option to &Yes&, otherwise set it to &No&.
        !          1569: */
        !          1570:                strcpy(opt[0],"Yes (This Program Uses Port Handle)");
        !          1571:                strcpy(opt[1],"No  (This Program Uses Port Number)");
        !          1572:                opt[2][0]=0;
        !          1573:                j=1;
        !          1574:                if(ulist(WIN_MID|WIN_SAV,0,0,0,&j,0
        !          1575:                        ,"Leave COM Port Open During Execution?",opt)==0)
        !          1576:                        os2pgm[i]->misc|=OS2_POPEN;
        !          1577:                total_os2pgms++;
        !          1578:                changes=1;
        !          1579:                continue; }
        !          1580:        if((i&MSK_ON)==MSK_DEL) {
        !          1581:                i&=MSK_OFF;
        !          1582:                FREE(os2pgm[i]);
        !          1583:                total_os2pgms--;
        !          1584:                for(j=i;j<total_os2pgms;j++)
        !          1585:                        os2pgm[j]=os2pgm[j+1];
        !          1586:                changes=1;
        !          1587:                continue; }
        !          1588:        SETHELP(WHERE);
        !          1589: /*
        !          1590: &OS/2 Program Name:&
        !          1591: 
        !          1592: This is the executable filename of the OS/2 external program.
        !          1593: */
        !          1594:        strcpy(str,os2pgm[i]->name);
        !          1595:        if(uinput(WIN_MID|WIN_SAV,0,5,"OS/2 Program Name",str,12
        !          1596:                ,K_UPPER|K_EDIT)>0)
        !          1597:                strcpy(os2pgm[i]->name,str);
        !          1598: 
        !          1599:        SETHELP(WHERE);
        !          1600: /*
        !          1601: &Leave COM Port Open During Execution:&
        !          1602: 
        !          1603: If this program accesses the COM port via handle (currently open COM
        !          1604: port), set this option to &Yes&, otherwise set it to &No&.
        !          1605: */
        !          1606:        strcpy(opt[0],"Yes (This Program Uses Port Handle)");
        !          1607:        strcpy(opt[1],"No  (This Program Uses Port Number)");
        !          1608:        opt[2][0]=0;
        !          1609:        j=1;
        !          1610:        savnum=1;
        !          1611:        j=ulist(WIN_MID|WIN_SAV,0,0,0,&j,0
        !          1612:                ,"Leave COM Port Open During Execution",opt);
        !          1613:        if(j==0 && !(os2pgm[i]->misc&OS2_POPEN)) {
        !          1614:                os2pgm[i]->misc|=OS2_POPEN;
        !          1615:                changes=1; }
        !          1616:        else if(j==1 && os2pgm[i]->misc&OS2_POPEN) {
        !          1617:                os2pgm[i]->misc&=~OS2_POPEN;
        !          1618:                changes=1; }
        !          1619:        }
        !          1620: return(0);
        !          1621: }
        !          1622: 
        !          1623: 
        !          1624: void xtrnsec_cfg()
        !          1625: {
        !          1626:        static int xtrnsec_dflt,xtrnsec_opt;
        !          1627:        char str[81],code[9],done=0,*p;
        !          1628:        int j,k;
        !          1629:        uint i;
        !          1630:        static xtrnsec_t savxtrnsec;
        !          1631: 
        !          1632: while(1) {
        !          1633:        for(i=0;i<total_xtrnsecs && i<MAX_OPTS;i++)
        !          1634:                sprintf(opt[i],"%-25s",xtrnsec[i]->name);
        !          1635:        opt[i][0]=0;
        !          1636:        j=WIN_SAV|WIN_ACT|WIN_CHE|WIN_BOT;
        !          1637:        savnum=0;
        !          1638:        if(total_xtrnsecs)
        !          1639:                j|=WIN_DEL|WIN_GET;
        !          1640:        if(total_xtrnsecs<MAX_OPTS)
        !          1641:                j|=WIN_INS|WIN_INSACT|WIN_XTR;
        !          1642:        if(savxtrnsec.name[0])
        !          1643:                j|=WIN_PUT;
        !          1644:        SETHELP(WHERE);
        !          1645: /*
        !          1646: &Online Program Sections:&
        !          1647: 
        !          1648: This is a list of &Online Program Sections& configured for your system.
        !          1649: 
        !          1650: To add an online program section, select the desired location with the
        !          1651: arrow keys and hit  INS .
        !          1652: 
        !          1653: To delete an online program section, select it and hit  DEL .
        !          1654: 
        !          1655: To configure an online program section, select it and hit  ENTER .
        !          1656: */
        !          1657:        i=ulist(j,0,0,45,&xtrnsec_dflt,0,"Online Program Sections",opt);
        !          1658:        if((signed)i==-1)
        !          1659:                return;
        !          1660:        if((i&MSK_ON)==MSK_INS) {
        !          1661:                i&=MSK_OFF;
        !          1662:                SETHELP(WHERE);
        !          1663: /*
        !          1664: &Online Program Section Name:&
        !          1665: 
        !          1666: This is the name of this section.
        !          1667: */
        !          1668:                if(uinput(WIN_MID|WIN_SAV,0,0,"Online Program Section Name",str,40
        !          1669:                        ,0)<1)
        !          1670:             continue;
        !          1671:                sprintf(code,"%.8s",str);
        !          1672:                p=strchr(code,SP);
        !          1673:                if(p) *p=0;
        !          1674:         strupr(code);
        !          1675:                SETHELP(WHERE);
        !          1676: /*
        !          1677: &Online Program Section Internal Code:&
        !          1678: 
        !          1679: Every online program section must have its own unique internal code
        !          1680: for Synchronet to reference it by. It is helpful if this code is an
        !          1681: abreviation of the name.
        !          1682: */
        !          1683:                if(uinput(WIN_MID|WIN_SAV,0,0,"Online Program Section Internal Code"
        !          1684:                        ,code,8,K_EDIT|K_UPPER)<1)
        !          1685:                        continue;
        !          1686:                if(!code_ok(code)) {
        !          1687:                        helpbuf=invalid_code;
        !          1688:                        umsg("Invalid Code");
        !          1689:                        helpbuf=0;
        !          1690:             continue; }
        !          1691:                if((xtrnsec=(xtrnsec_t **)REALLOC(xtrnsec
        !          1692:                        ,sizeof(xtrnsec_t *)*(total_xtrnsecs+1)))==NULL) {
        !          1693:                        errormsg(WHERE,ERR_ALLOC,nulstr,total_xtrnsecs+1);
        !          1694:                        total_xtrnsecs=0;
        !          1695:                        bail(1);
        !          1696:                        continue; }
        !          1697:                if(total_xtrnsecs) {
        !          1698:                        for(j=total_xtrnsecs;j>i;j--)
        !          1699:                                xtrnsec[j]=xtrnsec[j-1];
        !          1700:                        for(j=0;j<total_xtrns;j++)
        !          1701:                                if(xtrn[j]->sec>=i)
        !          1702:                                        xtrn[j]->sec++; }
        !          1703: 
        !          1704: 
        !          1705:                if((xtrnsec[i]=(xtrnsec_t *)MALLOC(sizeof(xtrnsec_t)))==NULL) {
        !          1706:                        errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(xtrnsec_t));
        !          1707:                        continue; }
        !          1708:                memset((xtrnsec_t *)xtrnsec[i],0,sizeof(xtrnsec_t));
        !          1709:                strcpy(xtrnsec[i]->name,str);
        !          1710:                strcpy(xtrnsec[i]->code,code);
        !          1711:                total_xtrnsecs++;
        !          1712:                changes=1;
        !          1713:                continue; }
        !          1714:        if((i&MSK_ON)==MSK_DEL) {
        !          1715:                i&=MSK_OFF;
        !          1716:                FREE(xtrnsec[i]);
        !          1717:                for(j=0;j<total_xtrns;) {
        !          1718:                        if(xtrn[j]->sec==i) {    /* delete xtrns of this group */
        !          1719:                                FREE(xtrn[j]);
        !          1720:                                total_xtrns--;
        !          1721:                                k=j;
        !          1722:                                while(k<total_xtrns) {   /* move all xtrns down */
        !          1723:                                        xtrn[k]=xtrn[k+1];
        !          1724:                                        k++; } }
        !          1725:                        else j++; }
        !          1726:                for(j=0;j<total_xtrns;j++)       /* move xtrn group numbers down */
        !          1727:                        if(xtrn[j]->sec>i)
        !          1728:                                xtrn[j]->sec--;
        !          1729:                total_xtrnsecs--;
        !          1730:                while(i<total_xtrnsecs) {
        !          1731:                        xtrnsec[i]=xtrnsec[i+1];
        !          1732:             i++; }
        !          1733:                changes=1;
        !          1734:                continue; }
        !          1735:        if((i&MSK_ON)==MSK_GET) {
        !          1736:                i&=MSK_OFF;
        !          1737:                savxtrnsec=*xtrnsec[i];
        !          1738:                continue; }
        !          1739:        if((i&MSK_ON)==MSK_PUT) {
        !          1740:                i&=MSK_OFF;
        !          1741:                *xtrnsec[i]=savxtrnsec;
        !          1742:                changes=1;
        !          1743:         continue; }
        !          1744:        done=0;
        !          1745:        while(!done) {
        !          1746:                k=0;
        !          1747:                sprintf(opt[k++],"%-27.27s%s","Name",xtrnsec[i]->name);
        !          1748:                sprintf(opt[k++],"%-27.27s%s","Internal Code",xtrnsec[i]->code);
        !          1749:                sprintf(opt[k++],"%-27.27s%.40s","Access Requirements"
        !          1750:                        ,xtrnsec[i]->ar);
        !          1751:                sprintf(opt[k++],"%s","Available Online Programs...");
        !          1752:                opt[k][0]=0;
        !          1753:                savnum=1;
        !          1754:                sprintf(str,"%s Program Section",xtrnsec[i]->name);
        !          1755:                switch(ulist(WIN_SAV|WIN_ACT|WIN_MID,0,0,60,&xtrnsec_opt,0,str
        !          1756:                        ,opt)) {
        !          1757:                        case -1:
        !          1758:                                done=1;
        !          1759:                                break;
        !          1760:                        case 0:
        !          1761:                                SETHELP(WHERE);
        !          1762: /*
        !          1763: &Online Program Section Name:&
        !          1764: 
        !          1765: This is the name of this section.
        !          1766: */
        !          1767:                                strcpy(str,xtrnsec[i]->name);    /* save */
        !          1768:                                if(!uinput(WIN_MID|WIN_SAV,0,10
        !          1769:                                        ,"Online Program Section Name"
        !          1770:                                        ,xtrnsec[i]->name,40,K_EDIT))
        !          1771:                                        strcpy(xtrnsec[i]->name,str);
        !          1772:                                break;
        !          1773:                        case 1:
        !          1774:                                strcpy(str,xtrnsec[i]->code);
        !          1775:                                SETHELP(WHERE);
        !          1776: /*
        !          1777: &Online Program Section Internal Code:&
        !          1778: 
        !          1779: Every online program section must have its own unique internal code
        !          1780: for Synchronet to reference it by. It is helpful if this code is an
        !          1781: abreviation of the name.
        !          1782: */
        !          1783:                                uinput(WIN_MID|WIN_SAV,0,17,"Internal Code (unique)"
        !          1784:                                        ,str,8,K_EDIT|K_UPPER);
        !          1785:                                if(code_ok(str))
        !          1786:                                        strcpy(xtrnsec[i]->code,str);
        !          1787:                                else {
        !          1788:                                        helpbuf=invalid_code;
        !          1789:                                        umsg("Invalid Code");
        !          1790:                                        helpbuf=0; }
        !          1791:                                break;
        !          1792:                        case 2:
        !          1793:                                getar(xtrnsec[i]->name,xtrnsec[i]->ar);
        !          1794:                 break;
        !          1795:                        case 3:
        !          1796:                                xtrn_cfg(i);
        !          1797:                                break; } } }
        !          1798: }

unix.superglobalmegacorp.com

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