Annotation of sbbs/src/sbbs3/scfgsave.c, revision 1.1

1.1     ! root        1: /* scfgsave.c */
        !             2: 
        !             3: /* Synchronet configuration file save routines */
        !             4: 
        !             5: /* $Id: scfgsave.c,v 1.48 2006/08/23 22:34:32 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 2006 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: BOOL no_msghdr=FALSE,all_msghdr=FALSE;
        !            41: 
        !            42: static char nulbuf[256]={0};
        !            43: static int  pslen;
        !            44: #define put_int(var,stream) fwrite(&var,1,sizeof(var),stream)
        !            45: #define put_str(var,stream) { pslen=strlen(var); \
        !            46:                                                        fwrite(var,1,pslen > sizeof(var) \
        !            47:                                                                ? sizeof(var) : pslen ,stream); \
        !            48:                                                        fwrite(nulbuf,1,pslen > sizeof(var) \
        !            49:                                                                ? 0 : sizeof(var)-pslen,stream); }
        !            50: 
        !            51: /****************************************************************************/
        !            52: /****************************************************************************/
        !            53: BOOL DLLCALL save_cfg(scfg_t* cfg, int backup_level)
        !            54: {
        !            55:        int i;
        !            56: 
        !            57:        if(cfg->prepped)
        !            58:                return(FALSE);
        !            59: 
        !            60:        for(i=0;i<cfg->sys_nodes;i++) {
        !            61:                if(cfg->node_path[i][0]==0) 
        !            62:                        sprintf(cfg->node_path[i],"../node%d",i+1);
        !            63:                cfg->node_num=i+1;
        !            64:                if(!write_node_cfg(cfg,backup_level))
        !            65:                        return(FALSE);
        !            66:        }
        !            67:        if(!write_main_cfg(cfg,backup_level))
        !            68:                return(FALSE);
        !            69:        if(!write_msgs_cfg(cfg,backup_level))
        !            70:                return(FALSE);
        !            71:        if(!write_file_cfg(cfg,backup_level))
        !            72:                return(FALSE);
        !            73:        if(!write_chat_cfg(cfg,backup_level))
        !            74:                return(FALSE);
        !            75:        if(!write_xtrn_cfg(cfg,backup_level))
        !            76:                return(FALSE);
        !            77: 
        !            78:        return(TRUE);
        !            79: }
        !            80: 
        !            81: BOOL DLLCALL fcopy(char* src, char* dest)
        !            82: {
        !            83:        int             ch;
        !            84:        ulong   count=0;
        !            85:        FILE*   in;
        !            86:        FILE*   out;
        !            87:        BOOL    success=TRUE;
        !            88: 
        !            89:        if((in=fopen(src,"rb"))==NULL)
        !            90:                return(FALSE);
        !            91:        if((out=fopen(dest,"wb"))==NULL) {
        !            92:                fclose(in);
        !            93:                return(FALSE);
        !            94:        }
        !            95: 
        !            96:        while(!feof(in)) {
        !            97:                if((ch=fgetc(in))==EOF)
        !            98:                        break;
        !            99:                if(fputc(ch,out)==EOF) {
        !           100:                        success=FALSE;
        !           101:                        break;
        !           102:                }
        !           103:                if(((count++)%(32*1024))==0)
        !           104:                        YIELD();
        !           105:        }
        !           106: 
        !           107:        fclose(in);
        !           108:        fclose(out);
        !           109: 
        !           110:        return(success);
        !           111: }
        !           112: 
        !           113: BOOL DLLCALL fcompare(char* fn1, char* fn2)
        !           114: {
        !           115:        FILE*   fp1;
        !           116:        FILE*   fp2;
        !           117:        BOOL    success=TRUE;
        !           118: 
        !           119:        if(flength(fn1) != flength(fn2))
        !           120:                return(FALSE);
        !           121:        if((fp1=fopen(fn1,"rb"))==NULL)
        !           122:                return(FALSE);
        !           123:        if((fp2=fopen(fn2,"rb"))==NULL) {
        !           124:                fclose(fp1);
        !           125:                return(FALSE);
        !           126:        }
        !           127: 
        !           128:        while(!feof(fp1) && success) {
        !           129:                if(fgetc(fp1) != fgetc(fp2))
        !           130:                        success=FALSE;
        !           131:        }
        !           132: 
        !           133:        fclose(fp1);
        !           134:        fclose(fp2);
        !           135: 
        !           136:        return(success);
        !           137: }
        !           138: 
        !           139: 
        !           140: /****************************************************************************/
        !           141: /****************************************************************************/
        !           142: BOOL DLLCALL backup(char *fname, int backup_level, BOOL ren)
        !           143: {
        !           144:        char    oldname[MAX_PATH+1];
        !           145:        char    newname[MAX_PATH+1];
        !           146:        char*   ext;
        !           147:        int             i;
        !           148:        int             len;
        !           149: 
        !           150:        if((ext=strrchr(fname,'.'))==NULL)
        !           151:                ext="";
        !           152: 
        !           153:        len=strlen(fname)-strlen(ext);
        !           154: 
        !           155:        for(i=backup_level;i;i--) {
        !           156:                safe_snprintf(newname,sizeof(newname),"%.*s.%d%s",len,fname,i-1,ext);
        !           157:                if(i==backup_level)
        !           158:                        if(fexist(newname) && remove(newname)!=0)
        !           159:                                return(FALSE);
        !           160:                if(i==1) {
        !           161:                        if(ren == TRUE) {
        !           162:                                if(rename(fname,newname)!=0)
        !           163:                                        return(FALSE);
        !           164:                        } else 
        !           165:                                if(!fcopy(fname,newname))
        !           166:                                        return(FALSE);
        !           167:                        continue; 
        !           168:                }
        !           169:                safe_snprintf(oldname,sizeof(oldname),"%.*s.%d%s",len,fname,i-2,ext);
        !           170:                if(fexist(oldname) && rename(oldname,newname)!=0)
        !           171:                        return(FALSE);
        !           172:        }
        !           173: 
        !           174:        return(TRUE);
        !           175: }
        !           176: 
        !           177: /****************************************************************************/
        !           178: /****************************************************************************/
        !           179: BOOL DLLCALL write_node_cfg(scfg_t* cfg, int backup_level)
        !           180: {
        !           181:        char    str[MAX_PATH+1];
        !           182:        int     i,file;
        !           183:        ushort  n;
        !           184:        FILE    *stream;
        !           185: 
        !           186:        if(cfg->prepped)
        !           187:                return(FALSE);
        !           188: 
        !           189:        if(cfg->node_num<1 || cfg->node_num>MAX_NODES)
        !           190:                return(FALSE);
        !           191: 
        !           192:        SAFECOPY(str,cfg->node_path[cfg->node_num-1]);
        !           193:        prep_dir(cfg->ctrl_dir,str,sizeof(str));
        !           194:        md(str);
        !           195:        strcat(str,"node.cnf");
        !           196:        backup(str, backup_level, TRUE);
        !           197: 
        !           198:        if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1
        !           199:                || (stream=fdopen(file,"wb"))==NULL) {
        !           200:                return(FALSE); 
        !           201:        }
        !           202:        setvbuf(stream,NULL,_IOFBF,2048);
        !           203: 
        !           204:        put_int(cfg->node_num,stream);
        !           205:        put_str(cfg->node_name,stream);
        !           206:        put_str(cfg->node_phone,stream);
        !           207:        put_str(cfg->node_comspec,stream);                               /* Was node_logon */
        !           208:        put_int(cfg->node_misc,stream);
        !           209:        put_int(cfg->node_ivt,stream);
        !           210:        put_int(cfg->node_swap,stream);
        !           211: #if 0
        !           212:        if(cfg->node_swapdir[0]) {
        !           213:                backslash(cfg->node_swapdir);
        !           214:                md(cfg->node_swapdir);               /* make sure it's a valid directory */
        !           215:        }
        !           216: #endif
        !           217:        put_str(cfg->node_swapdir,stream);
        !           218:        put_int(cfg->node_valuser,stream);
        !           219:        put_int(cfg->node_minbps,stream);
        !           220:        put_str(cfg->node_arstr,stream);
        !           221:        put_int(cfg->node_dollars_per_call,stream);
        !           222:        put_str(cfg->node_editor,stream);
        !           223:        put_str(cfg->node_viewer,stream);
        !           224:        put_str(cfg->node_daily,stream);
        !           225:        put_int(cfg->node_scrnlen,stream);
        !           226:        put_int(cfg->node_scrnblank,stream);
        !           227:        backslash(cfg->ctrl_dir);
        !           228:        put_str(cfg->ctrl_dir,stream);
        !           229:        backslash(cfg->text_dir);
        !           230:        put_str(cfg->text_dir,stream);
        !           231:        backslash(cfg->temp_dir);
        !           232:        put_str(cfg->temp_dir,stream);
        !           233:        for(i=0;i<10;i++)
        !           234:                put_str(cfg->wfc_cmd[i],stream);
        !           235:        for(i=0;i<12;i++)
        !           236:                put_str(cfg->wfc_scmd[i],stream);
        !           237:        put_str(cfg->mdm_hang,stream);
        !           238:        put_int(cfg->node_sem_check,stream);
        !           239:        put_int(cfg->node_stat_check,stream);
        !           240:        put_str(cfg->scfg_cmd,stream);
        !           241:        put_int(cfg->sec_warn,stream);
        !           242:        put_int(cfg->sec_hangup,stream);
        !           243:        n=0;
        !           244:        for(i=0;i<188;i++)                                      /* unused init to NULL */
        !           245:                fwrite(&n,1,2,stream);
        !           246:        n=0xffff;                                               /* unused init to 0xff */
        !           247:        for(i=0;i<256;i++)
        !           248:                fwrite(&n,1,2,stream);
        !           249:        put_int(cfg->com_port,stream);
        !           250:        put_int(cfg->com_irq,stream);
        !           251:        put_int(cfg->com_base,stream);
        !           252:        put_int(cfg->com_rate,stream);
        !           253:        put_int(cfg->mdm_misc,stream);
        !           254:        put_str(cfg->mdm_init,stream);
        !           255:        put_str(cfg->mdm_spec,stream);
        !           256:        put_str(cfg->mdm_term,stream);
        !           257:        put_str(cfg->mdm_dial,stream);
        !           258:        put_str(cfg->mdm_offh,stream);
        !           259:        put_str(cfg->mdm_answ,stream);
        !           260:        put_int(cfg->mdm_reinit,stream);
        !           261:        put_int(cfg->mdm_ansdelay,stream);
        !           262:        put_int(cfg->mdm_rings,stream);
        !           263:        put_int(cfg->mdm_results,stream);
        !           264:        for(i=0;i<cfg->mdm_results;i++) {
        !           265:                put_int(cfg->mdm_result[i].code,stream);
        !           266:                put_int(cfg->mdm_result[i].rate,stream);
        !           267:                put_int(cfg->mdm_result[i].cps,stream);
        !           268:                put_str(cfg->mdm_result[i].str,stream); 
        !           269:        }
        !           270:        fclose(stream);
        !           271: 
        !           272:        return(TRUE);
        !           273: }
        !           274: 
        !           275: /****************************************************************************/
        !           276: /****************************************************************************/
        !           277: BOOL DLLCALL write_main_cfg(scfg_t* cfg, int backup_level)
        !           278: {
        !           279:        char    str[MAX_PATH+1],c=0;
        !           280:        int     file;
        !           281:        ushort  i,j,n;
        !           282:        FILE    *stream;
        !           283: 
        !           284:        if(cfg->prepped)
        !           285:                return(FALSE);
        !           286: 
        !           287:        SAFEPRINTF(str,"%smain.cnf",cfg->ctrl_dir);
        !           288:        backup(str, backup_level, TRUE);
        !           289: 
        !           290:        if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1
        !           291:                || (stream=fdopen(file,"wb"))==NULL) {
        !           292:                return(FALSE); 
        !           293:        }
        !           294:        setvbuf(stream,NULL,_IOFBF,2048);
        !           295: 
        !           296:        put_str(cfg->sys_name,stream);
        !           297:        put_str(cfg->sys_id,stream);
        !           298:        put_str(cfg->sys_location,stream);
        !           299:        put_str(cfg->sys_phonefmt,stream);
        !           300:        put_str(cfg->sys_op,stream);
        !           301:        put_str(cfg->sys_guru,stream);
        !           302:        put_str(cfg->sys_pass,stream);
        !           303:        put_int(cfg->sys_nodes,stream);
        !           304:        for(i=0;i<cfg->sys_nodes;i++) 
        !           305:                put_str(cfg->node_path[i],stream);
        !           306:        backslash(cfg->data_dir);
        !           307:        put_str(cfg->data_dir,stream);
        !           308: 
        !           309:        backslash(cfg->exec_dir);
        !           310:        put_str(cfg->exec_dir,stream);
        !           311:        put_str(cfg->sys_logon,stream);
        !           312:        put_str(cfg->sys_logout,stream);
        !           313:        put_str(cfg->sys_daily,stream);
        !           314:        put_int(cfg->sys_timezone,stream);
        !           315:        put_int(cfg->sys_misc,stream);
        !           316:        put_int(cfg->sys_lastnode,stream);
        !           317:        put_int(cfg->sys_autonode,stream);
        !           318:        put_int(cfg->uq,stream);
        !           319:        put_int(cfg->sys_pwdays,stream);
        !           320:        put_int(cfg->sys_deldays,stream);
        !           321:        put_int(cfg->sys_exp_warn,stream);
        !           322:        put_int(cfg->sys_autodel,stream);
        !           323:        put_int(cfg->sys_def_stat,stream);
        !           324:        put_str(cfg->sys_chat_arstr,stream);
        !           325:        put_int(cfg->cdt_min_value,stream);
        !           326:        put_int(cfg->max_minutes,stream);
        !           327:        put_int(cfg->cdt_per_dollar,stream);
        !           328:        put_str(cfg->new_pass,stream);
        !           329:        put_str(cfg->new_magic,stream);
        !           330:        put_str(cfg->new_sif,stream);
        !           331:        put_str(cfg->new_sof,stream);
        !           332: 
        !           333:        put_int(cfg->new_level,stream);
        !           334:        put_int(cfg->new_flags1,stream);
        !           335:        put_int(cfg->new_flags2,stream);
        !           336:        put_int(cfg->new_flags3,stream);
        !           337:        put_int(cfg->new_flags4,stream);
        !           338:        put_int(cfg->new_exempt,stream);
        !           339:        put_int(cfg->new_rest,stream);
        !           340:        put_int(cfg->new_cdt,stream);
        !           341:        put_int(cfg->new_min,stream);
        !           342:        put_str(cfg->new_xedit,stream);
        !           343:        put_int(cfg->new_expire,stream);
        !           344:        if(cfg->new_shell>=cfg->total_shells)
        !           345:                cfg->new_shell=0;
        !           346:        put_int(cfg->new_shell,stream);
        !           347:        put_int(cfg->new_misc,stream);
        !           348:        put_int(cfg->new_prot,stream);
        !           349:        put_int(cfg->new_install,stream);
        !           350:        n=0;
        !           351:        for(i=0;i<7;i++)
        !           352:                put_int(n,stream);
        !           353: 
        !           354:        put_int(cfg->expired_level,stream);
        !           355:        put_int(cfg->expired_flags1,stream);
        !           356:        put_int(cfg->expired_flags2,stream);
        !           357:        put_int(cfg->expired_flags3,stream);
        !           358:        put_int(cfg->expired_flags4,stream);
        !           359:        put_int(cfg->expired_exempt,stream);
        !           360:        put_int(cfg->expired_rest,stream);
        !           361: 
        !           362:        put_str(cfg->logon_mod,stream);
        !           363:        put_str(cfg->logoff_mod,stream);
        !           364:        put_str(cfg->newuser_mod,stream);
        !           365:        put_str(cfg->login_mod,stream);
        !           366:        put_str(cfg->logout_mod,stream);
        !           367:        put_str(cfg->sync_mod,stream);
        !           368:        put_str(cfg->expire_mod,stream);
        !           369:        put_int(cfg->ctrlkey_passthru,stream);
        !           370:        put_str(cfg->mods_dir,stream);
        !           371:        put_str(cfg->logs_dir,stream);
        !           372: 
        !           373:        put_int(c,stream);
        !           374:        n=0;
        !           375:        for(i=0;i<158;i++)
        !           376:                put_int(n,stream);
        !           377:        n=0xffff;
        !           378:        for(i=0;i<254;i++)
        !           379:                put_int(n,stream);
        !           380: 
        !           381:        put_int(cfg->user_backup_level,stream);
        !           382:        put_int(cfg->mail_backup_level,stream);
        !           383: 
        !           384:        n=0;
        !           385:        for(i=0;i<10;i++) {
        !           386:                put_int(cfg->val_level[i],stream);
        !           387:                put_int(cfg->val_expire[i],stream);
        !           388:                put_int(cfg->val_flags1[i],stream);
        !           389:                put_int(cfg->val_flags2[i],stream);
        !           390:                put_int(cfg->val_flags3[i],stream);
        !           391:                put_int(cfg->val_flags4[i],stream);
        !           392:                put_int(cfg->val_cdt[i],stream);
        !           393:                put_int(cfg->val_exempt[i],stream);
        !           394:                put_int(cfg->val_rest[i],stream);
        !           395:                for(j=0;j<8;j++)
        !           396:                        put_int(n,stream); }
        !           397: 
        !           398:        c=0;
        !           399:        for(i=0;i<100 && !feof(stream);i++) {
        !           400:                put_int(cfg->level_timeperday[i],stream);
        !           401:                put_int(cfg->level_timepercall[i],stream);
        !           402:                put_int(cfg->level_callsperday[i],stream);
        !           403:                put_int(cfg->level_freecdtperday[i],stream);
        !           404:                put_int(cfg->level_linespermsg[i],stream);
        !           405:                put_int(cfg->level_postsperday[i],stream);
        !           406:                put_int(cfg->level_emailperday[i],stream);
        !           407:                put_int(cfg->level_misc[i],stream);
        !           408:                put_int(cfg->level_expireto[i],stream);
        !           409:                put_int(c,stream);
        !           410:                for(j=0;j<5;j++)
        !           411:                        put_int(n,stream); }
        !           412: 
        !           413:        /* Command Shells */
        !           414: 
        !           415:        put_int(cfg->total_shells,stream);
        !           416:        for(i=0;i<cfg->total_shells;i++) {
        !           417:                put_str(cfg->shell[i]->name,stream);
        !           418:                put_str(cfg->shell[i]->code,stream);
        !           419:                put_str(cfg->shell[i]->arstr,stream);
        !           420:                put_int(cfg->shell[i]->misc,stream);
        !           421:                n=0;
        !           422:                for(j=0;j<8;j++)
        !           423:                        put_int(n,stream); 
        !           424:        }
        !           425: 
        !           426:        fclose(stream);
        !           427: 
        !           428:        return(TRUE);
        !           429: }
        !           430: 
        !           431: /****************************************************************************/
        !           432: /****************************************************************************/
        !           433: BOOL DLLCALL write_msgs_cfg(scfg_t* cfg, int backup_level)
        !           434: {
        !           435:        char    str[MAX_PATH+1],c;
        !           436:        char    dir[LEN_DIR+1]="";
        !           437:        int     i,j,k,file;
        !           438:        ushort  n;
        !           439:        long    l;
        !           440:        FILE    *stream;
        !           441:        smb_t   smb;
        !           442: 
        !           443:        if(cfg->prepped)
        !           444:                return(FALSE);
        !           445: 
        !           446:        SAFEPRINTF(str,"%smsgs.cnf",cfg->ctrl_dir);
        !           447:        backup(str, backup_level, TRUE);
        !           448: 
        !           449:        if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1
        !           450:                || (stream=fdopen(file,"wb"))==NULL) {
        !           451:                return(FALSE); 
        !           452:        }
        !           453:        setvbuf(stream,NULL,_IOFBF,2048);
        !           454: 
        !           455:        put_int(cfg->max_qwkmsgs,stream);
        !           456:        put_int(cfg->mail_maxcrcs,stream);
        !           457:        put_int(cfg->mail_maxage,stream);
        !           458:        put_str(cfg->preqwk_arstr,stream);
        !           459:        put_int(cfg->smb_retry_time,stream);
        !           460:        n=0;
        !           461:        for(i=0;i<235;i++)
        !           462:                put_int(n,stream);
        !           463:        n=0xffff;
        !           464:        for(i=0;i<256;i++)
        !           465:                put_int(n,stream);
        !           466: 
        !           467:        /* Message Groups */
        !           468: 
        !           469:        put_int(cfg->total_grps,stream);
        !           470:        for(i=0;i<cfg->total_grps;i++) {
        !           471:                put_str(cfg->grp[i]->lname,stream);
        !           472:                put_str(cfg->grp[i]->sname,stream);
        !           473:                put_str(cfg->grp[i]->arstr,stream);
        !           474:                put_str(cfg->grp[i]->code_prefix,stream);
        !           475:                c=0;
        !           476:                put_int(c,stream);
        !           477:                n=0;
        !           478:                for(j=0;j<27;j++)
        !           479:                        put_int(n,stream);
        !           480:                n=0xffff;
        !           481:                for(j=0;j<16;j++)
        !           482:                        put_int(n,stream); 
        !           483:        }
        !           484: 
        !           485:        /* Message Sub-boards */
        !           486: 
        !           487:        backslash(cfg->echomail_dir);
        !           488: 
        !           489:        str[0]=0;
        !           490:        for(i=n=0;i<cfg->total_subs;i++)
        !           491:                if(cfg->sub[i]->grp<cfg->total_grps)            /* total VALID sub-boards */
        !           492:                        n++;
        !           493:        put_int(n,stream);
        !           494:        for(i=0;i<cfg->total_subs;i++) {
        !           495:                if(cfg->sub[i]->grp>=cfg->total_grps)   /* skip bogus group numbers */
        !           496:                        continue;
        !           497:                put_int(cfg->sub[i]->grp,stream);
        !           498:                put_str(cfg->sub[i]->lname,stream);
        !           499:                put_str(cfg->sub[i]->sname,stream);
        !           500:                put_str(cfg->sub[i]->qwkname,stream);
        !           501:                put_str(cfg->sub[i]->code_suffix,stream);
        !           502: #if 1
        !           503:                if(cfg->sub[i]->data_dir[0]) {
        !           504:                        backslash(cfg->sub[i]->data_dir);
        !           505:                        md(cfg->sub[i]->data_dir);
        !           506:                }
        !           507: #endif
        !           508:                put_str(cfg->sub[i]->data_dir,stream);
        !           509:                put_str(cfg->sub[i]->arstr,stream);
        !           510:                put_str(cfg->sub[i]->read_arstr,stream);
        !           511:                put_str(cfg->sub[i]->post_arstr,stream);
        !           512:                put_str(cfg->sub[i]->op_arstr,stream);
        !           513:                l=(cfg->sub[i]->misc&(~SUB_HDRMOD));    /* Don't write mod bit */
        !           514:                put_int(l,stream);
        !           515:                put_str(cfg->sub[i]->tagline,stream);
        !           516:                put_str(cfg->sub[i]->origline,stream);
        !           517:                put_str(cfg->sub[i]->post_sem,stream);
        !           518:                put_str(cfg->sub[i]->newsgroup,stream);
        !           519:                put_int(cfg->sub[i]->faddr,stream);
        !           520:                put_int(cfg->sub[i]->maxmsgs,stream);
        !           521:                put_int(cfg->sub[i]->maxcrcs,stream);
        !           522:                put_int(cfg->sub[i]->maxage,stream);
        !           523:                put_int(cfg->sub[i]->ptridx,stream);
        !           524:                put_str(cfg->sub[i]->mod_arstr,stream);
        !           525:                put_int(cfg->sub[i]->qwkconf,stream);
        !           526:                c=0;
        !           527:                put_int(c,stream);
        !           528:                n=0;
        !           529:                for(k=0;k<26;k++)
        !           530:                        put_int(n,stream);
        !           531: 
        !           532:                if(all_msghdr || (cfg->sub[i]->misc&SUB_HDRMOD && !no_msghdr)) {
        !           533:                        if(!cfg->sub[i]->data_dir[0])
        !           534:                                SAFEPRINTF(smb.file,"%ssubs",cfg->data_dir);
        !           535:                        else
        !           536:                                SAFECOPY(smb.file,cfg->sub[i]->data_dir);
        !           537:                        prep_dir(cfg->ctrl_dir,smb.file,sizeof(smb.file));
        !           538:                        SAFEPRINTF2(str,"%s%s"
        !           539:                                ,cfg->grp[cfg->sub[i]->grp]->code_prefix
        !           540:                                ,cfg->sub[i]->code_suffix);
        !           541:                        strlwr(str);
        !           542:                        strcat(smb.file,str);
        !           543:                        if(smb_open(&smb)!=0) {
        !           544:                                /* errormsg(WHERE,ERR_OPEN,smb.file,x); */
        !           545:                                continue; 
        !           546:                        }
        !           547:                        if(!filelength(fileno(smb.shd_fp))) {
        !           548:                                smb.status.max_crcs=cfg->sub[i]->maxcrcs;
        !           549:                                smb.status.max_msgs=cfg->sub[i]->maxmsgs;
        !           550:                                smb.status.max_age=cfg->sub[i]->maxage;
        !           551:                                smb.status.attr=cfg->sub[i]->misc&SUB_HYPER ? SMB_HYPERALLOC :0;
        !           552:                                if(smb_create(&smb)!=0)
        !           553:                                        /* errormsg(WHERE,ERR_CREATE,smb.file,x) */;
        !           554:                                smb_close(&smb);
        !           555:                                continue; 
        !           556:                        }
        !           557:                        if(smb_locksmbhdr(&smb)!=0) {
        !           558:                                smb_close(&smb);
        !           559:                                /* errormsg(WHERE,ERR_LOCK,smb.file,x) */;
        !           560:                                continue; 
        !           561:                        }
        !           562:                        if(smb_getstatus(&smb)!=0) {
        !           563:                                smb_close(&smb);
        !           564:                                /* errormsg(WHERE,ERR_READ,smb.file,x) */;
        !           565:                                continue; 
        !           566:                        }
        !           567:                        if((!(cfg->sub[i]->misc&SUB_HYPER) || smb.status.attr&SMB_HYPERALLOC)
        !           568:                                && smb.status.max_msgs==cfg->sub[i]->maxmsgs
        !           569:                                && smb.status.max_crcs==cfg->sub[i]->maxcrcs
        !           570:                                && smb.status.max_age==cfg->sub[i]->maxage) {   /* No change */
        !           571:                                smb_close(&smb);
        !           572:                                continue; 
        !           573:                        }
        !           574:                        smb.status.max_msgs=cfg->sub[i]->maxmsgs;
        !           575:                        smb.status.max_crcs=cfg->sub[i]->maxcrcs;
        !           576:                        smb.status.max_age=cfg->sub[i]->maxage;
        !           577:                        if(cfg->sub[i]->misc&SUB_HYPER)
        !           578:                                smb.status.attr|=SMB_HYPERALLOC;
        !           579:                        if(smb_putstatus(&smb)!=0) {
        !           580:                                smb_close(&smb);
        !           581:                                /* errormsg(WHERE,ERR_WRITE,smb.file,x); */
        !           582:                                continue; 
        !           583:                        }
        !           584:                        smb_close(&smb); 
        !           585:                }
        !           586:        }
        !           587: 
        !           588:        /* FidoNet */
        !           589: 
        !           590:        put_int(cfg->total_faddrs,stream);
        !           591:        for(i=0;i<cfg->total_faddrs;i++) {
        !           592:                put_int(cfg->faddr[i].zone,stream);
        !           593:                put_int(cfg->faddr[i].net,stream);
        !           594:                put_int(cfg->faddr[i].node,stream);
        !           595:                put_int(cfg->faddr[i].point,stream); }
        !           596: 
        !           597:        put_str(cfg->origline,stream);
        !           598:        put_str(cfg->netmail_sem,stream);
        !           599:        put_str(cfg->echomail_sem,stream);
        !           600:        backslash(cfg->netmail_dir);
        !           601:        put_str(cfg->netmail_dir,stream);
        !           602:        put_str(cfg->echomail_dir,stream);
        !           603:        backslash(cfg->fidofile_dir);
        !           604:        put_str(cfg->fidofile_dir,stream);
        !           605:        put_int(cfg->netmail_misc,stream);
        !           606:        put_int(cfg->netmail_cost,stream);
        !           607:        put_int(cfg->dflt_faddr,stream);
        !           608:        n=0;
        !           609:        for(i=0;i<28;i++)
        !           610:                put_int(n,stream);
        !           611: 
        !           612:        /* QWKnet Config */
        !           613: 
        !           614:        put_str(cfg->qnet_tagline,stream);
        !           615: 
        !           616:        put_int(cfg->total_qhubs,stream);
        !           617:        for(i=0;i<cfg->total_qhubs;i++) {
        !           618:                put_str(cfg->qhub[i]->id,stream);
        !           619:                put_int(cfg->qhub[i]->time,stream);
        !           620:                put_int(cfg->qhub[i]->freq,stream);
        !           621:                put_int(cfg->qhub[i]->days,stream);
        !           622:                put_int(cfg->qhub[i]->node,stream);
        !           623:                put_str(cfg->qhub[i]->call,stream);
        !           624:                put_str(cfg->qhub[i]->pack,stream);
        !           625:                put_str(cfg->qhub[i]->unpack,stream);
        !           626:                put_int(cfg->qhub[i]->subs,stream);
        !           627:                for(j=0;j<cfg->qhub[i]->subs;j++) {
        !           628:                        put_int(cfg->qhub[i]->conf[j],stream);
        !           629:                        put_int(cfg->qhub[i]->sub[j],stream);
        !           630:                        put_int(cfg->qhub[i]->mode[j],stream); }
        !           631:                n=0;
        !           632:                for(j=0;j<32;j++)
        !           633:                        put_int(n,stream); }
        !           634:        n=0;
        !           635:        for(i=0;i<32;i++)
        !           636:                put_int(n,stream);
        !           637: 
        !           638:        /* PostLink Config */
        !           639: 
        !           640:        memset(str,0,11);
        !           641:        fwrite(str,11,1,stream);        /* unused, used to be site name */
        !           642:        put_int(cfg->sys_psnum,stream);
        !           643: 
        !           644:        put_int(cfg->total_phubs,stream);
        !           645:        for(i=0;i<cfg->total_phubs;i++) {
        !           646:                put_str(cfg->phub[i]->name,stream);
        !           647:                put_int(cfg->phub[i]->time,stream);
        !           648:                put_int(cfg->phub[i]->freq,stream);
        !           649:                put_int(cfg->phub[i]->days,stream);
        !           650:                put_int(cfg->phub[i]->node,stream);
        !           651:                put_str(cfg->phub[i]->call,stream);
        !           652:                n=0;
        !           653:                for(j=0;j<32;j++)
        !           654:                        put_int(n,stream); }
        !           655: 
        !           656:        put_str(cfg->sys_psname,stream);
        !           657:        n=0;
        !           658:        for(i=0;i<32;i++)
        !           659:                put_int(n,stream);
        !           660: 
        !           661:        put_str(cfg->sys_inetaddr,stream); /* Internet address */
        !           662:        put_str(cfg->inetmail_sem,stream);
        !           663:        put_int(cfg->inetmail_misc,stream);
        !           664:        put_int(cfg->inetmail_cost,stream);
        !           665:        put_str(cfg->smtpmail_sem,stream);
        !           666: 
        !           667:        fclose(stream);
        !           668: 
        !           669:        /* MUST BE AT END */
        !           670: 
        !           671:        if(!no_msghdr) {
        !           672:                strcpy(dir,cfg->data_dir);
        !           673:                prep_dir(cfg->ctrl_dir,dir,sizeof(dir));
        !           674:                SAFEPRINTF(smb.file,"%smail",dir);
        !           675:                if(smb_open(&smb)!=0) {
        !           676:                        return(FALSE); 
        !           677:                }
        !           678:                if(!filelength(fileno(smb.shd_fp))) {
        !           679:                        smb.status.max_msgs=0;
        !           680:                        smb.status.max_crcs=cfg->mail_maxcrcs;
        !           681:                        smb.status.max_age=cfg->mail_maxage;
        !           682:                        smb.status.attr=SMB_EMAIL;
        !           683:                        i=smb_create(&smb);
        !           684:                        smb_close(&smb);
        !           685:                        return(i==0);
        !           686:                }
        !           687:                if(smb_locksmbhdr(&smb)!=0) {
        !           688:                        smb_close(&smb);
        !           689:                        /* errormsg disabled.  Why?  ToDo */
        !           690:                        /* errormsg(WHERE,ERR_LOCK,smb.file,x); */
        !           691:                        return(FALSE); 
        !           692:                }
        !           693:                if(smb_getstatus(&smb)!=0) {
        !           694:                        smb_close(&smb);
        !           695:                        /* errormsg disabled.  Why?  ToDo */
        !           696:                        /* errormsg(WHERE,ERR_READ,smb.file,x); */
        !           697:                        return(FALSE); 
        !           698:                }
        !           699:                smb.status.max_msgs=0;
        !           700:                smb.status.max_crcs=cfg->mail_maxcrcs;
        !           701:                smb.status.max_age=cfg->mail_maxage;
        !           702:                if(smb_putstatus(&smb)!=0) {
        !           703:                        smb_close(&smb);
        !           704:                        /* errormsg disabled.  Why?  ToDo */
        !           705:                        /* errormsg(WHERE,ERR_WRITE,smb.file,x); */
        !           706:                        return(FALSE); 
        !           707:                }
        !           708:                smb_close(&smb); 
        !           709:        }
        !           710: 
        !           711:        return(TRUE);
        !           712: }
        !           713: 
        !           714: 
        !           715: /****************************************************************************/
        !           716: /****************************************************************************/
        !           717: BOOL DLLCALL write_file_cfg(scfg_t* cfg, int backup_level)
        !           718: {
        !           719:        char    str[MAX_PATH+1],cmd[LEN_CMD+1],c;
        !           720:        char    path[MAX_PATH+1];
        !           721:        int     i,j,k,file;
        !           722:        ushort  n;
        !           723:        long    l=0;
        !           724:        FILE    *stream;
        !           725: 
        !           726:        if(cfg->prepped)
        !           727:                return(FALSE);
        !           728: 
        !           729:        SAFEPRINTF(str,"%sfile.cnf",cfg->ctrl_dir);
        !           730:        backup(str, backup_level, TRUE);
        !           731: 
        !           732:        if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1
        !           733:                || (stream=fdopen(file,"wb"))==NULL) {
        !           734:                return(FALSE); 
        !           735:        }
        !           736:        setvbuf(stream,NULL,_IOFBF,2048);
        !           737: 
        !           738:        put_int(cfg->min_dspace,stream);
        !           739:        put_int(cfg->max_batup,stream);
        !           740:        put_int(cfg->max_batdn,stream);
        !           741:        put_int(cfg->max_userxfer,stream);
        !           742:        put_int(l,stream);                                      /* unused */
        !           743:        put_int(cfg->cdt_up_pct,stream);
        !           744:        put_int(cfg->cdt_dn_pct,stream);
        !           745:        put_int(l,stream);                                      /* unused */
        !           746:        put_str(cmd,stream);
        !           747:        put_int(cfg->leech_pct,stream);
        !           748:        put_int(cfg->leech_sec,stream);
        !           749:        put_int(cfg->file_misc,stream);
        !           750:        n=0;
        !           751:        for(i=0;i<30;i++)
        !           752:                put_int(n,stream);
        !           753: 
        !           754:        /* Extractable File Types */
        !           755: 
        !           756:        put_int(cfg->total_fextrs,stream);
        !           757:        for(i=0;i<cfg->total_fextrs;i++) {
        !           758:                put_str(cfg->fextr[i]->ext,stream);
        !           759:                put_str(cfg->fextr[i]->cmd,stream);
        !           760:                put_str(cfg->fextr[i]->arstr,stream);
        !           761:                n=0;
        !           762:                for(j=0;j<8;j++)
        !           763:                        put_int(n,stream); }
        !           764: 
        !           765:        /* Compressable File Types */
        !           766: 
        !           767:        put_int(cfg->total_fcomps,stream);
        !           768:        for(i=0;i<cfg->total_fcomps;i++) {
        !           769:                put_str(cfg->fcomp[i]->ext,stream);
        !           770:                put_str(cfg->fcomp[i]->cmd,stream);
        !           771:                put_str(cfg->fcomp[i]->arstr,stream);
        !           772:                n=0;
        !           773:                for(j=0;j<8;j++)
        !           774:                        put_int(n,stream); }
        !           775: 
        !           776:        /* Viewable File Types */
        !           777: 
        !           778:        put_int(cfg->total_fviews,stream);
        !           779:        for(i=0;i<cfg->total_fviews;i++) {
        !           780:                put_str(cfg->fview[i]->ext,stream);
        !           781:                put_str(cfg->fview[i]->cmd,stream);
        !           782:                put_str(cfg->fview[i]->arstr,stream);
        !           783:                n=0;
        !           784:                for(j=0;j<8;j++)
        !           785:                        put_int(n,stream); }
        !           786: 
        !           787:        /* Testable File Types */
        !           788: 
        !           789:        put_int(cfg->total_ftests,stream);
        !           790:        for(i=0;i<cfg->total_ftests;i++) {
        !           791:                put_str(cfg->ftest[i]->ext,stream);
        !           792:                put_str(cfg->ftest[i]->cmd,stream);
        !           793:                put_str(cfg->ftest[i]->workstr,stream);
        !           794:                put_str(cfg->ftest[i]->arstr,stream);
        !           795:                n=0;
        !           796:                for(j=0;j<8;j++)
        !           797:                        put_int(n,stream); }
        !           798: 
        !           799:        /* Download Events */
        !           800: 
        !           801:        put_int(cfg->total_dlevents,stream);
        !           802:        for(i=0;i<cfg->total_dlevents;i++) {
        !           803:                put_str(cfg->dlevent[i]->ext,stream);
        !           804:                put_str(cfg->dlevent[i]->cmd,stream);
        !           805:                put_str(cfg->dlevent[i]->workstr,stream);
        !           806:                put_str(cfg->dlevent[i]->arstr,stream);
        !           807:                n=0;
        !           808:                for(j=0;j<8;j++)
        !           809:                        put_int(n,stream); }
        !           810: 
        !           811:        /* File Transfer Protocols */
        !           812: 
        !           813:        put_int(cfg->total_prots,stream);
        !           814:        for(i=0;i<cfg->total_prots;i++) {
        !           815:                put_int(cfg->prot[i]->mnemonic,stream);
        !           816:                put_str(cfg->prot[i]->name,stream);
        !           817:                put_str(cfg->prot[i]->ulcmd,stream);
        !           818:                put_str(cfg->prot[i]->dlcmd,stream);
        !           819:                put_str(cfg->prot[i]->batulcmd,stream);
        !           820:                put_str(cfg->prot[i]->batdlcmd,stream);
        !           821:                put_str(cfg->prot[i]->blindcmd,stream);
        !           822:                put_str(cfg->prot[i]->bicmd,stream);
        !           823:                put_int(cfg->prot[i]->misc,stream);
        !           824:                put_str(cfg->prot[i]->arstr,stream);
        !           825:                n=0;
        !           826:                for(j=0;j<8;j++)
        !           827:                        put_int(n,stream); }
        !           828: 
        !           829:        /* Alternate File Paths */
        !           830: 
        !           831:        put_int(cfg->altpaths,stream);
        !           832:        for(i=0;i<cfg->altpaths;i++) {
        !           833:                backslash(cfg->altpath[i]);
        !           834:                fwrite(cfg->altpath[i],LEN_DIR+1,1,stream);
        !           835:                n=0;
        !           836:                for(j=0;j<8;j++)
        !           837:                        put_int(n,stream); }
        !           838: 
        !           839:        /* File Libraries */
        !           840: 
        !           841:        put_int(cfg->total_libs,stream);
        !           842:        for(i=0;i<cfg->total_libs;i++) {
        !           843:                put_str(cfg->lib[i]->lname,stream);
        !           844:                put_str(cfg->lib[i]->sname,stream);
        !           845:                put_str(cfg->lib[i]->arstr,stream);
        !           846:                put_str(cfg->lib[i]->parent_path,stream);
        !           847:                put_str(cfg->lib[i]->code_prefix,stream);
        !           848: 
        !           849:                c=0;
        !           850:                put_int(c,stream);
        !           851:                n=0x0000;
        !           852:                for(j=0;j<3;j++)
        !           853:                        put_int(n,stream); 
        !           854: 
        !           855:                n=0xffff;
        !           856:                for(j=0;j<16;j++)
        !           857:                        put_int(n,stream); 
        !           858:        }
        !           859: 
        !           860:        /* File Directories */
        !           861: 
        !           862:        put_int(cfg->total_dirs,stream);
        !           863:        for(j=0;j<cfg->total_libs;j++)
        !           864:                for(i=0;i<cfg->total_dirs;i++)
        !           865:                        if(cfg->dir[i]->lib==j) {
        !           866:                                put_int(cfg->dir[i]->lib,stream);
        !           867:                                put_str(cfg->dir[i]->lname,stream);
        !           868:                                put_str(cfg->dir[i]->sname,stream);
        !           869:                                put_str(cfg->dir[i]->code_suffix,stream);
        !           870: #if 1
        !           871:                                if(cfg->dir[i]->data_dir[0]) {
        !           872:                                        backslash(cfg->dir[i]->data_dir);
        !           873:                                        md(cfg->dir[i]->data_dir);
        !           874:                                }
        !           875: #endif
        !           876:                                put_str(cfg->dir[i]->data_dir,stream);
        !           877:                                put_str(cfg->dir[i]->arstr,stream);
        !           878:                                put_str(cfg->dir[i]->ul_arstr,stream);
        !           879:                                put_str(cfg->dir[i]->dl_arstr,stream);
        !           880:                                put_str(cfg->dir[i]->op_arstr,stream);
        !           881:                                backslash(cfg->dir[i]->path);
        !           882:                                put_str(cfg->dir[i]->path,stream);
        !           883: #if 1
        !           884:                                if(cfg->dir[i]->misc&DIR_FCHK) {
        !           885:                                        SAFECOPY(path,cfg->dir[i]->path);
        !           886:                                        if(!path[0]) {          /* no file storage path specified */
        !           887:                                                SAFEPRINTF2(str,"%s%s"
        !           888:                                                        ,cfg->lib[cfg->dir[i]->lib]->code_prefix
        !           889:                                                        ,cfg->dir[i]->code_suffix);
        !           890:                                                strlwr(str);
        !           891:                                                safe_snprintf(path,sizeof(path),"%sdirs/%s/"
        !           892:                                                        ,cfg->data_dir
        !           893:                                                        ,str);
        !           894:                                        }
        !           895:                                        else if(cfg->lib[cfg->dir[i]->lib]->parent_path[0]) {
        !           896:                                                SAFECOPY(path,cfg->lib[cfg->dir[i]->lib]->parent_path);
        !           897:                                                prep_dir(cfg->ctrl_dir,path,sizeof(path));
        !           898:                                                md(path);
        !           899:                                                backslash(path);
        !           900:                                                strcat(path,cfg->dir[i]->path);
        !           901:                                        }
        !           902:                                        else
        !           903:                                                prep_dir(cfg->ctrl_dir, path,sizeof(path));
        !           904:                                        md(path); 
        !           905:                                }
        !           906: #endif
        !           907: 
        !           908:                                put_str(cfg->dir[i]->upload_sem,stream);
        !           909:                                put_int(cfg->dir[i]->maxfiles,stream);
        !           910:                                put_str(cfg->dir[i]->exts,stream);
        !           911:                                put_int(cfg->dir[i]->misc,stream);
        !           912:                                put_int(cfg->dir[i]->seqdev,stream);
        !           913:                                put_int(cfg->dir[i]->sort,stream);
        !           914:                                put_str(cfg->dir[i]->ex_arstr,stream);
        !           915:                                put_int(cfg->dir[i]->maxage,stream);
        !           916:                                put_int(cfg->dir[i]->up_pct,stream);
        !           917:                                put_int(cfg->dir[i]->dn_pct,stream);
        !           918:                                c=0;
        !           919:                                put_int(c,stream);
        !           920:                                n=0;
        !           921:                                for(k=0;k<8;k++)
        !           922:                                        put_int(n,stream);
        !           923:                                n=0xffff;
        !           924:                                for(k=0;k<16;k++)
        !           925:                                        put_int(n,stream);
        !           926:                                }
        !           927: 
        !           928:        /* Text File Sections */
        !           929: 
        !           930:        put_int(cfg->total_txtsecs,stream);
        !           931:        for(i=0;i<cfg->total_txtsecs;i++) {
        !           932: #if 1
        !           933:                SAFECOPY(str,cfg->txtsec[i]->code);
        !           934:                strlwr(str);
        !           935:                safe_snprintf(path,sizeof(path),"%stext/%s",cfg->data_dir,str);
        !           936:                md(path);
        !           937: #endif
        !           938:                put_str(cfg->txtsec[i]->name,stream);
        !           939:                put_str(cfg->txtsec[i]->code,stream);
        !           940:                put_str(cfg->txtsec[i]->arstr,stream);
        !           941:                n=0;
        !           942:                for(j=0;j<8;j++)
        !           943:                        put_int(n,stream); 
        !           944:        }
        !           945: 
        !           946:        fclose(stream);
        !           947: 
        !           948:        return(TRUE);
        !           949: }
        !           950: 
        !           951: 
        !           952: 
        !           953: /****************************************************************************/
        !           954: /****************************************************************************/
        !           955: BOOL DLLCALL write_chat_cfg(scfg_t* cfg, int backup_level)
        !           956: {
        !           957:        char    str[MAX_PATH+1];
        !           958:        int     i,j,file;
        !           959:        ushort  n;
        !           960:        FILE    *stream;
        !           961: 
        !           962:        if(cfg->prepped)
        !           963:                return(FALSE);
        !           964: 
        !           965:        sprintf(str,"%schat.cnf",cfg->ctrl_dir);
        !           966:        backup(str, backup_level, TRUE);
        !           967: 
        !           968:        if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1
        !           969:                || (stream=fdopen(file,"wb"))==NULL) {
        !           970:                return(FALSE); 
        !           971:        }
        !           972:        setvbuf(stream,NULL,_IOFBF,2048);
        !           973: 
        !           974:        put_int(cfg->total_gurus,stream);
        !           975:        for(i=0;i<cfg->total_gurus;i++) {
        !           976:                put_str(cfg->guru[i]->name,stream);
        !           977:                put_str(cfg->guru[i]->code,stream);
        !           978:                put_str(cfg->guru[i]->arstr,stream);
        !           979:                n=0;
        !           980:                for(j=0;j<8;j++)
        !           981:                        put_int(n,stream);
        !           982:                }
        !           983: 
        !           984:        put_int(cfg->total_actsets,stream);
        !           985:        for(i=0;i<cfg->total_actsets;i++)
        !           986:                put_str(cfg->actset[i]->name,stream);
        !           987: 
        !           988:        put_int(cfg->total_chatacts,stream);
        !           989:        for(i=0;i<cfg->total_chatacts;i++) {
        !           990:                put_int(cfg->chatact[i]->actset,stream);
        !           991:                put_str(cfg->chatact[i]->cmd,stream);
        !           992:                put_str(cfg->chatact[i]->out,stream);
        !           993:                n=0;
        !           994:                for(j=0;j<8;j++)
        !           995:                        put_int(n,stream);
        !           996:                }
        !           997: 
        !           998:        put_int(cfg->total_chans,stream);
        !           999:        for(i=0;i<cfg->total_chans;i++) {
        !          1000:                put_int(cfg->chan[i]->actset,stream);
        !          1001:                put_str(cfg->chan[i]->name,stream);
        !          1002:                put_str(cfg->chan[i]->code,stream);
        !          1003:                put_str(cfg->chan[i]->arstr,stream);
        !          1004:                put_int(cfg->chan[i]->cost,stream);
        !          1005:                put_int(cfg->chan[i]->guru,stream);
        !          1006:                put_int(cfg->chan[i]->misc,stream);
        !          1007:                n=0;
        !          1008:                for(j=0;j<8;j++)
        !          1009:                        put_int(n,stream);
        !          1010:                }
        !          1011: 
        !          1012:        put_int(cfg->total_pages,stream);
        !          1013:        for(i=0;i<cfg->total_pages;i++) {
        !          1014:                put_str(cfg->page[i]->cmd,stream);
        !          1015:                put_str(cfg->page[i]->arstr,stream);
        !          1016:                put_int(cfg->page[i]->misc,stream);
        !          1017:                n=0;
        !          1018:                for(j=0;j<8;j++)
        !          1019:                        put_int(n,stream);
        !          1020:                }
        !          1021: 
        !          1022:        fclose(stream);
        !          1023: 
        !          1024:        return(TRUE);
        !          1025: }
        !          1026: 
        !          1027: 
        !          1028: /****************************************************************************/
        !          1029: /****************************************************************************/
        !          1030: BOOL DLLCALL write_xtrn_cfg(scfg_t* cfg, int backup_level)
        !          1031: {
        !          1032:        uchar   str[MAX_PATH+1],c;
        !          1033:        int     i,j,sec,file;
        !          1034:        ushort  n;
        !          1035:        FILE    *stream;
        !          1036: 
        !          1037:        if(cfg->prepped)
        !          1038:                return(FALSE);
        !          1039: 
        !          1040:        sprintf(str,"%sxtrn.cnf",cfg->ctrl_dir);
        !          1041:        backup(str, backup_level, TRUE);
        !          1042: 
        !          1043:        if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1
        !          1044:                || (stream=fdopen(file,"wb"))==NULL) {
        !          1045:                return(FALSE); 
        !          1046:        }
        !          1047:        setvbuf(stream,NULL,_IOFBF,2048);
        !          1048: 
        !          1049:        put_int(cfg->total_swaps,stream);
        !          1050:        for(i=0;i<cfg->total_swaps;i++)
        !          1051:                put_str(cfg->swap[i]->cmd,stream);
        !          1052: 
        !          1053:        put_int(cfg->total_xedits,stream);
        !          1054:        for(i=0;i<cfg->total_xedits;i++) {
        !          1055:                put_str(cfg->xedit[i]->name,stream);
        !          1056:                put_str(cfg->xedit[i]->code,stream);
        !          1057:                put_str(cfg->xedit[i]->lcmd,stream);
        !          1058:                put_str(cfg->xedit[i]->rcmd,stream);
        !          1059:                put_int(cfg->xedit[i]->misc,stream);
        !          1060:                put_str(cfg->xedit[i]->arstr,stream);
        !          1061:                put_int(cfg->xedit[i]->type,stream);
        !          1062:                c=0;
        !          1063:                put_int(c,stream);
        !          1064:                n=0;
        !          1065:                for(j=0;j<7;j++)
        !          1066:                        put_int(n,stream);
        !          1067:                }
        !          1068: 
        !          1069:        put_int(cfg->total_xtrnsecs,stream);
        !          1070:        for(i=0;i<cfg->total_xtrnsecs;i++) {
        !          1071:                put_str(cfg->xtrnsec[i]->name,stream);
        !          1072:                put_str(cfg->xtrnsec[i]->code,stream);
        !          1073:                put_str(cfg->xtrnsec[i]->arstr,stream);
        !          1074:                n=0;
        !          1075:                for(j=0;j<8;j++)
        !          1076:                        put_int(n,stream);
        !          1077:                }
        !          1078: 
        !          1079:        put_int(cfg->total_xtrns,stream);
        !          1080:        for(sec=0;sec<cfg->total_xtrnsecs;sec++)
        !          1081:                for(i=0;i<cfg->total_xtrns;i++) {
        !          1082:                        if(cfg->xtrn[i]->sec!=sec)
        !          1083:                                continue;
        !          1084:                        put_int(cfg->xtrn[i]->sec,stream);
        !          1085:                        put_str(cfg->xtrn[i]->name,stream);
        !          1086:                        put_str(cfg->xtrn[i]->code,stream);
        !          1087:                        put_str(cfg->xtrn[i]->arstr,stream);
        !          1088:                        put_str(cfg->xtrn[i]->run_arstr,stream);
        !          1089:                        put_int(cfg->xtrn[i]->type,stream);
        !          1090:                        put_int(cfg->xtrn[i]->misc,stream);
        !          1091:                        put_int(cfg->xtrn[i]->event,stream);
        !          1092:                        put_int(cfg->xtrn[i]->cost,stream);
        !          1093:                        put_str(cfg->xtrn[i]->cmd,stream);
        !          1094:                        put_str(cfg->xtrn[i]->clean,stream);
        !          1095:                        put_str(cfg->xtrn[i]->path,stream);
        !          1096:                        put_int(cfg->xtrn[i]->textra,stream);
        !          1097:                        put_int(cfg->xtrn[i]->maxtime,stream);
        !          1098:                        n=0;
        !          1099:                        for(j=0;j<7;j++)
        !          1100:                                put_int(n,stream);
        !          1101:                        }
        !          1102: 
        !          1103:        put_int(cfg->total_events,stream);
        !          1104:        for(i=0;i<cfg->total_events;i++) {
        !          1105:                put_str(cfg->event[i]->code,stream);
        !          1106:                put_str(cfg->event[i]->cmd,stream);
        !          1107:                put_int(cfg->event[i]->days,stream);
        !          1108:                put_int(cfg->event[i]->time,stream);
        !          1109:                put_int(cfg->event[i]->node,stream);
        !          1110:                put_int(cfg->event[i]->misc,stream);
        !          1111:                put_str(cfg->event[i]->dir,stream);
        !          1112:                put_int(cfg->event[i]->freq,stream);
        !          1113:                put_int(cfg->event[i]->mdays,stream);
        !          1114:                n=0;
        !          1115:                for(j=0;j<5;j++)
        !          1116:                        put_int(n,stream);
        !          1117:                }
        !          1118: 
        !          1119:        put_int(cfg->total_natvpgms,stream);
        !          1120:        for(i=0;i<cfg->total_natvpgms;i++)
        !          1121:                put_str(cfg->natvpgm[i]->name,stream);
        !          1122:        for(i=0;i<cfg->total_natvpgms;i++)
        !          1123:                put_int(cfg->natvpgm[i]->misc,stream);
        !          1124: 
        !          1125:        put_int(cfg->total_hotkeys,stream);
        !          1126:        for(i=0;i<cfg->total_hotkeys;i++) {
        !          1127:                put_int(cfg->hotkey[i]->key,stream);
        !          1128:                put_str(cfg->hotkey[i]->cmd,stream);
        !          1129:                n=0;
        !          1130:                for(j=0;j<8;j++)
        !          1131:                        put_int(n,stream);
        !          1132:                }
        !          1133: 
        !          1134:        fclose(stream);
        !          1135: 
        !          1136:        return(TRUE);
        !          1137: }
        !          1138: 
        !          1139: void DLLCALL refresh_cfg(scfg_t* cfg)
        !          1140: {
        !          1141:        char    str[MAX_PATH+1];
        !          1142:     int                i;
        !          1143:        int             file;
        !          1144:     node_t     node;
        !          1145:     
        !          1146:     for(i=0;i<cfg->sys_nodes;i++) {
        !          1147:                if(getnodedat(cfg,i+1,&node,&file)!=0)
        !          1148:                        continue;
        !          1149:         node.misc|=NODE_RRUN;
        !          1150:         if(putnodedat(cfg,i+1,&node,file))
        !          1151:             break;
        !          1152:     }
        !          1153: 
        !          1154:        SAFEPRINTF(str,"%srecycle",cfg->ctrl_dir);              ftouch(str);
        !          1155: }

unix.superglobalmegacorp.com

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