Annotation of sbbs/src/sbbs3/pack_rep.cpp, revision 1.1

1.1     ! root        1: /* pack_rep.cpp */
        !             2: 
        !             3: /* Synchronet QWK reply (REP) packet creation routine */
        !             4: 
        !             5: /* $Id: pack_rep.cpp,v 1.34 2005/09/25 22:56:57 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 2005 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 an REP packet for upload to QWK hub 'hubnum'.                    */
        !            43: /* Returns 1 if successful, 0 if not.                                                                          */
        !            44: /****************************************************************************/
        !            45: bool sbbs_t::pack_rep(uint hubnum)
        !            46: {
        !            47:        char    str[MAX_PATH+1];
        !            48:        char    tmp[MAX_PATH+1],tmp2[MAX_PATH+1];
        !            49:        int     file,mode;
        !            50:        uint    i,j,k;
        !            51:        long    l,msgcnt,submsgs,posts,packedmail,netfiles=0,deleted;
        !            52:        long    mailmsgs;
        !            53:        ulong   last,msgs;
        !            54:        post_t  *post;
        !            55:        mail_t  *mail;
        !            56:        FILE*   rep;
        !            57:        DIR*    dir;
        !            58:        DIRENT* dirent;
        !            59:        smbmsg_t msg;
        !            60: 
        !            61:        msgcnt=0L;
        !            62:        delfiles(cfg.temp_dir,ALLFILES);
        !            63:        sprintf(str,"%s%s.rep",cfg.data_dir,cfg.qhub[hubnum]->id);
        !            64:        if(fexist(str)) {
        !            65:                eprintf(LOG_INFO,"Updating %s", str);
        !            66:                external(cmdstr(cfg.qhub[hubnum]->unpack,str,ALLFILES,NULL),EX_OFFLINE);
        !            67:        } else
        !            68:                eprintf(LOG_INFO,"Creating %s", str);
        !            69:        /*************************************************/
        !            70:        /* Create SYSID.MSG, write header and leave open */
        !            71:        /*************************************************/
        !            72:        sprintf(str,"%s%s.msg",cfg.temp_dir,cfg.qhub[hubnum]->id);
        !            73:        if((rep=fnopen(&file,str,O_CREAT|O_WRONLY|O_TRUNC))==NULL) {
        !            74:                errormsg(WHERE,ERR_CREATE,str,O_CREAT|O_WRONLY|O_TRUNC);
        !            75:                return(false); }
        !            76:        if(filelength(file)<1) {                                                        /* New REP packet */
        !            77:                sprintf(str,"%-*s"
        !            78:                        ,QWK_BLOCK_LEN,cfg.qhub[hubnum]->id);           /* So write header */
        !            79:                fwrite(str,QWK_BLOCK_LEN,1,rep); 
        !            80:        }
        !            81:        fseek(rep,0L,SEEK_END);
        !            82:        /*********************/
        !            83:        /* Pack new messages */
        !            84:        /*********************/
        !            85:        sprintf(smb.file,"%smail",cfg.data_dir);
        !            86:        smb.retry_time=cfg.smb_retry_time;
        !            87:        smb.subnum=INVALID_SUB;
        !            88:        if((i=smb_open(&smb))!=0) {
        !            89:                fclose(rep);
        !            90:                errormsg(WHERE,ERR_OPEN,smb.file,i,smb.last_error);
        !            91:                return(false); }
        !            92: 
        !            93:        /***********************/
        !            94:        /* Pack E-mail, if any */
        !            95:        /***********************/
        !            96:        qwkmail_last=0;
        !            97:        mail=loadmail(&smb,&mailmsgs,0,MAIL_YOUR,0);
        !            98:        packedmail=0;
        !            99:        if(mailmsgs) {
        !           100:                eprintf(LOG_INFO,"Packing NetMail for %s", cfg.qhub[hubnum]->id);
        !           101:                for(l=0;l<mailmsgs;l++) {
        !           102:        //              bprintf("\b\b\b\b\b%-5lu",l+1);
        !           103: 
        !           104:                        memset(&msg,0,sizeof(msg));
        !           105:                        msg.idx=mail[l];
        !           106:                        if(msg.idx.number>qwkmail_last)
        !           107:                                qwkmail_last=msg.idx.number;
        !           108:                        if(!loadmsg(&msg,mail[l].number))
        !           109:                                continue;
        !           110: 
        !           111:                        sprintf(str,"%s/",cfg.qhub[hubnum]->id);
        !           112:                        if(msg.to_net.type!=NET_QWK
        !           113:                                || (strcmp((char *)msg.to_net.addr,cfg.qhub[hubnum]->id)
        !           114:                                && strncmp((char *)msg.to_net.addr,str,strlen(str)))) {
        !           115:                                smb_unlockmsghdr(&smb,&msg);
        !           116:                                smb_freemsgmem(&msg);
        !           117:                                continue; }
        !           118: 
        !           119:                        msgtoqwk(&msg,rep,QM_TO_QNET|QM_REP|A_LEAVE,INVALID_SUB,0);
        !           120:                        packedmail++;
        !           121:                        smb_unlockmsghdr(&smb,&msg);
        !           122:                        smb_freemsgmem(&msg); 
        !           123:                        YIELD();        /* yield */
        !           124:                }
        !           125:                eprintf(LOG_INFO,"Packed %d NetMail messages",packedmail); 
        !           126:        }
        !           127:        smb_close(&smb);                                        /* Close the e-mail */
        !           128:        if(mailmsgs)
        !           129:                free(mail);
        !           130: 
        !           131:        for(i=0;i<cfg.qhub[hubnum]->subs;i++) {
        !           132:                j=cfg.qhub[hubnum]->sub[i];                     /* j now equals the real sub num */
        !           133:                msgs=getlastmsg(j,&last,0);
        !           134:                lncntr=0;                                               /* defeat pause */
        !           135:                if(!msgs || last<=subscan[j].ptr) {
        !           136:                        if(subscan[j].ptr>last) {
        !           137:                                subscan[j].ptr=last;
        !           138:                                subscan[j].last=last; }
        !           139:                        eprintf(LOG_INFO,remove_ctrl_a(text[NScanStatusFmt],tmp)
        !           140:                                ,cfg.grp[cfg.sub[j]->grp]->sname
        !           141:                                ,cfg.sub[j]->lname,0L,msgs);
        !           142:                        continue; }
        !           143: 
        !           144:                sprintf(smb.file,"%s%s"
        !           145:                        ,cfg.sub[j]->data_dir,cfg.sub[j]->code);
        !           146:                smb.retry_time=cfg.smb_retry_time;
        !           147:                smb.subnum=j;
        !           148:                if((k=smb_open(&smb))!=0) {
        !           149:                        errormsg(WHERE,ERR_OPEN,smb.file,k,smb.last_error);
        !           150:                        continue; }
        !           151: 
        !           152:                post=loadposts(&posts,j,subscan[j].ptr,LP_BYSELF|LP_OTHERS|LP_PRIVATE|LP_REP);
        !           153:                eprintf(LOG_INFO,remove_ctrl_a(text[NScanStatusFmt],tmp)
        !           154:                        ,cfg.grp[cfg.sub[j]->grp]->sname
        !           155:                        ,cfg.sub[j]->lname,posts,msgs);
        !           156:                if(!posts)      { /* no new messages */
        !           157:                        smb_close(&smb);
        !           158:                        continue; }
        !           159: 
        !           160:                subscan[j].ptr=last;                   /* set pointer */
        !           161:                eprintf(LOG_INFO,"%s",remove_ctrl_a(text[QWKPackingSubboard],tmp));     /* ptr to last msg      */
        !           162:                submsgs=0;
        !           163:                for(l=0;l<posts;l++) {
        !           164:        //              bprintf("\b\b\b\b\b%-5lu",l+1);
        !           165: 
        !           166:                        memset(&msg,0,sizeof(msg));
        !           167:                        msg.idx=post[l];
        !           168:                        if(!loadmsg(&msg,post[l].number))
        !           169:                                continue;
        !           170: 
        !           171:                        if(msg.from_net.type && msg.from_net.type!=NET_QWK &&
        !           172:                                !(cfg.sub[j]->misc&SUB_GATE)) {
        !           173:                                smb_freemsgmem(&msg);
        !           174:                                smb_unlockmsghdr(&smb,&msg);
        !           175:                                continue; }
        !           176: 
        !           177:                        if(!strnicmp(msg.subj,"NE:",3) || (msg.from_net.type==NET_QWK &&
        !           178:                                route_circ((char *)msg.from_net.addr,cfg.qhub[hubnum]->id))) {
        !           179:                                smb_freemsgmem(&msg);
        !           180:                                smb_unlockmsghdr(&smb,&msg);
        !           181:                                continue; }
        !           182: 
        !           183:                        mode=cfg.qhub[hubnum]->mode[i]|QM_TO_QNET|QM_REP;
        !           184:                        if(mode&A_LEAVE) mode|=(QM_VIA|QM_TZ|QM_MSGID);
        !           185:                        if(msg.from_net.type!=NET_QWK)
        !           186:                                mode|=QM_TAGLINE;
        !           187: 
        !           188:                        msgtoqwk(&msg,rep,mode,j,cfg.qhub[hubnum]->conf[i]);
        !           189: 
        !           190:                        smb_freemsgmem(&msg);
        !           191:                        smb_unlockmsghdr(&smb,&msg);
        !           192:                        msgcnt++;
        !           193:                        submsgs++; 
        !           194:                        if(!(l%50))
        !           195:                                YIELD(); /* yield */
        !           196:                }
        !           197:                eprintf(LOG_INFO,remove_ctrl_a(text[QWKPackedSubboard],tmp),submsgs,msgcnt);
        !           198:                free(post);
        !           199:                smb_close(&smb); 
        !           200:                YIELD();        /* yield */
        !           201:        }
        !           202: 
        !           203:        fclose(rep);                    /* close HUB_ID.MSG */
        !           204:        CRLF;
        !           205:                                                        /* Look for extra files to send out */
        !           206:        sprintf(str,"%sqnet/%s.out",cfg.data_dir,cfg.qhub[hubnum]->id);
        !           207:        strlwr(str);
        !           208:        dir=opendir(str);
        !           209:        while(dir!=NULL && (dirent=readdir(dir))!=NULL) {
        !           210:                sprintf(str,"%sqnet/%s.out/%s",cfg.data_dir,cfg.qhub[hubnum]->id,dirent->d_name);
        !           211:                strlwr(str);
        !           212:                if(isdir(str))
        !           213:                        continue;
        !           214:                sprintf(tmp2,"%s%s",cfg.temp_dir,dirent->d_name);
        !           215:                eprintf(LOG_INFO,remove_ctrl_a(text[RetrievingFile],tmp),str);
        !           216:                if(!mv(str,tmp2,1))
        !           217:                        netfiles++;
        !           218:        }
        !           219:        if(dir!=NULL)
        !           220:                closedir(dir);
        !           221:        if(netfiles)
        !           222:                CRLF;
        !           223: 
        !           224:        if(!msgcnt && !netfiles && !packedmail) {
        !           225:                eprintf(LOG_INFO,remove_ctrl_a(text[QWKNoNewMessages],tmp));
        !           226:                return(true);   // Changed from false Mar-11-2005 (needs to be true to save updated ptrs)
        !           227:        }
        !           228: 
        !           229:        /*******************/
        !           230:        /* Compress Packet */
        !           231:        /*******************/
        !           232:        sprintf(str,"%s%s.rep",cfg.data_dir,cfg.qhub[hubnum]->id);
        !           233:        sprintf(tmp2,"%s%s",cfg.temp_dir,ALLFILES);
        !           234:        i=external(cmdstr(cfg.qhub[hubnum]->pack,str,tmp2,NULL)
        !           235:                ,EX_OFFLINE|EX_WILDCARD);
        !           236:        if(!fexist(str)) {
        !           237:                eprintf(LOG_WARNING,"%s",remove_ctrl_a(text[QWKCompressionFailed],tmp));
        !           238:                if(i)
        !           239:                        errormsg(WHERE,ERR_EXEC,cmdstr(cfg.qhub[hubnum]->pack,str,tmp2,NULL),i);
        !           240:                else
        !           241:                        errorlog("Couldn't compress REP packet");
        !           242:                return(false); }
        !           243:        sprintf(str,"%sqnet/%s.out/",cfg.data_dir,cfg.qhub[hubnum]->id);
        !           244:        strlwr(str);
        !           245:        delfiles(str,ALLFILES);
        !           246: 
        !           247:        if(packedmail) {                                                /* Delete NetMail */
        !           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:                        errormsg(WHERE,ERR_OPEN,smb.file,i,smb.last_error);
        !           253:                        return(true); }
        !           254: 
        !           255:                mail=loadmail(&smb,&mailmsgs,0,MAIL_YOUR,0);
        !           256: 
        !           257:                if((i=smb_locksmbhdr(&smb))!=0) {                         /* Lock the base, so nobody */
        !           258:                        if(mailmsgs)
        !           259:                                free(mail);
        !           260:                        smb_close(&smb);
        !           261:                        errormsg(WHERE,ERR_LOCK,smb.file,i,smb.last_error);     /* messes with the index */
        !           262:                        return(true); }
        !           263: 
        !           264:                if((i=smb_getstatus(&smb))!=0) {
        !           265:                        if(mailmsgs)
        !           266:                                free(mail);
        !           267:                        smb_close(&smb);
        !           268:                        errormsg(WHERE,ERR_READ,smb.file,i,smb.last_error);
        !           269:                        return(true); }
        !           270: 
        !           271:                deleted=0;
        !           272:                /* Mark as READ and DELETE */
        !           273:                for(l=0;l<mailmsgs;l++) {
        !           274:                        if(mail[l].number>qwkmail_last)
        !           275:                                continue;
        !           276:                        memset(&msg,0,sizeof(msg));
        !           277:                        /* !IMPORTANT: search by number (do not initialize msg.idx.offset) */
        !           278:                        if(!loadmsg(&msg,mail[l].number))
        !           279:                                continue;
        !           280: 
        !           281:                        sprintf(str,"%s/",cfg.qhub[hubnum]->id);
        !           282:                        if(msg.to_net.type!=NET_QWK
        !           283:                                || (strcmp((char *)msg.to_net.addr,cfg.qhub[hubnum]->id)
        !           284:                                && strncmp((char *)msg.to_net.addr,str,strlen(str)))) {
        !           285:                                smb_unlockmsghdr(&smb,&msg);
        !           286:                                smb_freemsgmem(&msg);
        !           287:                                continue; }
        !           288: 
        !           289:                        msg.hdr.attr|=MSG_DELETE;
        !           290:                        msg.idx.attr=msg.hdr.attr;
        !           291:                        if((i=smb_putmsg(&smb,&msg))!=0)
        !           292:                                errormsg(WHERE,ERR_WRITE,smb.file,i,smb.last_error);
        !           293:                        else
        !           294:                                deleted++;
        !           295:                        smb_unlockmsghdr(&smb,&msg);
        !           296:                        smb_freemsgmem(&msg); 
        !           297:                }
        !           298: 
        !           299:                if(deleted && cfg.sys_misc&SM_DELEMAIL)
        !           300:                        delmail(0,MAIL_YOUR);
        !           301:                smb_close(&smb);
        !           302:                if(mailmsgs)
        !           303:                        free(mail); 
        !           304:                eprintf(LOG_INFO,"Deleted %d sent NetMail messages",deleted); 
        !           305:        }
        !           306: 
        !           307:        return(true);
        !           308: }

unix.superglobalmegacorp.com

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