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

1.1       root        1: /* scfgsave.c */
                      2: 
                      3: /* Synchronet configuration file save routines */
                      4: 
1.1.1.2 ! root        5: /* $Id: scfgsave.c,v 1.55 2009/11/12 04:34:41 rswindell Exp $ */
1.1       root        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:  *                                                                                                                                                     *
1.1.1.2 ! root       11:  * Copyright 2009 Rob Swindell - http://www.synchro.net/copyright.html         *
1.1       root       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;
1.1.1.2 ! root      183:        uint16_t        n;
1.1       root      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;
1.1.1.2 ! root      281:        ushort  i,j;
        !           282:        uint16_t n;
1.1       root      283:        FILE    *stream;
                    284: 
                    285:        if(cfg->prepped)
                    286:                return(FALSE);
                    287: 
                    288:        SAFEPRINTF(str,"%smain.cnf",cfg->ctrl_dir);
                    289:        backup(str, backup_level, TRUE);
                    290: 
                    291:        if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1
                    292:                || (stream=fdopen(file,"wb"))==NULL) {
                    293:                return(FALSE); 
                    294:        }
                    295:        setvbuf(stream,NULL,_IOFBF,2048);
                    296: 
                    297:        put_str(cfg->sys_name,stream);
                    298:        put_str(cfg->sys_id,stream);
                    299:        put_str(cfg->sys_location,stream);
                    300:        put_str(cfg->sys_phonefmt,stream);
                    301:        put_str(cfg->sys_op,stream);
                    302:        put_str(cfg->sys_guru,stream);
                    303:        put_str(cfg->sys_pass,stream);
                    304:        put_int(cfg->sys_nodes,stream);
                    305:        for(i=0;i<cfg->sys_nodes;i++) 
                    306:                put_str(cfg->node_path[i],stream);
                    307:        backslash(cfg->data_dir);
                    308:        put_str(cfg->data_dir,stream);
                    309: 
                    310:        backslash(cfg->exec_dir);
                    311:        put_str(cfg->exec_dir,stream);
                    312:        put_str(cfg->sys_logon,stream);
                    313:        put_str(cfg->sys_logout,stream);
                    314:        put_str(cfg->sys_daily,stream);
                    315:        put_int(cfg->sys_timezone,stream);
                    316:        put_int(cfg->sys_misc,stream);
                    317:        put_int(cfg->sys_lastnode,stream);
                    318:        put_int(cfg->sys_autonode,stream);
                    319:        put_int(cfg->uq,stream);
                    320:        put_int(cfg->sys_pwdays,stream);
                    321:        put_int(cfg->sys_deldays,stream);
                    322:        put_int(cfg->sys_exp_warn,stream);
                    323:        put_int(cfg->sys_autodel,stream);
                    324:        put_int(cfg->sys_def_stat,stream);
                    325:        put_str(cfg->sys_chat_arstr,stream);
                    326:        put_int(cfg->cdt_min_value,stream);
                    327:        put_int(cfg->max_minutes,stream);
                    328:        put_int(cfg->cdt_per_dollar,stream);
                    329:        put_str(cfg->new_pass,stream);
                    330:        put_str(cfg->new_magic,stream);
                    331:        put_str(cfg->new_sif,stream);
                    332:        put_str(cfg->new_sof,stream);
                    333: 
                    334:        put_int(cfg->new_level,stream);
                    335:        put_int(cfg->new_flags1,stream);
                    336:        put_int(cfg->new_flags2,stream);
                    337:        put_int(cfg->new_flags3,stream);
                    338:        put_int(cfg->new_flags4,stream);
                    339:        put_int(cfg->new_exempt,stream);
                    340:        put_int(cfg->new_rest,stream);
                    341:        put_int(cfg->new_cdt,stream);
                    342:        put_int(cfg->new_min,stream);
                    343:        put_str(cfg->new_xedit,stream);
                    344:        put_int(cfg->new_expire,stream);
                    345:        if(cfg->new_shell>=cfg->total_shells)
                    346:                cfg->new_shell=0;
                    347:        put_int(cfg->new_shell,stream);
                    348:        put_int(cfg->new_misc,stream);
                    349:        put_int(cfg->new_prot,stream);
                    350:        put_int(cfg->new_install,stream);
                    351:        n=0;
                    352:        for(i=0;i<7;i++)
                    353:                put_int(n,stream);
                    354: 
                    355:        put_int(cfg->expired_level,stream);
                    356:        put_int(cfg->expired_flags1,stream);
                    357:        put_int(cfg->expired_flags2,stream);
                    358:        put_int(cfg->expired_flags3,stream);
                    359:        put_int(cfg->expired_flags4,stream);
                    360:        put_int(cfg->expired_exempt,stream);
                    361:        put_int(cfg->expired_rest,stream);
                    362: 
                    363:        put_str(cfg->logon_mod,stream);
                    364:        put_str(cfg->logoff_mod,stream);
                    365:        put_str(cfg->newuser_mod,stream);
                    366:        put_str(cfg->login_mod,stream);
                    367:        put_str(cfg->logout_mod,stream);
                    368:        put_str(cfg->sync_mod,stream);
                    369:        put_str(cfg->expire_mod,stream);
                    370:        put_int(cfg->ctrlkey_passthru,stream);
                    371:        put_str(cfg->mods_dir,stream);
                    372:        put_str(cfg->logs_dir,stream);
                    373: 
                    374:        put_int(c,stream);
                    375:        n=0;
                    376:        for(i=0;i<158;i++)
                    377:                put_int(n,stream);
                    378:        n=0xffff;
                    379:        for(i=0;i<254;i++)
                    380:                put_int(n,stream);
                    381: 
                    382:        put_int(cfg->user_backup_level,stream);
                    383:        put_int(cfg->mail_backup_level,stream);
                    384: 
                    385:        n=0;
                    386:        for(i=0;i<10;i++) {
                    387:                put_int(cfg->val_level[i],stream);
                    388:                put_int(cfg->val_expire[i],stream);
                    389:                put_int(cfg->val_flags1[i],stream);
                    390:                put_int(cfg->val_flags2[i],stream);
                    391:                put_int(cfg->val_flags3[i],stream);
                    392:                put_int(cfg->val_flags4[i],stream);
                    393:                put_int(cfg->val_cdt[i],stream);
                    394:                put_int(cfg->val_exempt[i],stream);
                    395:                put_int(cfg->val_rest[i],stream);
                    396:                for(j=0;j<8;j++)
                    397:                        put_int(n,stream); }
                    398: 
                    399:        c=0;
                    400:        for(i=0;i<100 && !feof(stream);i++) {
                    401:                put_int(cfg->level_timeperday[i],stream);
                    402:                put_int(cfg->level_timepercall[i],stream);
                    403:                put_int(cfg->level_callsperday[i],stream);
                    404:                put_int(cfg->level_freecdtperday[i],stream);
                    405:                put_int(cfg->level_linespermsg[i],stream);
                    406:                put_int(cfg->level_postsperday[i],stream);
                    407:                put_int(cfg->level_emailperday[i],stream);
                    408:                put_int(cfg->level_misc[i],stream);
                    409:                put_int(cfg->level_expireto[i],stream);
                    410:                put_int(c,stream);
                    411:                for(j=0;j<5;j++)
                    412:                        put_int(n,stream); }
                    413: 
                    414:        /* Command Shells */
                    415: 
                    416:        put_int(cfg->total_shells,stream);
                    417:        for(i=0;i<cfg->total_shells;i++) {
                    418:                put_str(cfg->shell[i]->name,stream);
                    419:                put_str(cfg->shell[i]->code,stream);
                    420:                put_str(cfg->shell[i]->arstr,stream);
                    421:                put_int(cfg->shell[i]->misc,stream);
                    422:                n=0;
                    423:                for(j=0;j<8;j++)
                    424:                        put_int(n,stream); 
                    425:        }
                    426: 
                    427:        fclose(stream);
                    428: 
                    429:        return(TRUE);
                    430: }
                    431: 
                    432: /****************************************************************************/
                    433: /****************************************************************************/
                    434: BOOL DLLCALL write_msgs_cfg(scfg_t* cfg, int backup_level)
                    435: {
                    436:        char    str[MAX_PATH+1],c;
                    437:        char    dir[LEN_DIR+1]="";
                    438:        int     i,j,k,file;
1.1.1.2 ! root      439:        uint16_t        n;
        !           440:        int32_t l;
1.1       root      441:        FILE    *stream;
                    442:        smb_t   smb;
                    443: 
                    444:        if(cfg->prepped)
                    445:                return(FALSE);
                    446: 
                    447:        SAFEPRINTF(str,"%smsgs.cnf",cfg->ctrl_dir);
                    448:        backup(str, backup_level, TRUE);
                    449: 
                    450:        if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1
                    451:                || (stream=fdopen(file,"wb"))==NULL) {
                    452:                return(FALSE); 
                    453:        }
                    454:        setvbuf(stream,NULL,_IOFBF,2048);
                    455: 
                    456:        put_int(cfg->max_qwkmsgs,stream);
                    457:        put_int(cfg->mail_maxcrcs,stream);
                    458:        put_int(cfg->mail_maxage,stream);
                    459:        put_str(cfg->preqwk_arstr,stream);
                    460:        put_int(cfg->smb_retry_time,stream);
