|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.