Annotation of sbbs/src/sbbs3/pack_qwk.cpp, revision 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.