Annotation of sbbs/sbbs3/pack_qwk.cpp, revision 1.1.1.1

1.1       root        1: /* pack_qwk.cpp */
                      2: 
                      3: /* Synchronet pack QWK packet routine */
                      4: 
                      5: /* $Id: pack_qwk.cpp,v 1.8 2000/12/11 23:21:12 rswindell Exp $ */
                      6: 
                      7: /****************************************************************************
                      8:  * @format.tab-size 4          (Plain Text/Source Code File Header)                    *
                      9:  * @format.use-tabs true       (see http://www.synchro.net/ptsc_hdr.html)              *
                     10:  *                                                                                                                                                     *
                     11:  * Copyright 2000 Rob Swindell - http://www.synchro.net/copyright.html         *
                     12:  *                                                                                                                                                     *
                     13:  * This program is free software; you can redistribute it and/or                       *
                     14:  * modify it under the terms of the GNU General Public License                         *
                     15:  * as published by the Free Software Foundation; either version 2                      *
                     16:  * of the License, or (at your option) any later version.                                      *
                     17:  * See the GNU General Public License for more details: gpl.txt or                     *
                     18:  * http://www.fsf.org/copyleft/gpl.html                                                                                *
                     19:  *                                                                                                                                                     *
                     20:  * Anonymous FTP access to the most recent released source is available at     *
                     21:  * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net     *
                     22:  *                                                                                                                                                     *
                     23:  * Anonymous CVS access to the development source and modification history     *
                     24:  * is available at cvs.synchro.net:/cvsroot/sbbs, example:                                     *
                     25:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs login                       *
                     26:  *     (just hit return, no password is necessary)                                                     *
                     27:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src                *
                     28:  *                                                                                                                                                     *
                     29:  * For Synchronet coding style and modification guidelines, see                                *
                     30:  * http://www.synchro.net/source.html                                                                          *
                     31:  *                                                                                                                                                     *
                     32:  * You are encouraged to submit any modifications (preferably in Unix diff     *
                     33:  * format) via e-mail to [email protected]                                                                      *
                     34:  *                                                                                                                                                     *
                     35:  * Note: If this box doesn't appear square, then you need to fix your tabs.    *
                     36:  ****************************************************************************/
                     37: 
                     38: #include "sbbs.h"
                     39: #include "qwk.h"
                     40: #include "post.h"
                     41: 
                     42: /****************************************************************************/
                     43: /* Creates QWK packet, returning 1 if successful, 0 if not.                            */
                     44: /****************************************************************************/
                     45: bool sbbs_t::pack_qwk(char *packet, ulong *msgcnt, bool prepack)
                     46: {
                     47:        char    str[256],tmp2[256],ch,*p;
                     48:        char    tmp[512];
                     49:        char*   fname;
                     50:        int     file,mode;
                     51:        uint    i,j,k,conf;
                     52:        long    l,size,msgndx,posts,ex;
                     53:        ulong   mailmsgs=0;
                     54:        ulong   totalcdt,totaltime,lastmsg
                     55:                        ,files,submsgs,msgs,netfiles=0,preqwk=0;
                     56:        float   f;      /* Sparky is responsible */
                     57:        time_t  start;
                     58:        node_t  node;
                     59:        mail_t  *mail;
                     60:        post_t  HUGE16 *post;
                     61:        glob_t  g;
                     62:        FILE    *stream,*qwk,*personal,*ndx;
                     63:        DIR*    dir;
                     64:        DIRENT* dirent;
                     65:        struct  tm* tm;
                     66:        smbmsg_t msg;
                     67: 
                     68: 
                     69:        ex=EX_OUTL|EX_OUTR;
                     70:        if(prepack)
                     71:                ex|=EX_OFFLINE;
                     72: 
                     73:        delfiles(cfg.temp_dir,ALLFILES);
                     74:        sprintf(str,"%sfile/%04u.qwk",cfg.data_dir,useron.number);
                     75:        if(fexist(str)) {
                     76:                for(k=0;k<cfg.total_fextrs;k++)
                     77:                        if(!stricmp(cfg.fextr[k]->ext,useron.tmpext)
                     78:                                && chk_ar(cfg.fextr[k]->ar,&useron))
                     79:                                break;
                     80:                if(k>=cfg.total_fextrs)
                     81:                        k=0;
                     82:                i=external(cmdstr(cfg.fextr[k]->cmd,str,ALLFILES,NULL),ex);
                     83:                if(!i)
                     84:                        preqwk=1; }
                     85: 
                     86:        if(useron.rest&FLAG('Q') && useron.qwk&QWK_RETCTLA)
                     87:                useron.qwk|=(QWK_NOINDEX|QWK_NOCTRL|QWK_VIA|QWK_TZ);
                     88: 
                     89:        if(useron.qwk&QWK_EXPCTLA)
                     90:                mode=A_EXPAND;
                     91:        else if(useron.qwk&QWK_RETCTLA)
                     92:                mode=A_LEAVE;
                     93:        else mode=0;
                     94:        if(useron.qwk&QWK_TZ)
                     95:                mode|=TZ;
                     96:        if(useron.qwk&QWK_VIA)
                     97:                mode|=VIA;
                     98:        (*msgcnt)=0L;
                     99:        if(/* !prepack && */ !(useron.qwk&QWK_NOCTRL)) {
                    100:                /***************************/
                    101:                /* Create CONTROL.DAT file */
                    102:                /***************************/
                    103:                sprintf(str,"%sCONTROL.DAT",cfg.temp_dir);
                    104:                if((stream=fnopen(&file,str,O_WRONLY|O_CREAT|O_TRUNC))==NULL) {
                    105:                        errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_TRUNC);
                    106:                        return(false); }
                    107: 
                    108:                now=time(NULL);
                    109:                tm=gmtime(&now);
                    110:                if(tm==NULL)
                    111:                        return(false);
                    112: 
                    113:                fprintf(stream,"%s\r\n%s\r\n%s\r\n%s, Sysop\r\n0000,%s\r\n"
                    114:                        "%02u-%02u-%u,%02u:%02u:%02u\r\n"
                    115:                        ,cfg.sys_name
                    116:                        ,cfg.sys_location
                    117:                        ,cfg.node_phone
                    118:                        ,cfg.sys_op
                    119:                        ,cfg.sys_id
                    120:                        ,tm->tm_mon+1,tm->tm_mday,tm->tm_year+1900
                    121:                        ,tm->tm_hour,tm->tm_min,tm->tm_sec);
                    122:                k=0;
                    123:                for(i=0;i<usrgrps;i++)
                    124:                        for(j=0;j<usrsubs[i];j++)
                    125:                                k++;    /* k is how many subs */
                    126:                fprintf(stream,"%s\r\n\r\n0\r\n0\r\n%u\r\n",useron.alias,k);
                    127:                fprintf(stream,"0\r\nE-mail\r\n");   /* first conference is e-mail */
                    128:                for(i=0;i<usrgrps;i++)
                    129:                        for(j=0;j<usrsubs[i];j++)
                    130:                                fprintf(stream,"%u\r\n%s\r\n"
                    131:                                        ,cfg.sub[usrsub[i][j]]->qwkconf ? cfg.sub[usrsub[i][j]]->qwkconf
                    132:                                        : ((i+1)*1000)+j+1,cfg.sub[usrsub[i][j]]->qwkname);
                    133:                fprintf(stream,"HELLO\r\nBBSNEWS\r\nGOODBYE\r\n");
                    134:                fclose(stream);
                    135:                /***********************/
                    136:                /* Create DOOR.ID File */
                    137:                /***********************/
                    138:                sprintf(str,"%sDOOR.ID",cfg.temp_dir);
                    139:                if((stream=fnopen(&file,str,O_WRONLY|O_CREAT|O_TRUNC))==NULL) {
                    140:                        errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_TRUNC);
                    141:                        return(false); }
                    142:                p="CONTROLTYPE = ";
                    143:                fprintf(stream,"DOOR = %s\r\nVERSION = %s\r\n"
                    144:                        "SYSTEM = %s v%s\r\n"
                    145:                        "CONTROLNAME = SBBS\r\n"
                    146:                        "%sADD\r\n"
                    147:                        "%sDROP\r\n"
                    148:                        "%sYOURS\r\n"
                    149:                        "%sRESET\r\n"
                    150:                        "%sRESETALL\r\n"
                    151:                        "%sFILES\r\n"
                    152:                        "%sATTACH\r\n"
                    153:                        "%sOWN\r\n"
                    154:                        "%smail\r\n"
                    155:                        "%sDELMAIL\r\n"
                    156:                        "%sCTRL-A\r\n"
                    157:                        "%sFREQ\r\n"
                    158:                        "%sNDX\r\n"
                    159:                        "%sTZ\r\n"
                    160:                        "%sVIA\r\n"
                    161:                        "%sCONTROL\r\n"
                    162:                        "MIXEDCASE = YES\r\n"
                    163:                        ,"Synchronet"
                    164:                        ,VERSION
                    165:                        ,"Synchronet"
                    166:                        ,VERSION
                    167:                        ,p,p,p,p
                    168:                        ,p,p,p,p
                    169:                        ,p,p,p,p
                    170:                        ,p,p,p,p
                    171:                        );
                    172:                fclose(stream);
                    173:                if(useron.rest&FLAG('Q')) {
                    174:                        /***********************/
                    175:                        /* Create NETFLAGS.DAT */
                    176:                        /***********************/
                    177:                        sprintf(str,"%sNETFLAGS.DAT",cfg.temp_dir);
                    178:                        if((stream=fnopen(&file,str,O_WRONLY|O_CREAT))==NULL) {
                    179:                                errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT);
                    180:                                return(false); }
                    181:                        ch=1;                                           /* Net enabled */
                    182:                        if(usrgrps)
                    183:                                for(i=0;i<(usrgrps*1000)+usrsubs[usrgrps-1];i++)
                    184:                                        fputc(ch,stream);
                    185:                        fclose(stream); }
                    186:                } /* !prepack */
                    187: 
                    188:        /****************************************************/
                    189:        /* Create MESSAGES.DAT, write header and leave open */
                    190:        /****************************************************/
                    191:        sprintf(str,"%sMESSAGES.DAT",cfg.temp_dir);
                    192:        if((qwk=fnopen(&file,str,O_CREAT|O_WRONLY|O_TRUNC))==NULL) {
                    193:                errormsg(WHERE,ERR_OPEN,str,O_CREAT|O_WRONLY|O_TRUNC);
                    194:                return(false); }
                    195:        l=filelength(file);
                    196:        if(l<1) {
                    197:                fprintf(qwk,"%-128s",QWK_HEADER);
                    198:                msgndx=1; }
                    199:        else
                    200:                msgndx=l/128L;
                    201:        fseek(qwk,0,SEEK_END);
                    202:        sprintf(str,"%sNEWFILES.DAT",cfg.temp_dir);
                    203:        remove(str);
                    204:        if(!(useron.rest&FLAG('T')) && useron.qwk&QWK_FILES)
                    205:                files=create_filelist("NEWFILES.DAT",FL_ULTIME);
                    206:        else
                    207:                files=0;
                    208: 
                    209:        start=time(NULL);
                    210: 
                    211:        if(useron.rest&FLAG('Q'))
                    212:                useron.qwk|=(QWK_EMAIL|QWK_ALLMAIL|QWK_DELMAIL);
                    213: 
                    214:        if(!(useron.qwk&QWK_NOINDEX)) {
                    215:                sprintf(str,"%sPERSONAL.NDX",cfg.temp_dir);
                    216:                if((personal=fnopen(&file,str,O_CREAT|O_WRONLY|O_APPEND))==NULL) {
                    217:                        fclose(qwk);
                    218:                        errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_APPEND);
                    219:                        return(false); }
                    220:                fseek(personal,0L,SEEK_END); }
                    221:        else
                    222:                personal=NULL;
                    223: 
                    224:        if(useron.qwk&(QWK_EMAIL|QWK_ALLMAIL) /* && !prepack */) {
                    225:                sprintf(smb.file,"%smail",cfg.data_dir);
                    226:                smb.retry_time=cfg.smb_retry_time;
                    227:                if((i=smb_open(&smb))!=0) {
                    228:                        fclose(qwk);
                    229:                        if(personal)
                    230:                                fclose(personal);
                    231:                        errormsg(WHERE,ERR_OPEN,smb.file,i,smb.last_error);
                    232:                        return(false); }
                    233: 
                    234:                /***********************/
                    235:                /* Pack E-mail, if any */
                    236:                /***********************/
                    237:                qwkmail_time=time(NULL);
                    238:                mail=loadmail(&smb,&mailmsgs,useron.number,0,useron.qwk&QWK_ALLMAIL ? 0
                    239:                        : LM_UNREAD);
                    240:                if(mailmsgs && !(sys_status&SS_ABORT)) {
                    241:                        bputs(text[QWKPackingEmail]);
                    242:                        if(!(useron.qwk&QWK_NOINDEX)) {
                    243:                                sprintf(str,"%s000.NDX",cfg.temp_dir);
                    244:                                if((ndx=fnopen(&file,str,O_CREAT|O_WRONLY|O_APPEND))==NULL) {
                    245:                                        fclose(qwk);
                    246:                                        if(personal)
                    247:                                                fclose(personal);
                    248:                                        smb_close(&smb);
                    249:                                        errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_APPEND);
                    250:                                        FREE(mail);
                    251:                                        return(false); }
                    252:                                fseek(ndx,0L,SEEK_END); }
                    253:                        else
                    254:                                ndx=NULL;
                    255: 
                    256:                        if(useron.rest&FLAG('Q'))
                    257:                                mode|=TO_QNET;
                    258:                        else
                    259:                                mode&=~TO_QNET;
                    260: 
                    261:                        for(l=0;(ulong)l<mailmsgs;l++) {
                    262:                                bprintf("\b\b\b\b\b\b\b\b\b\b\b\b%4lu of %-4lu"
                    263:                                        ,l+1,mailmsgs);
                    264: 
                    265:                                msg.idx.offset=mail[l].offset;
                    266:                                if(!loadmsg(&msg,mail[l].number))
                    267:                                        continue;
                    268: 
                    269:                                if(msg.hdr.auxattr&MSG_FILEATTACH && useron.qwk&QWK_ATTACH) {
                    270:                                        sprintf(str,"%sfile/%04u.in/%s"
                    271:                                                ,cfg.data_dir,useron.number,msg.subj);
                    272:                                        sprintf(tmp,"%s%s",cfg.temp_dir,msg.subj);
                    273:                                        if(fexist(str) && !fexist(tmp))
                    274:                                                mv(str,tmp,1); }
                    275: 
                    276:                                size=msgtoqwk(&msg,qwk,mode,INVALID_SUB,0);
                    277:                                smb_unlockmsghdr(&smb,&msg);
                    278:                                smb_freemsgmem(&msg);
                    279:                                if(ndx) {
                    280:                                        msgndx++;
                    281:                                        f=ltomsbin(msgndx);     /* Record number */
                    282:                                        ch=0;                                   /* Sub number, not used */
                    283:                                        if(personal) {
                    284:                                                fwrite(&f,4,1,personal);
                    285:                                                fwrite(&ch,1,1,personal); }
                    286:                                        fwrite(&f,4,1,ndx);
                    287:                                        fwrite(&ch,1,1,ndx);
                    288:                                        msgndx+=size/128L; } }
                    289:                        bprintf(text[QWKPackedEmail],mailmsgs);
                    290:                        if(ndx)
                    291:                                fclose(ndx); }
                    292:                smb_close(&smb);                                        /* Close the e-mail */
                    293:                if(mailmsgs)
                    294:                        FREE(mail);
                    295:                }
                    296: 
                    297:        /*********************/
                    298:        /* Pack new messages */
                    299:        /*********************/
                    300:        for(i=0;i<usrgrps;i++) {
                    301:                for(j=0;j<usrsubs[i] && !msgabort();j++)
                    302:                        if(sub_cfg[usrsub[i][j]]&SUB_CFG_NSCAN
                    303:                                || (!(useron.rest&FLAG('Q'))
                    304:                                && cfg.sub[usrsub[i][j]]->misc&SUB_FORCED)) {
                    305:                                if(!chk_ar(cfg.sub[usrsub[i][j]]->read_ar,&useron))
                    306:                                        continue;
                    307:                                lncntr=0;                                               /* defeat pause */
                    308:                                if(useron.rest&FLAG('Q') && !(cfg.sub[usrsub[i][j]]->misc&SUB_QNET))
                    309:                                        continue;       /* QWK Net Node and not QWK networked, so skip */
                    310: 
                    311:                                msgs=getlastmsg(usrsub[i][j],&lastmsg,0);
                    312:                                if(!msgs || lastmsg<=sub_ptr[usrsub[i][j]]) { /* no msgs */
                    313:                                        if(sub_ptr[usrsub[i][j]]>lastmsg)       { /* corrupted ptr */
                    314:                                                sub_ptr[usrsub[i][j]]=lastmsg; /* so fix automatically */
                    315:                                                sub_last[usrsub[i][j]]=lastmsg; }
                    316:                                        bprintf(text[NScanStatusFmt]
                    317:                                                ,cfg.grp[cfg.sub[usrsub[i][j]]->grp]->sname
                    318:                                                ,cfg.sub[usrsub[i][j]]->lname,0L,msgs);
                    319:                                        continue; }
                    320: 
                    321:                                sprintf(smb.file,"%s%s"
                    322:                                        ,cfg.sub[usrsub[i][j]]->data_dir,cfg.sub[usrsub[i][j]]->code);
                    323:                                smb.retry_time=cfg.smb_retry_time;
                    324:                                if((k=smb_open(&smb))!=0) {
                    325:                                        errormsg(WHERE,ERR_OPEN,smb.file,k,smb.last_error);
                    326:                                        continue; }
                    327: 
                    328:                                k=0;
                    329:                                if(useron.qwk&QWK_BYSELF)
                    330:                                        k|=LP_BYSELF;
                    331:                                if(!(sub_cfg[usrsub[i][j]]&SUB_CFG_YSCAN))
                    332:                                        k|=LP_OTHERS;
                    333:                                post=loadposts(&posts,usrsub[i][j],sub_ptr[usrsub[i][j]],k);
                    334: 
                    335:                                bprintf(text[NScanStatusFmt]
                    336:                                        ,cfg.grp[cfg.sub[usrsub[i][j]]->grp]->sname
                    337:                                        ,cfg.sub[usrsub[i][j]]->lname,posts,msgs);
                    338:                                if(!posts)      { /* no new messages */
                    339:                                        smb_close(&smb);
                    340:                                        continue; }
                    341:                                bputs(text[QWKPackingSubboard]);        
                    342:                                submsgs=0;
                    343:                                conf=cfg.sub[usrsub[i][j]]->qwkconf;
                    344:                                if(!conf)
                    345:                                        conf=((i+1)*1000)+j+1;
                    346: 
                    347:                                if(!(useron.qwk&QWK_NOINDEX)) {
                    348:                                        sprintf(str,"%s%u.NDX",cfg.temp_dir,conf);
                    349:                                        if((ndx=fnopen(&file,str,O_CREAT|O_WRONLY|O_APPEND))==NULL) {
                    350:                                                fclose(qwk);
                    351:                                                if(personal)
                    352:                                                        fclose(personal);
                    353:                                                smb_close(&smb);
                    354:                                                errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_APPEND);
                    355:                                                LFREE(post);
                    356:                                                return(false); }
                    357:                                        fseek(ndx,0L,SEEK_END); }
                    358:                                else
                    359:                                        ndx=NULL;
                    360: 
                    361:                                for(l=0;l<posts && !msgabort();l++) {
                    362:                                        bprintf("\b\b\b\b\b%-5lu",l+1);
                    363: 
                    364:                                        sub_ptr[usrsub[i][j]]=post[l].number;   /* set ptr */
                    365:                                        sub_last[usrsub[i][j]]=post[l].number; /* set last read */
                    366: 
                    367:                                        msg.idx.offset=post[l].offset;
                    368:                                        if(!loadmsg(&msg,post[l].number))
                    369:                                                continue;
                    370: 
                    371:                                        if(useron.rest&FLAG('Q')) {
                    372:                                                if(msg.from_net.type && msg.from_net.type!=NET_QWK &&
                    373:                                                        !(cfg.sub[usrsub[i][j]]->misc&SUB_GATE)) { /* From other */
                    374:                                                        smb_freemsgmem(&msg);                    /* net, don't gate */
                    375:                                                        smb_unlockmsghdr(&smb,&msg);
                    376:                                                        continue; }
                    377:                                                mode|=(TO_QNET|TAGLINE);
                    378:                                                if(msg.from_net.type==NET_QWK) {
                    379:                                                        mode&=~TAGLINE;
                    380:                                                        if(route_circ((char *)msg.from_net.addr,useron.alias)
                    381:                                                                || !strnicmp(msg.subj,"NE:",3)) {
                    382:                                                                smb_freemsgmem(&msg);
                    383:                                                                smb_unlockmsghdr(&smb,&msg);
                    384:                                                                continue; } } }
                    385:                                        else
                    386:                                                mode&=~(TAGLINE|TO_QNET);
                    387: 
                    388:                                        size=msgtoqwk(&msg,qwk,mode,usrsub[i][j],conf);
                    389:                                        smb_unlockmsghdr(&smb,&msg);
                    390: 
                    391:                                        if(ndx) {
                    392:                                                msgndx++;
                    393:                                                f=ltomsbin(msgndx);     /* Record number */
                    394:                                                ch=0;                                   /* Sub number, not used */
                    395:                                                if(personal
                    396:                                                        && (!stricmp(msg.to,useron.alias)
                    397:                                                                || !stricmp(msg.to,useron.name))) {
                    398:                                                        fwrite(&f,4,1,personal);
                    399:                                                        fwrite(&ch,1,1,personal); }
                    400:                                                fwrite(&f,4,1,ndx);
                    401:                                                fwrite(&ch,1,1,ndx);
                    402:                                                msgndx+=size/128L; }
                    403: 
                    404:                                        smb_freemsgmem(&msg);
                    405:                                        (*msgcnt)++;
                    406:                                        submsgs++;
                    407:                                        if(cfg.max_qwkmsgs
                    408:                                                && !(useron.rest&FLAG('Q')) && (*msgcnt)>=cfg.max_qwkmsgs) {
                    409:                                                bputs(text[QWKmsgLimitReached]);
                    410:                                                break; } }
                    411:                                if(!(sys_status&SS_ABORT))
                    412:                                        bprintf(text[QWKPackedSubboard],submsgs,(*msgcnt));
                    413:                                if(ndx) {
                    414:                                        fclose(ndx);
                    415:                                        sprintf(str,"%s%u.NDX",cfg.temp_dir,conf);
                    416:                                        if(!flength(str))
                    417:                                                remove(str); }
                    418:                                smb_close(&smb);
                    419:                                LFREE(post);
                    420:                                if(l<posts)
                    421:                                        break; }
                    422:                if(j<usrsubs[i]) /* if sub aborted, abort all */
                    423:                        break; }
                    424: 
                    425:        if((*msgcnt)+mailmsgs && time(NULL)-start) {
                    426:                bprintf("\r\n\r\n\1n\1hPacked %lu messages in %lu seconds "
                    427:                        "(%lu messages/second)."
                    428:                        ,(*msgcnt)+mailmsgs,time(NULL)-start
                    429:                        ,((*msgcnt)+mailmsgs)/(time(NULL)-start));
                    430:                lprintf("Packed %lu messages in %lu seconds (%lu msgs/sec)"
                    431:                        ,(*msgcnt)+mailmsgs,time(NULL)-start
                    432:                        ,((*msgcnt)+mailmsgs)/(time(NULL)-start));
                    433:        }
                    434: 
                    435:        fclose(qwk);                    /* close MESSAGE.DAT */
                    436:        if(personal) {
                    437:                fclose(personal);                /* close PERSONAL.NDX */
                    438:                sprintf(str,"%sPERSONAL.NDX",cfg.temp_dir);
                    439:                if(!flength(str))
                    440:                        remove(str); }
                    441:        CRLF;
                    442: 
                    443:        if(!prepack && (sys_status&SS_ABORT || !online))
                    444:                return(false);
                    445: 
                    446:        if(/*!prepack && */ useron.rest&FLAG('Q')) { /* If QWK Net node, check for files */
                    447:                sprintf(str,"%sqnet/%s.out/",cfg.data_dir,useron.alias);
                    448:                dir=opendir(str);
                    449:                while((dirent=readdir(dir))!=NULL) {    /* Move files into temp dir */
                    450:                        sprintf(str,"%sqnet/%s.out/%s",cfg.data_dir,useron.alias,dirent->d_name);
                    451:                        if(isdir(str))
                    452:                                continue;
                    453:                        sprintf(tmp2,"%s%s",cfg.temp_dir,dirent->d_name);
                    454:                        lncntr=0;       /* Default pause */
                    455:                        lprintf("Including %s in packet",str);
                    456:                        bprintf(text[RetrievingFile],str);
                    457:                        if(!mv(str,tmp2,1))
                    458:                                netfiles++;
                    459:                }
                    460:                closedir(dir);
                    461:                if(netfiles)
                    462:                        CRLF; }
                    463: 
                    464:        if(batdn_total) {
                    465:                for(i=0,totalcdt=0;i<batdn_total;i++)
                    466:                                totalcdt+=batdn_cdt[i];
                    467:                if(!(useron.exempt&FLAG('D'))
                    468:                        && totalcdt>useron.cdt+useron.freecdt) {
                    469:                        bprintf(text[YouOnlyHaveNCredits]
                    470:                                ,ultoac(useron.cdt+useron.freecdt,tmp)); }
                    471:                else {
                    472:                        for(i=0,totaltime=0;i<batdn_total;i++) {
                    473:                                if(!(cfg.dir[batdn_dir[i]]->misc&DIR_TFREE) && cur_cps)
                    474:                                        totaltime+=batdn_size[i]/(ulong)cur_cps; }
                    475:                        if(!(useron.exempt&FLAG('T')) && !SYSOP && totaltime>timeleft)
                    476:                                bputs(text[NotEnoughTimeToDl]);
                    477:                        else {
                    478:                                for(i=0;i<batdn_total;i++) {
                    479:                                        lncntr=0;
                    480:                                        unpadfname(batdn_name[i],tmp);
                    481:                                        sprintf(tmp2,"%s%s",cfg.temp_dir,tmp);
                    482:                                        if(!fexist(tmp2)) {
                    483:                                                seqwait(cfg.dir[batdn_dir[i]]->seqdev);
                    484:                                                bprintf(text[RetrievingFile],tmp);
                    485:                                                sprintf(str,"%s%s"
                    486:                                                        ,batdn_alt[i]>0 && batdn_alt[i]<=cfg.altpaths
                    487:                                                        ? cfg.altpath[batdn_alt[i]-1]
                    488:                                                        : cfg.dir[batdn_dir[i]]->path
                    489:                                                        ,tmp);
                    490:                                                mv(str,tmp2,1); /* copy the file to temp dir */
                    491:                                                getnodedat(cfg.node_num,&thisnode,1);
                    492:                                                thisnode.aux=0xfe;
                    493:                                                putnodedat(cfg.node_num,&thisnode);
                    494:                                                CRLF; } } } } }
                    495: 
                    496:        if(!(*msgcnt) && !mailmsgs && !files && !netfiles && !batdn_total
                    497:                && (prepack || !preqwk)) {
                    498:                bputs(text[QWKNoNewMessages]);
                    499:                return(false); }
                    500: 
                    501:        if(!prepack && !(useron.rest&FLAG('Q'))) {      /* Don't include in network */
                    502:                /***********************/                                       /* packets */
                    503:                /* Copy QWK Text files */
                    504:                /***********************/
                    505:                sprintf(str,"%sQWK/HELLO",cfg.text_dir);
                    506:                if(fexist(str)) {
                    507:                        sprintf(tmp2,"%sHELLO",cfg.temp_dir);
                    508:                        mv(str,tmp2,1); }
                    509:                sprintf(str,"%sQWK/BBSNEWS",cfg.text_dir);
                    510:                if(fexist(str)) {
                    511:                        sprintf(tmp2,"%sBBSNEWS",cfg.temp_dir);
                    512:                        mv(str,tmp2,1); }
                    513:                sprintf(str,"%sQWK/GOODBYE",cfg.text_dir);
                    514:                if(fexist(str)) {
                    515:                        sprintf(tmp2,"%sGOODBYE",cfg.temp_dir);
                    516:                        mv(str,tmp2,1); }
                    517:                sprintf(str,"%sQWK/BLT-*",cfg.text_dir);
                    518:                glob(str,0,NULL,&g);
                    519:                for(i=0;i<g.gl_pathc;i++) {                     /* Copy BLT-*.* files */
                    520:                        fname=getfname(g.gl_pathv[i]);
                    521:                        padfname(fname,str);
                    522:                        if(isdigit(str[4]) && isdigit(str[9])) {
                    523:                                sprintf(str,"%sQWK/%s",cfg.text_dir,fname);
                    524:                                sprintf(tmp2,"%s%s",cfg.temp_dir,fname);
                    525:                                mv(str,tmp2,1); 
                    526:                        }
                    527:                }
                    528:                globfree(&g);
                    529:        }
                    530: 
                    531:        if(prepack) {
                    532:                for(i=1;i<=cfg.sys_nodes;i++) {
                    533:                        getnodedat(i,&node,0);
                    534:                        if((node.status==NODE_INUSE || node.status==NODE_QUIET
                    535:                                || node.status==NODE_LOGON) && node.useron==useron.number)
                    536:                                break; }
                    537:                if(i<=cfg.sys_nodes)    /* Don't pre-pack with user online */
                    538:                        return(false); }
                    539: 
                    540:        /*******************/
                    541:        /* Compress Packet */
                    542:        /*******************/
                    543:        sprintf(tmp2,"%s%s",cfg.temp_dir,ALLFILES);
                    544:        i=external(cmdstr(temp_cmd(),packet,tmp2,NULL),ex);
                    545:        if(!fexist(packet)) {
                    546:                bputs(text[QWKCompressionFailed]);
                    547:                if(i)
                    548:                        errormsg(WHERE,ERR_EXEC,cmdstr(temp_cmd(),packet,tmp2,NULL),i);
                    549:                else
                    550:                        errorlog("Couldn't compress QWK packet");
                    551:                return(false); }
                    552: 
                    553:        if(prepack)             /* Early return if pre-packing */
                    554:                return(true);
                    555: 
                    556:        l=flength(packet);
                    557:        sprintf(str,"%s.qwk",cfg.sys_id);
                    558:        bprintf(text[FiFilename],str);
                    559:        bprintf(text[FiFileSize],ultoac(l,tmp));
                    560:        if(l>0L && cur_cps)
                    561:                i=l/(ulong)cur_cps;
                    562:        else
                    563:                i=0;
                    564:        bprintf(text[FiTransferTime],sectostr(i,tmp));
                    565:        CRLF;
                    566:        if(!(useron.exempt&FLAG('T')) && i>timeleft) {
                    567:                bputs(text[NotEnoughTimeToDl]);
                    568:                return(false); 
                    569:        }
                    570: 
                    571:        if(useron.rest&FLAG('Q')) {
                    572:                sprintf(str,"%s.qwk",cfg.sys_id);
                    573:                dir=opendir(cfg.temp_dir);
                    574:                while((dirent=readdir(dir))!=NULL) {
                    575:                        if(!stricmp(str,dirent->d_name))        /* QWK packet */
                    576:                                continue;
                    577:                        sprintf(tmp,"%s%s",cfg.temp_dir,dirent->d_name);
                    578:                        if(!isdir(tmp))
                    579:                                remove(tmp); 
                    580:                }
                    581:                closedir(dir);
                    582:        }
                    583: 
                    584:        return(true);
                    585: }

unix.superglobalmegacorp.com

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