1.1.1.2 ! root      461:        put_int(cfg->max_qwkmsgage,stream);
1.1       root      462:        n=0;
1.1.1.2 ! root      463:        for(i=0;i<233;i++)
1.1       root      464:                put_int(n,stream);
1.1.1.2 ! root      465:        put_int(cfg->msg_misc,stream);
1.1       root      466:        n=0xffff;
1.1.1.2 ! root      467:        for(i=0;i<255;i++)
1.1       root      468:                put_int(n,stream);
                    469: 
                    470:        /* Message Groups */
                    471: 
                    472:        put_int(cfg->total_grps,stream);
                    473:        for(i=0;i<cfg->total_grps;i++) {
                    474:                put_str(cfg->grp[i]->lname,stream);
                    475:                put_str(cfg->grp[i]->sname,stream);
                    476:                put_str(cfg->grp[i]->arstr,stream);
                    477:                put_str(cfg->grp[i]->code_prefix,stream);
                    478:                c=0;
                    479:                put_int(c,stream);
                    480:                n=0;
                    481:                for(j=0;j<27;j++)
                    482:                        put_int(n,stream);
                    483:                n=0xffff;
                    484:                for(j=0;j<16;j++)
                    485:                        put_int(n,stream); 
                    486:        }
                    487: 
                    488:        /* Message Sub-boards */
                    489: 
                    490:        backslash(cfg->echomail_dir);
                    491: 
                    492:        str[0]=0;
                    493:        for(i=n=0;i<cfg->total_subs;i++)
                    494:                if(cfg->sub[i]->grp<cfg->total_grps)            /* total VALID sub-boards */
                    495:                        n++;
                    496:        put_int(n,stream);
                    497:        for(i=0;i<cfg->total_subs;i++) {
                    498:                if(cfg->sub[i]->grp>=cfg->total_grps)   /* skip bogus group numbers */
                    499:                        continue;
                    500:                put_int(cfg->sub[i]->grp,stream);
                    501:                put_str(cfg->sub[i]->lname,stream);
                    502:                put_str(cfg->sub[i]->sname,stream);
                    503:                put_str(cfg->sub[i]->qwkname,stream);
                    504:                put_str(cfg->sub[i]->code_suffix,stream);
                    505: #if 1
                    506:                if(cfg->sub[i]->data_dir[0]) {
                    507:                        backslash(cfg->sub[i]->data_dir);
                    508:                        md(cfg->sub[i]->data_dir);
                    509:                }
                    510: #endif
                    511:                put_str(cfg->sub[i]->data_dir,stream);
                    512:                put_str(cfg->sub[i]->arstr,stream);
                    513:                put_str(cfg->sub[i]->read_arstr,stream);
                    514:                put_str(cfg->sub[i]->post_arstr,stream);
                    515:                put_str(cfg->sub[i]->op_arstr,stream);
                    516:                l=(cfg->sub[i]->misc&(~SUB_HDRMOD));    /* Don't write mod bit */
                    517:                put_int(l,stream);
                    518:                put_str(cfg->sub[i]->tagline,stream);
                    519:                put_str(cfg->sub[i]->origline,stream);
                    520:                put_str(cfg->sub[i]->post_sem,stream);
                    521:                put_str(cfg->sub[i]->newsgroup,stream);
                    522:                put_int(cfg->sub[i]->faddr,stream);
                    523:                put_int(cfg->sub[i]->maxmsgs,stream);
                    524:                put_int(cfg->sub[i]->maxcrcs,stream);
                    525:                put_int(cfg->sub[i]->maxage,stream);
                    526:                put_int(cfg->sub[i]->ptridx,stream);
                    527:                put_str(cfg->sub[i]->mod_arstr,stream);
                    528:                put_int(cfg->sub[i]->qwkconf,stream);
                    529:                c=0;
                    530:                put_int(c,stream);
                    531:                n=0;
                    532:                for(k=0;k<26;k++)
                    533:                        put_int(n,stream);
                    534: 
                    535:                if(all_msghdr || (cfg->sub[i]->misc&SUB_HDRMOD && !no_msghdr)) {
                    536:                        if(!cfg->sub[i]->data_dir[0])
                    537:                                SAFEPRINTF(smb.file,"%ssubs",cfg->data_dir);
                    538:                        else
                    539:                                SAFECOPY(smb.file,cfg->sub[i]->data_dir);
                    540:                        prep_dir(cfg->ctrl_dir,smb.file,sizeof(smb.file));
                    541:                        SAFEPRINTF2(str,"%s%s"
                    542:                                ,cfg->grp[cfg->sub[i]->grp]->code_prefix
                    543:                                ,cfg->sub[i]->code_suffix);
                    544:                        strlwr(str);
                    545:                        strcat(smb.file,str);
                    546:                        if(smb_open(&smb)!=0) {
                    547:                                /* errormsg(WHERE,ERR_OPEN,smb.file,x); */
                    548:                                continue; 
                    549:                        }
                    550:                        if(!filelength(fileno(smb.shd_fp))) {
                    551:                                smb.status.max_crcs=cfg->sub[i]->maxcrcs;
                    552:                                smb.status.max_msgs=cfg->sub[i]->maxmsgs;
                    553:                                smb.status.max_age=cfg->sub[i]->maxage;
                    554:                                smb.status.attr=cfg->sub[i]->misc&SUB_HYPER ? SMB_HYPERALLOC :0;
                    555:                                if(smb_create(&smb)!=0)
                    556:                                        /* errormsg(WHERE,ERR_CREATE,smb.file,x) */;
                    557:                                smb_close(&smb);
                    558:                                continue; 
                    559:                        }
                    560:                        if(smb_locksmbhdr(&smb)!=0) {
                    561:                                smb_close(&smb);
                    562:                                /* errormsg(WHERE,ERR_LOCK,smb.file,x) */;
                    563:                                continue; 
                    564:                        }
                    565:                        if(smb_getstatus(&smb)!=0) {
                    566:                                smb_close(&smb);
                    567:                                /* errormsg(WHERE,ERR_READ,smb.file,x) */;
                    568:                                continue; 
                    569:                        }
                    570:                        if((!(cfg->sub[i]->misc&SUB_HYPER) || smb.status.attr&SMB_HYPERALLOC)
                    571:                                && smb.status.max_msgs==cfg->sub[i]->maxmsgs
                    572:                                && smb.status.max_crcs==cfg->sub[i]->maxcrcs
                    573:                                && smb.status.max_age==cfg->sub[i]->maxage) {   /* No change */
                    574:                                smb_close(&smb);
                    575:                                continue; 
                    576:                        }
                    577:                        smb.status.max_msgs=cfg->sub[i]->maxmsgs;
                    578:                        smb.status.max_crcs=cfg->sub[i]->maxcrcs;
                    579:                        smb.status.max_age=cfg->sub[i]->maxage;
                    580:                        if(cfg->sub[i]->misc&SUB_HYPER)
                    581:                                smb.status.attr|=SMB_HYPERALLOC;
                    582:                        if(smb_putstatus(&smb)!=0) {
                    583:                                smb_close(&smb);
                    584:                                /* errormsg(WHERE,ERR_WRITE,smb.file,x); */
                    585:                                continue; 
                    586:                        }
                    587:                        smb_close(&smb); 
                    588:                }
                    589:        }
                    590: 
                    591:        /* FidoNet */
                    592: 
                    593:        put_int(cfg->total_faddrs,stream);
                    594:        for(i=0;i<cfg->total_faddrs;i++) {
                    595:                put_int(cfg->faddr[i].zone,stream);
                    596:                put_int(cfg->faddr[i].net,stream);
                    597:                put_int(cfg->faddr[i].node,stream);
                    598:                put_int(cfg->faddr[i].point,stream); }
                    599: 
                    600:        put_str(cfg->origline,stream);
                    601:        put_str(cfg->netmail_sem,stream);
                    602:        put_str(cfg->echomail_sem,stream);
                    603:        backslash(cfg->netmail_dir);
                    604:        put_str(cfg->netmail_dir,stream);
                    605:        put_str(cfg->echomail_dir,stream);
                    606:        backslash(cfg->fidofile_dir);
                    607:        put_str(cfg->fidofile_dir,stream);
                    608:        put_int(cfg->netmail_misc,stream);
                    609:        put_int(cfg->netmail_cost,stream);
                    610:        put_int(cfg->dflt_faddr,stream);
                    611:        n=0;
                    612:        for(i=0;i<28;i++)
                    613:                put_int(n,stream);
                    614: 
                    615:        /* QWKnet Config */
                    616: 
                    617:        put_str(cfg->qnet_tagline,stream);
                    618: 
                    619:        put_int(cfg->total_qhubs,stream);
                    620:        for(i=0;i<cfg->total_qhubs;i++) {
                    621:                put_str(cfg->qhub[i]->id,stream);
                    622:                put_int(cfg->qhub[i]->time,stream);
                    623:                put_int(cfg->qhub[i]->freq,stream);
                    624:                put_int(cfg->qhub[i]->days,stream);
                    625:                put_int(cfg->qhub[i]->node,stream);
                    626:                put_str(cfg->qhub[i]->call,stream);
                    627:                put_str(cfg->qhub[i]->pack,stream);
                    628:                put_str(cfg->qhub[i]->unpack,stream);
                    629:                put_int(cfg->qhub[i]->subs,stream);
                    630:                for(j=0;j<cfg->qhub[i]->subs;j++) {
                    631:                        put_int(cfg->qhub[i]->conf[j],stream);
1.1.1.2 ! root      632:                        n=(uint16_t)cfg->qhub[i]->sub[j];
        !           633:                        put_int(n,stream);
1.1       root      634:                        put_int(cfg->qhub[i]->mode[j],stream); }
                    635:                n=0;
                    636:                for(j=0;j<32;j++)
                    637:                        put_int(n,stream); }
                    638:        n=0;
                    639:        for(i=0;i<32;i++)
                    640:                put_int(n,stream);
                    641: 
                    642:        /* PostLink Config */
                    643: 
                    644:        memset(str,0,11);
                    645:        fwrite(str,11,1,stream);        /* unused, used to be site name */
                    646:        put_int(cfg->sys_psnum,stream);
                    647: 
                    648:        put_int(cfg->total_phubs,stream);
                    649:        for(i=0;i<cfg->total_phubs;i++) {
                    650:                put_str(cfg->phub[i]->name,stream);
                    651:                put_int(cfg->phub[i]->time,stream);
                    652:                put_int(cfg->phub[i]->freq,stream);
                    653:                put_int(cfg->phub[i]->days,stream);
                    654:                put_int(cfg->phub[i]->node,stream);
                    655:                put_str(cfg->phub[i]->call,stream);
                    656:                n=0;
                    657:                for(j=0;j<32;j++)
                    658:                        put_int(n,stream); }
                    659: 
                    660:        put_str(cfg->sys_psname,stream);
                    661:        n=0;
                    662:        for(i=0;i<32;i++)
                    663:                put_int(n,stream);
                    664: 
                    665:        put_str(cfg->sys_inetaddr,stream); /* Internet address */
                    666:        put_str(cfg->inetmail_sem,stream);
                    667:        put_int(cfg->inetmail_misc,stream);
                    668:        put_int(cfg->inetmail_cost,stream);
                    669:        put_str(cfg->smtpmail_sem,stream);
                    670: 
                    671:        fclose(stream);
                    672: 
                    673:        /* MUST BE AT END */
                    674: 
                    675:        if(!no_msghdr) {
                    676:                strcpy(dir,cfg->data_dir);
                    677:                prep_dir(cfg->ctrl_dir,dir,sizeof(dir));
                    678:                SAFEPRINTF(smb.file,"%smail",dir);
                    679:                if(smb_open(&smb)!=0) {
                    680:                        return(FALSE); 
                    681:                }
                    682:                if(!filelength(fileno(smb.shd_fp))) {
                    683:                        smb.status.max_msgs=0;
                    684:                        smb.status.max_crcs=cfg->mail_maxcrcs;
                    685:                        smb.status.max_age=cfg->mail_maxage;
                    686:                        smb.status.attr=SMB_EMAIL;
                    687:                        i=smb_create(&smb);
                    688:                        smb_close(&smb);
                    689:                        return(i==0);
                    690:                }
                    691:                if(smb_locksmbhdr(&smb)!=0) {
                    692:                        smb_close(&smb);
                    693:                        /* errormsg disabled.  Why?  ToDo */
                    694:                        /* errormsg(WHERE,ERR_LOCK,smb.file,x); */
                    695:                        return(FALSE); 
                    696:                }
                    697:                if(smb_getstatus(&smb)!=0) {
                    698:                        smb_close(&smb);
                    699:                        /* errormsg disabled.  Why?  ToDo */
                    700:                        /* errormsg(WHERE,ERR_READ,smb.file,x); */
                    701:                        return(FALSE); 
                    702:                }
                    703:                smb.status.max_msgs=0;
                    704:                smb.status.max_crcs=cfg->mail_maxcrcs;
                    705:                smb.status.max_age=cfg->mail_maxage;
                    706:                if(smb_putstatus(&smb)!=0) {
                    707:                        smb_close(&smb);
                    708:                        /* errormsg disabled.  Why?  ToDo */
                    709:                        /* errormsg(WHERE,ERR_WRITE,smb.file,x); */
                    710:                        return(FALSE); 
                    711:                }
                    712:                smb_close(&smb); 
                    713:        }
                    714: 
                    715:        return(TRUE);
                    716: }
                    717: 
                    718: 
                    719: /****************************************************************************/
                    720: /****************************************************************************/
                    721: BOOL DLLCALL write_file_cfg(scfg_t* cfg, int backup_level)
                    722: {
                    723:        char    str[MAX_PATH+1],cmd[LEN_CMD+1],c;
                    724:        char    path[MAX_PATH+1];
                    725:        int     i,j,k,file;
1.1.1.2 ! root      726:        uint16_t        n;
        !           727:        int32_t l=0;
1.1       root      728:        FILE    *stream;
                    729: 
                    730:        if(cfg->prepped)
                    731:                return(FALSE);
                    732: 
                    733:        SAFEPRINTF(str,"%sfile.cnf",cfg->ctrl_dir);
                    734:        backup(str, backup_level, TRUE);
                    735: 
                    736:        if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1
                    737:                || (stream=fdopen(file,"wb"))==NULL) {
                    738:                return(FALSE); 
                    739:        }
                    740:        setvbuf(stream,NULL,_IOFBF,2048);
                    741: 
                    742:        put_int(cfg->min_dspace,stream);
                    743:        put_int(cfg->max_batup,stream);
                    744:        put_int(cfg->max_batdn,stream);
                    745:        put_int(cfg->max_userxfer,stream);
                    746:        put_int(l,stream);                                      /* unused */
                    747:        put_int(cfg->cdt_up_pct,stream);
                    748:        put_int(cfg->cdt_dn_pct,stream);
                    749:        put_int(l,stream);                                      /* unused */
                    750:        put_str(cmd,stream);
                    751:        put_int(cfg->leech_pct,stream);
                    752:        put_int(cfg->leech_sec,stream);
                    753:        put_int(cfg->file_misc,stream);
                    754:        n=0;
                    755:        for(i=0;i<30;i++)
                    756:                put_int(n,stream);
                    757: 
                    758:        /* Extractable File Types */
                    759: 
                    760:        put_int(cfg->total_fextrs,stream);
                    761:        for(i=0;i<cfg->total_fextrs;i++) {
                    762:                put_str(cfg->fextr[i]->ext,stream);
                    763:                put_str(cfg->fextr[i]->cmd,stream);
                    764:                put_str(cfg->fextr[i]->arstr,stream);
                    765:                n=0;
                    766:                for(j=0;j<8;j++)
                    767:                        put_int(n,stream); }
                    768: 
                    769:        /* Compressable File Types */
                    770: 
                    771:        put_int(cfg->total_fcomps,stream);
                    772:        for(i=0;i<cfg->total_fcomps;i++) {
                    773:                put_str(cfg->fcomp[i]->ext,stream);
                    774:                put_str(cfg->fcomp[i]->cmd,stream);
                    775:                put_str(cfg->fcomp[i]->arstr,stream);
                    776:                n=0;
                    777:                for(j=0;j<8;j++)
                    778:                        put_int(n,stream); }
                    779: 
                    780:        /* Viewable File Types */
                    781: 
                    782:        put_int(cfg->total_fviews,stream);
                    783:        for(i=0;i<cfg->total_fviews;i++) {
                    784:                put_str(cfg->fview[i]->ext,stream);
                    785:                put_str(cfg->fview[i]->cmd,stream);
                    786:                put_str(cfg->fview[i]->arstr,stream);
                    787:                n=0;
                    788:                for(j=0;j<8;j++)
                    789:                        put_int(n,stream); }
                    790: 
                    791:        /* Testable File Types */
                    792: 
                    793:        put_int(cfg->total_ftests,stream);
                    794:        for(i=0;i<cfg->total_ftests;i++) {
                    795:                put_str(cfg->ftest[i]->ext,stream);
                    796:                put_str(cfg->ftest[i]->cmd,stream);
                    797:                put_str(cfg->ftest[i]->workstr,stream);
                    798:                put_str(cfg->ftest[i]->arstr,stream);
                    799:                n=0;
                    800:                for(j=0;j<8;j++)
                    801:                        put_int(n,stream); }
                    802: 
                    803:        /* Download Events */
                    804: 
                    805:        put_int(cfg->total_dlevents,stream);
                    806:        for(i=0;i<cfg->total_dlevents;i++) {
                    807:                put_str(cfg->dlevent[i]->ext,stream);
                    808:                put_str(cfg->dlevent[i]->cmd,stream);
                    809:                put_str(cfg->dlevent[i]->workstr,stream);
                    810:                put_str(cfg->dlevent[i]->arstr,stream);
                    811:                n=0;
                    812:                for(j=0;j<8;j++)
                    813:                        put_int(n,stream); }
                    814: 
                    815:        /* File Transfer Protocols */
                    816: 
                    817:        put_int(cfg->total_prots,stream);
                    818:        for(i=0;i<cfg->total_prots;i++) {
                    819:                put_int(cfg->prot[i]->mnemonic,stream);
                    820:                put_str(cfg->prot[i]->name,stream);
                    821:                put_str(cfg->prot[i]->ulcmd,stream);
                    822:                put_str(cfg->prot[i]->dlcmd,stream);
                    823:                put_str(cfg->prot[i]->batulcmd,stream);
                    824:                put_str(cfg->prot[i]->batdlcmd,stream);
                    825:                put_str(cfg->prot[i]->blindcmd,stream);
                    826:                put_str(cfg->prot[i]->bicmd,stream);
                    827:                put_int(cfg->prot[i]->misc,stream);
                    828:                put_str(cfg->prot[i]->arstr,stream);
                    829:                n=0;
                    830:                for(j=0;j<8;j++)
                    831:                        put_int(n,stream); }
                    832: 
                    833:        /* Alternate File Paths */
                    834: 
                    835:        put_int(cfg->altpaths,stream);
                    836:        for(i=0;i<cfg->altpaths;i++) {
                    837:                backslash(cfg->altpath[i]);
                    838:                fwrite(cfg->altpath[i],LEN_DIR+1,1,stream);
                    839:                n=0;
                    840:                for(j=0;j<8;j++)
                    841:                        put_int(n,stream); }
                    842: 
                    843:        /* File Libraries */
                    844: 
                    845:        put_int(cfg->total_libs,stream);
                    846:        for(i=0;i<cfg->total_libs;i++) {
                    847:                put_str(cfg->lib[i]->lname,stream);
                    848:                put_str(cfg->lib[i]->sname,stream);
                    849:                put_str(cfg->lib[i]->arstr,stream);
                    850:                put_str(cfg->lib[i]->parent_path,stream);
                    851:                put_str(cfg->lib[i]->code_prefix,stream);
                    852: 
                    853:                c=0;
                    854:                put_int(c,stream);
                    855:                n=0x0000;
                    856:                for(j=0;j<3;j++)
                    857:                        put_int(n,stream); 
                    858: 
                    859:                n=0xffff;
                    860:                for(j=0;j<16;j++)
                    861:                        put_int(n,stream); 
                    862:        }
                    863: 
                    864:        /* File Directories */
                    865: 
                    866:        put_int(cfg->total_dirs,stream);
                    867:        for(j=0;j<cfg->total_libs;j++)
                    868:                for(i=0;i<cfg->total_dirs;i++)
                    869:                        if(cfg->dir[i]->lib==j) {
                    870:                                put_int(cfg->dir[i]->lib,stream);
                    871:                                put_str(cfg->dir[i]->lname,stream);
                    872:                                put_str(cfg->dir[i]->sname,stream);
                    873:                                put_str(cfg->dir[i]->code_suffix,stream);
                    874: #if 1
                    875:                                if(cfg->dir[i]->data_dir[0]) {
                    876:                                        backslash(cfg->dir[i]->data_dir);
                    877:                                        md(cfg->dir[i]->data_dir);
                    878:                                }
                    879: #endif
                    880:                                put_str(cfg->dir[i]->data_dir,stream);
                    881:                                put_str(cfg->dir[i]->arstr,stream);
                    882:                                put_str(cfg->dir[i]->ul_arstr,stream);
                    883:                                put_str(cfg->dir[i]->dl_arstr,stream);
                    884:                                put_str(cfg->dir[i]->op_arstr,stream);
                    885:                                backslash(cfg->dir[i]->path);
                    886:                                put_str(cfg->dir[i]->path,stream);
                    887: #if 1
                    888:                                if(cfg->dir[i]->misc&DIR_FCHK) {
                    889:                                        SAFECOPY(path,cfg->dir[i]->path);
                    890:                                        if(!path[0]) {          /* no file storage path specified */
                    891:                                                SAFEPRINTF2(str,"%s%s"
                    892:                                                        ,cfg->lib[cfg->dir[i]->lib]->code_prefix
                    893:                                                        ,cfg->dir[i]->code_suffix);
                    894:                                                strlwr(str);
                    895:                                                safe_snprintf(path,sizeof(path),"%sdirs/%s/"
                    896:                                                        ,cfg->data_dir
                    897:                                                        ,str);
                    898:                                        }
                    899:                                        else if(cfg->lib[cfg->dir[i]->lib]->parent_path[0]) {
                    900:                                                SAFECOPY(path,cfg->lib[cfg->dir[i]->lib]->parent_path);
                    901:                                                prep_dir(cfg->ctrl_dir,path,sizeof(path));
                    902:                                                md(path);
                    903:                                                backslash(path);
                    904:                                                strcat(path,cfg->dir[i]->path);
                    905:                                        }
                    906:                                        else
                    907:                                                prep_dir(cfg->ctrl_dir, path,sizeof(path));
                    908:                                        md(path); 
                    909:                                }
                    910: #endif
                    911: 
                    912:                                put_str(cfg->dir[i]->upload_sem,stream);
                    913:                                put_int(cfg->dir[i]->maxfiles,stream);
                    914:                                put_str(cfg->dir[i]->exts,stream);
                    915:                                put_int(cfg->dir[i]->misc,stream);
                    916:                                put_int(cfg->dir[i]->seqdev,stream);
                    917:                                put_int(cfg->dir[i]->sort,stream);
                    918:                                put_str(cfg->dir[i]->ex_arstr,stream);
                    919:                                put_int(cfg->dir[i]->maxage,stream);
                    920:                                put_int(cfg->dir[i]->up_pct,stream);
                    921:                                put_int(cfg->dir[i]->dn_pct,stream);
                    922:                                c=0;
                    923:                                put_int(c,stream);
                    924:                                n=0;
                    925:                                for(k=0;k<8;k++)
                    926:                                        put_int(n,stream);
                    927:                                n=0xffff;
                    928:                                for(k=0;k<16;k++)
                    929:                                        put_int(n,stream);
                    930:                                }
                    931: 
                    932:        /* Text File Sections */
                    933: 
                    934:        put_int(cfg->total_txtsecs,stream);
                    935:        for(i=0;i<cfg->total_txtsecs;i++) {
                    936: #if 1
                    937:                SAFECOPY(str,cfg->txtsec[i]->code);
                    938:                strlwr(str);
                    939:                safe_snprintf(path,sizeof(path),"%stext/%s",cfg->data_dir,str);
                    940:                md(path);
                    941: #endif
                    942:                put_str(cfg->txtsec[i]->name,stream);
                    943:                put_str(cfg->txtsec[i]->code,stream);
                    944:                put_str(cfg->txtsec[i]->arstr,stream);
                    945:                n=0;
                    946:                for(j=0;j<8;j++)
                    947:                        put_int(n,stream); 
                    948:        }
                    949: 
                    950:        fclose(stream);
                    951: 
                    952:        return(TRUE);
                    953: }
                    954: 
                    955: 
                    956: 
                    957: /****************************************************************************/
                    958: /****************************************************************************/
                    959: BOOL DLLCALL write_chat_cfg(scfg_t* cfg, int backup_level)
                    960: {
                    961:        char    str[MAX_PATH+1];
                    962:        int     i,j,file;
1.1.1.2 ! root      963:        uint16_t        n;
1.1       root      964:        FILE    *stream;
                    965: 
                    966:        if(cfg->prepped)
                    967:                return(FALSE);
                    968: 
                    969:        sprintf(str,"%schat.cnf",cfg->ctrl_dir);
                    970:        backup(str, backup_level, TRUE);
                    971: 
                    972:        if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1
                    973:                || (stream=fdopen(file,"wb"))==NULL) {
                    974:                return(FALSE); 
                    975:        }
                    976:        setvbuf(stream,NULL,_IOFBF,2048);
                    977: 
                    978:        put_int(cfg->total_gurus,stream);
                    979:        for(i=0;i<cfg->total_gurus;i++) {
                    980:                put_str(cfg->guru[i]->name,stream);
                    981:                put_str(cfg->guru[i]->code,stream);
                    982:                put_str(cfg->guru[i]->arstr,stream);
                    983:                n=0;
                    984:                for(j=0;j<8;j++)
                    985:                        put_int(n,stream);
                    986:                }
                    987: 
                    988:        put_int(cfg->total_actsets,stream);
                    989:        for(i=0;i<cfg->total_actsets;i++)
                    990:                put_str(cfg->actset[i]->name,stream);
                    991: 
                    992:        put_int(cfg->total_chatacts,stream);
                    993:        for(i=0;i<cfg->total_chatacts;i++) {
                    994:                put_int(cfg->chatact[i]->actset,stream);
                    995:                put_str(cfg->chatact[i]->cmd,stream);
                    996:                put_str(cfg->chatact[i]->out,stream);
                    997:                n=0;
                    998:                for(j=0;j<8;j++)
                    999:                        put_int(n,stream);
                   1000:                }
                   1001: 
                   1002:        put_int(cfg->total_chans,stream);
                   1003:        for(i=0;i<cfg->total_chans;i++) {
                   1004:                put_int(cfg->chan[i]->actset,stream);
                   1005:                put_str(cfg->chan[i]->name,stream);
                   1006:                put_str(cfg->chan[i]->code,stream);
                   1007:                put_str(cfg->chan[i]->arstr,stream);
                   1008:                put_int(cfg->chan[i]->cost,stream);
                   1009:                put_int(cfg->chan[i]->guru,stream);
                   1010:                put_int(cfg->chan[i]->misc,stream);
                   1011:                n=0;
                   1012:                for(j=0;j<8;j++)
                   1013:                        put_int(n,stream);
                   1014:                }
                   1015: 
                   1016:        put_int(cfg->total_pages,stream);
                   1017:        for(i=0;i<cfg->total_pages;i++) {
                   1018:                put_str(cfg->page[i]->cmd,stream);
                   1019:                put_str(cfg->page[i]->arstr,stream);
                   1020:                put_int(cfg->page[i]->misc,stream);
                   1021:                n=0;
                   1022:                for(j=0;j<8;j++)
                   1023:                        put_int(n,stream);
                   1024:                }
                   1025: 
                   1026:        fclose(stream);
                   1027: 
                   1028:        return(TRUE);
                   1029: }
                   1030: 
                   1031: 
                   1032: /****************************************************************************/
                   1033: /****************************************************************************/
                   1034: BOOL DLLCALL write_xtrn_cfg(scfg_t* cfg, int backup_level)
                   1035: {
                   1036:        uchar   str[MAX_PATH+1],c;
                   1037:        int     i,j,sec,file;
1.1.1.2 ! root     1038:        uint16_t        n;
1.1       root     1039:        FILE    *stream;
                   1040: 
                   1041:        if(cfg->prepped)
                   1042:                return(FALSE);
                   1043: 
                   1044:        sprintf(str,"%sxtrn.cnf",cfg->ctrl_dir);
                   1045:        backup(str, backup_level, TRUE);
                   1046: 
                   1047:        if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1
                   1048:                || (stream=fdopen(file,"wb"))==NULL) {
                   1049:                return(FALSE); 
                   1050:        }
                   1051:        setvbuf(stream,NULL,_IOFBF,2048);
                   1052: 
                   1053:        put_int(cfg->total_swaps,stream);
                   1054:        for(i=0;i<cfg->total_swaps;i++)
                   1055:                put_str(cfg->swap[i]->cmd,stream);
                   1056: 
                   1057:        put_int(cfg->total_xedits,stream);
                   1058:        for(i=0;i<cfg->total_xedits;i++) {
                   1059:                put_str(cfg->xedit[i]->name,stream);
                   1060:                put_str(cfg->xedit[i]->code,stream);
                   1061:                put_str(cfg->xedit[i]->lcmd,stream);
                   1062:                put_str(cfg->xedit[i]->rcmd,stream);
                   1063:                put_int(cfg->xedit[i]->misc,stream);
                   1064:                put_str(cfg->xedit[i]->arstr,stream);
                   1065:                put_int(cfg->xedit[i]->type,stream);
                   1066:                c=0;
                   1067:                put_int(c,stream);
                   1068:                n=0;
                   1069:                for(j=0;j<7;j++)
                   1070:                        put_int(n,stream);
                   1071:                }
                   1072: 
                   1073:        put_int(cfg->total_xtrnsecs,stream);
                   1074:        for(i=0;i<cfg->total_xtrnsecs;i++) {
                   1075:                put_str(cfg->xtrnsec[i]->name,stream);
                   1076:                put_str(cfg->xtrnsec[i]->code,stream);
                   1077:                put_str(cfg->xtrnsec[i]->arstr,stream);
                   1078:                n=0;
                   1079:                for(j=0;j<8;j++)
                   1080:                        put_int(n,stream);
                   1081:                }
                   1082: 
                   1083:        put_int(cfg->total_xtrns,stream);
                   1084:        for(sec=0;sec<cfg->total_xtrnsecs;sec++)
                   1085:                for(i=0;i<cfg->total_xtrns;i++) {
                   1086:                        if(cfg->xtrn[i]->sec!=sec)
                   1087:                                continue;
                   1088:                        put_int(cfg->xtrn[i]->sec,stream);
                   1089:                        put_str(cfg->xtrn[i]->name,stream);
                   1090:                        put_str(cfg->xtrn[i]->code,stream);
                   1091:                        put_str(cfg->xtrn[i]->arstr,stream);
                   1092:                        put_str(cfg->xtrn[i]->run_arstr,stream);
                   1093:                        put_int(cfg->xtrn[i]->type,stream);
                   1094:                        put_int(cfg->xtrn[i]->misc,stream);
                   1095:                        put_int(cfg->xtrn[i]->event,stream);
                   1096:                        put_int(cfg->xtrn[i]->cost,stream);
                   1097:                        put_str(cfg->xtrn[i]->cmd,stream);
                   1098:                        put_str(cfg->xtrn[i]->clean,stream);
                   1099:                        put_str(cfg->xtrn[i]->path,stream);
                   1100:                        put_int(cfg->xtrn[i]->textra,stream);
                   1101:                        put_int(cfg->xtrn[i]->maxtime,stream);
                   1102:                        n=0;
                   1103:                        for(j=0;j<7;j++)
                   1104:                                put_int(n,stream);
                   1105:                        }
                   1106: 
                   1107:        put_int(cfg->total_events,stream);
                   1108:        for(i=0;i<cfg->total_events;i++) {
                   1109:                put_str(cfg->event[i]->code,stream);
                   1110:                put_str(cfg->event[i]->cmd,stream);
                   1111:                put_int(cfg->event[i]->days,stream);
                   1112:                put_int(cfg->event[i]->time,stream);
                   1113:                put_int(cfg->event[i]->node,stream);
                   1114:                put_int(cfg->event[i]->misc,stream);
                   1115:                put_str(cfg->event[i]->dir,stream);
                   1116:                put_int(cfg->event[i]->freq,stream);
                   1117:                put_int(cfg->event[i]->mdays,stream);
1.1.1.2 ! root     1118:                put_int(cfg->event[i]->months,stream);
1.1       root     1119:                n=0;
1.1.1.2 ! root     1120:                for(j=0;j<4;j++)
1.1       root     1121:                        put_int(n,stream);
                   1122:                }
                   1123: 
                   1124:        put_int(cfg->total_natvpgms,stream);
                   1125:        for(i=0;i<cfg->total_natvpgms;i++)
                   1126:                put_str(cfg->natvpgm[i]->name,stream);
                   1127:        for(i=0;i<cfg->total_natvpgms;i++)
                   1128:                put_int(cfg->natvpgm[i]->misc,stream);
                   1129: 
                   1130:        put_int(cfg->total_hotkeys,stream);
                   1131:        for(i=0;i<cfg->total_hotkeys;i++) {
                   1132:                put_int(cfg->hotkey[i]->key,stream);
                   1133:                put_str(cfg->hotkey[i]->cmd,stream);
                   1134:                n=0;
                   1135:                for(j=0;j<8;j++)
                   1136:                        put_int(n,stream);
                   1137:                }
                   1138: 
                   1139:        fclose(stream);
                   1140: 
                   1141:        return(TRUE);
                   1142: }
                   1143: 
                   1144: void DLLCALL refresh_cfg(scfg_t* cfg)
                   1145: {
                   1146:        char    str[MAX_PATH+1];
                   1147:     int                i;
                   1148:        int             file;
                   1149:     node_t     node;
                   1150:     
                   1151:     for(i=0;i<cfg->sys_nodes;i++) {
                   1152:                if(getnodedat(cfg,i+1,&node,&file)!=0)
                   1153:                        continue;
                   1154:         node.misc|=NODE_RRUN;
                   1155:         if(putnodedat(cfg,i+1,&node,file))
                   1156:             break;
                   1157:     }
                   1158: 
                   1159:        SAFEPRINTF(str,"%srecycle",cfg->ctrl_dir);              ftouch(str);
                   1160: }

unix.superglobalmegacorp.com

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