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

unix.superglobalmegacorp.com

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