Annotation of sbbs/sbbs2/pack_rep.c, revision 1.1.1.1

1.1       root        1: #line 1 "PACK_REP.C"
                      2: 
                      3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
                      4: 
                      5: #include "sbbs.h"
                      6: #include "post.h"
                      7: #include "qwk.h"
                      8: 
                      9: /****************************************************************************/
                     10: /* Creates an REP packet for upload to QWK hub 'hubnum'.                    */
                     11: /* Returns 1 if successful, 0 if not.                                                                          */
                     12: /****************************************************************************/
                     13: char pack_rep(uint hubnum)
                     14: {
                     15:        uchar   str[256],tmp2[256],ch,*p;
                     16:        uchar   HUGE16 *qwkbuf;
                     17:        int     file,mode;
                     18:        uint    i,j,k,n;
                     19:        long    l,size,msgcnt,submsgs,mailmsgs,packedmail,netfiles=0,deleted;
                     20:        ulong   last,ptr,posts,msgs;
                     21:        post_t  HUGE16 *post;
                     22:        mail_t  *mail;
                     23:        struct  ffblk ff;
                     24:        FILE    *rep;
                     25:        smbmsg_t msg;
                     26: 
                     27: msgcnt=0L;
                     28: delfiles(temp_dir,"*.*");
                     29: sprintf(str,"%s%s.REP",data_dir,qhub[hubnum]->id);
                     30: if(fexist(str))
                     31:        external(cmdstr(qhub[hubnum]->unpack,str,"*.*",NULL),EX_OUTL);
                     32: /*************************************************/
                     33: /* Create SYSID.MSG, write header and leave open */
                     34: /*************************************************/
                     35: sprintf(str,"%s%s.MSG",temp_dir,qhub[hubnum]->id);
                     36: if((rep=fnopen(&file,str,O_CREAT|O_WRONLY))==NULL) {
                     37:        errormsg(WHERE,ERR_OPEN,str,O_CREAT|O_WRONLY);
                     38:        return(0); }
                     39: if(!filelength(file)) {                                                /* New REP packet */
                     40:        sprintf(str,"%-128s",qhub[hubnum]->id);     /* So write header */
                     41:        fwrite(str,128,1,rep); }
                     42: fseek(rep,0L,SEEK_END);
                     43: /*********************/
                     44: /* Pack new messages */
                     45: /*********************/
                     46: console|=CON_L_ECHO;
                     47: 
                     48: sprintf(smb.file,"%sMAIL",data_dir);
                     49: smb.retry_time=smb_retry_time;
                     50: if((i=smb_open(&smb))!=0) {
                     51:        fclose(rep);
                     52:        errormsg(WHERE,ERR_OPEN,smb.file,i);
                     53:        return(0); }
                     54: 
                     55: /***********************/
                     56: /* Pack E-mail, if any */
                     57: /***********************/
                     58: qwkmail_time=time(NULL);
                     59: mailmsgs=loadmail(&mail,0,MAIL_YOUR,LM_QWK);
                     60: packedmail=0;
                     61: if(mailmsgs) {
                     62:        bputs(text[QWKPackingEmail]);
                     63:        for(l=0;l<mailmsgs;l++) {
                     64:                bprintf("\b\b\b\b\b%-5lu",l+1);
                     65: 
                     66:                msg.idx.offset=mail[l].offset;
                     67:                if(!loadmsg(&msg,mail[l].number))
                     68:                        continue;
                     69: 
                     70:                sprintf(str,"%s/",qhub[hubnum]->id);
                     71:                if(msg.to_net.type!=NET_QWK
                     72:                        || (strcmp(msg.to_net.addr,qhub[hubnum]->id)
                     73:                        && strncmp(msg.to_net.addr,str,strlen(str)))) {
                     74:                        smb_unlockmsghdr(&smb,&msg);
                     75:                        smb_freemsgmem(&msg);
                     76:                        continue; }
                     77: 
                     78:                msgtoqwk(msg,rep,TO_QNET|REP|A_LEAVE,INVALID_SUB,0);
                     79:                packedmail++;
                     80:                smb_unlockmsghdr(&smb,&msg);
                     81:                smb_freemsgmem(&msg); }
                     82:        bprintf(text[QWKPackedEmail],packedmail); }
                     83: smb_close(&smb);                                       /* Close the e-mail */
                     84: if(mailmsgs)
                     85:        FREE(mail);
                     86: 
                     87: useron.number=1;
                     88: getuserdat(&useron);
                     89: for(i=0;i<qhub[hubnum]->subs;i++) {
                     90:        j=qhub[hubnum]->sub[i];                         /* j now equals the real sub num */
                     91:        msgs=getlastmsg(j,&last,0);
                     92:        lncntr=0;                                               /* defeat pause */
                     93:        if(!msgs || last<=sub[j]->ptr) {
                     94:                if(sub[j]->ptr>last) {
                     95:                        sub[j]->ptr=last;
                     96:                        sub[j]->last=last; }
                     97:                bprintf(text[NScanStatusFmt]
                     98:                        ,grp[sub[j]->grp]->sname
                     99:                        ,sub[j]->lname,0L,msgs);
                    100:                continue; }
                    101: 
                    102:        sprintf(smb.file,"%s%s"
                    103:                ,sub[j]->data_dir,sub[j]->code);
                    104:        smb.retry_time=smb_retry_time;
                    105:        if((k=smb_open(&smb))!=0) {
                    106:                errormsg(WHERE,ERR_OPEN,smb.file,k);
                    107:                continue; }
                    108: 
                    109:        post=loadposts(&posts,j,sub[j]->ptr,LP_BYSELF|LP_OTHERS|LP_PRIVATE|LP_REP);
                    110:        bprintf(text[NScanStatusFmt]
                    111:                ,grp[sub[j]->grp]->sname
                    112:                ,sub[j]->lname,posts,msgs);
                    113:        if(!posts)      { /* no new messages */
                    114:                smb_close(&smb);
                    115:                continue; }
                    116: 
                    117:     sub[j]->ptr=last;                   /* set pointer */
                    118:        bputs(text[QWKPackingSubboard]);        /* ptr to last msg      */
                    119:        submsgs=0;
                    120:        for(l=0;l<posts;l++) {
                    121:                bprintf("\b\b\b\b\b%-5lu",l+1);
                    122: 
                    123:                msg.idx.offset=post[l].offset;
                    124:                if(!loadmsg(&msg,post[l].number))
                    125:                        continue;
                    126: 
                    127:                if(msg.from_net.type && msg.from_net.type!=NET_QWK &&
                    128:                        !(sub[j]->misc&SUB_GATE)) {
                    129:                        smb_freemsgmem(&msg);
                    130:                        smb_unlockmsghdr(&smb,&msg);
                    131:                        continue; }
                    132: 
                    133:                if(!strncmpi(msg.subj,"NE:",3) || (msg.from_net.type==NET_QWK &&
                    134:                        route_circ(msg.from_net.addr,qhub[hubnum]->id))) {
                    135:                        smb_freemsgmem(&msg);
                    136:                        smb_unlockmsghdr(&smb,&msg);
                    137:                        continue; }
                    138: 
                    139:                mode=qhub[hubnum]->mode[i]|TO_QNET|REP;
                    140:                if(mode&A_LEAVE) mode|=(VIA|TZ);
                    141:                if(msg.from_net.type!=NET_QWK)
                    142:                        mode|=TAGLINE;
                    143: 
                    144:                msgtoqwk(msg,rep,mode,j,qhub[hubnum]->conf[i]);
                    145: 
                    146:                smb_freemsgmem(&msg);
                    147:                smb_unlockmsghdr(&smb,&msg);
                    148:                msgcnt++;
                    149:                submsgs++; }
                    150:        bprintf(text[QWKPackedSubboard],submsgs,msgcnt);
                    151:        LFREE(post);
                    152:        smb_close(&smb); }
                    153: 
                    154: fclose(rep);                   /* close MESSAGE.DAT */
                    155: CRLF;
                    156:                                                /* Look for extra files to send out */
                    157: sprintf(str,"%sQNET\\%s.OUT\\*.*",data_dir,qhub[hubnum]->id);
                    158: i=findfirst(str,&ff,0);
                    159: while(!i) {
                    160:     sprintf(str,"%sQNET\\%s.OUT\\%s",data_dir,qhub[hubnum]->id,ff.ff_name);
                    161:     sprintf(tmp2,"%s%s",temp_dir,ff.ff_name);
                    162:        bprintf(text[RetrievingFile],str);
                    163:        if(!mv(str,tmp2,1))
                    164:         netfiles++;
                    165:     i=findnext(&ff); }
                    166: if(netfiles)
                    167:        CRLF;
                    168: 
                    169: if(!msgcnt && !netfiles && !packedmail) {
                    170:        bputs(text[QWKNoNewMessages]);
                    171:        return(0); }
                    172: 
                    173: /*******************/
                    174: /* Compress Packet */
                    175: /*******************/
                    176: sprintf(str,"%s%s.REP",data_dir,qhub[hubnum]->id);
                    177: sprintf(tmp2,"%s*.*",temp_dir);
                    178: i=external(cmdstr(qhub[hubnum]->pack,str,tmp2,NULL),EX_OUTL);
                    179: if(!fexist(str)) {
                    180:        bputs(text[QWKCompressionFailed]);
                    181:        if(i)
                    182:                errormsg(WHERE,ERR_EXEC,cmdstr(qhub[hubnum]->pack,str,tmp2,NULL),i);
                    183:        else
                    184:                errorlog("Couldn't compress REP packet");
                    185:        return(0); }
                    186: sprintf(str,"%sQNET\\%s.OUT\\",data_dir,qhub[hubnum]->id);
                    187: delfiles(str,"*.*");
                    188: 
                    189: if(packedmail) {                                               /* Delete NetMail */
                    190:        sprintf(smb.file,"%sMAIL",data_dir);
                    191:        smb.retry_time=smb_retry_time;
                    192:        if((i=smb_open(&smb))!=0) {
                    193:                errormsg(WHERE,ERR_OPEN,smb.file,i);
                    194:                return(1); }
                    195: 
                    196:        mailmsgs=loadmail(&mail,0,MAIL_YOUR,LM_QWK);
                    197: 
                    198:        if((i=smb_locksmbhdr(&smb))!=0) {                         /* Lock the base, so nobody */
                    199:                if(mailmsgs)
                    200:                        FREE(mail);
                    201:                smb_close(&smb);
                    202:                errormsg(WHERE,ERR_LOCK,smb.file,i);    /* messes with the index */
                    203:                return(1); }
                    204: 
                    205:        if((i=smb_getstatus(&smb))!=0) {
                    206:                if(mailmsgs)
                    207:                        FREE(mail);
                    208:                smb_close(&smb);
                    209:                errormsg(WHERE,ERR_READ,smb.file,i);
                    210:                return(1); }
                    211: 
                    212:        deleted=0;
                    213:        /* Mark as READ and DELETE */
                    214:        for(l=0;l<mailmsgs;l++) {
                    215:                if(mail[l].time>qwkmail_time)
                    216:                        continue;
                    217:                msg.idx.offset=0;
                    218:                if(!loadmsg(&msg,mail[l].number))
                    219:                        continue;
                    220: 
                    221:                sprintf(str,"%s/",qhub[hubnum]->id);
                    222:                if(msg.to_net.type!=NET_QWK
                    223:                        || (strcmp(msg.to_net.addr,qhub[hubnum]->id)
                    224:                        && strncmp(msg.to_net.addr,str,strlen(str)))) {
                    225:                        smb_unlockmsghdr(&smb,&msg);
                    226:                        smb_freemsgmem(&msg);
                    227:             continue; }
                    228: 
                    229:                msg.hdr.attr|=MSG_DELETE;
                    230:                msg.idx.attr=msg.hdr.attr;
                    231:                if((i=smb_putmsg(&smb,&msg))!=0)
                    232:                        errormsg(WHERE,ERR_WRITE,smb.file,i);
                    233:                else
                    234:                        deleted++;
                    235:                smb_unlockmsghdr(&smb,&msg);
                    236:                smb_freemsgmem(&msg); }
                    237: 
                    238:        if(deleted && sys_misc&SM_DELEMAIL)
                    239:                delmail(0,MAIL_YOUR);
                    240:        smb_close(&smb);
                    241:        if(mailmsgs)
                    242:                FREE(mail); }
                    243: 
                    244: return(1);
                    245: }

unix.superglobalmegacorp.com

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