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

1.1       root        1: /* load_cfg.c */
                      2: 
                      3: /* Synchronet configuration load routines (exported) */
                      4: 
                      5: /* $Id: load_cfg.c,v 1.13 2000/11/28 02:42:16 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: 
                     40: /****************************************************************************/
                     41: /* Initializes system and node configuration information and data variables */
                     42: /****************************************************************************/
                     43: BOOL DLLCALL load_cfg(scfg_t* cfg, char* text[])
                     44: {
                     45:        char    str[256],fname[13];
                     46:        int             i;
                     47:        long    line=0L;
                     48:        FILE    *instream;
                     49:        read_cfg_text_t txt;
                     50: 
                     51:        free_cfg(cfg);  /* free allocated config parameters */
                     52: 
                     53:        memset(&txt,0,sizeof(txt));
                     54:        txt.openerr=    "!ERROR: opening %s for read.";
                     55:        txt.error=              "!ERROR: offset %lu in %s:";
                     56:        txt.allocerr=   "!ERROR: allocating %u bytes of memory.";
                     57: 
                     58:        if(cfg->node_num<1)
                     59:                cfg->node_num=1;
                     60: 
                     61:        backslash(cfg->ctrl_dir);
                     62:        if(read_main_cfg(cfg, &txt)==FALSE)
                     63:                return(FALSE);
                     64:        sprintf(cfg->node_dir,"%.*s",sizeof(cfg->node_dir)-1,cfg->node_path[cfg->node_num-1]);
                     65:        if(read_node_cfg(cfg, &txt)==FALSE)
                     66:                return(FALSE);
                     67:        if(read_msgs_cfg(cfg, &txt)==FALSE)
                     68:                return(FALSE);
                     69:        if(read_file_cfg(cfg, &txt)==FALSE)
                     70:                return(FALSE);
                     71:        if(read_xtrn_cfg(cfg, &txt)==FALSE)
                     72:                return(FALSE);
                     73:        if(read_chat_cfg(cfg, &txt)==FALSE)
                     74:                return(FALSE);
                     75:        if(read_attr_cfg(cfg, &txt)==FALSE)
                     76:                return(FALSE);
                     77: 
                     78:        if(text!=NULL) {
                     79: 
                     80:                /* Free existing text if allocated */
                     81:                free_text(text);
                     82: 
                     83:                strcpy(fname,"text.dat");
                     84:                sprintf(str,"%s%s",cfg->ctrl_dir,fname);
                     85:                if((instream=fnopen(NULL,str,O_RDONLY))==NULL) {
                     86:                        lprintf(txt.openerr,str);
                     87:                        return(FALSE); }
                     88:                if(txt.reading && txt.reading[0])
                     89:                        lprintf(txt.reading,fname);
                     90: 
                     91:                for(i=0;i<TOTAL_TEXT && !feof(instream) && !ferror(instream);i++)
                     92:                        if((text[i]=readtext(&line,instream))==NULL) {
                     93:                                i--;
                     94:                                break;
                     95:                        }
                     96:                fclose(instream);
                     97: 
                     98:                if(i<TOTAL_TEXT) {
                     99:                        lprintf(txt.error,line,fname);
                    100:                        lprintf("Less than TOTAL_TEXT (%u) strings defined in %s."
                    101:                                ,TOTAL_TEXT,fname);
                    102:                        return(FALSE); }
                    103: 
                    104:                /****************************/
                    105:                /* Read in static text data */
                    106:                /****************************/
                    107:                if(txt.readit && txt.readit[0])
                    108:                        lprintf(txt.readit,fname);
                    109:        }
                    110: 
                    111:     /* Override com-port settings */
                    112:     cfg->com_base=0xf; /* All nodes use FOSSIL */
                    113:     cfg->com_port=1;   /* All nodes use "COM1" */
                    114: 
                    115:        return(TRUE);
                    116: }
                    117: 
                    118: void DLLCALL free_cfg(scfg_t* cfg)
                    119: {
                    120:        free_node_cfg(cfg);
                    121:        free_main_cfg(cfg);
                    122:        free_msgs_cfg(cfg);
                    123:        free_file_cfg(cfg);
                    124:        free_chat_cfg(cfg);
                    125:        free_xtrn_cfg(cfg);
                    126: }
                    127: 
                    128: void DLLCALL free_text(char* text[])
                    129: {
                    130:        int i;
                    131: 
                    132:        if(text==NULL)
                    133:                return;
                    134: 
                    135:        for(i=0;i<TOTAL_TEXT;i++) {
                    136:                FREE_AND_NULL(text[i]); 
                    137:        }
                    138: }
                    139: 
                    140: /****************************************************************************/
                    141: /* If the directory 'path' doesn't exist, create it.                           */
                    142: /****************************************************************************/
                    143: BOOL md(char *inpath)
                    144: {
                    145:        DIR*    dir;
                    146:        char    path[MAX_PATH+1];
                    147: 
                    148:        sprintf(path,"%.*s",MAX_PATH,inpath);
                    149: 
                    150:        /* Truncate '.' if present */
                    151:        if(path[0]!=0 && path[strlen(path)-1]=='.')
                    152:                path[strlen(path)-1]=0;
                    153: 
                    154:        dir=opendir(path);
                    155:        if(dir==NULL) {
                    156:                lprintf("Creating directory: %s",path);
                    157:                if(_mkdir(path)) {
                    158:                        lprintf("!Error %d: Fix configuration or make directory by "
                    159:                                "hand.",errno);
                    160:                        return(FALSE); 
                    161:                } 
                    162:        }
                    163:        else
                    164:                closedir(dir);
                    165:        
                    166:        return(TRUE);
                    167: }
                    168: 
                    169: /****************************************************************************/
                    170: /* Reads special TEXT.DAT printf style text lines, splicing multiple lines, */
                    171: /* replacing escaped characters, and allocating the memory                                     */
                    172: /****************************************************************************/
                    173: char *readtext(long *line,FILE *stream)
                    174: {
                    175:        char buf[2048],str[2048],tmp[256],*p,*p2;
                    176:        int i,j,k;
                    177: 
                    178:        if(!fgets(buf,256,stream))
                    179:                return(NULL);
                    180:        if(line)
                    181:                (*line)++;
                    182:        if(buf[0]=='#')
                    183:                return(NULL);
                    184:        p=strrchr(buf,'"');
                    185:        if(!p) {
                    186:                if(line) {
                    187:                        lprintf("No quotation marks in line %d of text.dat",*line);
                    188:                        return(NULL); }
                    189:                return(NULL); }
                    190:        if(*(p+1)=='\\')        /* merge multiple lines */
                    191:                while(strlen(buf)<2000) {
                    192:                        if(!fgets(str,255,stream))
                    193:                                return(NULL);
                    194:                        if(line)
                    195:                                (*line)++;
                    196:                        p2=strchr(str,'"');
                    197:                        if(!p2)
                    198:                                continue;
                    199:                        strcpy(p,p2+1);
                    200:                        p=strrchr(p,'"');
                    201:                        if(p && *(p+1)=='\\')
                    202:                                continue;
                    203:                        break; }
                    204:        *(p)=0;
                    205:        k=strlen(buf);
                    206:        for(i=1,j=0;i<k;j++) {
                    207:                if(buf[i]=='\\')        { /* escape */
                    208:                        i++;
                    209:                        if(isdigit(buf[i])) {
                    210:                                str[j]=atoi(buf+i);     /* decimal, NOT octal */
                    211:                                if(isdigit(buf[++i]))   /* skip up to 3 digits */
                    212:                                        if(isdigit(buf[++i]))
                    213:                                                i++;
                    214:                                continue; }
                    215:                        switch(buf[i++]) {
                    216:                                case '\\':
                    217:                                        str[j]='\\';
                    218:                                        break;
                    219:                                case '?':
                    220:                                        str[j]='?';
                    221:                                        break;
                    222:                                case 'x':
                    223:                                        tmp[0]=buf[i++];        /* skip next character */
                    224:                                        tmp[1]=0;
                    225:                                        if(isxdigit(buf[i])) {  /* if another hex digit, skip too */
                    226:                                                tmp[1]=buf[i++];
                    227:                                                tmp[2]=0; }
                    228:                                        str[j]=(char)ahtoul(tmp);
                    229:                                        break;
                    230:                                case '\'':
                    231:                                        str[j]='\'';
                    232:                                        break;
                    233:                                case '"':
                    234:                                        str[j]='"';
                    235:                                        break;
                    236:                                case 'r':
                    237:                                        str[j]=CR;
                    238:                                        break;
                    239:                                case 'n':
                    240:                                        str[j]=LF;
                    241:                                        break;
                    242:                                case 't':
                    243:                                        str[j]=TAB;
                    244:                                        break;
                    245:                                case 'b':
                    246:                                        str[j]=BS;
                    247:                                        break;
                    248:                                case 'a':
                    249:                                        str[j]=BEL;
                    250:                                        break;
                    251:                                case 'f':
                    252:                                        str[j]=FF;
                    253:                                        break;
                    254:                                case 'v':
                    255:                                        str[j]=11;      /* VT */
                    256:                                        break;
                    257:                                default:
                    258:                                        str[j]=buf[i];
                    259:                                        break; }
                    260:                        continue; }
                    261:                str[j]=buf[i++]; }
                    262:        str[j]=0;
                    263:        if((p=(char *)MALLOC(j+1))==NULL) {
                    264:                lprintf("Error allocating %u bytes of memory from text.dat",j);
                    265:                return(NULL); }
                    266:        strcpy(p,str);
                    267:        return(p);
                    268: }
                    269: 
                    270: /****************************************************************************/
                    271: /* Reads in ATTR.CFG and initializes the associated variables               */
                    272: /****************************************************************************/
                    273: BOOL read_attr_cfg(scfg_t* cfg, read_cfg_text_t* txt)
                    274: {
                    275:     char    str[256],fname[13];
                    276:     int     i;
                    277:        long    offset=0;
                    278:     FILE    *instream;
                    279: 
                    280:        strcpy(fname,"attr.cfg");
                    281:        sprintf(str,"%s%s",cfg->ctrl_dir,fname);
                    282:        if((instream=fnopen(NULL,str,O_RDONLY))==NULL) {
                    283:                lprintf(txt->openerr,str);
                    284:                return(FALSE); }
                    285:        if(txt->reading && txt->reading[0])
                    286:                lprintf(txt->reading,fname);
                    287:        for(i=0;i<TOTAL_COLORS && !feof(instream) && !ferror(instream);i++) {
                    288:                readline(&offset,str,4,instream);
                    289:                cfg->color[i]=attrstr(str); }
                    290:        if(i<TOTAL_COLORS) {
                    291:                lprintf(txt->error,offset,fname);
                    292:                lprintf("Less than TOTAL_COLORS (%u) defined in %s"
                    293:                        ,TOTAL_COLORS,fname);
                    294:                return(FALSE); }
                    295:        fclose(instream);
                    296:        if(txt->readit && txt->readit[0])
                    297:                lprintf(txt->readit,fname);
                    298:        return(TRUE);
                    299: }
                    300: 

unix.superglobalmegacorp.com

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