Annotation of sbbs/sbbs2/qwktomsg.c, revision 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.