Annotation of sbbs/src/sbbs3/scfg/scfgmsg.c, revision 1.1.1.1

1.1       root        1: /* scfgmsg.c */
                      2: 
                      3: /* $Id: scfgmsg.c,v 1.32 2006/07/12 06:41:50 rswindell Exp $ */
                      4: 
                      5: /****************************************************************************
                      6:  * @format.tab-size 4          (Plain Text/Source Code File Header)                    *
                      7:  * @format.use-tabs true       (see http://www.synchro.net/ptsc_hdr.html)              *
                      8:  *                                                                                                                                                     *
                      9:  * Copyright 2003 Rob Swindell - http://www.synchro.net/copyright.html         *
                     10:  *                                                                                                                                                     *
                     11:  * This program is free software; you can redistribute it and/or                       *
                     12:  * modify it under the terms of the GNU General Public License                         *
                     13:  * as published by the Free Software Foundation; either version 2                      *
                     14:  * of the License, or (at your option) any later version.                                      *
                     15:  * See the GNU General Public License for more details: gpl.txt or                     *
                     16:  * http://www.fsf.org/copyleft/gpl.html                                                                                *
                     17:  *                                                                                                                                                     *
                     18:  * Anonymous FTP access to the most recent released source is available at     *
                     19:  * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net     *
                     20:  *                                                                                                                                                     *
                     21:  * Anonymous CVS access to the development source and modification history     *
                     22:  * is available at cvs.synchro.net:/cvsroot/sbbs, example:                                     *
                     23:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs login                       *
                     24:  *     (just hit return, no password is necessary)                                                     *
                     25:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src                *
                     26:  *                                                                                                                                                     *
                     27:  * For Synchronet coding style and modification guidelines, see                                *
                     28:  * http://www.synchro.net/source.html                                                                          *
                     29:  *                                                                                                                                                     *
                     30:  * You are encouraged to submit any modifications (preferably in Unix diff     *
                     31:  * format) via e-mail to [email protected]                                                                      *
                     32:  *                                                                                                                                                     *
                     33:  * Note: If this box doesn't appear square, then you need to fix your tabs.    *
                     34:  ****************************************************************************/
                     35: 
                     36: #include "scfg.h"
                     37: 
                     38: char *utos(char *str)
                     39: {
                     40:        static char out[128];
                     41:        int i;
                     42: 
                     43:        for(i=0;str[i] && i<sizeof(out)-1;i++)
                     44:                if(str[i]=='_')
                     45:                        out[i]=' ';
                     46:                else
                     47:                        out[i]=str[i];
                     48:        out[i]=0;
                     49:        return(out);
                     50: }
                     51: 
                     52: char *stou(char *str)
                     53: {
                     54:        static char out[128];
                     55:        int i;
                     56: 
                     57: for(i=0;str[i];i++)
                     58:        if(str[i]==' ')
                     59:                out[i]='_';
                     60:        else
                     61:                out[i]=str[i];
                     62: out[i]=0;
                     63: return(out);
                     64: }
                     65: 
                     66: void clearptrs(int subnum)
                     67: {
                     68:        char str[256];
                     69:        ushort idx,scancfg;
                     70:        int file,i,gi;
                     71:        long l=0L;
                     72:        glob_t g;
                     73: 
                     74:     uifc.pop("Clearing Pointers...");
                     75:     sprintf(str,"%suser/ptrs/*.ixb",cfg.data_dir);
                     76: 
                     77:        glob(str,0,NULL,&g);
                     78:        for(gi=0;gi<g.gl_pathc;gi++) {
                     79: 
                     80:         if(flength(g.gl_pathv[gi])>=((long)cfg.sub[subnum]->ptridx+1L)*10L) {
                     81:             if((file=nopen(g.gl_pathv[gi],O_WRONLY))==-1) {
                     82:                 errormsg(WHERE,ERR_OPEN,g.gl_pathv[gi],O_WRONLY);
                     83:                 bail(1);
                     84:             }
                     85:             while(filelength(file)<(long)(cfg.sub[subnum]->ptridx)*10) {
                     86:                 lseek(file,0L,SEEK_END);
                     87:                 idx=tell(file)/10;
                     88:                 for(i=0;i<cfg.total_subs;i++)
                     89:                     if(cfg.sub[i]->ptridx==idx)
                     90:                         break;
                     91:                 write(file,&l,sizeof(l));
                     92:                 write(file,&l,sizeof(l));
                     93:                 scancfg=0xff;
                     94:                 if(i<cfg.total_subs) {
                     95:                     if(!(cfg.sub[i]->misc&SUB_NSDEF))
                     96:                         scancfg&=~SUB_CFG_NSCAN;
                     97:                     if(!(cfg.sub[i]->misc&SUB_SSDEF))
                     98:                         scancfg&=~SUB_CFG_SSCAN; 
                     99:                                } else  /* Default to scan OFF for unknown sub */
                    100:                                        scancfg&=~(SUB_CFG_NSCAN|SUB_CFG_SSCAN);
                    101:                 write(file,&scancfg,sizeof(scancfg)); 
                    102:                        }
                    103:             lseek(file,((long)cfg.sub[subnum]->ptridx)*10L,SEEK_SET);
                    104:             write(file,&l,sizeof(l));  /* date set to null */
                    105:             write(file,&l,sizeof(l));  /* date set to null */
                    106:             scancfg=0xff;
                    107:             if(!(cfg.sub[subnum]->misc&SUB_NSDEF))
                    108:                 scancfg&=~SUB_CFG_NSCAN;
                    109:             if(!(cfg.sub[subnum]->misc&SUB_SSDEF))
                    110:                 scancfg&=~SUB_CFG_SSCAN;
                    111:             write(file,&scancfg,sizeof(scancfg));
                    112:             close(file); 
                    113:                }
                    114:     }
                    115:        globfree(&g);
                    116:     uifc.pop(0);
                    117: }
                    118: 
                    119: void msgs_cfg()
                    120: {
                    121:        static int dflt,msgs_dflt,bar;
                    122:        char    str[256],str2[256],done=0;
                    123:        char*   p;
                    124:        char*   tp;
                    125:     char       tmp[128];
                    126:        char    tmp_code[16];
                    127:        int             j,k,l,q,s;
                    128:        int             i,file,ptridx,n;
                    129:        unsigned total_subs;
                    130:        long    ported;
                    131:        sub_t   tmpsub;
                    132:        static grp_t savgrp;
                    133:        FILE*   stream;
                    134: 
                    135: while(1) {
                    136:        for(i=0;i<cfg.total_grps && i<MAX_OPTS;i++)
                    137:                sprintf(opt[i],"%-25s",cfg.grp[i]->lname);
                    138:        opt[i][0]=0;
                    139:        j=WIN_ORG|WIN_ACT|WIN_CHE;
                    140:        if(cfg.total_grps)
                    141:                j|=WIN_DEL|WIN_DELACT|WIN_GET;
                    142:        if(cfg.total_grps<MAX_OPTS)
                    143:                j|=WIN_INS|WIN_INSACT|WIN_XTR;
                    144:        if(savgrp.sname[0])
                    145:                j|=WIN_PUT;
                    146:        SETHELP(WHERE);
                    147: /*
                    148: &Message Groups:&
                    149: 
                    150: This is a listing of message groups for your BBS. Message groups are
                    151: used to logically separate your message &sub-boards& into groups. Every
                    152: sub-board belongs to a message group. You must have at least one message
                    153: group and one sub-board configured.
                    154: 
                    155: One popular use for message groups is to separate local sub-boards and
                    156: networked sub-boards. One might have a &Local& message group that contains
                    157: non-networked sub-boards of various topics and also have a &FidoNet&
                    158: message group that contains sub-boards that are echoed across FidoNet.
                    159: Some sysops separate sub-boards into more specific areas such as &Main&,
                    160: &Technical&, or &Adult&. If you have many sub-boards that have a common
                    161: subject denominator, you may want to have a separate message group for
                    162: those sub-boards for a more organized message structure.
                    163: */
                    164:        i=uifc.list(j,0,0,45,&msgs_dflt,&bar,"Message Groups",opt);
                    165:        if(i==-1) {
                    166:                j=save_changes(WIN_MID);
                    167:                if(j==-1)
                    168:                   continue;
                    169:                if(!j) {
                    170:                        write_msgs_cfg(&cfg,backup_level);
                    171:             refresh_cfg(&cfg);
                    172:         }
                    173:                return;
                    174:     }
                    175:        if((i&MSK_ON)==MSK_INS) {
                    176:                i&=MSK_OFF;
                    177:                SETHELP(WHERE);
                    178: /*
                    179: &Group Long Name:&
                    180: 
                    181: This is a description of the message group which is displayed when a
                    182: user of the system uses the &/*& command from the main menu.
                    183: */
                    184:                strcpy(str,"Main");
                    185:                if(uifc.input(WIN_MID|WIN_SAV,0,0,"Group Long Name",str,LEN_GLNAME
                    186:                        ,K_EDIT)<1)
                    187:                        continue;
                    188:                SETHELP(WHERE);
                    189: /*
                    190: &Group Short Name:&
                    191: 
                    192: This is a short description of the message group which is used for the
                    193: main menu and reading message prompts.
                    194: */
                    195:                sprintf(str2,"%.*s",LEN_GSNAME,str);
                    196:                if(uifc.input(WIN_MID,0,0,"Group Short Name",str2,LEN_GSNAME,K_EDIT)<1)
                    197:                        continue;
                    198:                if((cfg.grp=(grp_t **)realloc(cfg.grp,sizeof(grp_t *)*(cfg.total_grps+1)))==NULL) {
                    199:             errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_grps+1);
                    200:                        cfg.total_grps=0;
                    201:                        bail(1);
                    202:             continue; }
                    203: 
                    204:                if(cfg.total_grps) {    /* was cfg.total_subs (?) */
                    205:             for(j=cfg.total_grps;j>i;j--)   /* insert above */
                    206:                 cfg.grp[j]=cfg.grp[j-1];
                    207:             for(j=0;j<cfg.total_subs;j++)   /* move sub group numbers */
                    208:                 if(cfg.sub[j]->grp>=i)
                    209:                     cfg.sub[j]->grp++; }
                    210: 
                    211:                if((cfg.grp[i]=(grp_t *)malloc(sizeof(grp_t)))==NULL) {
                    212:                        errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(grp_t));
                    213:                        continue; }
                    214:                memset((grp_t *)cfg.grp[i],0,sizeof(grp_t));
                    215:                strcpy(cfg.grp[i]->lname,str);
                    216:                strcpy(cfg.grp[i]->sname,str2);
                    217:                cfg.total_grps++;
                    218:                uifc.changes=1;
                    219:                continue; }
                    220:        if((i&MSK_ON)==MSK_DEL) {
                    221:                i&=MSK_OFF;
                    222:                SETHELP(WHERE);
                    223: /*
                    224: &Delete All Data in Group:&
                    225: 
                    226: If you wish to delete the messages in all the sub-boards in this group,
                    227: select &Yes&.
                    228: */
                    229:                j=1;
                    230:                strcpy(opt[0],"Yes");
                    231:                strcpy(opt[1],"No");
                    232:                opt[2][0]=0;
                    233:                j=uifc.list(WIN_MID|WIN_SAV,0,0,0,&j,0,"Delete All Data in Group",opt);
                    234:                if(j==-1)
                    235:                        continue;
                    236:                if(j==0)
                    237:                        for(j=0;j<cfg.total_subs;j++)
                    238:                                if(cfg.sub[j]->grp==i) {
                    239:                                        sprintf(str,"%s%s.s*"
                    240:                                                ,cfg.grp[cfg.sub[j]->grp]->code_prefix
                    241:                                                ,cfg.sub[j]->code_suffix);
                    242:                                        strlwr(str);
                    243:                                        if(!cfg.sub[j]->data_dir[0])
                    244:                                                sprintf(tmp,"%ssubs/",cfg.data_dir);
                    245:                                        else
                    246:                                                strcpy(tmp,cfg.sub[j]->data_dir);
                    247:                                        delfiles(tmp,str);
                    248:                                        clearptrs(j); }
                    249:                free(cfg.grp[i]);
                    250:                for(j=0;j<cfg.total_subs;) {
                    251:                        if(cfg.sub[j]->grp==i) {        /* delete subs of this group */
                    252:                                free(cfg.sub[j]);
                    253:                                cfg.total_subs--;
                    254:                                k=j;
                    255:                                while(k<cfg.total_subs) {       /* move all subs down */
                    256:                                        cfg.sub[k]=cfg.sub[k+1];
                    257:                                        for(q=0;q<cfg.total_qhubs;q++)
                    258:                                                for(s=0;s<cfg.qhub[q]->subs;s++)
                    259:                                                        if(cfg.qhub[q]->sub[s]==k)
                    260:                                                                cfg.qhub[q]->sub[s]--;
                    261:                                        k++; } }
                    262:                        else j++; }
                    263:                for(j=0;j<cfg.total_subs;j++)   /* move sub group numbers down */
                    264:                        if(cfg.sub[j]->grp>i)
                    265:                                cfg.sub[j]->grp--;
                    266:                cfg.total_grps--;
                    267:                while(i<cfg.total_grps) {
                    268:                        cfg.grp[i]=cfg.grp[i+1];
                    269:                        i++; }
                    270:                uifc.changes=1;
                    271:                continue; }
                    272:        if((i&MSK_ON)==MSK_GET) {
                    273:                i&=MSK_OFF;
                    274:                savgrp=*cfg.grp[i];
                    275:                continue; }
                    276:        if((i&MSK_ON)==MSK_PUT) {
                    277:                i&=MSK_OFF;
                    278:                *cfg.grp[i]=savgrp;
                    279:                uifc.changes=1;
                    280:                continue; }
                    281:        done=0;
                    282:        while(!done) {
                    283:                j=0;
                    284:                sprintf(opt[j++],"%-27.27s%s","Long Name",cfg.grp[i]->lname);
                    285:                sprintf(opt[j++],"%-27.27s%s","Short Name",cfg.grp[i]->sname);
                    286:                sprintf(opt[j++],"%-27.27s%s","Internal Code Prefix",cfg.grp[i]->code_prefix);
                    287:                sprintf(opt[j++],"%-27.27s%.40s","Access Requirements"
                    288:                        ,cfg.grp[i]->arstr);
                    289:                strcpy(opt[j++],"Clone Options");
                    290:                strcpy(opt[j++],"Export Areas...");
                    291:                strcpy(opt[j++],"Import Areas...");
                    292:                strcpy(opt[j++],"Message Sub-boards...");
                    293:                opt[j][0]=0;
                    294:                sprintf(str,"%s Group",cfg.grp[i]->sname);
                    295:                SETHELP(WHERE);
                    296: /*
                    297: &Message Group Configuration:&
                    298: 
                    299: This menu allows you to configure the security requirements for access
                    300: to this message group. You can also add, delete, and configure the
                    301: sub-boards of this group by selecting the &Messages Sub-boards...& option.
                    302: */
                    303:                switch(uifc.list(WIN_ACT,6,4,60,&dflt,0,str,opt)) {
                    304:                        case -1:
                    305:                                done=1;
                    306:                                break;
                    307:                        case 0:
                    308:                                SETHELP(WHERE);
                    309: /*
                    310: &Group Long Name:&
                    311: 
                    312: This is a description of the message group which is displayed when a
                    313: user of the system uses the &/*& command from the main menu.
                    314: */
                    315:                                strcpy(str,cfg.grp[i]->lname);  /* save incase setting to null */
                    316:                                if(!uifc.input(WIN_MID|WIN_SAV,0,17,"Name to use for Listings"
                    317:                                        ,cfg.grp[i]->lname,LEN_GLNAME,K_EDIT))
                    318:                                        strcpy(cfg.grp[i]->lname,str);
                    319:                                break;
                    320:                        case 1:
                    321:                                SETHELP(WHERE);
                    322: /*
                    323: &Group Short Name:&
                    324: 
                    325: This is a short description of the message group which is used for
                    326: main menu and reading messages prompts.
                    327: */
                    328:                                uifc.input(WIN_MID|WIN_SAV,0,17,"Name to use for Prompts"
                    329:                                        ,cfg.grp[i]->sname,LEN_GSNAME,K_EDIT);
                    330:                                break;
                    331:                        case 2:
                    332:                                SETHELP(WHERE);
                    333: /*
                    334: `Internal Code Prefix:`
                    335: 
                    336: This is an `optional` code prefix used to help generate unique internal
                    337: codes for the sub-boards in this message group. If this option
                    338: is used, sub-board internal codes will be made up of this prefix and the
                    339: specified code suffix for each sub-board.
                    340: */
                    341:                                uifc.input(WIN_MID|WIN_SAV,0,17,"Internal Code Prefix"
                    342:                                        ,cfg.grp[i]->code_prefix,LEN_CODE,K_EDIT|K_UPPER);
                    343:                                break;
                    344:                        case 3:
                    345:                                sprintf(str,"%s Group",cfg.grp[i]->sname);
                    346:                                getar(str,cfg.grp[i]->arstr);
                    347:                                break;
                    348:                        case 4:         /* Clone Options */
                    349:                                j=0;
                    350:                                strcpy(opt[0],"Yes");
                    351:                                strcpy(opt[1],"No");
                    352:                                opt[2][0]=0;
                    353:                                SETHELP(WHERE);
                    354: /*
                    355: &Clone Sub-board Options:&
                    356: 
                    357: If you want to clone the options of the first sub-board of this group
                    358: into all sub-boards of this group, select &Yes&.
                    359: 
                    360: The options cloned are posting requirements, reading requirements,
                    361: operator requirments, moderated user requirments, toggle options,
                    362: network options (including EchoMail origin line, EchoMail address,
                    363: and QWK Network tagline), maximum number of messages, maximum number
                    364: of CRCs, maximum age of messages, storage method, and data directory.
                    365: */
                    366:                                j=uifc.list(WIN_MID|WIN_SAV,0,0,0,&j,0
                    367:                                        ,"Clone Options of First Sub-board into All of Group",opt);
                    368:                                if(j==0) {
                    369:                                        k=-1;
                    370:                                        for(j=0;j<cfg.total_subs;j++)
                    371:                                                if(cfg.sub[j]->grp==i) {
                    372:                                                        if(k==-1)
                    373:                                                                k=j;
                    374:                                                        else {
                    375:                                                                uifc.changes=1;
                    376:                                                                cfg.sub[j]->misc=(cfg.sub[k]->misc|SUB_HDRMOD);
                    377:                                                                strcpy(cfg.sub[j]->post_arstr,cfg.sub[k]->post_arstr);
                    378:                                                                strcpy(cfg.sub[j]->read_arstr,cfg.sub[k]->read_arstr);
                    379:                                                                strcpy(cfg.sub[j]->op_arstr,cfg.sub[k]->op_arstr);
                    380:                                                                strcpy(cfg.sub[j]->mod_arstr,cfg.sub[k]->mod_arstr);
                    381:                                                                strcpy(cfg.sub[j]->origline,cfg.sub[k]->origline);
                    382:                                                                strcpy(cfg.sub[j]->tagline,cfg.sub[k]->tagline);
                    383:                                                                strcpy(cfg.sub[j]->data_dir,cfg.sub[k]->data_dir);
                    384:                                                                strcpy(cfg.sub[j]->post_sem,cfg.sub[k]->post_sem);
                    385:                                                                cfg.sub[j]->maxmsgs=cfg.sub[k]->maxmsgs;
                    386:                                                                cfg.sub[j]->maxcrcs=cfg.sub[k]->maxcrcs;
                    387:                                                                cfg.sub[j]->maxage=cfg.sub[k]->maxage;
                    388: 
                    389:                                                                cfg.sub[j]->faddr=cfg.sub[k]->faddr; } } }
                    390:                                break;
                    391:                        case 5:
                    392:                                k=0;
                    393:                                ported=0;
                    394:                                q=uifc.changes;
                    395:                                strcpy(opt[k++],"SUBS.TXT    (Synchronet)");
                    396:                                strcpy(opt[k++],"AREAS.BBS   (MSG)");
                    397:                                strcpy(opt[k++],"AREAS.BBS   (SBBSecho)");
                    398:                                strcpy(opt[k++],"FIDONET.NA  (Fido)");
                    399:                                opt[k][0]=0;
                    400:                                SETHELP(WHERE);
                    401: /*
                    402: &Export Area File Format:&
                    403: 
                    404: This menu allows you to choose the format of the area file you wish to
                    405: export the current message group into.
                    406: */
                    407:                                k=0;
                    408:                                k=uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
                    409:                                        ,"Export Area File Format",opt);
                    410:                                if(k==-1)
                    411:                                        break;
                    412:                                if(k==0)
                    413:                                        sprintf(str,"%sSUBS.TXT",cfg.ctrl_dir);
                    414:                                else if(k==1)
                    415:                                        sprintf(str,"AREAS.BBS");
                    416:                                else if(k==2)
                    417:                                        sprintf(str,"%sAREAS.BBS",cfg.data_dir);
                    418:                                else if(k==3)
                    419:                                        sprintf(str,"FIDONET.NA");
                    420:                                if(k && k<3)
                    421:                                        if(uifc.input(WIN_MID|WIN_SAV,0,0,"Uplinks"
                    422:                                                ,str2,sizeof(str2)-1,0)<=0) {
                    423:                                                uifc.changes=q;
                    424:                                                break; }
                    425:                                if(uifc.input(WIN_MID|WIN_SAV,0,0,"Filename"
                    426:                                        ,str,sizeof(str)-1,K_EDIT)<=0) {
                    427:                                        uifc.changes=q;
                    428:                                        break; }
                    429:                                if(fexist(str)) {
                    430:                                        strcpy(opt[0],"Overwrite");
                    431:                                        strcpy(opt[1],"Append");
                    432:                                        opt[2][0]=0;
                    433:                                        j=0;
                    434:                                        j=uifc.list(WIN_MID|WIN_SAV,0,0,0,&j,0
                    435:                                                ,"File Exists",opt);
                    436:                                        if(j==-1)
                    437:                                                break;
                    438:                                        if(j==0) j=O_WRONLY|O_TRUNC;
                    439:                                        else     j=O_WRONLY|O_APPEND; }
                    440:                                else
                    441:                                        j=O_WRONLY|O_CREAT;
                    442:                                if((stream=fnopen(&file,str,j))==NULL) {
                    443:                                        sprintf(str,"Open Failure: %d (%s)"
                    444:                                                ,errno,strerror(errno));
                    445:                                        uifc.msg(str);
                    446:                                        uifc.changes=q;
                    447:                                        break; 
                    448:                                }
                    449:                                uifc.pop("Exporting Areas...");
                    450:                                for(j=0;j<cfg.total_subs;j++) {
                    451:                                        if(cfg.sub[j]->grp!=i)
                    452:                                                continue;
                    453:                                        ported++;
                    454:                                        if(k==1) {              /* AREAS.BBS *.MSG */
                    455:                                                sprintf(str,"%s%s%s/"
                    456:                                                        ,cfg.echomail_dir
                    457:                                                        ,cfg.grp[cfg.sub[j]->grp]->code_prefix
                    458:                                                        ,cfg.sub[j]->code_suffix);
                    459:                                                fprintf(stream,"%-30s %-20s %s\r\n"
                    460:                                                        ,str,stou(cfg.sub[j]->sname),str2);
                    461:                                                continue; }
                    462:                                        if(k==2) {              /* AREAS.BBS SBBSecho */
                    463:                                                fprintf(stream,"%s%-30s %-20s %s\r\n"
                    464:                                                        ,cfg.grp[cfg.sub[j]->grp]->code_prefix
                    465:                                                        ,cfg.sub[j]->code_suffix
                    466:                                                        ,stou(cfg.sub[j]->sname)
                    467:                                                        ,str2);
                    468:                                                continue; }
                    469:                                        if(k==3) {              /* FIDONET.NA */
                    470:                                                fprintf(stream,"%-20s %s\r\n"
                    471:                                                        ,stou(cfg.sub[j]->sname),cfg.sub[j]->lname);
                    472:                                                continue; }
                    473:                                        fprintf(stream,"%s\r\n%s\r\n%s\r\n%s\r\n%s\r\n%s\r\n"
                    474:                                                        "%s\r\n%s\r\n%s\r\n"
                    475:                                                ,cfg.sub[j]->lname
                    476:                                                ,cfg.sub[j]->sname
                    477:                                                ,cfg.sub[j]->qwkname
                    478:                                                ,cfg.sub[j]->code_suffix
                    479:                                                ,cfg.sub[j]->data_dir
                    480:                                                ,cfg.sub[j]->arstr
                    481:                                                ,cfg.sub[j]->read_arstr
                    482:                                                ,cfg.sub[j]->post_arstr
                    483:                                                ,cfg.sub[j]->op_arstr
                    484:                                                );
                    485:                                        fprintf(stream,"%lX\r\n%s\r\n%s\r\n%s\r\n%s\r\n%s\r\n"
                    486:                                                ,cfg.sub[j]->misc
                    487:                                                ,cfg.sub[j]->tagline
                    488:                                                ,cfg.sub[j]->origline
                    489:                                                ,cfg.sub[j]->post_sem
                    490:                                                ,cfg.sub[j]->newsgroup
                    491:                                                ,smb_faddrtoa(&cfg.sub[j]->faddr,tmp)
                    492:                                                );
                    493:                                        fprintf(stream,"%lu\r\n%lu\r\n%u\r\n%u\r\n%s\r\n"
                    494:                                                ,cfg.sub[j]->maxmsgs
                    495:                                                ,cfg.sub[j]->maxcrcs
                    496:                                                ,cfg.sub[j]->maxage
                    497:                                                ,cfg.sub[j]->ptridx
                    498:                                                ,cfg.sub[j]->mod_arstr
                    499:                                                );
                    500:                                        fprintf(stream,"***END-OF-SUB***\r\n\r\n"); }
                    501:                                fclose(stream);
                    502:                                uifc.pop(0);
                    503:                                sprintf(str,"%lu Message Areas Exported Successfully",ported);
                    504:                                uifc.msg(str);
                    505:                                uifc.changes=q;
                    506:                                break;
                    507:                        case 6:
                    508:                                ported=0;
                    509:                                k=0;
                    510:                                strcpy(opt[k++],"SUBS.TXT    (Synchronet)");
                    511:                                strcpy(opt[k++],"AREAS.BBS   (Generic)");
                    512:                                strcpy(opt[k++],"AREAS.BBS   (SBBSecho)");
                    513:                                strcpy(opt[k++],"FIDONET.NA  (Fido)");
                    514:                                opt[k][0]=0;
                    515:                                SETHELP(WHERE);
                    516: /*
                    517: &Import Area File Format:&
                    518: 
                    519: This menu allows you to choose the format of the area file you wish to
                    520: import into the current message group.
                    521: */
                    522:                                k=0;
                    523:                                k=uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0
                    524:                                        ,"Import Area File Format",opt);
                    525:                                if(k==-1)
                    526:                                        break;
                    527:                                if(k==0)
                    528:                                        sprintf(str,"%sSUBS.TXT",cfg.ctrl_dir);
                    529:                                else if(k==1)
                    530:                                        sprintf(str,"AREAS.BBS");
                    531:                                else if(k==2)
                    532:                                        sprintf(str,"%sAREAS.BBS",cfg.data_dir);
                    533:                                else if(k==3)
                    534:                                        sprintf(str,"FIDONET.NA");
                    535:                                if(uifc.input(WIN_MID|WIN_SAV,0,0,"Filename"
                    536:                                        ,str,sizeof(str)-1,K_EDIT)<=0)
                    537:                     break;
                    538:                                if((stream=fnopen(&file,str,O_RDONLY))==NULL) {
                    539:                                        uifc.msg("Open Failure");
                    540:                     break; }
                    541:                                uifc.pop("Importing Areas...");
                    542:                                total_subs = cfg.total_subs;     /* Save original number of subs */
                    543:                                ptridx = 0;
                    544:                                while(!feof(stream)) {
                    545:                                        if(!fgets(str,sizeof(str),stream)) break;
                    546:                                        truncsp(str);
                    547:                                        if(!str[0])
                    548:                                                continue;
                    549:                                        if(k) {
                    550:                                                p=str;
                    551:                                                while(*p && *p<=' ') p++;
                    552:                                                if(!*p || *p==';')
                    553:                                                        continue;
                    554:                                                memset(&tmpsub,0,sizeof(sub_t));
                    555:                                                tmpsub.misc|=
                    556:                                                        (SUB_FIDO|SUB_NAME|SUB_TOUSER|SUB_QUOTE|SUB_HYPER);
                    557:                                                if(k==1) {              /* AREAS.BBS Generic/*.MSG */
                    558:                                                        p=str;
                    559:                                                        SKIP_WHITESPACE(p);                     /* Find path    */
                    560:                                                        FIND_WHITESPACE(p);                     /* Skip path    */
                    561:                                                        SKIP_WHITESPACE(p);                     /* Find tag             */
                    562:                                                        truncstr(p," \t");                      /* Truncate tag */
                    563:                                                        SAFECOPY(tmp_code,p);           /* Copy tag to internal code */
                    564:                                                        SAFECOPY(tmpsub.lname,utos(p));
                    565:                                                        SAFECOPY(tmpsub.sname,tmpsub.lname);
                    566:                                                        SAFECOPY(tmpsub.qwkname,tmpsub.qwkname);
                    567:                                                }
                    568:                                                else if(k==2) { /* AREAS.BBS SBBSecho */
                    569:                                                        p=str;
                    570:                                                        SKIP_WHITESPACE(p);                     /* Find internal code */
                    571:                                                        tp=p;
                    572:                                                        FIND_WHITESPACE(tp);
                    573:                                                        *tp=0;                                          /* Truncate internal code */
                    574:                                                        SAFECOPY(tmp_code,p);           /* Copy internal code suffix */
                    575:                                                        p=tp+1;
                    576:                                                        SKIP_WHITESPACE(p);                     /* Find echo tag */
                    577:                                                        truncstr(p," \t");                      /* Truncate tag */
                    578:                                                        SAFECOPY(tmpsub.lname,utos(p));
                    579:                                                        SAFECOPY(tmpsub.sname,tmpsub.lname);
                    580:                                                        SAFECOPY(tmpsub.qwkname,tmpsub.sname);
                    581:                                                }
                    582:                                                else if(k==3) { /* FIDONET.NA */
                    583:                             p=str;
                    584:                                                        SKIP_WHITESPACE(p);                     /* Find echo tag */
                    585:                                                        tp=p;
                    586:                                                        FIND_WHITESPACE(tp);            /* Find end of tag */
                    587:                                                        *tp=0;                                          /* Truncate echo tag */
                    588:                                                        SAFECOPY(tmp_code,p);           /* Copy tag to internal code suffix */
                    589:                                                        SAFECOPY(tmpsub.sname,utos(p)); /* ... to short name, converting underscores to spaces */
                    590:                                                        SAFECOPY(tmpsub.qwkname,tmpsub.sname);  /* ... to QWK name .... */
                    591:                                                        p=tp+1;
                    592:                                                        SKIP_WHITESPACE(p);                     /* Find description */
                    593:                                                        SAFECOPY(tmpsub.lname,p);       /* Copy description to long name */
                    594:                                                }
                    595:                                        }
                    596:                                        else {
                    597:                                                memset(&tmpsub,0,sizeof(sub_t));
                    598:                                                tmpsub.grp=i;
                    599:                                                sprintf(tmpsub.lname,"%.*s",LEN_SLNAME,str);
                    600:                                                if(!fgets(str,128,stream)) break;
                    601:                                                truncsp(str);
                    602:                                                sprintf(tmpsub.sname,"%.*s",LEN_SSNAME,str);
                    603:                                                if(!fgets(str,128,stream)) break;
                    604:                                                truncsp(str);
                    605:                                                sprintf(tmpsub.qwkname,"%.*s",10,str);
                    606:                                                if(!fgets(str,128,stream)) break;
                    607:                                                truncsp(str);
                    608:                                                SAFECOPY(tmp_code,str);
                    609:                                                if(!fgets(str,128,stream)) break;
                    610:                                                truncsp(str);
                    611:                                                sprintf(tmpsub.data_dir,"%.*s",LEN_DIR,str);
                    612:                                                if(!fgets(str,128,stream)) break;
                    613:                                                truncsp(str);
                    614:                                                sprintf(tmpsub.arstr,"%.*s",LEN_ARSTR,str);
                    615:                                                if(!fgets(str,128,stream)) break;
                    616:                                                truncsp(str);
                    617:                                                sprintf(tmpsub.read_arstr,"%.*s",LEN_ARSTR,str);
                    618:                                                if(!fgets(str,128,stream)) break;
                    619:                                                truncsp(str);
                    620:                                                sprintf(tmpsub.post_arstr,"%.*s",LEN_ARSTR,str);
                    621:                                                if(!fgets(str,128,stream)) break;
                    622:                                                truncsp(str);
                    623:                                                sprintf(tmpsub.op_arstr,"%.*s",LEN_ARSTR,str);
                    624:                                                if(!fgets(str,128,stream)) break;
                    625:                                                truncsp(str);
                    626:                                                tmpsub.misc=ahtoul(str);
                    627:                                                if(!fgets(str,128,stream)) break;
                    628:                                                truncsp(str);
                    629:                                                sprintf(tmpsub.tagline,"%.*s",80,str);
                    630:                                                if(!fgets(str,128,stream)) break;
                    631:                                                truncsp(str);
                    632:                                                sprintf(tmpsub.origline,"%.*s",50,str);
                    633:                                                if(!fgets(str,128,stream)) break;
                    634:                                                truncsp(str);
                    635:                                                sprintf(tmpsub.post_sem,"%.*s",LEN_DIR,str);
                    636:                                                if(!fgets(str,128,stream)) break;
                    637:                                                truncsp(str);
                    638:                                                SAFECOPY(tmpsub.newsgroup,str);
                    639:                                                if(!fgets(str,128,stream)) break;
                    640:                                                truncsp(str);
                    641:                                                tmpsub.faddr=atofaddr(str);
                    642:                                                if(!fgets(str,128,stream)) break;
                    643:                                                truncsp(str);
                    644:                                                tmpsub.maxmsgs=atol(str);
                    645:                                                if(!fgets(str,128,stream)) break;
                    646:                                                truncsp(str);
                    647:                                                tmpsub.maxcrcs=atol(str);
                    648:                                                if(!fgets(str,128,stream)) break;
                    649:                                                truncsp(str);
                    650:                                                tmpsub.maxage=atoi(str);
                    651:                                                if(!fgets(str,128,stream)) break;
                    652:                                                truncsp(str);
                    653:                                                tmpsub.ptridx=atoi(str);
                    654:                                                if(!fgets(str,128,stream)) break;
                    655:                                                truncsp(str);
                    656:                                                sprintf(tmpsub.mod_arstr,"%.*s",LEN_ARSTR,str);
                    657: 
                    658:                                                while(!feof(stream)
                    659:                                                        && strcmp(str,"***END-OF-SUB***")) {
                    660:                                                        if(!fgets(str,128,stream)) break;
                    661:                                                        truncsp(str); 
                    662:                                                } 
                    663:                                        }
                    664: 
                    665:                                        p=tmp_code;
                    666:                                        l=strlen(cfg.grp[i]->code_prefix);
                    667:                                        if(l && strnicmp(p,cfg.grp[i]->code_prefix,l)==0 && strlen(p)!=l)
                    668:                                                p+=l;                                                                   /* Skip code prefix, if supplied */
                    669:                     prep_code(p);                                                              /* Strip invalid chars */
                    670:                                        SAFECOPY(tmpsub.code_suffix,p);                         /* THEN truncate to valid length */
                    671: 
                    672:                                        truncsp(tmpsub.sname);
                    673:                                        truncsp(tmpsub.lname);
                    674:                                        truncsp(tmpsub.qwkname);
                    675: 
                    676:                                        if(tmpsub.code_suffix[0]==0
                    677:                                                || tmpsub.sname[0]==0
                    678:                                                || tmpsub.lname[0]==0
                    679:                                                || tmpsub.qwkname[0]==0)
                    680:                                                continue;
                    681: 
                    682:                                        for(j=0;j<total_subs;j++) {
                    683:                                                if(cfg.sub[j]->grp!=i)
                    684:                                                        continue;
                    685:                                                if(!stricmp(cfg.sub[j]->code_suffix,tmpsub.code_suffix))
                    686:                                                        break; }
                    687:                                        if(j==total_subs) {
                    688:                                                j=cfg.total_subs;
                    689:                                                if((cfg.sub=(sub_t **)realloc(cfg.sub
                    690:                                                        ,sizeof(sub_t *)*(cfg.total_subs+1)))==NULL) {
                    691:                                                        errormsg(WHERE,ERR_ALLOC,nulstr,cfg.total_subs+1);
                    692:                                                        cfg.total_subs=0;
                    693:                                                        bail(1);
                    694:                                                        break; 
                    695:                                                }
                    696: 
                    697:                                                if((cfg.sub[j]=(sub_t *)malloc(sizeof(sub_t)))
                    698:                                                        ==NULL) {
                    699:                                                        errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(sub_t));
                    700:                                                        break; 
                    701:                                                }
                    702:                                                memset(cfg.sub[j],0,sizeof(sub_t)); }
                    703:                                        if(!k) {
                    704:                                                n=cfg.sub[j]->ptridx;   /* save original ptridx */
                    705:                                                memcpy(cfg.sub[j],&tmpsub,sizeof(sub_t));
                    706:                                                cfg.sub[j]->ptridx=n;   /* restore original ptridx */
                    707:                                        } else {
                    708:                         cfg.sub[j]->grp=i;
                    709:                                                if(cfg.total_faddrs)
                    710:                                                        cfg.sub[j]->faddr=cfg.faddr[0];
                    711:                                                strcpy(cfg.sub[j]->code_suffix,tmpsub.code_suffix);
                    712:                                                strcpy(cfg.sub[j]->sname,tmpsub.sname);
                    713:                                                strcpy(cfg.sub[j]->lname,tmpsub.lname);
                    714:                                                strcpy(cfg.sub[j]->qwkname,tmpsub.qwkname);
                    715:                                                strcpy(cfg.sub[j]->data_dir,tmpsub.data_dir);
                    716:                                                if(j==cfg.total_subs)
                    717:                                                        cfg.sub[j]->maxmsgs=1000;
                    718:                                        }
                    719:                                        if(j==cfg.total_subs) { /* adding new sub-board */
                    720:                                                for(;ptridx<USHRT_MAX;ptridx++) {
                    721:                                                        for(n=0;n<total_subs;n++)
                    722:                                                                if(cfg.sub[n]->ptridx==ptridx)
                    723:                                                                        break;
                    724:                                                        if(n==total_subs)
                    725:                                                                break; 
                    726:                                                }
                    727:                                                cfg.sub[j]->ptridx=ptridx;      /* use new ptridx */
                    728:                                                cfg.sub[j]->misc=tmpsub.misc;
                    729:                                                cfg.total_subs++; 
                    730:                                                ptridx++;       /* don't use the same ptridx for next sub */
                    731:                                        }
                    732:                                        uifc.changes=1; 
                    733:                                        ported++;
                    734:                                }
                    735:                                fclose(stream);
                    736:                                uifc.pop(0);
                    737:                                sprintf(str,"%lu Message Areas Imported Successfully",ported);
                    738:                 uifc.msg(str);
                    739:                                break;
                    740: 
                    741:                        case 7:
                    742:                 sub_cfg(i);
                    743:                                break; } } }
                    744: 
                    745: }
                    746: 
                    747: void msg_opts()
                    748: {
                    749:        char str[128],*p;
                    750:        static int msg_dflt;
                    751:        int i,j;
                    752: 
                    753:        while(1) {
                    754:                i=0;
                    755:                sprintf(opt[i++],"%-33.33s%s"
                    756:                        ,"BBS ID for QWK Packets",cfg.sys_id);
                    757:                sprintf(opt[i++],"%-33.33s%s"
                    758:                        ,"Local Time Zone",smb_zonestr(cfg.sys_timezone,NULL));
                    759:                sprintf(opt[i++],"%-33.33s%u seconds"
                    760:                        ,"Maximum Retry Time",cfg.smb_retry_time);
                    761:                if(cfg.max_qwkmsgs)
                    762:                        sprintf(str,"%lu",cfg.max_qwkmsgs);
                    763:                else
                    764:                        sprintf(str,"Unlimited");
                    765:                sprintf(opt[i++],"%-33.33s%s"
                    766:                        ,"Maximum QWK Messages",str);
                    767:                sprintf(opt[i++],"%-33.33s%s","Pre-pack QWK Requirements",cfg.preqwk_arstr);
                    768:                if(cfg.mail_maxage)
                    769:                        sprintf(str,"Enabled (%u days old)",cfg.mail_maxage);
                    770:         else
                    771:             strcpy(str,"Disabled");
                    772:                sprintf(opt[i++],"%-33.33s%s","Purge E-mail by Age",str);
                    773:                if(cfg.sys_misc&SM_DELEMAIL)
                    774:                        strcpy(str,"Immediately");
                    775:                else
                    776:                        strcpy(str,"Daily");
                    777:                sprintf(opt[i++],"%-33.33s%s","Purge Deleted E-mail",str);
                    778:                if(cfg.mail_maxcrcs)
                    779:                        sprintf(str,"Enabled (%lu mail CRCs)",cfg.mail_maxcrcs);
                    780:                else
                    781:                        strcpy(str,"Disabled");
                    782:                sprintf(opt[i++],"%-33.33s%s","Duplicate E-mail Checking",str);
                    783:                sprintf(opt[i++],"%-33.33s%s","Allow Anonymous E-mail"
                    784:                        ,cfg.sys_misc&SM_ANON_EM ? "Yes" : "No");
                    785:                sprintf(opt[i++],"%-33.33s%s","Allow Quoting in E-mail"
                    786:                        ,cfg.sys_misc&SM_QUOTE_EM ? "Yes" : "No");
                    787:                sprintf(opt[i++],"%-33.33s%s","Allow Uploads in E-mail"
                    788:                        ,cfg.sys_misc&SM_FILE_EM ? "Yes" : "No");
                    789:                sprintf(opt[i++],"%-33.33s%s","Allow Forwarding to NetMail"
                    790:                        ,cfg.sys_misc&SM_FWDTONET ? "Yes" : "No");
                    791:                sprintf(opt[i++],"%-33.33s%s","Kill Read E-mail"
                    792:                        ,cfg.sys_misc&SM_DELREADM ? "Yes" : "No");
                    793:                sprintf(opt[i++],"%-33.33s%s","Receive E-mail by Real Name"
                    794:                        ,cfg.msg_misc&MM_REALNAME ? "Yes" : "No");
                    795:                sprintf(opt[i++],"%-33.33s%s","Users Can View Deleted Messages"
                    796:                        ,cfg.sys_misc&SM_USRVDELM ? "Yes" : cfg.sys_misc&SM_SYSVDELM
                    797:                                ? "Sysops Only":"No");
                    798:                strcpy(opt[i++],"Extra Attribute Codes...");
                    799:                opt[i][0]=0;
                    800:                SETHELP(WHERE);
                    801: /*
                    802: &Message Options:&
                    803: 
                    804: This is a menu of system-wide message related options. Messages include
                    805: E-mail and public posts (on sub-boards).
                    806: */
                    807: 
                    808:                switch(uifc.list(WIN_ORG|WIN_ACT|WIN_MID|WIN_CHE,0,0,72,&msg_dflt,0
                    809:                        ,"Message Options",opt)) {
                    810:                        case -1:
                    811:                                i=save_changes(WIN_MID);
                    812:                                if(i==-1)
                    813:                                   continue;
                    814:                                if(!i) {
                    815:                                        cfg.new_install=new_install;
                    816:                                        write_msgs_cfg(&cfg,backup_level);
                    817:                                        write_main_cfg(&cfg,backup_level);
                    818:                     refresh_cfg(&cfg);
                    819:                 }
                    820:                                return;
                    821:                        case 0:
                    822:                                strcpy(str,cfg.sys_id);
                    823:                                SETHELP(WHERE);
                    824: /*
                    825: &BBS ID for QWK Packets:&
                    826: 
                    827: This is a short system ID for your BBS that is used for QWK packets.
                    828: It should be an abbreviation of your BBS name or other related string.
                    829: This ID will be used for your outgoing and incoming QWK packets. If
                    830: you plan on networking via QWK packets with another Synchronet BBS,
                    831: this ID should not begin with a number. The maximum length of the ID
                    832: is eight characters and cannot contain spaces or other invalid DOS
                    833: filename characters. In a QWK packet network, each system must have
                    834: a unique QWK system ID.
                    835: */
                    836: 
                    837:                                uifc.input(WIN_MID|WIN_SAV,0,0,"BBS ID for QWK Packets"
                    838:                                        ,str,LEN_QWKID,K_EDIT|K_UPPER);
                    839:                                if(code_ok(str))
                    840:                                        strcpy(cfg.sys_id,str);
                    841:                                else
                    842:                                        uifc.msg("Invalid ID");
                    843:                                break;
                    844:                        case 1:
                    845:                                strcpy(opt[0],"Yes");
                    846:                                strcpy(opt[1],"No");
                    847:                                opt[2][0]=0;
                    848:                                i=0;
                    849:                                SETHELP(WHERE);
                    850: /*
                    851: &United States Time Zone:&
                    852: 
                    853: If your local time zone is the United States, select &Yes&.
                    854: */
                    855: 
                    856:                                i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
                    857:                                        ,"United States Time Zone",opt);
                    858:                                if(i==-1)
                    859:                                        break;
                    860:                                if(i==0) {
                    861:                                        strcpy(opt[i++],"Atlantic");
                    862:                                        strcpy(opt[i++],"Eastern");
                    863:                                        strcpy(opt[i++],"Central");
                    864:                                        strcpy(opt[i++],"Mountain");
                    865:                                        strcpy(opt[i++],"Pacific");
                    866:                                        strcpy(opt[i++],"Yukon");
                    867:                                        strcpy(opt[i++],"Hawaii/Alaska");
                    868:                                        strcpy(opt[i++],"Bering");
                    869:                                        opt[i][0]=0;
                    870:                                        i=0;
                    871:                                        i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
                    872:                                                ,"Time Zone",opt);
                    873:                                        if(i==-1)
                    874:                                                break;
                    875:                                        uifc.changes=1;
                    876:                                        switch(i) {
                    877:                                                case 0:
                    878:                                                        cfg.sys_timezone=AST;
                    879:                                                        break;
                    880:                                                case 1:
                    881:                                                        cfg.sys_timezone=EST;
                    882:                                                        break;
                    883:                                                case 2:
                    884:                                                        cfg.sys_timezone=CST;
                    885:                             break;
                    886:                                                case 3:
                    887:                                                        cfg.sys_timezone=MST;
                    888:                             break;
                    889:                                                case 4:
                    890:                                                        cfg.sys_timezone=PST;
                    891:                             break;
                    892:                                                case 5:
                    893:                                                        cfg.sys_timezone=YST;
                    894:                             break;
                    895:                                                case 6:
                    896:                                                        cfg.sys_timezone=HST;
                    897:                             break;
                    898:                                                case 7:
                    899:                                                        cfg.sys_timezone=BST;
                    900:                                                        break; }
                    901:                                        strcpy(opt[0],"Yes");
                    902:                                        strcpy(opt[1],"No");
                    903:                                        opt[2][0]=0;
                    904:                                        i=1;
                    905:                                        i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
                    906:                                                ,"Daylight Savings",opt);
                    907:                                        if(i==-1)
                    908:                         break;
                    909:                                        if(!i)
                    910:                                                cfg.sys_timezone|=DAYLIGHT;
                    911:                                        break; }
                    912:                                i=0;
                    913:                                strcpy(opt[i++],"Midway");
                    914:                                strcpy(opt[i++],"Vancouver");
                    915:                                strcpy(opt[i++],"Edmonton");
                    916:                                strcpy(opt[i++],"Winnipeg");
                    917:                                strcpy(opt[i++],"Bogota");
                    918:                                strcpy(opt[i++],"Caracas");
                    919:                                strcpy(opt[i++],"Rio de Janeiro");
                    920:                                strcpy(opt[i++],"Fernando de Noronha");
                    921:                                strcpy(opt[i++],"Azores");
                    922:                                strcpy(opt[i++],"London");
                    923:                                strcpy(opt[i++],"Berlin");
                    924:                                strcpy(opt[i++],"Athens");
                    925:                                strcpy(opt[i++],"Moscow");
                    926:                                strcpy(opt[i++],"Dubai");
                    927:                                strcpy(opt[i++],"Kabul");
                    928:                                strcpy(opt[i++],"Karachi");
                    929:                                strcpy(opt[i++],"Bombay");
                    930:                                strcpy(opt[i++],"Kathmandu");
                    931:                                strcpy(opt[i++],"Dhaka");
                    932:                                strcpy(opt[i++],"Bangkok");
                    933:                                strcpy(opt[i++],"Hong Kong");
                    934:                                strcpy(opt[i++],"Tokyo");
                    935:                                strcpy(opt[i++],"Sydney");
                    936:                                strcpy(opt[i++],"Noumea");
                    937:                                strcpy(opt[i++],"Wellington");
                    938:                                strcpy(opt[i++],"Other...");
                    939:                                opt[i][0]=0;
                    940:                                i=0;
                    941:                                i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
                    942:                                        ,"Time Zone",opt);
                    943:                                if(i==-1)
                    944:                                        break;
                    945:                                uifc.changes=1;
                    946:                                switch(i) {
                    947:                                        case 0:
                    948:                                                cfg.sys_timezone=MID;
                    949:                                                break;
                    950:                                        case 1:
                    951:                                                cfg.sys_timezone=VAN;
                    952:                                                break;
                    953:                                        case 2:
                    954:                                                cfg.sys_timezone=EDM;
                    955:                                                break;
                    956:                                        case 3:
                    957:                                                cfg.sys_timezone=WIN;
                    958:                                                break;
                    959:                                        case 4:
                    960:                                                cfg.sys_timezone=BOG;
                    961:                                                break;
                    962:                                        case 5:
                    963:                                                cfg.sys_timezone=CAR;
                    964:                                                break;
                    965:                                        case 6:
                    966:                                                cfg.sys_timezone=RIO;
                    967:                                                break;
                    968:                                        case 7:
                    969:                                                cfg.sys_timezone=FER;
                    970:                                                break;
                    971:                                        case 8:
                    972:                                                cfg.sys_timezone=AZO;
                    973:                         break;
                    974:                                        case 9:
                    975:                                                cfg.sys_timezone=LON;
                    976:                         break;
                    977:                                        case 10:
                    978:                                                cfg.sys_timezone=BER;
                    979:                         break;
                    980:                                        case 11:
                    981:                                                cfg.sys_timezone=ATH;
                    982:                         break;
                    983:                                        case 12:
                    984:                                                cfg.sys_timezone=MOS;
                    985:                         break;
                    986:                                        case 13:
                    987:                                                cfg.sys_timezone=DUB;
                    988:                         break;
                    989:                                        case 14:
                    990:                                                cfg.sys_timezone=KAB;
                    991:                         break;
                    992:                                        case 15:
                    993:                                                cfg.sys_timezone=KAR;
                    994:                         break;
                    995:                                        case 16:
                    996:                                                cfg.sys_timezone=BOM;
                    997:                         break;
                    998:                                        case 17:
                    999:                                                cfg.sys_timezone=KAT;
                   1000:                         break;
                   1001:                                        case 18:
                   1002:                                                cfg.sys_timezone=DHA;
                   1003:                         break;
                   1004:                                        case 19:
                   1005:                                                cfg.sys_timezone=BAN;
                   1006:                         break;
                   1007:                                        case 20:
                   1008:                                                cfg.sys_timezone=HON;
                   1009:                         break;
                   1010:                                        case 21:
                   1011:                                                cfg.sys_timezone=TOK;
                   1012:                         break;
                   1013:                                        case 22:
                   1014:                                                cfg.sys_timezone=SYD;
                   1015:                         break;
                   1016:                                        case 23:
                   1017:                                                cfg.sys_timezone=NOU;
                   1018:                         break;
                   1019:                                        case 24:
                   1020:                                                cfg.sys_timezone=WEL;
                   1021:                         break;
                   1022:                                        default:
                   1023:                                                if(cfg.sys_timezone>720 || cfg.sys_timezone<-720)
                   1024:                                                        cfg.sys_timezone=0;
                   1025:                                                sprintf(str,"%02d:%02d"
                   1026:                                                        ,cfg.sys_timezone/60,cfg.sys_timezone<0
                   1027:                                                        ? (-cfg.sys_timezone)%60 : cfg.sys_timezone%60);
                   1028:                                                uifc.input(WIN_MID|WIN_SAV,0,0
                   1029:                                                        ,"Time (HH:MM) East (+) or West (-) of Universal "
                   1030:                                                                "Time"
                   1031:                                                        ,str,6,K_EDIT|K_UPPER);
                   1032:                                                cfg.sys_timezone=atoi(str)*60;
                   1033:                                                p=strchr(str,':');
                   1034:                                                if(p) {
                   1035:                                                        if(cfg.sys_timezone<0)
                   1036:                                                                cfg.sys_timezone-=atoi(p+1);
                   1037:                                                        else
                   1038:                                                                cfg.sys_timezone+=atoi(p+1); }
                   1039:                         break;
                   1040:                                                }
                   1041:                 break;
                   1042:                        case 2:
                   1043:                                SETHELP(WHERE);
                   1044: /*
                   1045: &Maximum Message Base Retry Time:&
                   1046: 
                   1047: This is the maximum number of seconds to allow while attempting to open
                   1048: or lock a message base (a value in the range of 10 to 45 seconds should
                   1049: be fine).
                   1050: */
                   1051:                                ultoa(cfg.smb_retry_time,str,10);
                   1052:                                uifc.input(WIN_MID|WIN_SAV,0,0
                   1053:                                        ,"Maximum Message Base Retry Time (in seconds)"
                   1054:                                        ,str,2,K_NUMBER|K_EDIT);
                   1055:                                cfg.smb_retry_time=atoi(str);
                   1056:                                break;
                   1057:                        case 3:
                   1058:                                SETHELP(WHERE);
                   1059: /*
                   1060: &Maximum Messages Per QWK Packet:&
                   1061: 
                   1062: This is the maximum number of messages (excluding E-mail), that a user
                   1063: can have in one QWK packet for download. This limit does not effect
                   1064: QWK network nodes (&Q& restriction). If set to &0&, no limit is imposed.
                   1065: */
                   1066: 
                   1067:                                ultoa(cfg.max_qwkmsgs,str,10);
                   1068:                                uifc.input(WIN_MID|WIN_SAV,0,0
                   1069:                                        ,"Maximum Messages Per QWK Packet (0=No Limit)"
                   1070:                                        ,str,6,K_NUMBER|K_EDIT);
                   1071:                                cfg.max_qwkmsgs=atol(str);
                   1072:                 break;
                   1073:                        case 4:
                   1074:                                SETHELP(WHERE);
                   1075: /*
                   1076: &Pre-pack QWK Requirements:&
                   1077: 
                   1078: ALL user accounts on the BBS meeting this requirmenet will have a QWK
                   1079: packet automatically created for them every day after midnight
                   1080: (during the internal daily event).
                   1081: 
                   1082: This is mainly intended for QWK network nodes that wish to save connect
                   1083: time by having their packets pre-packed. If a large number of users meet
                   1084: this requirement, it can take up a large amount of disk space on your
                   1085: system (in the &DATA\FILE& directory).
                   1086: */
                   1087:                                getar("Pre-pack QWK (Use with caution!)",cfg.preqwk_arstr);
                   1088:                                break;
                   1089:                        case 5:
                   1090:                                sprintf(str,"%u",cfg.mail_maxage);
                   1091:                 SETHELP(WHERE);
                   1092: /*
                   1093: &Maximum Age of Mail:&
                   1094: 
                   1095: This value is the maximum number of days that mail will be kept.
                   1096: */
                   1097:                 uifc.input(WIN_MID|WIN_SAV,0,17,"Maximum Age of Mail "
                   1098:                     "(in days)",str,5,K_EDIT|K_NUMBER);
                   1099:                 cfg.mail_maxage=atoi(str);
                   1100:                 break;
                   1101:                        case 6:
                   1102:                                strcpy(opt[0],"Daily");
                   1103:                                strcpy(opt[1],"Immediately");
                   1104:                                opt[2][0]=0;
                   1105:                                i=cfg.sys_misc&SM_DELEMAIL ? 0:1;
                   1106:                                SETHELP(WHERE);
                   1107: /*
                   1108: &Purge Deleted E-mail:&
                   1109: 
                   1110: If you wish to have deleted e-mail physically (and permanently) removed
                   1111: from your e-mail database immediately after a users exits the reading
                   1112: e-mail prompt, set this option to &Immediately&.
                   1113: 
                   1114: For the best system performance and to avoid delays when deleting e-mail
                   1115: from a large e-mail database, set this option to &Daily& (the default).
                   1116: Your system maintenance will automatically purge deleted e-mail once a
                   1117: day.
                   1118: */
                   1119: 
                   1120:                                i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
                   1121:                                        ,"Purge Deleted E-mail",opt);
                   1122:                                if(!i && cfg.sys_misc&SM_DELEMAIL) {
                   1123:                                        cfg.sys_misc&=~SM_DELEMAIL;
                   1124:                                        uifc.changes=1; }
                   1125:                                else if(i==1 && !(cfg.sys_misc&SM_DELEMAIL)) {
                   1126:                                        cfg.sys_misc|=SM_DELEMAIL;
                   1127:                                        uifc.changes=1; }
                   1128:                 break;
                   1129:                        case 7:
                   1130:                                sprintf(str,"%lu",cfg.mail_maxcrcs);
                   1131:                 SETHELP(WHERE);
                   1132: /*
                   1133: &Maximum Number of Mail CRCs:&
                   1134: 
                   1135: This value is the maximum number of CRCs that will be kept for duplicate
                   1136: mail checking. Once this maximum number of CRCs is reached, the oldest
                   1137: CRCs will be automatically purged.
                   1138: */
                   1139:                 uifc.input(WIN_MID|WIN_SAV,0,17,"Maximum Number of Mail "
                   1140:                     "CRCs",str,5,K_EDIT|K_NUMBER);
                   1141:                 cfg.mail_maxcrcs=atol(str);
                   1142:                 break;
                   1143:                        case 8:
                   1144:                                strcpy(opt[0],"Yes");
                   1145:                                strcpy(opt[1],"No");
                   1146:                                opt[2][0]=0;
                   1147:                                i=cfg.sys_misc&SM_ANON_EM ? 0:1;
                   1148:                                SETHELP(WHERE);
                   1149: /*
                   1150: &Allow Anonymous E-mail:&
                   1151: 
                   1152: If you want users with the &A& exemption to be able to send E-mail
                   1153: anonymously, set this option to &Yes&.
                   1154: */
                   1155: 
                   1156:                                i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
                   1157:                                        ,"Allow Anonymous E-mail",opt);
                   1158:                                if(!i && !(cfg.sys_misc&SM_ANON_EM)) {
                   1159:                                        cfg.sys_misc|=SM_ANON_EM;
                   1160:                                        uifc.changes=1; }
                   1161:                                else if(i==1 && cfg.sys_misc&SM_ANON_EM) {
                   1162:                                        cfg.sys_misc&=~SM_ANON_EM;
                   1163:                                        uifc.changes=1; }
                   1164:                                break;
                   1165:                        case 9:
                   1166:                                strcpy(opt[0],"Yes");
                   1167:                                strcpy(opt[1],"No");
                   1168:                                opt[2][0]=0;
                   1169:                                i=cfg.sys_misc&SM_QUOTE_EM ? 0:1;
                   1170:                                SETHELP(WHERE);
                   1171: /*
                   1172: &Allow Quoting in E-mail:&
                   1173: 
                   1174: If you want your users to be allowed to use message quoting when
                   1175: responding in E-mail, set this option to &Yes&.
                   1176: */
                   1177: 
                   1178:                                i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
                   1179:                                        ,"Allow Quoting in E-mail",opt);
                   1180:                                if(!i && !(cfg.sys_misc&SM_QUOTE_EM)) {
                   1181:                                        cfg.sys_misc|=SM_QUOTE_EM;
                   1182:                                        uifc.changes=1; }
                   1183:                                else if(i==1 && cfg.sys_misc&SM_QUOTE_EM) {
                   1184:                                        cfg.sys_misc&=~SM_QUOTE_EM;
                   1185:                                        uifc.changes=1; }
                   1186:                                break;
                   1187:                        case 10:
                   1188:                                strcpy(opt[0],"Yes");
                   1189:                                strcpy(opt[1],"No");
                   1190:                                opt[2][0]=0;
                   1191:                                i=cfg.sys_misc&SM_FILE_EM ? 0:1;
                   1192:                                SETHELP(WHERE);
                   1193: /*
                   1194: &Allow File Attachment Uploads in E-mail:&
                   1195: 
                   1196: If you want your users to be allowed to attach an uploaded file to
                   1197: an E-mail message, set this option to &Yes&.
                   1198: */
                   1199: 
                   1200:                                i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
                   1201:                                        ,"Allow File Attachment Uploads in E-mail",opt);
                   1202:                                if(!i && !(cfg.sys_misc&SM_FILE_EM)) {
                   1203:                                        cfg.sys_misc|=SM_FILE_EM;
                   1204:                                        uifc.changes=1; }
                   1205:                                else if(i==1 && cfg.sys_misc&SM_FILE_EM) {
                   1206:                                        cfg.sys_misc&=~SM_FILE_EM;
                   1207:                                        uifc.changes=1; }
                   1208:                                break;
                   1209:                        case 11:
                   1210:                                strcpy(opt[0],"Yes");
                   1211:                                strcpy(opt[1],"No");
                   1212:                                opt[2][0]=0;
                   1213:                                i=cfg.sys_misc&SM_FWDTONET ? 0:1;
                   1214:                                SETHELP(WHERE);
                   1215: /*
                   1216: &Allow Users to Have Their E-mail Forwarded to NetMail:&
                   1217: 
                   1218: If you want your users to be able to have any e-mail sent to them
                   1219: optionally (at the sender's discretion) forwarded to a NetMail address,
                   1220: set this option to &Yes&.
                   1221: */
                   1222: 
                   1223:                                i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
                   1224:                                        ,"Allow Forwarding of E-mail to NetMail",opt);
                   1225:                                if(!i && !(cfg.sys_misc&SM_FWDTONET)) {
                   1226:                                        cfg.sys_misc|=SM_FWDTONET;
                   1227:                                        uifc.changes=1; }
                   1228:                                else if(i==1 && cfg.sys_misc&SM_FWDTONET) {
                   1229:                                        cfg.sys_misc&=~SM_FWDTONET;
                   1230:                                        uifc.changes=1; }
                   1231:                 break;
                   1232:                        case 12:
                   1233:                                strcpy(opt[0],"Yes");
                   1234:                                strcpy(opt[1],"No");
                   1235:                                opt[2][0]=0;
                   1236:                                i=cfg.sys_misc&SM_DELREADM ? 0:1;
                   1237:                                SETHELP(WHERE);
                   1238: /*
                   1239: &Kill Read E-mail Automatically:&
                   1240: 
                   1241: If this option is set to &Yes&, e-mail that has been read will be
                   1242: automatically deleted when message base maintenance is run.
                   1243: */
                   1244: 
                   1245:                                i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
                   1246:                                        ,"Kill Read E-mail Automatically",opt);
                   1247:                                if(!i && !(cfg.sys_misc&SM_DELREADM)) {
                   1248:                                        cfg.sys_misc|=SM_DELREADM;
                   1249:                                        uifc.changes=1; }
                   1250:                                else if(i==1 && cfg.sys_misc&SM_DELREADM) {
                   1251:                                        cfg.sys_misc&=~SM_DELREADM;
                   1252:                                        uifc.changes=1; }
                   1253:                 break;
                   1254:                        case 13:
                   1255:                                strcpy(opt[0],"Yes");
                   1256:                                strcpy(opt[1],"No");
                   1257:                                opt[2][0]=0;
                   1258:                                i=cfg.msg_misc&MM_REALNAME ? 0:1;
                   1259:                                SETHELP(WHERE);
                   1260: /*
                   1261: `Receive E-mail by Real Name:`
                   1262: 
                   1263: If this option is set to ~Yes~, e-mail messages may be received when
                   1264: addressed to a user's real name (rather than their alias).
                   1265: */
                   1266: 
                   1267:                                i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
                   1268:                                        ,"Receive E-mail by Real Name",opt);
                   1269:                                if(!i && !(cfg.msg_misc&MM_REALNAME)) {
                   1270:                                        cfg.msg_misc|=MM_REALNAME;
                   1271:                                        uifc.changes=1; 
                   1272:                                }
                   1273:                                else if(i==1 && cfg.msg_misc&MM_REALNAME) {
                   1274:                                        cfg.msg_misc&=~MM_REALNAME;
                   1275:                                        uifc.changes=1; 
                   1276:                                }
                   1277:                 break;
                   1278:                        case 14:
                   1279:                                strcpy(opt[0],"Yes");
                   1280:                                strcpy(opt[1],"No");
                   1281:                                strcpy(opt[2],"Sysops Only");
                   1282:                                opt[3][0]=0;
                   1283:                                i=1;
                   1284:                                SETHELP(WHERE);
                   1285: /*
                   1286: &Users Can View Deleted Messages:&
                   1287: 
                   1288: If this option is set to &Yes&, then users will be able to view messages
                   1289: they've sent and deleted or messages sent to them and they've deleted
                   1290: with the option of un-deleting the message before the message is
                   1291: physically purged from the e-mail database.
                   1292: 
                   1293: If this option is set to &No&, then when a message is deleted, it is no
                   1294: longer viewable (with SBBS) by anyone.
                   1295: 
                   1296: If this option is set to &Sysops Only&, then only sysops and sub-ops (when
                   1297: appropriate) can view deleted messages.
                   1298: */
                   1299: 
                   1300:                                i=uifc.list(WIN_MID|WIN_SAV,0,0,0,&i,0
                   1301:                                        ,"Users Can View Deleted Messages",opt);
                   1302:                                if(!i && (cfg.sys_misc&(SM_USRVDELM|SM_SYSVDELM))
                   1303:                                        !=(SM_USRVDELM|SM_SYSVDELM)) {
                   1304:                                        cfg.sys_misc|=(SM_USRVDELM|SM_SYSVDELM);
                   1305:                                        uifc.changes=1; }
                   1306:                                else if(i==1 && cfg.sys_misc&(SM_USRVDELM|SM_SYSVDELM)) {
                   1307:                                        cfg.sys_misc&=~(SM_USRVDELM|SM_SYSVDELM);
                   1308:                                        uifc.changes=1; }
                   1309:                                else if(i==2 && (cfg.sys_misc&(SM_USRVDELM|SM_SYSVDELM))
                   1310:                                        !=SM_SYSVDELM) {
                   1311:                                        cfg.sys_misc|=SM_SYSVDELM;
                   1312:                                        cfg.sys_misc&=~SM_USRVDELM;
                   1313:                                        uifc.changes=1; }
                   1314:                 break;
                   1315:                        case 15:
                   1316:                                SETHELP(WHERE);
                   1317: /*
                   1318: &Extra Attribute Codes...&
                   1319: 
                   1320: Synchronet can suppport the native text attribute codes of other BBS
                   1321: programs in messages (menus, posts, e-mail, etc.) To enable the extra
                   1322: attribute codes for another BBS program, set the corresponding option
                   1323: to &Yes&.
                   1324: */
                   1325: 
                   1326:                                j=0;
                   1327:                                while(1) {
                   1328:                                        i=0;
                   1329:                                        sprintf(opt[i++],"%-15.15s %-3.3s","WWIV"
                   1330:                                                ,cfg.sys_misc&SM_WWIV ? "Yes":"No");
                   1331:                                        sprintf(opt[i++],"%-15.15s %-3.3s","PCBoard"
                   1332:                                                ,cfg.sys_misc&SM_PCBOARD ? "Yes":"No");
                   1333:                                        sprintf(opt[i++],"%-15.15s %-3.3s","Wildcat"
                   1334:                                                ,cfg.sys_misc&SM_WILDCAT ? "Yes":"No");
                   1335:                                        sprintf(opt[i++],"%-15.15s %-3.3s","Celerity"
                   1336:                                                ,cfg.sys_misc&SM_CELERITY ? "Yes":"No");
                   1337:                                        sprintf(opt[i++],"%-15.15s %-3.3s","Renegade"
                   1338:                                                ,cfg.sys_misc&SM_RENEGADE ? "Yes":"No");
                   1339:                                        opt[i][0]=0;
                   1340:                                        j=uifc.list(WIN_BOT|WIN_RHT|WIN_SAV,2,2,0,&j,0
                   1341:                                                ,"Extra Attribute Codes",opt);
                   1342:                                        if(j==-1)
                   1343:                                                break;
                   1344: 
                   1345:                                        uifc.changes=1;
                   1346:                                        switch(j) {
                   1347:                                                case 0:
                   1348:                                                        cfg.sys_misc^=SM_WWIV;
                   1349:                                                        break;
                   1350:                                                case 1:
                   1351:                                                        cfg.sys_misc^=SM_PCBOARD;
                   1352:                                                        break;
                   1353:                                                case 2:
                   1354:                                                        cfg.sys_misc^=SM_WILDCAT;
                   1355:                                                        break;
                   1356:                                                case 3:
                   1357:                                                        cfg.sys_misc^=SM_CELERITY;
                   1358:                                                        break;
                   1359:                                                case 4:
                   1360:                                                        cfg.sys_misc^=SM_RENEGADE;
                   1361:                                                        break; } } } }
                   1362: }

unix.superglobalmegacorp.com

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