Annotation of sbbs/sbbs3/load_cfg.c, revision 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.