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

1.1       root        1: /* qwktomsg.cpp */
                      2: 
                      3: /* Synchronet QWK to SMB message conversion routine */
                      4: 
                      5: /* $Id: qwktomsg.cpp,v 1.4 2000/11/14 02:16: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 2000 Rob Swindell - http://www.synchro.net/copyright.html         *
                     12:  *                                                                                                                                                     *
                     13:  * This program is free software; you can redistribute it and/or                       *
                     14:  * modify it under the terms of the GNU General Public License                         *
                     15:  * as published by the Free Software Foundation; either version 2                      *
                     16:  * of the License, or (at your option) any later version.                                      *
                     17:  * See the GNU General Public License for more details: gpl.txt or                     *
                     18:  * http://www.fsf.org/copyleft/gpl.html                                                                                *
                     19:  *                                                                                                                                                     *
                     20:  * Anonymous FTP access to the most recent released source is available at     *
                     21:  * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net     *
                     22:  *                                                                                                                                                     *
                     23:  * Anonymous CVS access to the development source and modification history     *
                     24:  * is available at cvs.synchro.net:/cvsroot/sbbs, example:                                     *
                     25:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs login                       *
                     26:  *     (just hit return, no password is necessary)                                                     *
                     27:  * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src                *
                     28:  *                                                                                                                                                     *
                     29:  * For Synchronet coding style and modification guidelines, see                                *
                     30:  * http://www.synchro.net/source.html                                                                          *
                     31:  *                                                                                                                                                     *
                     32:  * You are encouraged to submit any modifications (preferably in Unix diff     *
                     33:  * format) via e-mail to [email protected]                                                                      *
                     34:  *                                                                                                                                                     *
                     35:  * Note: If this box doesn't appear square, then you need to fix your tabs.    *
                     36:  ****************************************************************************/
                     37: 
                     38: #include "sbbs.h"
                     39: #include "qwk.h"
                     40: 
                     41: /****************************************************************************/
                     42: /* Converts a QWK message packet into a message.                                                       */
                     43: /****************************************************************************/
                     44: bool sbbs_t::qwktomsg(FILE *qwk_fp, char *hdrblk, char fromhub, uint subnum
                     45:        , uint touser)
                     46: {
                     47:        char    str[256],*body,*tail,col=0,lastch=0,*p,*lzhbuf,qwkbuf[128];
                     48:        uint    i,j,k,lzh=0,storage,skip=0;
                     49:        ushort  xlat;
                     50:        long    l,bodylen,taillen,length;
                     51:        ulong   crc,block,blocks;
                     52:        smbmsg_t        msg;
                     53:        struct  tm tm;
                     54: 
                     55:        memset(&msg,0,sizeof(smbmsg_t));                /* Initialize message header */
                     56:        memcpy(msg.hdr.id,"SHD\x1a",4);
                     57:        msg.hdr.version=smb_ver();
                     58: 
                     59:        blocks=atol(hdrblk+116);
                     60:        if(blocks<2) {
                     61:                errormsg(WHERE,ERR_CHK,"QWK packet header blocks",blocks);
                     62:                return(false);
                     63:        }
                     64: 
                     65:        if(subnum!=INVALID_SUB
                     66:                && (hdrblk[0]=='*' || hdrblk[0]=='+' || cfg.sub[subnum]->misc&SUB_PONLY))
                     67:                msg.idx.attr|=MSG_PRIVATE;
                     68:        if(subnum!=INVALID_SUB && cfg.sub[subnum]->misc&SUB_AONLY)
                     69:                msg.idx.attr|=MSG_ANONYMOUS;
                     70:        if(subnum==INVALID_SUB && cfg.sys_misc&SM_DELREADM)
                     71:                msg.idx.attr|=MSG_KILLREAD;
                     72:        if((fromhub || useron.rest&FLAG('Q')) &&
                     73:                (hdrblk[0]=='*' || hdrblk[0]=='-' || hdrblk[0]=='`'))
                     74:                msg.idx.attr|=MSG_READ;
                     75: 
                     76:        if(subnum!=INVALID_SUB && !fromhub && cfg.sub[subnum]->mod_ar[0]
                     77:                && chk_ar(cfg.sub[subnum]->mod_ar,&useron))
                     78:                msg.idx.attr|=MSG_MODERATED;
                     79:        if(subnum!=INVALID_SUB && !fromhub && cfg.sub[subnum]->misc&SUB_SYSPERM
                     80:                && sub_op(subnum))
                     81:                msg.idx.attr|=MSG_PERMANENT;
                     82: 
                     83:        msg.hdr.attr=msg.idx.attr;
                     84: 
                     85:        memset(&tm,0,sizeof(tm));
                     86:        tm.tm_mon = ((hdrblk[8]&0xf)*10)+(hdrblk[9]&0xf);
                     87:        if(tm.tm_mon>0) tm.tm_mon--;    /* zero based */
                     88:        tm.tm_mday=((hdrblk[11]&0xf)*10)+(hdrblk[12]&0xf);
                     89:        tm.tm_year=((hdrblk[14]&0xf)*10)+(hdrblk[15]&0xf);
                     90:        if(tm.tm_year<Y2K_2DIGIT_WINDOW)
                     91:                tm.tm_year+=100;
                     92:        tm.tm_hour=((hdrblk[16]&0xf)*10)+(hdrblk[17]&0xf);
                     93:        tm.tm_min=((hdrblk[19]&0xf)*10)+(hdrblk[20]&0xf);
                     94:        tm.tm_sec=0;
                     95: 
                     96:        msg.hdr.when_written.time=mktime(&tm);
                     97:        if(!(useron.rest&FLAG('Q')) && !fromhub)
                     98:                msg.hdr.when_written.zone=cfg.sys_timezone;
                     99:        msg.hdr.when_imported.time=time(NULL);
                    100:        msg.hdr.when_imported.zone=cfg.sys_timezone;
                    101: 
                    102:        hdrblk[116]=0;  // don't include number of blocks in "re: msg number"
                    103:        msg.hdr.thread_orig=atol((char *)hdrblk+108);
                    104: 
                    105:        if((uint)subnum==INVALID_SUB) {                 /* E-mail */
                    106:                msg.idx.to=touser;
                    107: 
                    108:                username(&cfg,touser,str);
                    109:                smb_hfield(&msg,RECIPIENT,strlen(str),str);
                    110:                sprintf(str,"%u",touser);
                    111:                smb_hfield(&msg,RECIPIENTEXT,strlen(str),str); }
                    112: 
                    113:        else {
                    114:                sprintf(str,"%25.25s",(char *)hdrblk+21);     /* To user */
                    115:                truncsp(str);
                    116:                smb_hfield(&msg,RECIPIENT,strlen(str),str);
                    117:                strlwr(str);
                    118:                msg.idx.to=crc16(str); }
                    119: 
                    120:        fread(qwkbuf,1,128,qwk_fp);
                    121: 
                    122:        if(useron.rest&FLAG('Q') || fromhub) {      /* QWK Net */
                    123:                if(!strnicmp(qwkbuf,"@VIA:",5)) {
                    124:                        p=strchr(qwkbuf,'\xe3');
                    125:                        if(p) {
                    126:                                *p=0;
                    127:                                skip=strlen(qwkbuf)+1; }
                    128:                        truncsp(qwkbuf);
                    129:                        p=qwkbuf+5;                                     /* Skip "@VIA:" */
                    130:                        while(*p && *p<=SP) p++;                /* Skip any spaces */
                    131:                        if(route_circ(p,cfg.sys_id)) {
                    132:                                smb_freemsgmem(&msg);
                    133:                                bprintf("\r\nCircular message path: %s\r\n",p);
                    134:                                sprintf(str,"Circular message path: %s from %s"
                    135:                                        ,p,fromhub ? cfg.qhub[fromhub-1]->id:useron.alias);
                    136:                                errorlog(str);
                    137:                                return(false); }
                    138:                        sprintf(str,"%s/%s"
                    139:                                ,fromhub ? cfg.qhub[fromhub-1]->id : useron.alias,p);
                    140:                        strupr(str);
                    141:                        update_qwkroute(str); }
                    142:                else {
                    143:                        if(fromhub)
                    144:                                strcpy(str,cfg.qhub[fromhub-1]->id);
                    145:                        else
                    146:                                strcpy(str,useron.alias); }
                    147:                strupr(str);
                    148:                j=NET_QWK;
                    149:                smb_hfield(&msg,SENDERNETTYPE,2,&j);
                    150:                smb_hfield(&msg,SENDERNETADDR,strlen(str),str);
                    151:                sprintf(str,"%25.25s",hdrblk+46);  /* From user */
                    152:                truncsp(str);
                    153:                if(!strnicmp(qwkbuf+skip,"@TZ:",4)) {
                    154:                        p=strchr(qwkbuf+skip,'\xe3');
                    155:                        i=skip;
                    156:                        if(p) {
                    157:                                *p=0;
                    158:                                skip+=strlen(qwkbuf+i)+1; }
                    159:                        p=qwkbuf+i+4;                                   /* Skip "@TZ:" */
                    160:                        while(*p && *p<=SP) p++;                /* Skip any spaces */
                    161:                        msg.hdr.when_written.zone=(short)ahtoul(p); }
                    162:                }
                    163:        else {
                    164:                sprintf(str,"%u",useron.number);
                    165:                smb_hfield(&msg,SENDEREXT,strlen(str),str);
                    166:                if((uint)subnum!=INVALID_SUB && cfg.sub[subnum]->misc&SUB_NAME)
                    167:                        strcpy(str,useron.name);
                    168:                else
                    169:                        strcpy(str,useron.alias); }
                    170: 
                    171:        smb_hfield(&msg,SENDER,strlen(str),str);
                    172:        if((uint)subnum==INVALID_SUB) {
                    173:                if(useron.rest&FLAG('Q') || fromhub)
                    174:                        msg.idx.from=0;
                    175:                else
                    176:                        msg.idx.from=useron.number; }
                    177:        else {
                    178:                strlwr(str);
                    179:                msg.idx.from=crc16(str); }
                    180: 
                    181:        sprintf(str,"%25.25s",hdrblk+71);   /* Subject */
                    182:        truncsp(str);
                    183:        remove_re(str);
                    184:        smb_hfield(&msg,SUBJECT,strlen(str),str);
                    185:        strlwr(str);
                    186:        msg.idx.subj=crc16(str);
                    187: 
                    188:        /********************************/
                    189:        /* Convert the QWK message text */
                    190:        /********************************/
                    191: 
                    192:        bodylen=0;
                    193:        if((body=(char *)LMALLOC((blocks-1L)*128L*2L))==NULL) {
                    194:                smb_freemsgmem(&msg);
                    195:                errormsg(WHERE,ERR_ALLOC,"QWK msg body",(blocks-1L)*128L*2L);
                    196:                return(false); }
                    197: 
                    198:        taillen=0;
                    199:        if((tail=(char *)LMALLOC((blocks-1L)*128L*2L))==NULL) {
                    200:                LFREE(body);
                    201:                smb_freemsgmem(&msg);
                    202:                errormsg(WHERE,ERR_ALLOC,"QWK msg tail",(blocks-1L)*128L*2L);
                    203:                return(false); }
                    204: 
                    205:        for(block=1;block<blocks;block++) {
                    206:                if(block>1)
                    207:                        if(!fread(qwkbuf,1,128,qwk_fp))
                    208:                                break;
                    209:                for(k=skip;k<128;k++,skip=0) {
                    210:                        if(qwkbuf[k]==0)
                    211:                                continue;
                    212:                        if(!taillen && qwkbuf[k]==SP && col==3 && bodylen>=3
                    213:                                && body[bodylen-3]=='-' && body[bodylen-2]=='-'
                    214:                                && body[bodylen-1]=='-') {
                    215:                                bodylen-=3;
                    216:                                strcpy(tail,"--- ");
                    217:                                taillen=4;
                    218:                                col++;
                    219:                                continue; }
                    220:                        if((uchar)qwkbuf[k]==0xE3) {            /* expand 0xe3 to crlf */
                    221:                                if(!taillen && col==3 && bodylen>=3 && body[bodylen-3]=='-'
                    222:                                        && body[bodylen-2]=='-' && body[bodylen-1]=='-') {
                    223:                                        bodylen-=3;
                    224:                                        strcpy(tail,"---");
                    225:                                        taillen=3; }
                    226:                                col=0;
                    227:                                if(taillen) {
                    228:                                        tail[taillen++]=CR;
                    229:                                        tail[taillen++]=LF; }
                    230:                                else {
                    231:                                        body[bodylen++]=CR;
                    232:                                        body[bodylen++]=LF; }
                    233:                                continue; }
                    234:                        /* beep restrict */
                    235:                        if(!fromhub && qwkbuf[k]==BEL && useron.rest&FLAG('B'))   
                    236:                                continue;
                    237:                        /* ANSI restriction */
                    238:                        if(!fromhub && (qwkbuf[k]==1 || qwkbuf[k]==ESC)
                    239:                                && useron.rest&FLAG('A'))
                    240:                                continue;
                    241:                        if(qwkbuf[k]!=1 && lastch!=1)
                    242:                                col++;
                    243:                        if(lastch==1 && !validattr(qwkbuf[k])) {
                    244:                                if(taillen) taillen--;
                    245:                                else            bodylen--;
                    246:                                lastch=0;
                    247:                                continue; }
                    248:                        lastch=qwkbuf[k];
                    249:                        if(taillen)
                    250:                                tail[taillen++]=qwkbuf[k];
                    251:                        else
                    252:                                body[bodylen++]=qwkbuf[k]; } }
                    253: 
                    254:        while(bodylen && body[bodylen-1]==SP) bodylen--; /* remove trailing spaces */
                    255:        if(bodylen>=2 && body[bodylen-2]==CR && body[bodylen-1]==LF)
                    256:                bodylen-=2;
                    257: 
                    258:        while(taillen && tail[taillen-1]<=SP) taillen--; /* remove trailing garbage */
                    259: 
                    260:        /*****************/
                    261:        /* Calculate CRC */
                    262:        /*****************/
                    263: 
                    264:        if(smb.status.max_crcs) {
                    265:                crc=0xffffffffUL;
                    266:                for(l=0;l<bodylen;l++)
                    267:                        crc=ucrc32(body[l],crc);
                    268:                crc=~crc;
                    269: 
                    270:                /*******************/
                    271:                /* Check for dupes */
                    272:                /*******************/
                    273: 
                    274:                j=smb_addcrc(&smb,crc);
                    275:                if(j) {
                    276:                        if(j==1) {
                    277:                                bprintf("\r\nDuplicate message\r\n");
                    278:                                if(subnum==INVALID_SUB)
                    279:                                        logline("E!","Duplicate e-mail attempt"); 
                    280:                                else {
                    281:                                        sprintf(str,"Duplicate message attempt in %s/%s"
                    282:                                                ,cfg.grp[cfg.sub[subnum]->grp]->sname
                    283:                                                ,cfg.sub[subnum]->lname);
                    284:                                        logline("P!",str); 
                    285:                                }
                    286:                        } else
                    287:                                errormsg(WHERE,ERR_CHK,smb.file,j);
                    288: 
                    289:                        smb_freemsgmem(&msg);
                    290:                        LFREE(body);
                    291:                        LFREE(tail);
                    292:                        return(false); } }
                    293: 
                    294:        bputs(text[WritingIndx]);
                    295: 
                    296:        /*************************************/
                    297:        /* Write SMB message header and text */
                    298:        /*************************************/
                    299: 
                    300:        if(subnum!=INVALID_SUB && cfg.sub[subnum]->misc&SUB_LZH && bodylen
                    301:                && bodylen+2+taillen+2>=SDT_BLOCK_LEN
                    302:                && (lzhbuf=(char *)LMALLOC(bodylen*2))!=NULL) {
                    303:                length=lzh_encode((uchar *)body,bodylen,(uchar *)lzhbuf);
                    304:                if(length>1L
                    305:                        && smb_datblocks(length+4L+taillen+2L)
                    306:                                <smb_datblocks(bodylen+2L+taillen+2L)) {
                    307:                        bodylen=length;         /* Compressable */
                    308:                        length+=4L;
                    309:                        lzh=1;
                    310:                        LFREE(body);
                    311:                        body=lzhbuf; }
                    312:                else {                                  /* Non-compressable */
                    313:                        length=bodylen+2L;
                    314:                        LFREE(lzhbuf); } }
                    315:        else
                    316:                length=bodylen+2L;                                       /* +2 for translation string */
                    317: 
                    318:        if(taillen)
                    319:                length+=taillen+2L;
                    320: 
                    321:        if(length&0xfff00000UL) {
                    322:                errormsg(WHERE,ERR_LEN,"REP msg",length);
                    323:                smb_freemsgmem(&msg);
                    324:                LFREE(body);
                    325:                LFREE(tail);
                    326:                return(false); }
                    327: 
                    328:        if((i=smb_locksmbhdr(&smb))!=0) {
                    329:                errormsg(WHERE,ERR_LOCK,smb.file,i);
                    330:                FREE(body);
                    331:                FREE(tail);
                    332:                return(false); }
                    333: 
                    334:        if(smb.status.attr&SMB_HYPERALLOC) {
                    335:                msg.hdr.offset=smb_hallocdat(&smb);
                    336:                storage=SMB_HYPERALLOC; }
                    337:        else {
                    338:                if((i=smb_open_da(&smb))!=0) {
                    339:                        errormsg(WHERE,ERR_OPEN,smb.file,i);
                    340:                        FREE(body);
                    341:                        FREE(tail);
                    342:                        return(false); }
                    343:                if((subnum==INVALID_SUB && cfg.sys_misc&SM_FASTMAIL)
                    344:                        || (subnum!=INVALID_SUB && cfg.sub[subnum]->misc&SUB_FAST)) {
                    345:                        msg.hdr.offset=smb_fallocdat(&smb,length,1);
                    346:                        storage=SMB_FASTALLOC; }
                    347:                else {
                    348:                        msg.hdr.offset=smb_allocdat(&smb,length,1);
                    349:                        storage=SMB_SELFPACK; }
                    350:                smb_close_da(&smb); }
                    351: 
                    352:        if(msg.hdr.offset && msg.hdr.offset<1L) {
                    353:                smb_unlocksmbhdr(&smb);
                    354:                errormsg(WHERE,ERR_READ,smb.file,msg.hdr.offset);
                    355:                smb_freemsgmem(&msg);
                    356:                FREE(body);
                    357:                FREE(tail); }
                    358:        fseek(smb.sdt_fp,msg.hdr.offset,SEEK_SET);
                    359:        if(lzh) {
                    360:                xlat=XLAT_LZH;
                    361:                fwrite(&xlat,2,1,smb.sdt_fp); }
                    362:        xlat=XLAT_NONE;
                    363:        fwrite(&xlat,2,1,smb.sdt_fp);
                    364:        fwrite(body,bodylen,1,smb.sdt_fp);
                    365:        smb_dfield(&msg,TEXT_BODY,bodylen+2+(lzh ? 2:0));
                    366:        if(taillen) {
                    367:                fwrite(&xlat,2,1,smb.sdt_fp);
                    368:                fwrite(tail,taillen,1,smb.sdt_fp);
                    369:                smb_dfield(&msg,TEXT_TAIL,taillen+2); }
                    370:        fflush(smb.sdt_fp);
                    371:        smb_unlocksmbhdr(&smb);
                    372: 
                    373:        if((i=smb_addmsghdr(&smb,&msg,storage))!=0)
                    374:                errormsg(WHERE,ERR_WRITE,smb.file,i);
                    375: 
                    376:        smb_freemsgmem(&msg);
                    377: 
                    378:        LFREE(body);
                    379:        LFREE(tail);
                    380: 
                    381:        return(true);
                    382: }

unix.superglobalmegacorp.com

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