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

1.1       root        1: #line 1 "QWKTOMSG.C"
                      2: 
                      3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
                      4: 
                      5: #include "sbbs.h"
                      6: #include "qwk.h"
                      7: 
                      8: /****************************************************************************/
                      9: /* Converts a QWK message packet into a message. The 'qwkbuf' pointer       */
                     10: /* points to the message header and 'str' is the file to output to.         */
                     11: /* Returns the 1 on success or 0 if failure.                                                           */
                     12: /****************************************************************************/
                     13: char qwktomsg(FILE *qwk_fp, uchar *hdrblk, char fromhub, uint subnum
                     14:        , uint touser)
                     15: {
                     16:        uchar   str[256],*body,*tail,col=0,lastch=0,*p,*lzhbuf,qwkbuf[128];
                     17:        int     file,i,j,k,lzh=0,storage,skip=0;
                     18:        ushort  xlat;
                     19:        long    l,bodylen,taillen,length;
                     20:        ulong   crc,block,blocks;
                     21:        smbmsg_t        msg;
                     22: 
                     23: memset(&msg,0,sizeof(smbmsg_t));               /* Initialize message header */
                     24: memcpy(msg.hdr.id,"SHD\x1a",4);
                     25: msg.hdr.version=SMB_VERSION;
                     26: 
                     27: blocks=atol(hdrblk+116);
                     28: if(blocks<2)
                     29:        return(0);
                     30: 
                     31: if(subnum!=INVALID_SUB
                     32:        && (hdrblk[0]=='*' || hdrblk[0]=='+' || sub[subnum]->misc&SUB_PONLY))
                     33:        msg.idx.attr|=MSG_PRIVATE;
                     34: if(subnum!=INVALID_SUB && sub[subnum]->misc&SUB_AONLY)
                     35:        msg.idx.attr|=MSG_ANONYMOUS;
                     36: if(subnum==INVALID_SUB && sys_misc&SM_DELREADM)
                     37:        msg.idx.attr|=MSG_KILLREAD;
                     38: if((fromhub || useron.rest&FLAG('Q')) &&
                     39:        (hdrblk[0]=='*' || hdrblk[0]=='-' || hdrblk[0]=='`'))
                     40:        msg.idx.attr|=MSG_READ;
                     41: 
                     42: if(subnum!=INVALID_SUB && !fromhub && sub[subnum]->mod_ar[0]
                     43:        && chk_ar(sub[subnum]->mod_ar,useron))
                     44:        msg.idx.attr|=MSG_MODERATED;
                     45: if(subnum!=INVALID_SUB && !fromhub && sub[subnum]->misc&SUB_SYSPERM
                     46:        && sub_op(subnum))
                     47:        msg.idx.attr|=MSG_PERMANENT;
                     48: 
                     49: msg.hdr.attr=msg.idx.attr;
                     50: 
                     51: date.da_mon=((hdrblk[8]&0xf)*10)+(hdrblk[9]&0xf);
                     52: date.da_day=((hdrblk[11]&0xf)*10)+(hdrblk[12]&0xf);
                     53: date.da_year=((hdrblk[14]&0xf)*10)+(hdrblk[15]&0xf)+1900;
                     54: curtime.ti_hour=((hdrblk[16]&0xf)*10)+(hdrblk[17]&0xf);
                     55: curtime.ti_min=((hdrblk[19]&0xf)*10)+(hdrblk[20]&0xf);
                     56: curtime.ti_sec=0;
                     57: msg.hdr.when_written.time=dostounix(&date,&curtime);
                     58: if(!(useron.rest&FLAG('Q')) && !fromhub)
                     59:        msg.hdr.when_written.zone=sys_timezone;
                     60: msg.hdr.when_imported.time=time(NULL);
                     61: msg.hdr.when_imported.zone=sys_timezone;
                     62: 
                     63: msg.hdr.thread_orig=atol(hdrblk+108);
                     64: 
                     65: if((uint)subnum==INVALID_SUB) {                /* E-mail */
                     66:        msg.idx.to=touser;
                     67: 
                     68: /***                                   Unnecessary code in v2.10a
                     69:        if(!touser) {
                     70:                sprintf(str,"%25.25s",hdrblk+21);
                     71:                truncsp(str);
                     72:                for(i=0;i<total_qhubs;i++)
                     73:                        if(!stricmp(qhub[i]->id,str))
                     74:                                break;
                     75:                if(i==total_qhubs) {
                     76:                        errormsg(WHERE,ERR_CHK,str,0);
                     77:                        return(0); }
                     78:                smb_hfield(&msg,RECIPIENT,strlen(str),str); }
                     79:        else {
                     80: ***/
                     81:                username(touser,str);
                     82:                smb_hfield(&msg,RECIPIENT,strlen(str),str);
                     83:                sprintf(str,"%u",touser);
                     84:                smb_hfield(&msg,RECIPIENTEXT,strlen(str),str); }
                     85: 
                     86: else {
                     87:        sprintf(str,"%25.25s",hdrblk+21);     /* To user */
                     88:        truncsp(str);
                     89:        smb_hfield(&msg,RECIPIENT,strlen(str),str);
                     90:        strlwr(str);
                     91:        msg.idx.to=crc16(str); }
                     92: 
                     93: fread(qwkbuf,1,128,qwk_fp);
                     94: 
                     95: if(useron.rest&FLAG('Q') || fromhub) {      /* QWK Net */
                     96:        if(!strnicmp(qwkbuf,"@VIA:",5)) {
                     97:                p=strchr(qwkbuf,'\xe3');
                     98:                if(p) {
                     99:                        *p=0;
                    100:                        skip=strlen(qwkbuf)+1; }
                    101:                truncsp(qwkbuf);
                    102:                p=qwkbuf+5;                                     /* Skip "@VIA:" */
                    103:                while(*p && *p<=SP) p++;                /* Skip any spaces */
                    104:                if(route_circ(p,sys_id)) {
                    105:                        smb_freemsgmem(&msg);
                    106:                        bprintf("\r\nCircular message path: %s\r\n",p);
                    107:                        sprintf(str,"Circular message path: %s from %s"
                    108:                                ,p,fromhub ? qhub[fromhub-1]->id:useron.alias);
                    109:                        errorlog(str);
                    110:                        return(0); }
                    111:                sprintf(str,"%s/%s"
                    112:                        ,fromhub ? qhub[fromhub-1]->id : useron.alias,p);
                    113:                strupr(str);
                    114:                update_qwkroute(str); }
                    115:        else {
                    116:                if(fromhub)
                    117:                        strcpy(str,qhub[fromhub-1]->id);
                    118:                else
                    119:                        strcpy(str,useron.alias); }
                    120:        strupr(str);
                    121:        j=NET_QWK;
                    122:        smb_hfield(&msg,SENDERNETTYPE,2,&j);
                    123:        smb_hfield(&msg,SENDERNETADDR,strlen(str),str);
                    124:        sprintf(str,"%25.25s",hdrblk+46);  /* From user */
                    125:        truncsp(str);
                    126:        if(!strnicmp(qwkbuf+skip,"@TZ:",4)) {
                    127:                p=strchr(qwkbuf+skip,'\xe3');
                    128:                i=skip;
                    129:                if(p) {
                    130:                        *p=0;
                    131:                        skip+=strlen(qwkbuf+i)+1; }
                    132:                p=qwkbuf+i+4;                                   /* Skip "@TZ:" */
                    133:                while(*p && *p<=SP) p++;                /* Skip any spaces */
                    134:                msg.hdr.when_written.zone=(short)ahtoul(p); }
                    135:        }
                    136: else {
                    137:        sprintf(str,"%u",useron.number);
                    138:        smb_hfield(&msg,SENDEREXT,strlen(str),str);
                    139:        if((uint)subnum!=INVALID_SUB && sub[subnum]->misc&SUB_NAME)
                    140:                strcpy(str,useron.name);
                    141:        else
                    142:                strcpy(str,useron.alias); }
                    143: 
                    144: smb_hfield(&msg,SENDER,strlen(str),str);
                    145: if((uint)subnum==INVALID_SUB) {
                    146:        if(useron.rest&FLAG('Q') || fromhub)
                    147:                msg.idx.from=0;
                    148:        else
                    149:                msg.idx.from=useron.number; }
                    150: else {
                    151:        strlwr(str);
                    152:        msg.idx.from=crc16(str); }
                    153: 
                    154: sprintf(str,"%25.25s",hdrblk+71);   /* Subject */
                    155: truncsp(str);
                    156: remove_re(str);
                    157: smb_hfield(&msg,SUBJECT,strlen(str),str);
                    158: strlwr(str);
                    159: msg.idx.subj=crc16(str);
                    160: 
                    161: /********************************/
                    162: /* Convert the QWK message text */
                    163: /********************************/
                    164: 
                    165: bodylen=0;
                    166: if((body=LMALLOC((blocks-1L)*128L*2L))==NULL) {
                    167:        smb_freemsgmem(&msg);
                    168:        errormsg(WHERE,ERR_ALLOC,"QWK msg",(blocks-1L)*128L*2L);
                    169:        return(0); }
                    170: 
                    171: taillen=0;
                    172: if((tail=LMALLOC((blocks-1L)*128L))==NULL) {
                    173:        LFREE(body);
                    174:        smb_freemsgmem(&msg);
                    175:        errormsg(WHERE,ERR_ALLOC,"QWK msg",(blocks-1L)*128L);
                    176:     return(0); }
                    177: 
                    178: for(block=1;block<blocks;block++) {
                    179:        if(block>1)
                    180:                if(!fread(qwkbuf,1,128,qwk_fp))
                    181:                        break;
                    182:        for(k=skip;k<128;k++,skip=0) {
                    183:                if(qwkbuf[k]==0)
                    184:                        continue;
                    185:                if(!taillen && qwkbuf[k]==SP && col==3 && bodylen>=3
                    186:                        && body[bodylen-3]=='-' && body[bodylen-2]=='-'
                    187:                        && body[bodylen-1]=='-') {
                    188:                        bodylen-=3;
                    189:                        strcpy(tail,"--- ");
                    190:                        taillen=4;
                    191:                        col++;
                    192:                        continue; }
                    193:                if(qwkbuf[k]==0xE3) {           /* expand 0xe3 to crlf */
                    194:                        if(!taillen && col==3 && bodylen>=3 && body[bodylen-3]=='-'
                    195:                                && body[bodylen-2]=='-' && body[bodylen-1]=='-') {
                    196:                                bodylen-=3;
                    197:                                strcpy(tail,"---");
                    198:                                taillen=3; }
                    199:                        col=0;
                    200:                        if(taillen) {
                    201:                                tail[taillen++]=CR;
                    202:                                tail[taillen++]=LF; }
                    203:                        else {
                    204:                                body[bodylen++]=CR;
                    205:                                body[bodylen++]=LF; }
                    206:                        continue; }
                    207:                if(!fromhub && qwkbuf[k]==7 && useron.rest&FLAG('B'))   /* beep res */
                    208:                        continue;
                    209:                if(!fromhub && (qwkbuf[k]==1 || qwkbuf[k]==ESC) /* ANSI restriction */
                    210:                        && useron.rest&FLAG('A'))
                    211:                        continue;
                    212:                if(qwkbuf[k]!=1 && lastch!=1)
                    213:                        col++;
                    214:                if(lastch==1 && !validattr(qwkbuf[k])) {
                    215:                        if(taillen) taillen--;
                    216:                        else            bodylen--;
                    217:                        lastch=0;
                    218:                        continue; }
                    219:                lastch=qwkbuf[k];
                    220:                if(taillen)
                    221:                        tail[taillen++]=qwkbuf[k];
                    222:                else
                    223:                        body[bodylen++]=qwkbuf[k]; } }
                    224: 
                    225: while(bodylen && body[bodylen-1]==SP) bodylen--; /* remove trailing spaces */
                    226: if(bodylen>=2 && body[bodylen-2]==CR && body[bodylen-1]==LF)
                    227:        bodylen-=2;
                    228: 
                    229: while(taillen && tail[taillen-1]<=SP) taillen--; /* remove trailing garbage */
                    230: 
                    231: /*****************/
                    232: /* Calculate CRC */
                    233: /*****************/
                    234: 
                    235: if(smb.status.max_crcs) {
                    236:        crc=0xffffffffUL;
                    237:        for(l=0;l<bodylen;l++)
                    238:                crc=ucrc32(body[l],crc);
                    239:        crc=~crc;
                    240: 
                    241:        /*******************/
                    242:        /* Check for dupes */
                    243:        /*******************/
                    244: 
                    245:        j=smb_addcrc(&smb,crc);
                    246:        if(j) {
                    247:                if(j==1) {
                    248:                        bprintf("\r\nDuplicate message\r\n");
                    249:                        logline(subnum==INVALID_SUB ? "E!":"P!","Duplicate message"); }
                    250:                else
                    251:                        errormsg(WHERE,ERR_CHK,smb.file,j);
                    252: 
                    253:                smb_freemsgmem(&msg);
                    254:                LFREE(body);
                    255:                LFREE(tail);
                    256:                return(0); } }
                    257: 
                    258: bputs(text[WritingIndx]);
                    259: 
                    260: /*************************************/
                    261: /* Write SMB message header and text */
                    262: /*************************************/
                    263: 
                    264: if(subnum!=INVALID_SUB && sub[subnum]->misc&SUB_LZH && bodylen
                    265:        && bodylen+2+taillen+2>=SDT_BLOCK_LEN
                    266:        && (lzhbuf=(char *)LMALLOC(bodylen*2))!=NULL) {
                    267:        length=lzh_encode((uchar *)body,bodylen,(uchar *)lzhbuf);
                    268:        if(length>1L
                    269:                && smb_datblocks(length+4L+taillen+2L)
                    270:                        <smb_datblocks(bodylen+2L+taillen+2L)) {
                    271:                bodylen=length;         /* Compressable */
                    272:                length+=4L;
                    273:                lzh=1;
                    274:                LFREE(body);
                    275:                body=lzhbuf; }
                    276:        else {                                  /* Non-compressable */
                    277:                length=bodylen+2L;
                    278:                LFREE(lzhbuf); } }
                    279: else
                    280:        length=bodylen+2L;                                       /* +2 for translation string */
                    281: 
                    282: if(taillen)
                    283:        length+=taillen+2L;
                    284: 
                    285: if(length&0xfff00000UL) {
                    286:        errormsg(WHERE,ERR_LEN,"REP msg",length);
                    287:        smb_freemsgmem(&msg);
                    288:        LFREE(body);
                    289:        LFREE(tail);
                    290:        return(0); }
                    291: 
                    292: if((i=smb_locksmbhdr(&smb))!=0) {
                    293:        errormsg(WHERE,ERR_LOCK,smb.file,i);
                    294:        FREE(body);
                    295:        FREE(tail);
                    296:        return(0); }
                    297: 
                    298: if(smb.status.attr&SMB_HYPERALLOC) {
                    299:        msg.hdr.offset=smb_hallocdat(&smb);
                    300:        storage=SMB_HYPERALLOC; }
                    301: else {
                    302:        if((i=smb_open_da(&smb))!=0) {
                    303:                errormsg(WHERE,ERR_OPEN,smb.file,i);
                    304:                FREE(body);
                    305:                FREE(tail);
                    306:                return(0); }
                    307:        if((subnum==INVALID_SUB && sys_misc&SM_FASTMAIL)
                    308:                || (subnum!=INVALID_SUB && sub[subnum]->misc&SUB_FAST)) {
                    309:                msg.hdr.offset=smb_fallocdat(&smb,length,1);
                    310:                storage=SMB_FASTALLOC; }
                    311:        else {
                    312:                msg.hdr.offset=smb_allocdat(&smb,length,1);
                    313:                storage=SMB_SELFPACK; }
                    314:        smb_close_da(&smb); }
                    315: 
                    316: if(msg.hdr.offset && msg.hdr.offset<1L) {
                    317:        smb_unlocksmbhdr(&smb);
                    318:        errormsg(WHERE,ERR_READ,smb.file,msg.hdr.offset);
                    319:        smb_freemsgmem(&msg);
                    320:        FREE(body);
                    321:        FREE(tail); }
                    322: fseek(smb.sdt_fp,msg.hdr.offset,SEEK_SET);
                    323: if(lzh) {
                    324:        xlat=XLAT_LZH;
                    325:        fwrite(&xlat,2,1,smb.sdt_fp); }
                    326: xlat=XLAT_NONE;
                    327: fwrite(&xlat,2,1,smb.sdt_fp);
                    328: fwrite(body,bodylen,1,smb.sdt_fp);
                    329: smb_dfield(&msg,TEXT_BODY,bodylen+2+(lzh ? 2:0));
                    330: if(taillen) {
                    331:        fwrite(&xlat,2,1,smb.sdt_fp);
                    332:        fwrite(tail,taillen,1,smb.sdt_fp);
                    333:        smb_dfield(&msg,TEXT_TAIL,taillen+2); }
                    334: fflush(smb.sdt_fp);
                    335: smb_unlocksmbhdr(&smb);
                    336: 
                    337: if((i=smb_addmsghdr(&smb,&msg,storage))!=0)
                    338:        errormsg(WHERE,ERR_WRITE,smb.file,i);
                    339: 
                    340: smb_freemsgmem(&msg);
                    341: 
                    342: LFREE(body);
                    343: LFREE(tail);
                    344: 
                    345: return(1);
                    346: }

unix.superglobalmegacorp.com

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