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

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

unix.superglobalmegacorp.com

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