|
|
1.1 root 1: /* SMM2MSG.C */
2:
3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
4:
5: /* Scans SMM database and posts any additions/updates into an MSG file */
6:
7: #define uint unsigned int
8:
9: #include <dos.h>
10: #include "smblib.h"
11: #include "smmdefs.h"
12:
13: #define VERSION "1.00�"
14:
15: smb_t smb;
16: extern int daylight=0;
17: extern long timezone=0L;
18:
19: unsigned _stklen=16000; /* Set stack size in code, not header */
20:
21: uchar cryptchar(uchar ch, ulong seed)
22: {
23: if(ch==1)
24: return(0xfe);
25: if(ch<0x20 || ch&0x80) /* Ctrl chars and ex-ASCII are not xlated */
26: return(ch);
27: return(ch^(seed&0x1f));
28: }
29:
30: char *encrypt(uchar *str, ulong seed)
31: {
32: static uchar out[1024];
33: int i,j;
34:
35: j=strlen(str);
36: for(i=0;i<j;i++)
37: out[i]=cryptchar(str[i],seed^(i&7));
38: out[i]=0;
39: return(out);
40: }
41:
42: /****************************************************************************/
43: /* Checks the disk drive for the existence of a file. Returns 1 if it */
44: /* exists, 0 if it doesn't. */
45: /****************************************************************************/
46: char fexist(char *filespec)
47: {
48: struct ffblk f;
49:
50: if(findfirst(filespec,&f,0)==0)
51: return(1);
52: return(0);
53: }
54:
55:
56: /****************************************************************************/
57: /* Updates 16-bit "rcrc" with character 'ch' */
58: /****************************************************************************/
59: void ucrc16(uchar ch, ushort *rcrc) {
60: ushort i, cy;
61: uchar nch=ch;
62:
63: for (i=0; i<8; i++) {
64: cy=*rcrc & 0x8000;
65: *rcrc<<=1;
66: if (nch & 0x80) *rcrc |= 1;
67: nch<<=1;
68: if (cy) *rcrc ^= 0x1021; }
69: }
70:
71: /****************************************************************************/
72: /* Returns 16-crc of string (not counting terminating NULL) */
73: /****************************************************************************/
74: ushort crc16(char *str)
75: {
76: int i=0;
77: ushort crc=0;
78:
79: ucrc16(0,&crc);
80: while(str[i])
81: ucrc16(str[i++],&crc);
82: ucrc16(0,&crc);
83: ucrc16(0,&crc);
84: return(crc);
85: }
86:
87:
88: /****************************************************************************/
89: /* Converts unix time format (long - time_t) into a char str MM/DD/YY */
90: /****************************************************************************/
91: char *unixtodstr(time_t unix, char *str)
92: {
93: struct time curtime;
94: struct date date;
95:
96: if(!unix)
97: strcpy(str,"00/00/00");
98: else {
99: unixtodos(unix,&date,&curtime);
100: if((unsigned)date.da_mon>12) { /* DOS leap year bug */
101: date.da_mon=1;
102: date.da_year++; }
103: if((unsigned)date.da_day>31)
104: date.da_day=1;
105: sprintf(str,"%02u/%02u/%02u",date.da_mon,date.da_day
106: ,date.da_year>=2000 ? date.da_year-2000 : date.da_year-1900); }
107: return(str);
108: }
109:
110: time_t checktime()
111: {
112: struct tm tm;
113:
114: memset(&tm,0,sizeof(tm));
115: tm.tm_year=94;
116: tm.tm_mday=1;
117: return(mktime(&tm)^0x2D24BD00L);
118: }
119:
120: #define BUF_LEN 8192
121:
122: int main(int argc, char **argv)
123: {
124: uchar str[128],tmp[128],msg_dir[128],buf[BUF_LEN],telegram[513],*p;
125: int i,j,file;
126: ushort xlat;
127: long length;
128: ulong offset;
129: time_t last,t;
130: user_t user,from;
131: wall_t wall;
132: smbmsg_t msg;
133: FILE *stream;
134:
135: fprintf(stderr,"\nSMM2MSG v%s - Write SMM data to MSG - Developed 1995-1997 "
136: "Rob Swindell\n\n",VERSION);
137:
138: if(checktime()) {
139: printf("Time problem!\n");
140: return(-1); }
141:
142: if(argc<3) {
143: fprintf(stderr,"usage: smm2msg <smm.dab> <msg_dir>\n\n");
144: fprintf(stderr,"example: smm2msg c:\\sbbs\\xtrn\\smm\\smm.dab "
145: "c:\\im\\mail\n");
146: return(1); }
147:
148:
149: strcpy(msg_dir,argv[2]);
150: strupr(msg_dir);
151:
152: strcpy(str,argv[1]);
153: strupr(str);
154: if((file=open(str,O_RDONLY|O_BINARY|O_DENYNONE))==-1) {
155: printf("error opening %s\n",str);
156: return(1); }
157: if((stream=fdopen(file,"rb"))==NULL) {
158: printf("error fdopening %s\n",str);
159: return(1); }
160: setvbuf(stream,NULL,_IOFBF,4096);
161:
162: strcpy(tmp,str);
163: p=strrchr(tmp,'.');
164: if(p) {
165: (*p)=0;
166: strcat(tmp,"2MSG.DAB");
167: if((file=open(tmp,O_RDWR|O_BINARY|O_CREAT,S_IWRITE|S_IREAD))==-1) {
168: printf("error opening %s\n",str);
169: return(1); }
170: t=time(NULL);
171: if(read(file,&last,sizeof(time_t))!=sizeof(time_t))
172: last=0;
173: lseek(file,0L,SEEK_SET);
174: write(file,&t,sizeof(time_t));
175: close(file); }
176:
177: //sprintf(str,"%s.SHD",smb.file);
178: //if(!fexist(str)) {
179: // printf("%s doesn't exist\n",smb.file);
180: // return(0); }
181: //fprintf(stderr,"Opening %s\n",smb.file);
182: //smb.retry_time=30;
183: //if((i=smb_open(&smb))!=0) {
184: // printf("smb_open returned %d\n",i);
185: // return(1); }
186:
187: strcpy(str,argv[1]);
188: strupr(str);
189: p=strrchr(str,'\\');
190: if(p) p++;
191: else p=str;
192: strcpy(p,"TELEGRAM.DAB");
193: if((file=open(str,O_RDWR|O_DENYNONE|O_BINARY))!=-1) {
194: while(!eof(file)) {
195: read(file,from.system,sizeof(user.system));
196: read(file,user.system,sizeof(user.system));
197: read(file,&user.number,sizeof(user.number));
198: printf("Telegram to: %lu@%s\n",user.number,user.system);
199: read(file,telegram,512);
200: telegram[512]=0;
201: sprintf(buf,"}%lx\r\n%s",user.number,encrypt(telegram,user.number));
202: strcat(buf,"\r\n"); /* blank line terminates telegram */
203: strcat(buf,"\r\n--- SMM2MSG v");
204: strcat(buf,VERSION);
205:
206: length=strlen(buf); /* +2 for translation string */
207:
208: if(smb.status.attr&SMB_HYPERALLOC)
209: offset=smb_hallocdat(&smb);
210: else {
211: i=smb_open_da(&smb);
212: if(i) {
213: printf("smb_open_da returned %d\n",i);
214: exit(1); }
215: offset=smb_allocdat(&smb,length+2,1);
216: fclose(smb.sda_fp); }
217:
218: fseek(smb.sdt_fp,offset,SEEK_SET);
219: xlat=XLAT_NONE;
220: fwrite(&xlat,2,1,smb.sdt_fp);
221: fwrite(buf,length,1,smb.sdt_fp);
222: length+=2;
223:
224: memset(&msg,0,sizeof(smbmsg_t));
225: memcpy(msg.hdr.id,"SHD\x1a",4);
226: msg.hdr.version=SMB_VERSION;
227: msg.hdr.when_written.time=time(NULL);
228:
229: msg.hdr.offset=offset;
230:
231: strcpy(str,"SMM");
232: i=smb_hfield(&msg,RECIPIENT,strlen(str),str);
233: if(i) {
234: printf("smb_hfield returned %d\n",i);
235: smb_freemsgdat(&smb,offset,length,1);
236: exit(1); }
237: strlwr(str);
238: msg.idx.to=crc16(str);
239:
240: strcpy(str,from.system);
241: i=smb_hfield(&msg,SENDER,strlen(str),str);
242: if(i) {
243: printf("smb_hfield returned %d\n",i);
244: smb_freemsgdat(&smb,offset,length,1);
245: exit(1); }
246: strlwr(str);
247: msg.idx.from=crc16(str);
248:
249: strcpy(str,user.system);
250: i=smb_hfield(&msg,SUBJECT,strlen(str),str);
251: if(i) {
252: printf("smb_hfield returned %d\n",i);
253: smb_freemsgdat(&smb,offset,length,1);
254: exit(1); }
255: strlwr(str);
256: msg.idx.subj=crc16(str);
257:
258: i=smb_dfield(&msg,TEXT_BODY,length);
259: if(i) {
260: printf("smb_dfield returned %d\n",i);
261: smb_freemsgdat(&smb,offset,length,1);
262: exit(1); }
263:
264: i=smb_addmsghdr(&smb,&msg,smb.status.attr&SMB_HYPERALLOC);
265: if(i) {
266: printf("smb_addmsghdr returned %d\n",i);
267: smb_freemsgdat(&smb,offset,length,1);
268: exit(1); }
269: smb_freemsgmem(&msg); }
270: chsize(file,0L);
271: close(file); }
272:
273: strcpy(str,argv[1]);
274: strupr(str);
275: p=strrchr(str,'\\');
276: if(p) p++;
277: else p=str;
278: strcpy(p,"WALL.DAB");
279: if((file=sopen(str,O_RDONLY|O_BINARY,SH_DENYNO))!=-1) {
280: while(!eof(file)) {
281: if(!read(file,&wall,sizeof(wall_t)))
282: break;
283: if(last && wall.imported<last)
284: continue;
285:
286: if(wall.imported!=wall.written) /* Imported from SMB */
287: continue;
288:
289: printf("Wall writing from: %s\n",wall.name);
290: sprintf(buf,"%s\r\n",encrypt(wall.name,wall.written));
291: sprintf(str,"%s\r\n",encrypt(wall.system,wall.written));
292: strcat(buf,str);
293: for(i=0;i<5;i++) {
294: sprintf(str,"%s\r\n",encrypt(wall.text[i],wall.written));
295: strcat(buf,str); }
296: sprintf(str,"%lx\r\n",wall.written);
297: strcat(buf,str);
298: strcat(buf,"\r\n--- SMM2SMB v");
299: strcat(buf,VERSION);
300:
301: length=strlen(buf); /* +2 for translation string */
302:
303: if(smb.status.attr&SMB_HYPERALLOC)
304: offset=smb_hallocdat(&smb);
305: else {
306: i=smb_open_da(&smb);
307: if(i) {
308: printf("smb_open_da returned %d\n",i);
309: exit(1); }
310: offset=smb_allocdat(&smb,length+2,1);
311: fclose(smb.sda_fp); }
312:
313: fseek(smb.sdt_fp,offset,SEEK_SET);
314: xlat=XLAT_NONE;
315: fwrite(&xlat,2,1,smb.sdt_fp);
316: fwrite(buf,length,1,smb.sdt_fp);
317: length+=2;
318:
319: memset(&msg,0,sizeof(smbmsg_t));
320: memcpy(msg.hdr.id,"SHD\x1a",4);
321: msg.hdr.version=SMB_VERSION;
322: msg.hdr.when_written.time=time(NULL);
323:
324: msg.hdr.offset=offset;
325:
326: strcpy(str,"SMM");
327: i=smb_hfield(&msg,RECIPIENT,strlen(str),str);
328: if(i) {
329: printf("smb_hfield returned %d\n",i);
330: smb_freemsgdat(&smb,offset,length,1);
331: exit(1); }
332: strlwr(str);
333: msg.idx.to=crc16(str);
334:
335: strcpy(str,wall.system);
336: i=smb_hfield(&msg,SENDER,strlen(str),str);
337: if(i) {
338: printf("smb_hfield returned %d\n",i);
339: smb_freemsgdat(&smb,offset,length,1);
340: exit(1); }
341: strlwr(str);
342: msg.idx.from=crc16(str);
343:
344: strcpy(str,"->WALL<-");
345: i=smb_hfield(&msg,SUBJECT,strlen(str),str);
346: if(i) {
347: printf("smb_hfield returned %d\n",i);
348: smb_freemsgdat(&smb,offset,length,1);
349: exit(1); }
350: strlwr(str);
351: msg.idx.subj=crc16(str);
352:
353: i=smb_dfield(&msg,TEXT_BODY,length);
354: if(i) {
355: printf("smb_dfield returned %d\n",i);
356: smb_freemsgdat(&smb,offset,length,1);
357: exit(1); }
358:
359: i=smb_addmsghdr(&smb,&msg,smb.status.attr&SMB_HYPERALLOC);
360: if(i) {
361: printf("smb_addmsghdr returned %d\n",i);
362: smb_freemsgdat(&smb,offset,length,1);
363: exit(1); }
364: smb_freemsgmem(&msg); }
365: close(file); }
366:
367:
368: while(!feof(stream)) {
369: if(!fread(&user,sizeof(user_t),1,stream))
370: break;
371: if(user.misc&(USER_FROMSMB|USER_DELETED)
372: || (last && user.updated<last && user.created<last)
373: || user.number&0xffff0000L
374: || user.number==0
375: || user.system[0]<SP
376: || user.name[0]<SP
377: || user.realname[0]<SP
378: || user.location[0]<SP
379: || user.zipcode[0]<SP
380: || user.birth[0]<SP)
381: continue;
382:
383: printf("Profile: %s\n",user.name);
384: memset(buf,0,BUF_LEN);
385:
386: sprintf(str,"0:%.25s\r\n",encrypt(user.name,user.number));
387: strcat(buf,str);
388: sprintf(str,"1:%.25s\r\n",encrypt(user.realname,user.number));
389: strcat(buf,str);
390:
391: sprintf(str,"2:%.8s\r\n",encrypt(user.birth,user.number));
392: strcat(buf,str);
393:
394: sprintf(str,"3:%.30s\r\n",encrypt(user.location,user.number));
395: strcat(buf,str);
396:
397: sprintf(str,"4:%.10s\r\n",encrypt(user.zipcode,user.number));
398: strcat(buf,str);
399: sprintf(str,"5:%.10s\r\n",encrypt(user.min_zipcode,user.number));
400: strcat(buf,str);
401: sprintf(str,"6:%.10s\r\n",encrypt(user.max_zipcode,user.number));
402: strcat(buf,str);
403: sprintf(str,"7:%.4s\r\n",encrypt(user.mbtype,user.number));
404: strcat(buf,str);
405:
406: sprintf(str,"A:%.50s\r\n",encrypt(user.note[0],user.number));
407: strcat(buf,str);
408: sprintf(str,"B:%.50s\r\n",encrypt(user.note[1],user.number));
409: strcat(buf,str);
410: sprintf(str,"C:%.50s\r\n",encrypt(user.note[2],user.number));
411: strcat(buf,str);
412: sprintf(str,"D:%.50s\r\n",encrypt(user.note[3],user.number));
413: strcat(buf,str);
414: sprintf(str,"E:%.50s\r\n",encrypt(user.note[4],user.number));
415: strcat(buf,str);
416:
417: sprintf(str,"F:%c%c\r\n",user.sex,user.pref_sex);
418: strcat(buf,str);
419:
420: sprintf(str,"G:%x\r\n",user.marital);
421: strcat(buf,str);
422: sprintf(str,"H:%x\r\n",user.pref_marital);
423: strcat(buf,str);
424:
425: sprintf(str,"I:%x\r\n",user.race);
426: strcat(buf,str);
427: sprintf(str,"J:%x\r\n",user.pref_race);
428: strcat(buf,str);
429:
430: sprintf(str,"K:%x\r\n",user.hair);
431: strcat(buf,str);
432: sprintf(str,"L:%x\r\n",user.pref_hair);
433: strcat(buf,str);
434:
435: sprintf(str,"M:%x\r\n",user.eyes);
436: strcat(buf,str);
437: sprintf(str,"N:%x\r\n",user.pref_eyes);
438: strcat(buf,str);
439:
440: sprintf(str,"O:%x\r\nP:%x\r\nQ:%x\r\n"
441: ,user.weight,user.min_weight,user.max_weight);
442: strcat(buf,str);
443:
444: sprintf(str,"R:%x\r\nS:%x\r\nT:%x\r\n"
445: ,user.height,user.min_height,user.max_height);
446: strcat(buf,str);
447:
448: sprintf(str,"U:%x\r\nV:%x\r\nW:%x\r\n"
449: ,user.min_age,user.max_age,user.purity);
450: strcat(buf,str);
451:
452: sprintf(str,"X:%lx\r\nY:%lx\r\nZ:%lx\r\n!:%lx\r\n"
453: ,user.income,user.min_income,user.max_income,time(NULL));
454: strcat(buf,str);
455:
456: for(i=0;i<5;i++) {
457: if(!user.queans[i].name[0])
458: continue;
459: sprintf(str,"*%d%.8s\r\n",i,encrypt(user.queans[i].name,user.number));
460: strcat(buf,str);
461: for(j=0;j<20;j++) {
462: sprintf(str," %04x %04x"
463: ,user.queans[i].self[j]
464: ,user.queans[i].pref[j]);
465: strcat(buf,str);
466: if(!((j+1)%7))
467: strcat(buf,"\r\n"); }
468: strcat(buf,"\r\n"); }
469:
470: strcat(buf,"\r\n--- SMM2MSG v");
471: strcat(buf,VERSION);
472:
473: length=strlen(buf); /* +2 for translation string */
474:
475: if(smb.status.attr&SMB_HYPERALLOC)
476: offset=smb_hallocdat(&smb);
477: else {
478: i=smb_open_da(&smb);
479: if(i) {
480: printf("smb_open_da returned %d\n",i);
481: exit(1); }
482: offset=smb_allocdat(&smb,length+2,1);
483: fclose(smb.sda_fp); }
484:
485: fseek(smb.sdt_fp,offset,SEEK_SET);
486: xlat=XLAT_NONE;
487: fwrite(&xlat,2,1,smb.sdt_fp);
488: fwrite(buf,length,1,smb.sdt_fp);
489: length+=2;
490:
491: memset(&msg,0,sizeof(smbmsg_t));
492: memcpy(msg.hdr.id,"SHD\x1a",4);
493: msg.hdr.version=SMB_VERSION;
494: msg.hdr.when_written.time=time(NULL);
495:
496: msg.hdr.offset=offset;
497:
498: strcpy(str,"SMM");
499: i=smb_hfield(&msg,RECIPIENT,strlen(str),str);
500: if(i) {
501: printf("smb_hfield returned %d\n",i);
502: smb_freemsgdat(&smb,offset,length,1);
503: exit(1); }
504: strlwr(str);
505: msg.idx.to=crc16(str);
506:
507: strcpy(str,user.system);
508: i=smb_hfield(&msg,SENDER,strlen(str),str);
509: if(i) {
510: printf("smb_hfield returned %d\n",i);
511: smb_freemsgdat(&smb,offset,length,1);
512: exit(1); }
513: strlwr(str);
514: msg.idx.from=crc16(str);
515:
516: sprintf(str,"%lu",user.number);
517: i=smb_hfield(&msg,SUBJECT,strlen(str),str);
518: if(i) {
519: printf("smb_hfield returned %d\n",i);
520: smb_freemsgdat(&smb,offset,length,1);
521: exit(1); }
522: strlwr(str);
523: msg.idx.subj=crc16(str);
524:
525: i=smb_dfield(&msg,TEXT_BODY,length);
526: if(i) {
527: printf("smb_dfield returned %d\n",i);
528: smb_freemsgdat(&smb,offset,length,1);
529: exit(1); }
530:
531: i=smb_addmsghdr(&smb,&msg,smb.status.attr&SMB_HYPERALLOC);
532: if(i) {
533: printf("smb_addmsghdr returned %d\n",i);
534: smb_freemsgdat(&smb,offset,length,1);
535: exit(1); }
536: smb_freemsgmem(&msg); }
537: return(0);
538: }
539:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.