|
|
1.1 ! root 1: /* Converts RFC #822 Internet Text Messages to SMB format */ ! 2: ! 3: #include <dos.h> ! 4: #include "smblib.h" ! 5: ! 6: /****************************************************************************** ! 7: Chops off the ":" and all spaces and tabs after it for the message headers ! 8: ******************************************************************************/ ! 9: char *header(char *instr) ! 10: { ! 11: char str[256],*p; ! 12: int i=0; ! 13: ! 14: p=strstr(instr,":"); ! 15: ++p; ! 16: while(*p==SP || *p==TAB) ! 17: ++p; ! 18: while(i<strlen(p)) { ! 19: if(p[i]==LF || p[i]==CR) { ! 20: p[i]=0; ! 21: break; } ! 22: ++i; } ! 23: return p; ! 24: } ! 25: /****************************************************************************/ ! 26: /* Updates 16-bit "rcrc" with character 'ch' */ ! 27: /****************************************************************************/ ! 28: void ucrc16(uchar ch, ushort *rcrc) { ! 29: ushort i, cy; ! 30: uchar nch=ch; ! 31: ! 32: for (i=0; i<8; i++) { ! 33: cy=*rcrc & 0x8000; ! 34: *rcrc<<=1; ! 35: if (nch & 0x80) *rcrc |= 1; ! 36: nch<<=1; ! 37: if (cy) *rcrc ^= 0x1021; } ! 38: } ! 39: ! 40: /****************************************************************************/ ! 41: /* Returns 16-crc of string (not counting terminating NULL) */ ! 42: /****************************************************************************/ ! 43: ushort crc16(char *str) ! 44: { ! 45: int i=0; ! 46: ushort crc=0; ! 47: ! 48: ucrc16(0,&crc); ! 49: while(str[i]) ! 50: ucrc16(str[i++],&crc); ! 51: ucrc16(0,&crc); ! 52: ucrc16(0,&crc); ! 53: return(crc); ! 54: } ! 55: ! 56: /****************************************************************************** ! 57: Converts ASCII time in RFC 822 or RFC 1036 format to SMB when_t format ! 58: ******************************************************************************/ ! 59: when_t imsgtime(char *str) ! 60: { ! 61: char month[25],zone[25],*p; ! 62: struct date date; ! 63: struct time t; ! 64: when_t when; ! 65: ! 66: when.zone=0; /* Default to UT */ ! 67: ! 68: if(isdigit(str[1])) { /* Regular format: "01 Jan 86 0234 GMT" */ ! 69: date.da_day=atoi(str); ! 70: sprintf(month,"%3.3s",str+3); ! 71: if(!stricmp(month,"jan")) ! 72: date.da_mon=1; ! 73: else if(!stricmp(month,"feb")) ! 74: date.da_mon=2; ! 75: else if(!stricmp(month,"mar")) ! 76: date.da_mon=3; ! 77: else if(!stricmp(month,"apr")) ! 78: date.da_mon=4; ! 79: else if(!stricmp(month,"may")) ! 80: date.da_mon=5; ! 81: else if(!stricmp(month,"jun")) ! 82: date.da_mon=6; ! 83: else if(!stricmp(month,"jul")) ! 84: date.da_mon=7; ! 85: else if(!stricmp(month,"aug")) ! 86: date.da_mon=8; ! 87: else if(!stricmp(month,"sep")) ! 88: date.da_mon=9; ! 89: else if(!stricmp(month,"oct")) ! 90: date.da_mon=10; ! 91: else if(!stricmp(month,"nov")) ! 92: date.da_mon=11; ! 93: else ! 94: date.da_mon=12; ! 95: date.da_year=1900+atoi(str+7); ! 96: t.ti_hour=atoi(str+10); ! 97: t.ti_min=atoi(str+12); ! 98: t.ti_sec=0; ! 99: p=str+13; } ! 100: ! 101: else { /* USENET format: "Mon, 1 Jan 86 02:34:00 GMT" */ ! 102: date.da_day=atoi(str+5); ! 103: sprintf(month,"%3.3s",str+8); ! 104: if(!stricmp(month,"jan")) ! 105: date.da_mon=1; ! 106: else if(!stricmp(month,"feb")) ! 107: date.da_mon=2; ! 108: else if(!stricmp(month,"mar")) ! 109: date.da_mon=3; ! 110: else if(!stricmp(month,"apr")) ! 111: date.da_mon=4; ! 112: else if(!stricmp(month,"may")) ! 113: date.da_mon=5; ! 114: else if(!stricmp(month,"jun")) ! 115: date.da_mon=6; ! 116: else if(!stricmp(month,"jul")) ! 117: date.da_mon=7; ! 118: else if(!stricmp(month,"aug")) ! 119: date.da_mon=8; ! 120: else if(!stricmp(month,"sep")) ! 121: date.da_mon=9; ! 122: else if(!stricmp(month,"oct")) ! 123: date.da_mon=10; ! 124: else if(!stricmp(month,"nov")) ! 125: date.da_mon=11; ! 126: else ! 127: date.da_mon=12; ! 128: date.da_year=atoi(str+12); ! 129: if(date.da_year<100) ! 130: date.da_year+=1900; ! 131: p=str+12; ! 132: while(*p!=SP) p++; /* skip the year */ ! 133: while(*p==SP) p++; /* and white space */ ! 134: t.ti_hour=atoi(p); ! 135: t.ti_min=atoi(p+3); ! 136: t.ti_sec=atoi(p+6); ! 137: p=str+22; } ! 138: ! 139: when.time=dostounix(&date,&t); ! 140: ! 141: while(*p!=SP) p++; /* skip the time */ ! 142: while(*p==SP) p++; /* and white space */ ! 143: ! 144: sprintf(zone,"%-.5s",p); ! 145: ! 146: /* Get the zone */ ! 147: if(!strcmpi(zone,"GMT") || !strcmpi(zone,"UT")) ! 148: when.zone=0; ! 149: else if(!strcmpi(zone,"EST")) ! 150: when.zone=EST; ! 151: else if(!strcmpi(zone,"EDT")) ! 152: when.zone=EDT; ! 153: else if(!strcmpi(zone,"MST")) ! 154: when.zone=MST; ! 155: else if(!strcmpi(zone,"MDT")) ! 156: when.zone=MDT; ! 157: else if(!strcmpi(zone,"CST")) ! 158: when.zone=CST; ! 159: else if(!strcmpi(zone,"CDT")) ! 160: when.zone=CDT; ! 161: else if(!strcmpi(zone,"PST")) ! 162: when.zone=PST; ! 163: else if(!strcmpi(zone,"PDT")) ! 164: when.zone=PDT; ! 165: ! 166: else if(isalpha(zone[0]) && !zone[1]) { /* Military single character zone */ ! 167: zone[0]&=0xdf; /* convert to upper case */ ! 168: if(zone[0]>='A' && zone[0]<='I') ! 169: when.zone='@'-zone[0]; ! 170: else if(zone[0]>='K' && zone[0]<='M') /* J is not used */ ! 171: when.zone='A'-zone[0]; ! 172: else if(zone[0]>='N' && zone[0]<='Y') ! 173: when.zone=zone[0]-'M'; } ! 174: ! 175: else if((zone[0]=='+' || zone[0]=='-') && isdigit(zone[1])) { /* Literal */ ! 176: when.zone=(((zone[1]&0xf)*10)+(zone[2]&0xf))*60; /* Hours */ ! 177: when.zone+=atoi(zone+3); /* Minutes */ ! 178: if(zone[0]=='-') /* Negative? */ ! 179: when.zone=-when.zone; } ! 180: ! 181: return(when); ! 182: } ! 183: ! 184: void main(int argc, char **argv) ! 185: { ! 186: FILE *stream; ! 187: char str[256]={NULL},filespec[256],file[256],*p,*abuf; ! 188: ushort i,xlat,net; ! 189: ulong l,length,datlen; ! 190: struct ffblk ff; ! 191: smbmsg_t msg; ! 192: smbstatus_t status; ! 193: ! 194: if(argc<2) { ! 195: printf("Usage: INET2SMB <file_spec> <smb_name>\r\n"); ! 196: exit(1); } ! 197: ! 198: strcpy(filespec,argv[1]); ! 199: strcpy(smb_file,argv[2]); ! 200: strupr(smb_file); ! 201: ! 202: smb_open(10); ! 203: if(!filelength(fileno(shd_fp))) ! 204: smb_create(2000,2000,0,0,10); ! 205: ! 206: i=findfirst(filespec,&ff,0); ! 207: while(!i) { ! 208: sprintf(file,"%s",ff.ff_name); ! 209: if((stream=fopen(file,"rb"))==NULL) { ! 210: printf("Error opening %s\r\n",file); ! 211: break; } ! 212: ! 213: memset(&msg,0,sizeof(smbmsg_t)); ! 214: memcpy(msg.hdr.id,"SHD\x1a",4); ! 215: msg.hdr.version=SMB_VERSION; ! 216: msg.hdr.when_imported.time=time(NULL); ! 217: msg.hdr.when_imported.zone=PST; /* set to local time zone */ ! 218: ! 219: while(str[0]!=CR && str[0]!=LF) { ! 220: fgets(str,81,stream); ! 221: if(!strnicmp(str,"Resent-",6)) { ! 222: p=strstr(str,"Resent-"); ! 223: sprintf(str,"%s",p); } ! 224: if(!strnicmp(str,"Return-Path",11) ! 225: || !strnicmp(str,"Path",4)) { ! 226: strcpy(str,header(str)); ! 227: smb_hfield(&msg,REPLYTO,strlen(str),str); } ! 228: else if(!strnicmp(str,"Date",4)) { ! 229: strcpy(str,header(str)); ! 230: msg.hdr.when_written=imsgtime(str); } ! 231: else if(!strnicmp(str,"From",4) || !strnicmp(str,"Sender",6)) { ! 232: strcpy(str,header(str)); ! 233: p=strstr(str," ("); ! 234: if(p) { ! 235: *p=0; ! 236: *(p+1)=0; ! 237: p+=2; ! 238: smb_hfield(&msg,SENDERNETADDR,strlen(str),str); ! 239: sprintf(str,"%s",p); ! 240: p=strstr(str,")"); ! 241: *p=0; } ! 242: smb_hfield(&msg,SENDER,strlen(str),str); ! 243: strlwr(str); ! 244: msg.idx.from=crc16(str); } ! 245: else if(!strnicmp(str,"Subject",7)) { ! 246: strcpy(str,header(str)); ! 247: smb_hfield(&msg,SUBJECT,strlen(str),str); ! 248: strlwr(str); ! 249: msg.idx.subj=crc16(str); } ! 250: else if(!strnicmp(str,"To",2)) { ! 251: strcpy(str,header(str)); ! 252: smb_hfield(&msg,RECIPIENT,strlen(str),str); ! 253: strlwr(str); ! 254: msg.idx.to=crc16(str); } ! 255: ! 256: /* Following are optional fields */ ! 257: ! 258: else if(!strnicmp(str,"Message-ID",10)) { ! 259: strcpy(str,header(str)); ! 260: smb_hfield(&msg,RFC822MSGID,strlen(str),str); } ! 261: else if(!strnicmp(str,"In-Reply-To",11)) { ! 262: strcpy(str,header(str)); ! 263: smb_hfield(&msg,RFC822REPLYID,strlen(str),str); } ! 264: ! 265: /* User defined extension field */ ! 266: ! 267: else if(!strnicmp(str,"X-",2)) { ! 268: if(strstr(str,"To")) { ! 269: strcpy(str,header(str)); ! 270: smb_hfield(&msg,RECIPIENT,strlen(str),str); ! 271: strlwr(str); ! 272: msg.idx.to=crc16(str); } ! 273: else ! 274: smb_hfield(&msg,RFC822HEADER,strlen(str),str); } ! 275: else ! 276: smb_hfield(&msg,RFC822HEADER,strlen(str),str); } ! 277: ! 278: l=ftell(stream); ! 279: fseek(stream,0L,SEEK_END); ! 280: length=ftell(stream)-l; ! 281: fseek(stream,l,SEEK_SET); ! 282: ! 283: if((abuf=(char *)MALLOC(length))==NULL) { ! 284: printf("alloc error\n"); ! 285: exit(1); } ! 286: fread(abuf,length,1,stream); ! 287: fclose(stream); ! 288: ! 289: net=NET_INTERNET; ! 290: smb_hfield(&msg,SENDERNETTYPE,sizeof(ushort),&net); ! 291: ! 292: if(smb_open_da(10)) { ! 293: printf("error opening %s.SDA\n",smb_file); ! 294: exit(1); } ! 295: msg.hdr.offset=smb_fallocdat(length+2,1); ! 296: fclose(sda_fp); ! 297: if(msg.hdr.offset && msg.hdr.offset<1L) { ! 298: printf("error %ld allocating records\r\n",msg.hdr.offset); ! 299: exit(1); } ! 300: fseek(sdt_fp,msg.hdr.offset,SEEK_SET); ! 301: xlat=XLAT_NONE; ! 302: fwrite(&xlat,2,1,sdt_fp); ! 303: fwrite(abuf,SDT_BLOCK_LEN,smb_datblocks(length),sdt_fp); ! 304: FREE(abuf); ! 305: fflush(sdt_fp); ! 306: ! 307: smb_dfield(&msg,TEXT_BODY,length+2); ! 308: ! 309: smb_addmsghdr(&msg,&status,1,10); ! 310: smb_freemsgmem(msg); ! 311: i=findnext(&ff); } ! 312: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.