Annotation of sbbs/sbbs3/scfglib1.c, revision 1.1.1.1

1.1       root        1: /* scfglib1.c */
                      2: 
                      3: /* Synchronet configuration library routines */
                      4: 
                      5: /* $Id: scfglib1.c,v 1.14 2000/12/05 03:37:04 rswindell Exp $ */
                      6: 
                      7: /****************************************************************************
                      8:  * @format.tab-size 4          (Plain Text/Source Code File Header)                    *
                      9:  * @format.use-tabs true       (see http://www.synchro.net/ptsc_hdr.html)              *
                     10:  *                                                                                                                                                     *
                     11:  * Copyright 2000 Rob Swindell - http://www.synchro.net/copyright.html         *
                     12:  *                                                                                                                                                     *
                     13:  * This program is free software; you can redistribute it and/or                       *
                     14:  * modify it under the terms of the GNU General Public License                         *
                     15:  * as published by the Free Software Foundation; either version 2                      *
                     16:  * of the License, or (at your option) any later version.                                      *
                     17:  * See the GNU General Public License for more details: gpl.txt or                     *
                     18:  * http://www.fsf.org/copyleft/gpl.html                                                                                *
                     19:  *                                                                                                                                                     *
                     20:  * Anonymous FTP access to the most recent released source is available at     *
                     21:  * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net     *
                     22:  *                                                                                                                                                     *
                     23:  * Anonymous CVS access to the development source and modification history     *
                     24:  * is available at cvs.synchro.net:/cvsroot/sbbs, example:                                     *
                     25:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs login                       *
                     26:  *     (just hit return, no password is necessary)                                                     *
                     27:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src                *
                     28:  *                                                                                                                                                     *
                     29:  * For Synchronet coding style and modification guidelines, see                                *
                     30:  * http://www.synchro.net/source.html                                                                          *
                     31:  *                                                                                                                                                     *
                     32:  * You are encouraged to submit any modifications (preferably in Unix diff     *
                     33:  * format) via e-mail to [email protected]                                                                      *
                     34:  *                                                                                                                                                     *
                     35:  * Note: If this box doesn't appear square, then you need to fix your tabs.    *
                     36:  ****************************************************************************/
                     37: 
                     38: #include "sbbs.h"
                     39: #include "scfglib.h"
                     40: 
                     41: const char *scfgnulstr="";
                     42: 
                     43: void prep_dir(char* base, char* path)
                     44: {
                     45: #ifdef __unix__
                     46:        char    *p;
                     47: #endif
                     48:        char    str[LEN_DIR*2];
                     49: 
                     50:        if(!path[0])
                     51:                return;
                     52:        if(path[0]!='\\' && path[0]!='/' && path[1]!=':')           /* Relative to NODE directory */
                     53:                sprintf(str,"%s%s",base,path);
                     54:        else
                     55:                strcpy(str,path);
                     56: 
                     57: #ifdef __unix__                                /* Change backslashes to forward slashes on Unix */
                     58:        for(p=str;*p;p++)
                     59:                if(*p=='\\') 
                     60:                        *p='/';
                     61:        strlwr(str);    /* temporary hack */
                     62: #endif
                     63: 
                     64:        backslashcolon(str);
                     65:        strcat(str,".");                // Change C: to C:. and C:\SBBS\ to C:\SBBS\.
                     66:        _fullpath(path,str,LEN_DIR+1);  // Change C:\SBBS\NODE1\..\EXEC to C:\SBBS\EXEC
                     67:        backslash(path);
                     68: }
                     69: 
                     70: void prep_path(char* path)
                     71: {
                     72: #ifdef __unix__                                /* Change backslashes to forward slashes on Unix */
                     73:        char    *p;
                     74: 
                     75:        for(p=path;*p;p++)
                     76:                if(*p=='\\') 
                     77:                        *p='/';
                     78: #endif
                     79: }
                     80: 
                     81: char * get_alloc(long *offset, char *outstr, int maxlen, FILE *instream)
                     82: {
                     83: 
                     84: #ifdef SCFG
                     85:        fread(outstr,1,maxlen+1,instream);
                     86:        (*offset)+=maxlen+1;
                     87: #else
                     88:        char str[257];
                     89: 
                     90:        fread(str,1,maxlen+1,instream);
                     91: //       lprintf("%s %d %p\r\n",__FILE__,__LINE__,offset);
                     92:        (*offset)+=maxlen+1;    // this line was commented out (04/12/97) why?
                     93:        if(!str[0])                     /* Save memory */
                     94:                return((char *)scfgnulstr);
                     95:        if((outstr=(char *)MALLOC(strlen(str)+1))==NULL)
                     96:                return(NULL);
                     97:        strcpy(outstr,str);
                     98: #endif
                     99: 
                    100: return(outstr);
                    101: }
                    102: 
                    103: #ifdef SCFG    /* SCFG allocate max length */
                    104:        #define readline_alloc(l,s,m,i) readline(l,s,m,i)
                    105: #else
                    106:        char *readline_alloc(long *offset, char *outstr, int maxline
                    107:                , FILE *instream);
                    108:        #define readline_alloc(l,s,m,i) s=readline_alloc(l,s,m,i)
                    109:        #define get_alloc(o,s,l,i) s=get_alloc(o,s,l,i)
                    110: #endif
                    111: 
                    112: /***********************************************************/
                    113: /* These functions are called from here and must be linked */
                    114: /***********************************************************/
                    115: /***
                    116:        nopen()
                    117:        truncsp()
                    118: ***/
                    119: 
                    120: BOOL allocerr(read_cfg_text_t* txt, long offset, char *fname, uint size)
                    121: {
                    122:        lprintf(txt->error,offset,fname);
                    123:        lprintf(txt->allocerr,size);
                    124:        return(FALSE);
                    125: }
                    126: 
                    127: #ifndef NO_NODE_CFG
                    128: 
                    129: /****************************************************************************/
                    130: /* Reads in NODE.CNF and initializes the associated variables                          */
                    131: /****************************************************************************/
                    132: BOOL read_node_cfg(scfg_t* cfg, read_cfg_text_t* txt)
                    133: {
                    134:        char    c,str[256],fname[13];
                    135:        int     i;
                    136:        short   n;
                    137:        long    offset=0;
                    138:        FILE    *instream;
                    139: 
                    140:        strcpy(fname,"node.cnf");
                    141:        sprintf(str,"%s%s",cfg->node_dir,fname);
                    142:        if((instream=fnopen(NULL,str,O_RDONLY))==NULL) {
                    143:                lprintf(txt->openerr,str);
                    144:                return(FALSE); 
                    145:        }
                    146: 
                    147:        if(txt->reading && txt->reading[0])
                    148:                lprintf(txt->reading,fname);
                    149:        get_int(cfg->node_num,instream);
                    150:        if(!cfg->node_num) {
                    151:                lprintf(txt->error,offset,fname);
                    152:                lprintf("Node number must be non-zero.");
                    153:                return(FALSE); }
                    154:        get_str(cfg->node_name,instream);
                    155:        get_str(cfg->node_phone,instream);
                    156:        get_str(cfg->node_comspec,instream);
                    157:        #ifdef __OS2__
                    158:        if(!node_comspec[0])
                    159:                strcpy(node_comspec,"C:\\OS2\\MDOS\\COMMAND.COM");
                    160:        #endif
                    161:        get_int(cfg->node_misc,instream);
                    162:        get_int(cfg->node_ivt,instream);
                    163:        get_int(cfg->node_swap,instream);
                    164:        get_str(cfg->node_swapdir,instream);
                    165:        get_int(cfg->node_valuser,instream);
                    166:        get_int(cfg->node_minbps,instream);
                    167:        #ifdef SCFG
                    168:        get_str(cfg->node_ar,instream);
                    169:        #else
                    170:        fread(str,1,LEN_ARSTR+1,instream);
                    171:        offset+=LEN_ARSTR+1;
                    172:        cfg->node_ar=arstr(0, str, cfg);
                    173:        #endif
                    174:        get_int(cfg->node_dollars_per_call,instream);
                    175:        get_str(cfg->node_editor,instream);
                    176:        get_str(cfg->node_viewer,instream);
                    177:        get_str(cfg->node_daily,instream);
                    178:        get_int(c,instream);
                    179:        if(c) cfg->node_scrnlen=c;
                    180:        get_int(cfg->node_scrnblank,instream);
                    181:        get_str(cfg->text_dir,instream);                                /* ctrl directory */
                    182:        get_str(cfg->text_dir,instream);                                /* text directory */
                    183:        get_str(cfg->temp_dir,instream);                                /* temp directory */
                    184:        if(!cfg->temp_dir[0])
                    185:                strcpy(cfg->temp_dir,"temp");
                    186: 
                    187:        strlwr(cfg->text_dir);  /* temporary Unix-compatibility hack */
                    188:        strlwr(cfg->temp_dir);  /* temporary Unix-compatibility hack */
                    189: 
                    190:        #ifndef SCFG
                    191:        prep_dir(cfg->ctrl_dir, cfg->text_dir);
                    192:        #endif
                    193: 
                    194:        for(i=0;i<10;i++) {                                             /* WFC 0-9 DOS commands */
                    195:                get_alloc(&offset,cfg->wfc_cmd[i],LEN_CMD,instream); }
                    196:        for(i=0;i<12;i++) {                                             /* WFC F1-F12 shrinking DOS cmds */
                    197:                get_alloc(&offset,cfg->wfc_scmd[i],LEN_CMD,instream); }
                    198:        get_str(cfg->mdm_hang,instream);
                    199:        get_int(cfg->node_sem_check,instream);
                    200:        if(!cfg->node_sem_check) cfg->node_sem_check=60;
                    201:        get_int(cfg->node_stat_check,instream);
                    202:        if(!cfg->node_stat_check) cfg->node_stat_check=10;
                    203:        get_str(cfg->scfg_cmd,instream);
                    204:        if(!cfg->scfg_cmd[0])
                    205:                strcpy(cfg->scfg_cmd,"%!scfg %k");
                    206:        get_int(cfg->sec_warn,instream);
                    207:        if(!cfg->sec_warn)
                    208:                cfg->sec_warn=180;
                    209:        get_int(cfg->sec_hangup,instream);
                    210:        if(!cfg->sec_hangup)
                    211:                cfg->sec_hangup=300;
                    212:        for(i=0;i<188;i++) {                            /* Unused - initialized to NULL */
                    213:                fread(&n,1,2,instream);
                    214:                offset+=2; }
                    215:        for(i=0;i<256;i++) {                            /* Unused - initialized to 0xff */
                    216:                fread(&n,1,2,instream);
                    217:                offset+=2; }
                    218: 
                    219:        /***************/
                    220:        /* Modem Stuff */
                    221:        /***************/
                    222: 
                    223:        get_int(cfg->com_port,instream);
                    224:        get_int(cfg->com_irq,instream);
                    225:        get_int(cfg->com_base,instream);
                    226:        get_int(cfg->com_rate,instream);
                    227:        get_int(cfg->mdm_misc,instream);
                    228:        get_str(cfg->mdm_init,instream);
                    229:        get_str(cfg->mdm_spec,instream);
                    230:        get_str(cfg->mdm_term,instream);
                    231:        get_str(cfg->mdm_dial,instream);
                    232:        get_str(cfg->mdm_offh,instream);
                    233:        get_str(cfg->mdm_answ,instream);
                    234:        get_int(cfg->mdm_reinit,instream);
                    235:        get_int(cfg->mdm_ansdelay,instream);
                    236:        get_int(cfg->mdm_rings,instream);
                    237: 
                    238:        get_int(cfg->mdm_results,instream);
                    239: 
                    240:        if(cfg->mdm_results) {
                    241:                if((cfg->mdm_result=(mdm_result_t *)MALLOC(sizeof(mdm_result_t)*cfg->mdm_results))
                    242:                        ==NULL)
                    243:                return allocerr(txt,offset,fname,sizeof(mdm_result_t *)*cfg->mdm_results); }
                    244:        else
                    245:                cfg->mdm_result=NULL;
                    246: 
                    247:        for(i=0;i<cfg->mdm_results;i++) {
                    248:                if(feof(instream)) break;
                    249:                get_int(cfg->mdm_result[i].code,instream);
                    250:                get_int(cfg->mdm_result[i].rate,instream);
                    251:                get_int(cfg->mdm_result[i].cps,instream);
                    252:                get_alloc(&offset,cfg->mdm_result[i].str,LEN_MODEM,instream); }
                    253:        cfg->mdm_results=i;
                    254:        fclose(instream);
                    255:        if(txt->readit && txt->readit[0])
                    256:                lprintf(txt->readit,fname);
                    257:        return(TRUE);
                    258: }
                    259: 
                    260: #endif
                    261: 
                    262: #ifndef NO_MAIN_CFG
                    263: 
                    264: /****************************************************************************/
                    265: /* Reads in MAIN.CNF and initializes the associated variables                          */
                    266: /****************************************************************************/
                    267: BOOL read_main_cfg(scfg_t* cfg, read_cfg_text_t* txt)
                    268: {
                    269:        char    str[256],fname[13],c;
                    270:        short   i,j,n;
                    271:        long    offset=0;
                    272:        FILE    *instream;
                    273: 
                    274:        strcpy(fname,"main.cnf");
                    275:        sprintf(str,"%s%s",cfg->ctrl_dir,fname);
                    276:        if((instream=fnopen(NULL,str,O_RDONLY))==NULL) {
                    277:                lprintf(txt->openerr,str);
                    278:                return(FALSE); }
                    279: 
                    280:        if(txt->reading && txt->reading[0])
                    281:                lprintf(txt->reading,fname);
                    282:        get_str(cfg->sys_name,instream);
                    283:        get_str(cfg->sys_id,instream);
                    284:        get_str(cfg->sys_location,instream);
                    285:        get_str(cfg->sys_phonefmt,instream);
                    286:        get_str(cfg->sys_op,instream);
                    287:        get_str(cfg->sys_guru,instream);
                    288:        get_str(cfg->sys_pass,instream);
                    289:        get_int(cfg->sys_nodes,instream);
                    290: 
                    291:        if(!cfg->sys_nodes || cfg->sys_nodes<cfg->node_num || cfg->sys_nodes>MAX_NODES) {
                    292:                lprintf(txt->error,offset,fname);
                    293:                if(!cfg->sys_nodes)
                    294:                        lprintf("Total nodes on system must be non-zero.");
                    295:                else if(cfg->sys_nodes>MAX_NODES)
                    296:                        lprintf("Total nodes exceeds %u.",MAX_NODES);
                    297:                else
                    298:                        lprintf("Total nodes (%u) < node number in NODE.CNF (%u)"
                    299:                                ,cfg->sys_nodes,cfg->node_num);
                    300:                return(FALSE); }
                    301: 
                    302:        if((cfg->node_path=(char **)MALLOC(sizeof(char *)*cfg->sys_nodes))==NULL)
                    303:                return allocerr(txt,offset,fname,sizeof(char *)*cfg->sys_nodes);
                    304: 
                    305:        for(i=0;i<cfg->sys_nodes;i++) {
                    306:                if(feof(instream)) break;
                    307:                fread(str,LEN_DIR+1,1,instream);
                    308:                prep_dir(cfg->ctrl_dir, str);
                    309:                offset+=LEN_DIR+1;
                    310:                if((cfg->node_path[i]=(char *)MALLOC(strlen(str)+1))==NULL)
                    311:                        return allocerr(txt,offset,fname,strlen(str)+1);
                    312:                strcpy(cfg->node_path[i],str); 
                    313:                strlwr(cfg->node_path[i]); /* temporary Unix-compatibility hack */
                    314:        }
                    315: 
                    316:        get_str(cfg->data_dir,instream);                          /* data directory */
                    317:        get_str(cfg->exec_dir,instream);                          /* exec directory */
                    318: 
                    319:        strlwr(cfg->data_dir);          /* temporary Unix-compatibility hack */
                    320:        strlwr(cfg->exec_dir);          /* temporary Unix-compatibility hack */
                    321: 
                    322:        #ifndef SCFG
                    323:        prep_dir(cfg->ctrl_dir, cfg->data_dir);
                    324:        prep_dir(cfg->ctrl_dir, cfg->exec_dir);
                    325:        #endif
                    326: 
                    327:        get_str(cfg->sys_logon,instream);
                    328:        get_str(cfg->sys_logout,instream);
                    329:        get_str(cfg->sys_daily,instream);
                    330:        get_int(cfg->sys_timezone,instream);
                    331:        get_int(cfg->sys_misc,instream);
                    332:        get_int(cfg->sys_lastnode,instream);
                    333:        get_int(cfg->sys_autonode,instream);
                    334:        get_int(cfg->uq,instream);
                    335:        get_int(cfg->sys_pwdays,instream);
                    336:        get_int(cfg->sys_deldays,instream);
                    337:        get_int(cfg->sys_exp_warn,instream);    /* Days left till expiration warning */
                    338:        get_int(cfg->sys_autodel,instream);
                    339:        get_int(cfg->sys_def_stat,instream);    /* default status line */
                    340: 
                    341:        #ifdef SCFG
                    342:        get_str(cfg->sys_chat_ar,instream);
                    343:        #else
                    344:        fread(str,1,LEN_ARSTR+1,instream);
                    345:        offset+=LEN_ARSTR+1;
                    346:        cfg->sys_chat_ar=arstr(0,str,cfg);
                    347:        #endif
                    348: 
                    349:        get_int(cfg->cdt_min_value,instream);
                    350:        get_int(cfg->max_minutes,instream);
                    351:        get_int(cfg->cdt_per_dollar,instream);
                    352:        get_str(cfg->new_pass,instream);
                    353:        get_str(cfg->new_magic,instream);
                    354:        get_str(cfg->new_sif,instream);
                    355:        get_str(cfg->new_sof,instream);
                    356:        if(!cfg->new_sof[0])            /* if output not specified, use input file */
                    357:                strcpy(cfg->new_sof,cfg->new_sif);
                    358: 
                    359:        /*********************/
                    360:        /* New User Settings */
                    361:        /*********************/
                    362: 
                    363:        get_int(cfg->new_level,instream);
                    364:        get_int(cfg->new_flags1,instream);
                    365:        get_int(cfg->new_flags2,instream);
                    366:        get_int(cfg->new_flags3,instream);
                    367:        get_int(cfg->new_flags4,instream);
                    368:        get_int(cfg->new_exempt,instream);
                    369:        get_int(cfg->new_rest,instream);
                    370:        get_int(cfg->new_cdt,instream);
                    371:        get_int(cfg->new_min,instream);
                    372:        get_str(cfg->new_xedit,instream);
                    373:        get_int(cfg->new_expire,instream);
                    374:        get_int(cfg->new_shell,instream);
                    375:        get_int(cfg->new_misc,instream);
                    376:        get_int(cfg->new_prot,instream);
                    377:        if(cfg->new_prot<SP)
                    378:                cfg->new_prot=SP;
                    379:        get_int(c,instream);
                    380:        for(i=0;i<7;i++)
                    381:                get_int(n,instream);
                    382: 
                    383:        /*************************/
                    384:        /* Expired User Settings */
                    385:        /*************************/
                    386: 
                    387:        get_int(cfg->expired_level,instream);
                    388:        get_int(cfg->expired_flags1,instream);
                    389:        get_int(cfg->expired_flags2,instream);
                    390:        get_int(cfg->expired_flags3,instream);
                    391:        get_int(cfg->expired_flags4,instream);
                    392:        get_int(cfg->expired_exempt,instream);
                    393:        get_int(cfg->expired_rest,instream);
                    394: 
                    395:        get_str(cfg->logon_mod,instream);
                    396:        get_str(cfg->logoff_mod,instream);
                    397:        get_str(cfg->newuser_mod,instream);
                    398:        get_str(cfg->login_mod,instream);
                    399:        if(!cfg->login_mod[0]) strcpy(cfg->login_mod,"login");
                    400:        get_str(cfg->logout_mod,instream);
                    401:        get_str(cfg->sync_mod,instream);
                    402:        get_str(cfg->expire_mod,instream);
                    403:        get_int(c,instream);
                    404: 
                    405: #if    1       /* temporary hack for Unix compatibility */
                    406:        strlwr (cfg->logon_mod);
                    407:        strlwr (cfg->logoff_mod);
                    408:        strlwr (cfg->newuser_mod);
                    409:        strlwr (cfg->login_mod);
                    410:        strlwr (cfg->logout_mod);
                    411:        strlwr (cfg->sync_mod);
                    412:        strlwr (cfg->expire_mod);
                    413: #endif
                    414: 
                    415:        for(i=0;i<224;i++)                                      /* unused - initialized to NULL */
                    416:                get_int(n,instream);
                    417:        for(i=0;i<256;i++)                                      /* unused - initialized to 0xff */
                    418:                get_int(n,instream);
                    419: 
                    420:        /*******************/
                    421:        /* Validation Sets */
                    422:        /*******************/
                    423: 
                    424:        for(i=0;i<10 && !feof(instream);i++) {
                    425:                get_int(cfg->val_level[i],instream);
                    426:                get_int(cfg->val_expire[i],instream);
                    427:                get_int(cfg->val_flags1[i],instream);
                    428:                get_int(cfg->val_flags2[i],instream);
                    429:                get_int(cfg->val_flags3[i],instream);
                    430:                get_int(cfg->val_flags4[i],instream);
                    431:                get_int(cfg->val_cdt[i],instream);
                    432:                get_int(cfg->val_exempt[i],instream);
                    433:                get_int(cfg->val_rest[i],instream);
                    434:                for(j=0;j<8;j++)
                    435:                        get_int(n,instream); }
                    436: 
                    437:        /***************************/
                    438:        /* Security Level Settings */
                    439:        /***************************/
                    440: 
                    441:        for(i=0;i<100 && !feof(instream);i++) {
                    442:                get_int(cfg->level_timeperday[i],instream);
                    443:                if(cfg->level_timeperday[i]>500)
                    444:                        cfg->level_timeperday[i]=500;
                    445:                get_int(cfg->level_timepercall[i],instream);
                    446:                if(cfg->level_timepercall[i]>500)
                    447:                        cfg->level_timepercall[i]=500;
                    448:                get_int(cfg->level_callsperday[i],instream);
                    449:                get_int(cfg->level_freecdtperday[i],instream);
                    450:                get_int(cfg->level_linespermsg[i],instream);
                    451:                get_int(cfg->level_postsperday[i],instream);
                    452:                get_int(cfg->level_emailperday[i],instream);
                    453:                get_int(cfg->level_misc[i],instream);
                    454:                get_int(cfg->level_expireto[i],instream);
                    455:                get_int(c,instream);
                    456:                for(j=0;j<5;j++)
                    457:                        get_int(n,instream); }
                    458:        if(i!=100) {
                    459:                lprintf(txt->error,offset,fname);
                    460:                lprintf("Insufficient User Level Information"
                    461:                        "%d user levels read, 100 needed.",i);
                    462:                return(FALSE); }
                    463: 
                    464:        get_int(cfg->total_shells,instream);
                    465:        #ifdef SBBS
                    466:        if(!cfg->total_shells) {
                    467:                lprintf(txt->error,offset,fname);
                    468:                lprintf("At least one command shell must be configured.");
                    469:                return(FALSE); }
                    470:        #endif
                    471: 
                    472:        if(cfg->total_shells) {
                    473:                if((cfg->shell=(shell_t **)MALLOC(sizeof(shell_t *)*cfg->total_shells))==NULL)
                    474:                        return allocerr(txt,offset,fname,sizeof(shell_t *)*cfg->total_shells); }
                    475:        else
                    476:                cfg->shell=NULL;
                    477: 
                    478:        for(i=0;i<cfg->total_shells;i++) {
                    479:                if(feof(instream)) break;
                    480:                if((cfg->shell[i]=(shell_t *)MALLOC(sizeof(shell_t)))==NULL)
                    481:                        return allocerr(txt,offset,fname,sizeof(shell_t));
                    482:                memset(cfg->shell[i],0,sizeof(shell_t));
                    483: 
                    484:                get_alloc(&offset,cfg->shell[i]->name,40,instream);
                    485:                get_str(cfg->shell[i]->code,instream);
                    486:                strlwr(cfg->shell[i]->code);    /* temporary Unix-compatibility hack */
                    487:        #ifdef SCFG
                    488:                get_str(cfg->shell[i]->ar,instream);
                    489:        #else
                    490:                fread(str,1,LEN_ARSTR+1,instream);
                    491:                offset+=LEN_ARSTR+1;
                    492:                cfg->shell[i]->ar=arstr(0,str,cfg);
                    493:        #endif
                    494:                get_int(cfg->shell[i]->misc,instream);
                    495:                for(j=0;j<8;j++)
                    496:                        get_int(n,instream);
                    497:                }
                    498:        cfg->total_shells=i;
                    499: 
                    500: 
                    501:        fclose(instream);
                    502:        if(txt->readit && txt->readit[0])
                    503:                lprintf(txt->readit,fname);
                    504:        return(TRUE);
                    505: }
                    506: 
                    507: #endif
                    508: 
                    509: #ifndef NO_MSGS_CFG
                    510: 
                    511: 
                    512: /****************************************************************************/
                    513: /* Reads in MSGS.CNF and initializes the associated variables                          */
                    514: /****************************************************************************/
                    515: BOOL read_msgs_cfg(scfg_t* cfg, read_cfg_text_t* txt)
                    516: {
                    517:        char    str[256],fname[13],c;
                    518:        short   i,j,k,n;
                    519:        long    offset=0;
                    520:        FILE    *instream;
                    521: 
                    522: #ifndef SCFG
                    523: 
                    524:        sprintf(cfg->data_dir_subs,"%ssubs/",cfg->data_dir);
                    525:        prep_dir(cfg->ctrl_dir, cfg->data_dir_subs);
                    526: 
                    527: #endif
                    528: 
                    529:        strcpy(fname,"msgs.cnf");
                    530:        sprintf(str,"%s%s",cfg->ctrl_dir,fname);
                    531:        if((instream=fnopen(NULL,str,O_RDONLY))==NULL) {
                    532:                lprintf(txt->openerr,str);
                    533:                return(FALSE); }
                    534: 
                    535:        if(txt->reading && txt->reading[0])
                    536:                lprintf(txt->reading,fname);
                    537: 
                    538:        /*************************/
                    539:        /* General Message Stuff */
                    540:        /*************************/
                    541: 
                    542:        get_int(cfg->max_qwkmsgs,instream);
                    543:        get_int(cfg->mail_maxcrcs,instream);
                    544:        get_int(cfg->mail_maxage,instream);
                    545:        #ifdef SCFG
                    546:                get_str(cfg->preqwk_ar,instream);
                    547:        #else
                    548:                fread(str,1,LEN_ARSTR+1,instream);
                    549:                offset+=LEN_ARSTR+1;
                    550:                cfg->preqwk_ar=arstr(0,str,cfg);
                    551:        #endif
                    552:        get_int(cfg->smb_retry_time,instream);   /* odd byte */
                    553:        if(!cfg->smb_retry_time)
                    554:                cfg->smb_retry_time=30;
                    555:        for(i=0;i<235;i++)      /* NULL */
                    556:                get_int(n,instream);
                    557:        for(i=0;i<256;i++)      /* 0xff */
                    558:                get_int(n,instream);
                    559: 
                    560: 
                    561:        /******************/
                    562:        /* Message Groups */
                    563:        /******************/
                    564: 
                    565:        get_int(cfg->total_grps,instream);
                    566: 
                    567: 
                    568:        if(cfg->total_grps) {
                    569:                if((cfg->grp=(grp_t **)MALLOC(sizeof(grp_t *)*cfg->total_grps))==NULL)
                    570:                        return allocerr(txt,offset,fname,sizeof(grp_t *)*cfg->total_grps); }
                    571:        else
                    572:                cfg->grp=NULL;
                    573: 
                    574: 
                    575:        for(i=0;i<cfg->total_grps;i++) {
                    576: 
                    577:                if(feof(instream)) break;
                    578:                if((cfg->grp[i]=(grp_t *)MALLOC(sizeof(grp_t)))==NULL)
                    579:                        return allocerr(txt,offset,fname,sizeof(grp_t));
                    580:                memset(cfg->grp[i],0,sizeof(grp_t));
                    581: 
                    582:                get_alloc(&offset,cfg->grp[i]->lname,LEN_GLNAME,instream);
                    583:                get_alloc(&offset,cfg->grp[i]->sname,LEN_GSNAME,instream);
                    584: 
                    585:        #if !defined(SCFG) && defined(SAVE_MEMORY)        /* Save memory */
                    586:                if(!strcmp(cfg->grp[i]->lname,cfg->grp[i]->sname) && cfg->grp[i]->sname!=scfgnulstr) {
                    587:                        FREE(cfg->grp[i]->sname);
                    588:                        cfg->grp[i]->sname=cfg->grp[i]->lname; }
                    589:        #endif
                    590: 
                    591:        #ifdef SCFG
                    592:                get_str(cfg->grp[i]->ar,instream);
                    593:        #else
                    594:                fread(str,1,LEN_ARSTR+1,instream);
                    595:                offset+=LEN_ARSTR+1;
                    596:                cfg->grp[i]->ar=arstr(0,str,cfg);
                    597:        #endif
                    598:                for(j=0;j<48;j++)
                    599:                        get_int(n,instream);
                    600:                }
                    601:        cfg->total_grps=i;
                    602: 
                    603:        /**********************/
                    604:        /* Message Sub-boards */
                    605:        /**********************/
                    606: 
                    607:        get_int(cfg->total_subs,instream);
                    608: 
                    609:        if(cfg->total_subs) {
                    610:                if((cfg->sub=(sub_t **)MALLOC(sizeof(sub_t *)*cfg->total_subs))==NULL)
                    611:                        return allocerr(txt,offset,fname,sizeof(sub_t *)*cfg->total_subs); }
                    612:        else
                    613:                cfg->sub=NULL;
                    614: 
                    615:        for(i=0;i<cfg->total_subs;i++) {
                    616:                if(feof(instream)) break;
                    617:                if((cfg->sub[i]=(sub_t *)MALLOC(sizeof(sub_t)))==NULL)
                    618:                        return allocerr(txt,offset,fname,sizeof(sub_t));
                    619:                memset(cfg->sub[i],0,sizeof(sub_t));
                    620: 
                    621:                get_int(cfg->sub[i]->grp,instream);
                    622:                get_alloc(&offset,cfg->sub[i]->lname,LEN_SLNAME,instream);
                    623:                get_alloc(&offset,cfg->sub[i]->sname,LEN_SSNAME,instream);
                    624: 
                    625:        #if !defined(SCFG) && defined(SAVE_MEMORY) /* Save memory */
                    626:                if(!strcmp(cfg->sub[i]->lname,cfg->sub[i]->sname) && cfg->sub[i]->sname!=scfgnulstr) {
                    627:                        FREE(cfg->sub[i]->sname);
                    628:                        cfg->sub[i]->sname=cfg->sub[i]->lname; }
                    629:        #endif
                    630: 
                    631:                get_alloc(&offset,cfg->sub[i]->qwkname,10,instream);
                    632: 
                    633:        #if !defined(SCFG) && defined(SAVE_MEMORY)      /* Save memory */
                    634:                if(!strcmp(cfg->sub[i]->qwkname,cfg->sub[i]->sname) && cfg->sub[i]->qwkname!=scfgnulstr) {
                    635:                        FREE(cfg->sub[i]->qwkname);
                    636:                        cfg->sub[i]->qwkname=cfg->sub[i]->sname; }
                    637:        #endif
                    638: 
                    639:                get_str(cfg->sub[i]->code,instream);
                    640:                strlwr(cfg->sub[i]->code); /* temporary Unix-compatibility hack */
                    641: 
                    642:        #ifdef SCFG
                    643:                get_str(cfg->sub[i]->data_dir,instream);
                    644:        #else
                    645:                fread(str,LEN_DIR+1,1,instream);   /* substitute data dir */
                    646:                offset+=LEN_DIR+1;
                    647:                if(str[0]) {
                    648:                        prep_dir(cfg->ctrl_dir, str);
                    649:                        if((cfg->sub[i]->data_dir=(char *)MALLOC(strlen(str)+1))==NULL)
                    650:                                return allocerr(txt,offset,fname,strlen(str)+1);
                    651:                        strcpy(cfg->sub[i]->data_dir,str); }
                    652:                else
                    653:                        cfg->sub[i]->data_dir=cfg->data_dir_subs;
                    654:        #endif
                    655: 
                    656: 
                    657:        #ifdef SCFG
                    658:                get_str(cfg->sub[i]->ar,instream);
                    659:                get_str(cfg->sub[i]->read_ar,instream);
                    660:                get_str(cfg->sub[i]->post_ar,instream);
                    661:                get_str(cfg->sub[i]->op_ar,instream);
                    662:        #else
                    663:                fread(str,1,LEN_ARSTR+1,instream);
                    664:                offset+=LEN_ARSTR+1;
                    665:                cfg->sub[i]->ar=arstr(0,str,cfg);
                    666:                fread(str,1,LEN_ARSTR+1,instream);
                    667:                offset+=LEN_ARSTR+1;
                    668:                cfg->sub[i]->read_ar=arstr(0,str,cfg);
                    669:                fread(str,1,LEN_ARSTR+1,instream);
                    670:                offset+=LEN_ARSTR+1;
                    671:                cfg->sub[i]->post_ar=arstr(0,str,cfg);
                    672:                fread(str,1,LEN_ARSTR+1,instream);
                    673:                offset+=LEN_ARSTR+1;
                    674:                cfg->sub[i]->op_ar=arstr(0,str,cfg);
                    675:        #endif
                    676:                get_int(cfg->sub[i]->misc,instream);
                    677: 
                    678: 
                    679:        #ifdef SCFG
                    680:                get_str(cfg->sub[i]->tagline,instream);
                    681:        #else
                    682:                fread(str,81,1,instream);       /* substitute tagline */
                    683:                offset+=81;
                    684:                if(str[0]) {
                    685:                        if((cfg->sub[i]->tagline=(char *)MALLOC(strlen(str)+1))==NULL)
                    686:                                return allocerr(txt,offset,fname,strlen(str)+1);
                    687:                        strcpy(cfg->sub[i]->tagline,str); }
                    688:                else
                    689:                        cfg->sub[i]->tagline=cfg->qnet_tagline;
                    690:        #endif
                    691: 
                    692:        #ifdef SCFG
                    693:                get_str(cfg->sub[i]->origline,instream);
                    694:        #else
                    695:                fread(str,1,51,instream);       /* substitute origin line */
                    696:                offset+=51;
                    697:                if(str[0]) {
                    698:                        if((cfg->sub[i]->origline=(char *)MALLOC(strlen(str)+1))==NULL)
                    699:                                return allocerr(txt,offset,fname,strlen(str)+1);
                    700:                        strcpy(cfg->sub[i]->origline,str); }
                    701:                else
                    702:                        cfg->sub[i]->origline=cfg->origline;
                    703:        #endif
                    704: 
                    705:        #ifdef SCFG
                    706:                get_str(cfg->sub[i]->echomail_sem,instream);
                    707:        #else
                    708:                fread(str,1,LEN_DIR+1,instream);   /* substitute echomail semaphore */
                    709:                offset+=LEN_DIR+1;
                    710:                if(str[0]) {
                    711:                        prep_path(str);
                    712:                        if((cfg->sub[i]->echomail_sem=(char *)MALLOC(strlen(str)+1))==NULL)
                    713:                                return allocerr(txt,offset,fname,strlen(str)+1);
                    714:                        strcpy(cfg->sub[i]->echomail_sem,str); 
                    715:                } else
                    716:                        cfg->sub[i]->echomail_sem=cfg->echomail_sem;
                    717:        #endif
                    718:                fread(str,1,LEN_DIR+1,instream);   /* substitute EchoMail path */
                    719:                offset+=LEN_DIR+1;
                    720:        #ifndef SBBS
                    721:                backslash(str);
                    722:                strcpy(cfg->sub[i]->echopath,str);
                    723:        #endif
                    724:                get_int(cfg->sub[i]->faddr,instream);                   /* FidoNet address */
                    725: 
                    726:                get_int(cfg->sub[i]->maxmsgs,instream);
                    727:                get_int(cfg->sub[i]->maxcrcs,instream);
                    728:                get_int(cfg->sub[i]->maxage,instream);
                    729:                get_int(cfg->sub[i]->ptridx,instream);
                    730:        #ifdef SBBS
                    731:                for(j=0;j<i;j++)
                    732:                        if(cfg->sub[i]->ptridx==cfg->sub[j]->ptridx) {
                    733:                                lprintf(txt->error,offset,fname);
                    734:                                lprintf("Duplicate pointer index for subs #%d and #%d"
                    735:                                        ,i+1,j+1);
                    736:                                return(FALSE); }
                    737:        #endif
                    738: 
                    739:        #ifdef SCFG
                    740:                get_str(cfg->sub[i]->mod_ar,instream);
                    741:        #else
                    742:                fread(str,1,LEN_ARSTR+1,instream);
                    743:                offset+=LEN_ARSTR+1;
                    744:                cfg->sub[i]->mod_ar=arstr(0,str,cfg);
                    745:        #endif
                    746:                get_int(cfg->sub[i]->qwkconf,instream);
                    747:                get_int(c,instream);
                    748:                for(j=0;j<26;j++)
                    749:                        get_int(n,instream);
                    750:                }
                    751:        cfg->total_subs=i;
                    752: 
                    753:        /***********/
                    754:        /* FidoNet */
                    755:        /***********/
                    756: 
                    757:        get_int(cfg->total_faddrs,instream);
                    758: 
                    759:        if(cfg->total_faddrs) {
                    760:                if((cfg->faddr=(faddr_t *)MALLOC(sizeof(faddr_t)*cfg->total_faddrs))==NULL)
                    761:                        return allocerr(txt,offset,fname,sizeof(faddr_t)*cfg->total_faddrs); }
                    762:        else
                    763:                cfg->faddr=NULL;
                    764: 
                    765:        for(i=0;i<cfg->total_faddrs;i++)
                    766:                get_int(cfg->faddr[i],instream);
                    767: 
                    768:        get_str(cfg->origline,instream);
                    769:        get_str(cfg->netmail_sem,instream);
                    770:        get_str(cfg->echomail_sem,instream);
                    771:        get_str(cfg->netmail_dir,instream);
                    772:        get_str(cfg->echomail_dir,instream);
                    773:        get_str(cfg->fidofile_dir,instream);
                    774:        get_int(cfg->netmail_misc,instream);
                    775:        get_int(cfg->netmail_cost,instream);
                    776:        get_int(cfg->dflt_faddr,instream);
                    777:        for(i=0;i<28;i++)
                    778:                get_int(n,instream);
                    779: 
                    780:        /* Fix-up paths */
                    781:        prep_path(cfg->netmail_sem);
                    782:        prep_path(cfg->echomail_sem);
                    783:        prep_dir(cfg->netmail_dir,cfg->data_dir);
                    784:        prep_dir(cfg->echomail_dir,cfg->data_dir);
                    785:        prep_dir(cfg->fidofile_dir,cfg->data_dir);
                    786: 
                    787:        /**********/
                    788:        /* QWKnet */
                    789:        /**********/
                    790: 
                    791:        get_str(cfg->qnet_tagline,instream);
                    792: 
                    793:        get_int(cfg->total_qhubs,instream);
                    794: 
                    795:        if(cfg->total_qhubs) {
                    796:                if((cfg->qhub=(qhub_t **)MALLOC(sizeof(qhub_t *)*cfg->total_qhubs))==NULL)
                    797:                        return allocerr(txt,offset,fname,sizeof(qhub_t*)*cfg->total_qhubs); }
                    798:        else
                    799:                cfg->qhub=NULL;
                    800: 
                    801:        for(i=0;i<cfg->total_qhubs;i++) {
                    802:                if(feof(instream)) break;
                    803:                if((cfg->qhub[i]=(qhub_t *)MALLOC(sizeof(qhub_t)))==NULL)
                    804:                        return allocerr(txt,offset,fname,sizeof(qhub_t));
                    805:                memset(cfg->qhub[i],0,sizeof(qhub_t));
                    806: 
                    807:                get_str(cfg->qhub[i]->id,instream);
                    808:                get_int(cfg->qhub[i]->time,instream);
                    809:                get_int(cfg->qhub[i]->freq,instream);
                    810:                get_int(cfg->qhub[i]->days,instream);
                    811:                get_int(cfg->qhub[i]->node,instream);
                    812:                get_alloc(&offset,cfg->qhub[i]->call,LEN_CMD,instream);
                    813:                get_alloc(&offset,cfg->qhub[i]->pack,LEN_CMD,instream);
                    814:                get_alloc(&offset,cfg->qhub[i]->unpack,LEN_CMD,instream);
                    815:                get_int(k,instream);
                    816: 
                    817:                if(k) {
                    818:                        if((cfg->qhub[i]->sub=(ushort *)MALLOC(sizeof(ushort)*k))==NULL)
                    819:                                return allocerr(txt,offset,fname,sizeof(uint)*k);
                    820:                        if((cfg->qhub[i]->conf=(ushort *)MALLOC(sizeof(ushort)*k))==NULL)
                    821:                                return allocerr(txt,offset,fname,sizeof(ushort)*k);
                    822:                        if((cfg->qhub[i]->mode=(char *)MALLOC(sizeof(char)*k))==NULL)
                    823:                                return allocerr(txt,offset,fname,sizeof(uchar)*k); }
                    824: 
                    825:                for(j=0;j<k;j++) {
                    826:                        if(feof(instream)) break;
                    827:                        get_int(cfg->qhub[i]->conf[cfg->qhub[i]->subs],instream);
                    828:                        get_int(cfg->qhub[i]->sub[cfg->qhub[i]->subs],instream);
                    829:                        get_int(cfg->qhub[i]->mode[cfg->qhub[i]->subs],instream);
                    830:                        if(cfg->qhub[i]->sub[cfg->qhub[i]->subs]<cfg->total_subs)
                    831:                                cfg->sub[cfg->qhub[i]->sub[cfg->qhub[i]->subs]]->misc|=SUB_QNET;
                    832:                        else
                    833:                                continue;
                    834:                        if(cfg->qhub[i]->sub[cfg->qhub[i]->subs]!=INVALID_SUB)
                    835:                                cfg->qhub[i]->subs++; }
                    836:                for(j=0;j<32;j++)
                    837:                        get_int(n,instream); }
                    838: 
                    839:        cfg->total_qhubs=i;
                    840: 
                    841:        for(j=0;j<32;j++)
                    842:                get_int(n,instream);
                    843: 
                    844:        /************/
                    845:        /* PostLink */
                    846:        /************/
                    847: 
                    848:        fread(str,11,1,instream);               /* Unused - used to be Site Name */
                    849:        offset+=11;
                    850:        get_int(cfg->sys_psnum,instream);       /* Site Number */
                    851:        get_int(cfg->total_phubs,instream);
                    852: 
                    853:        if(cfg->total_phubs) {
                    854:                if((cfg->phub=(phub_t **)MALLOC(sizeof(phub_t *)*cfg->total_phubs))==NULL)
                    855:                        return allocerr(txt,offset,fname,sizeof(phub_t*)*cfg->total_phubs); }
                    856:        else
                    857:                cfg->phub=NULL;
                    858: 
                    859:        for(i=0;i<cfg->total_phubs;i++) {
                    860:                if(feof(instream)) break;
                    861:                if((cfg->phub[i]=(phub_t *)MALLOC(sizeof(phub_t)))==NULL)
                    862:                        return allocerr(txt,offset,fname,sizeof(phub_t));
                    863:                memset(cfg->phub[i],0,sizeof(phub_t));
                    864:        #ifdef SCFG
                    865:                get_str(cfg->phub[i]->name,instream);
                    866:        #else
                    867:                fread(str,11,1,instream);
                    868:                offset+=11;
                    869:        #endif
                    870:                get_int(cfg->phub[i]->time,instream);
                    871:                get_int(cfg->phub[i]->freq,instream);
                    872:                get_int(cfg->phub[i]->days,instream);
                    873:                get_int(cfg->phub[i]->node,instream);
                    874:                get_alloc(&offset,cfg->phub[i]->call,LEN_CMD,instream);
                    875:                for(j=0;j<32;j++)
                    876:                        get_int(n,instream); }
                    877: 
                    878:        cfg->total_phubs=i;
                    879: 
                    880:        get_str(cfg->sys_psname,instream);      /* Site Name */
                    881: 
                    882:        for(j=0;j<32;j++)
                    883:                get_int(n,instream);
                    884: 
                    885:        /* Internet */
                    886: 
                    887:        get_str(cfg->sys_inetaddr,instream); /* Internet address */
                    888:        get_str(cfg->inetmail_sem,instream);
                    889:        prep_path(cfg->inetmail_sem);
                    890:        get_int(cfg->inetmail_misc,instream);
                    891:        get_int(cfg->inetmail_cost,instream);
                    892: 
                    893:        fclose(instream);
                    894:        if(txt->readit && txt->readit[0])
                    895:                lprintf(txt->readit,fname);
                    896:        return(TRUE);
                    897: }
                    898: 
                    899: #endif
                    900: 
                    901: void free_node_cfg(scfg_t* cfg)
                    902: {
                    903:        FREE_AND_NULL(cfg->mdm_result);
                    904: }
                    905: 
                    906: void free_main_cfg(scfg_t* cfg)
                    907: {
                    908:        int i;
                    909: 
                    910:        for(i=0;i<cfg->sys_nodes;i++)
                    911:                FREE_AND_NULL(cfg->node_path[i]);
                    912:        FREE_AND_NULL(cfg->node_path);
                    913:        for(i=0;i<cfg->total_shells;i++)
                    914:                FREE_AND_NULL(cfg->shell[i]);
                    915:        FREE_AND_NULL(cfg->shell);
                    916: }
                    917: 
                    918: void free_msgs_cfg(scfg_t* cfg)
                    919: {
                    920:        int i;
                    921: 
                    922:        for(i=0;i<cfg->total_grps;i++)
                    923:                FREE_AND_NULL(cfg->grp[i]);
                    924:        FREE_AND_NULL(cfg->grp);
                    925: 
                    926:        for(i=0;i<cfg->total_subs;i++)
                    927:                FREE_AND_NULL(cfg->sub[i]);
                    928:        FREE_AND_NULL(cfg->sub);
                    929: 
                    930:        FREE_AND_NULL(cfg->faddr);
                    931:        cfg->total_faddrs=0;
                    932: 
                    933:        for(i=0;i<cfg->total_qhubs;i++) {
                    934:                FREE_AND_NULL(cfg->qhub[i]->mode);
                    935:                FREE_AND_NULL(cfg->qhub[i]->conf);
                    936:                FREE_AND_NULL(cfg->qhub[i]->sub);
                    937:                FREE_AND_NULL(cfg->qhub[i]); }
                    938:        FREE_AND_NULL(cfg->qhub);
                    939:        cfg->qhub=NULL;
                    940: 
                    941:        for(i=0;i<cfg->total_phubs;i++)
                    942:                FREE_AND_NULL(cfg->phub[i]);
                    943:        FREE_AND_NULL(cfg->phub);
                    944: 
                    945: }
                    946: 
                    947: /************************************************************/
                    948: /* Create data and sub-dirs off data if not already created */
                    949: /************************************************************/
                    950: void make_data_dirs(scfg_t* cfg)
                    951: {
                    952:        char str[MAX_PATH+1];
                    953: 
                    954:        md(cfg->data_dir);
                    955:        sprintf(str,"%ssubs",cfg->data_dir);
                    956:        md(str);
                    957:        sprintf(str,"%sdirs",cfg->data_dir);
                    958:        md(str);
                    959:        sprintf(str,"%stext",cfg->data_dir);
                    960:        md(str);
                    961:        sprintf(str,"%smsgs",cfg->data_dir);
                    962:        md(str);
                    963:        sprintf(str,"%suser",cfg->data_dir);
                    964:        md(str);
                    965:        sprintf(str,"%suser/ptrs",cfg->data_dir);
                    966:        md(str);
                    967:        sprintf(str,"%slogs",cfg->data_dir);
                    968:        md(str);
                    969:        sprintf(str,"%sqnet",cfg->data_dir);
                    970:        md(str);
                    971:        sprintf(str,"%sfile",cfg->data_dir);
                    972:        md(str);
                    973: }

unix.superglobalmegacorp.com

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