Annotation of sbbs/sbbs2/smb/121a/inet2smb.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

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