|
|
1.1 root 1: /* SMB2SMM */
2:
3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
4:
5: /* Scans SMB message base for messages to "SMM" and adds them to the SMM */
6: /* database. */
7:
8: #define uint unsigned int
9:
10: #define LOOP_NOPEN 500
11:
12: #include <dos.h>
13: #include "smblib.h"
14: #include "smmdefs.h"
15: #include "nodedefs.h"
16: #include "crc32.h"
17:
18: #define VERSION "2.01"
19:
20: extern int daylight=0;
21: extern long timezone=0L;
22:
23: unsigned _stklen=16000; /* Set stack size in code, not header */
24:
25: char data_dir[128];
26:
27: smb_t smb;
28: FILE *trashfile=NULL;
29:
30: uchar cryptchar(uchar ch, ulong seed)
31: {
32: if(ch==0xfe)
33: return(1);
34: if(ch<0x20 || ch&0x80) /* Ctrl chars and ex-ASCII are not xlated */
35: return(ch);
36: return(ch^(seed&0x1f));
37: }
38:
39: void decrypt(char *str, ulong seed)
40: {
41: char out[1024];
42: int i,j;
43:
44: j=strlen(str);
45: for(i=0;i<j;i++)
46: out[i]=cryptchar(str[i],seed^(i&7));
47: out[i]=0;
48: strcpy(str,out);
49: }
50:
51: /****************************************************************************/
52: /* Returns 32-crc of string (not counting terminating NULL) */
53: /****************************************************************************/
54: ulong crc32(char *str)
55: {
56: int i=0;
57: ulong crc=0xffffffffUL;
58:
59: while(str[i])
60: crc=ucrc32(str[i++],crc);
61: crc=~crc;
62: return(crc);
63: }
64:
65: /***************************************************************************/
66: /* Truncates white-space chars off end of 'str' and terminates at first CR */
67: /****************************************************************************/
68: void truncsp(char *str)
69: {
70: char c;
71:
72: str[strcspn(str,"\r")]=0;
73: c=strlen(str);
74: while(c && (uchar)str[c-1]<=SP) c--;
75: str[c]=0;
76: }
77:
78: /****************************************************************************/
79: /* Converts an ASCII Hex string into an ulong */
80: /****************************************************************************/
81: ulong ahtoul(char *str)
82: {
83: ulong l,val=0;
84:
85: while(*str>' ' && (l=(*str++)|0x20)!=0x20)
86: val=(l&0xf)+(l>>6&1)*9+val*16;
87: return(val);
88: }
89:
90:
91: /****************************************************************************/
92: /* Checks the disk drive for the existence of a file. Returns 1 if it */
93: /* exists, 0 if it doesn't. */
94: /****************************************************************************/
95: char fexist(char *filespec)
96: {
97: struct ffblk f;
98:
99: if(findfirst(filespec,&f,0)==0)
100: return(1);
101: return(0);
102: }
103:
104: /****************************************************************************/
105: /* Returns the length of the file in 'filespec' */
106: /****************************************************************************/
107: long flength(char *filespec)
108: {
109: struct ffblk f;
110:
111: if(findfirst(filespec,&f,0)==0)
112: return(f.ff_fsize);
113: return(-1L);
114: }
115:
116:
117: /****************************************************************************/
118: /* Converts a date string in format MM/DD/YY into unix time format */
119: /****************************************************************************/
120: time_t dstrtounix(char *str)
121: {
122: struct date date;
123: struct time curtime;
124:
125: if(!strncmp(str,"00/00/00",8))
126: return(0);
127: curtime.ti_hour=curtime.ti_min=curtime.ti_sec=0;
128: if(str[6]<7)
129: date.da_year=2000+((str[6]&0xf)*10)+(str[7]&0xf);
130: else
131: date.da_year=1900+((str[6]&0xf)*10)+(str[7]&0xf);
132: date.da_mon=((str[0]&0xf)*10)+(str[1]&0xf);
133: date.da_day=((str[3]&0xf)*10)+(str[4]&0xf);
134: return(dostounix(&date,&curtime));
135: }
136:
137: /****************************************************************************/
138: /* Updates 16-bit "rcrc" with character 'ch' */
139: /****************************************************************************/
140: void ucrc16(uchar ch, ushort *rcrc) {
141: ushort i, cy;
142: uchar nch=ch;
143:
144: for (i=0; i<8; i++) {
145: cy=*rcrc & 0x8000;
146: *rcrc<<=1;
147: if (nch & 0x80) *rcrc |= 1;
148: nch<<=1;
149: if (cy) *rcrc ^= 0x1021; }
150: }
151:
152: /****************************************************************************/
153: /* Returns the age derived from the string 'birth' in the format MM/DD/YY */
154: /****************************************************************************/
155: char getage(char *birth)
156: {
157: char age;
158: struct date date;
159:
160: if(birth[0]<=SP)
161: return(0);
162: getdate(&date);
163: age=(date.da_year-1900)-(((birth[6]&0xf)*10)+(birth[7]&0xf));
164: if(atoi(birth)>12 || atoi(birth+3)>31)
165: return(0);
166: if(((birth[0]&0xf)*10)+(birth[1]&0xf)>date.da_mon ||
167: (((birth[0]&0xf)*10)+(birth[1]&0xf)==date.da_mon &&
168: ((birth[3]&0xf)*10)+(birth[4]&0xf)>date.da_day))
169: age--;
170: if(age<0)
171: return(0);
172: return(age);
173: }
174:
175: /****************************************************************************/
176: /* Returns 16-crc of string (not counting terminating NULL) */
177: /****************************************************************************/
178: ushort crc16(char *str)
179: {
180: int i=0;
181: ushort crc=0;
182:
183: ucrc16(0,&crc);
184: while(str[i])
185: ucrc16(str[i++],&crc);
186: ucrc16(0,&crc);
187: ucrc16(0,&crc);
188: return(crc);
189: }
190:
191:
192: char *base41(unsigned int i, char *str)
193: {
194: char c;
195: unsigned int j=41*41,k;
196:
197: for(c=0;c<3;c++) {
198: k=i/j;
199: str[c]='0'+k;
200: i-=(k*j);
201: j/=41;
202: if(str[c]>=':')
203: str[c]='A'+(str[c]-':');
204: if(str[c]>='[')
205: str[c]='#'+(str[c]-'['); }
206: str[c]=0;
207: return(str);
208: }
209:
210:
211: /****************************************************************************/
212: /* Network open function. Opens all files DENYALL and retries LOOP_NOPEN */
213: /* number of times if the attempted file is already open or denying access */
214: /* for some other reason. All files are opened in BINARY mode. */
215: /****************************************************************************/
216: int nopen(char *str, int access)
217: {
218: char logstr[256];
219: int file,share,count=0;
220:
221: if(access&O_DENYNONE) share=O_DENYNONE;
222: else if(access==O_RDONLY) share=O_DENYWRITE;
223: else share=O_DENYALL;
224: while(((file=open(str,O_BINARY|share|access,S_IWRITE))==-1)
225: && errno==EACCES && count++<LOOP_NOPEN)
226: if(count>10)
227: delay(55);
228: if(file==-1 && errno==EACCES)
229: puts("\7\nNOPEN: ACCESS DENIED\n\7");
230: return(file);
231: }
232:
233:
234: /****************************************************************************/
235: /* Creates a short message for 'usernumber' than contains 'strin' */
236: /****************************************************************************/
237: void putsmsg(int usernumber, char *strin)
238: {
239: char str[256];
240: int file,i;
241: struct ffblk ff;
242: node_t node;
243:
244: sprintf(str,"%sMSGS\\%4.4u.MSG",data_dir,usernumber);
245: if((file=nopen(str,O_WRONLY|O_CREAT|O_APPEND))==-1) {
246: printf("\7Error opening/creating %s for creat/append access\n",str);
247: return; }
248: i=strlen(strin);
249: if(write(file,strin,i)!=i) {
250: close(file);
251: printf("\7Error writing %u bytes to %s\n",i,str);
252: return; }
253: close(file);
254: }
255:
256: void puttgram(int usernumber, char *strin)
257: {
258: char str[256];
259: int file,i;
260: struct ffblk ff;
261: node_t node;
262:
263: sprintf(str,"%4.4u.MSG",usernumber);
264: if((file=nopen(str,O_WRONLY|O_CREAT|O_APPEND))==-1) {
265: printf("\7Error opening/creating %s for creat/append access\n",str);
266: return; }
267: i=strlen(strin);
268: if(write(file,strin,i)!=i) {
269: close(file);
270: printf("\7Error writing %u bytes to %s\n",i,str);
271: return; }
272: close(file);
273: }
274:
275: int trash(char *instr)
276: {
277: char str[1024],word[128];
278:
279: if(!trashfile)
280: return(0);
281: strcpy(str,instr);
282: strupr(str);
283: rewind(trashfile);
284: while(!ferror(trashfile)) {
285: if(!fgets(word,125,trashfile))
286: break;
287: truncsp(word);
288: if(!word[0])
289: continue;
290: strupr(word);
291: if(strstr(str,word))
292: return(1); }
293: return(0);
294: }
295:
296: time_t checktime()
297: {
298: struct tm tm;
299:
300: memset(&tm,0,sizeof(tm));
301: tm.tm_year=94;
302: tm.tm_mday=1;
303: return(mktime(&tm)^0x2D24BD00L);
304: }
305:
306: int main(int argc, char **argv)
307: {
308: uchar str[256],system[128],telegram[1024],HUGE16 *buf,HUGE16 *hp, *p
309: ,min_age,fname[64],path[128],tmp[128],ch;
310: int i,j,file,out,wallfile,msgfile,tgramonly=0,wallonly=0,esc;
311: ulong l,m,last,high,system_crc,crc,length;
312: ushort smm,smm_photo,touser;
313: user_t user;
314: wall_t wall;
315: smbmsg_t msg;
316: FILE *stream,*index,*tmpfile;
317: ixb_t ixb;
318:
319: fprintf(stderr,"\nSMB2SMM v%s - Updates SMM via SMB - Developed 1995-1997 "
320: "Rob Swindell\n\n",VERSION);
321:
322: if(checktime()) {
323: printf("Time problem!\n");
324: return(-1); }
325:
326: if(argc<3) {
327: fprintf(stderr,"usage: smb2smm <smb_file> <smm.dab>\n\n");
328: fprintf(stderr,"example: smb2smm c:\\sbbs\\data\\subs\\syncdata "
329: "c:\\sbbs\\xtrn\\smm\\smm.dab\n");
330: return(1); }
331:
332: p=getenv("SBBSNODE");
333: if(p==NULL) {
334: printf("\7\nSBBSNODE environment variable not set.\n");
335: exit(1); }
336: strcpy(str,p);
337: if(str[strlen(str)-1]!='\\')
338: strcat(str,"\\");
339: strcat(str,"XTRN.DAT");
340: if((file=nopen(str,O_RDONLY))==-1 || (stream=fdopen(file,"rb"))==NULL) {
341: printf("\7\nCan't open %s\n",str);
342: exit(1); }
343: fgets(str,81,stream); /* user name */
344: fgets(system,81,stream); /* system name */
345: truncsp(system);
346: fgets(str,81,stream); /* sysop name */
347: fgets(str,81,stream); /* guru name */
348: fgets(str,81,stream); /* ctrl dir */
349: fgets(str,81,stream); /* data dir */
350: truncsp(str);
351: if(str[0]=='.') {
352: strcpy(data_dir,p); /* node dir */
353: if(data_dir[strlen(data_dir)-1]!='\\')
354: strcat(data_dir,"\\");
355: strcat(data_dir,str); }
356: else
357: strcpy(data_dir,str);
358: fclose(stream);
359:
360: if(argc>3 && !stricmp(argv[3],"/t"))
361: tgramonly=1;
362:
363: if(argc>3 && !stricmp(argv[3],"/w"))
364: wallonly=1;
365:
366: strcpy(smb.file,argv[1]);
367: strupr(smb.file);
368:
369: strcpy(str,argv[2]);
370: strupr(str);
371: if((file=open(str,O_RDWR|O_BINARY|O_DENYNONE|O_CREAT,S_IWRITE|S_IREAD))==-1) {
372: printf("error opening %s\n",str);
373: return(1); }
374: if((stream=fdopen(file,"r+b"))==NULL) {
375: printf("error fdopening %s\n",str);
376: return(1); }
377: setvbuf(stream,NULL,_IOFBF,4096);
378:
379: p=strrchr(str,'.');
380: if(!p) p=str;
381: else p++;
382: strcpy(p,"IXB");
383: if((file=open(str,O_RDWR|O_BINARY|O_DENYNONE|O_CREAT,S_IWRITE|S_IREAD))==-1) {
384: printf("error opening %s\n",str);
385: return(1); }
386: if((index=fdopen(file,"r+b"))==NULL) {
387: printf("error fdopening %s\n",str);
388: return(1); }
389: setvbuf(index,NULL,_IOFBF,1024);
390:
391: p=strrchr(str,'.');
392: if(!p) p=str;
393: else p++;
394: strcpy(p,"CAN");
395: trashfile=NULL;
396: if((file=open(str,O_RDONLY|O_DENYNONE))!=-1) {
397: trashfile=fdopen(file,"rb");
398: setvbuf(trashfile,NULL,_IOFBF,4096); }
399:
400: p=strrchr(str,'.');
401: if(!p) p=str;
402: else p++;
403: strcpy(p,"CFG");
404: if((file=nopen(str,O_RDONLY))==-1) {
405: printf("error opening %s\n",str);
406: return(1); }
407: if((tmpfile=fdopen(file,"rb"))==NULL) {
408: printf("error fdopening %s\n",str);
409: return(1); }
410: fgets(str,128,tmpfile); /* Min purity age */
411: fgets(str,128,tmpfile); /* Min profile age */
412: truncsp(str);
413: min_age=atoi(str);
414: fclose(tmpfile);
415:
416: sprintf(str,"%s.SMM",smb.file);
417: if((file=open(str,O_RDWR|O_BINARY|O_CREAT,S_IWRITE|S_IREAD))==-1) {
418: printf("error opening %s\n",str);
419: return(1); }
420: if(read(file,&last,4)!=4)
421: last=0;
422: high=last;
423:
424: sprintf(str,"%s.SHD",smb.file);
425: if(!fexist(str)) {
426: printf("%s doesn't exist\n",smb.file);
427: return(0); }
428: sprintf(str,"%s.SID",smb.file);
429: if(!flength(str)) {
430: printf("%s is empty\n",smb.file);
431: return(0); }
432: fprintf(stderr,"Opening %s\n",smb.file);
433: smb.retry_time=30;
434: if((i=smb_open(&smb))!=0) {
435: printf("smb_open returned %d\n",i);
436: return(1); }
437:
438: smm=crc16("smm");
439: smm_photo=crc16("smm photo");
440:
441: if((i=smb_locksmbhdr(&smb))!=0) { /* Be sure noone deletes or */
442: printf("Error locking %d\n",i); /* adds while we're reading */
443: return(1); }
444:
445: rewind(smb.sid_fp);
446: while(!feof(smb.sid_fp) && !ferror(smb.sid_fp)) {
447: if(!fread(&msg.idx,sizeof(idxrec_t),1,smb.sid_fp))
448: break;
449: fprintf(stderr,"\r#%-5lu ",msg.idx.number);
450: if(msg.idx.to!=smm && msg.idx.to!=smm_photo)
451: continue;
452: if(msg.idx.number<=last || msg.idx.attr&MSG_DELETE)
453: continue;
454: high=msg.idx.number;
455: if((i=smb_lockmsghdr(&smb,&msg))!=0) {
456: printf("\7Error %d locking msg #%lu\n",i,msg.idx.number);
457: continue; }
458: if((i=smb_getmsghdr(&smb,&msg))!=0) {
459: smb_unlockmsghdr(&smb,&msg);
460: printf("\7Error %d reading msg #%lu\n",i,msg.idx.number);
461: continue; }
462:
463: smb_unlockmsghdr(&smb,&msg);
464: if(!msg.from_net.type || !strnicmp(msg.from,system,25)) { // ignore local msg
465: smb_freemsgmem(&msg);
466: continue; }
467:
468: printf("From: %-25.25s To: %-25.25s Subj: %s\n"
469: ,msg.from,msg.to,msg.subj);
470:
471: if(msg.idx.to==smm_photo) {
472: buf=smb_getmsgtxt(&smb,&msg,0);
473: if(!buf) {
474: smb_freemsgmem(&msg);
475: continue; }
476: sprintf(str,"%.4s",msg.subj);
477: l=ahtoul(str);
478: l^=0x0191;
479: sprintf(str,"%.8s",msg.subj+4);
480: system_crc=ahtoul(str);
481: system_crc^=0x90120e71;
482: fprintf(stderr,"Searching...");
483:
484: rewind(index);
485: memset(&user,0,sizeof(user_t));
486: while(1) {
487: if(!fread(&ixb,sizeof(ixb_t),1,index)) {
488: memset(&user,0,sizeof(user_t));
489: break; }
490: if(ixb.number==l && ixb.system==system_crc) {
491: fseek(index,ftell(index)-sizeof(ixb_t),SEEK_SET);
492: fseek(stream,(ftell(index)/sizeof(ixb_t))*sizeof(user_t)
493: ,SEEK_SET);
494: fread(&user,sizeof(user_t),1,stream);
495: break; } }
496: fprintf(stderr,"\n");
497:
498: if(!user.number) {
499: printf("Profile Not found\n");
500: smb_freemsgmem(&msg);
501: continue; }
502:
503: for(i=0;user.system[i];i++)
504: if(isalnum(user.system[i]))
505: break;
506: if(!user.system[i])
507: fname[0]='~';
508: else
509: fname[0]=user.system[i];
510: for(i=strlen(user.system)-1;i>0;i--)
511: if(isalnum(user.system[i]))
512: break;
513: if(i<=0)
514: fname[1]='~';
515: else
516: fname[1]=user.system[i];
517: fname[2]=0;
518: strcpy(str,user.system);
519: strupr(str);
520: strcat(fname,base41(crc16(str),tmp));
521: strcat(fname,base41(user.number,tmp));
522: sprintf(str,".%.3s",msg.subj+20);
523: strcat(fname,str);
524: strupr(fname);
525:
526: if((out=nopen(fname,O_CREAT|O_WRONLY|O_TRUNC))==-1) {
527: printf("Error opening %s\n",fname);
528: smb_freemsgmem(&msg);
529: continue; }
530:
531: crc=0xffffffffUL;
532: esc=0;
533: for(l=0;buf[l]!=CR;l++)
534: ;
535: buf[l]=0;
536: length=ahtoul((char *)buf)^4096;
537: l+=2; /* Skip CRLF */
538: for(m=0;buf[l] && m<length;l++) {
539: ch=buf[l];
540: if(ch<SP)
541: continue;
542: if(ch=='`') {
543: if(esc) {
544: write(out,&ch,1);
545: m++;
546: crc=ucrc32(ch,crc);
547: esc=0; }
548: else
549: esc=1;
550: continue; }
551: if(esc) {
552: if(isalpha(ch)) {
553: if(isupper(ch))
554: ch-='@';
555: else if(ch=='g')
556: ch=0xe3;
557: else if(ch=='h')
558: ch=0x8d;
559: else if(ch=='i')
560: ch=0xee;
561: else
562: ch=0xfa+(ch-'a'); }
563: else
564: ch=0xf0+(ch-'0');
565: write(out,&ch,1);
566: m++;
567: crc=ucrc32(ch,crc);
568: esc=0;
569: continue; }
570: if(ch>=0xf0)
571: ch&=0xf;
572: if(ch==0xee)
573: ch=0xff;
574: write(out,&ch,1);
575: m++;
576: crc=ucrc32(ch,crc); }
577: close(out);
578: crc=~crc;
579: crc^=0x05296328L;
580: sprintf(str,"%.8s",msg.subj+12);
581: smb_freemsgmem(&msg);
582: if(crc!=ahtoul(str)) {
583: printf("CRC error!\n");
584: remove(fname);
585: continue; }
586: sprintf(path,"PHOTO\\%s",fname);
587: mkdir("PHOTO");
588: if(rename(fname,path)) {
589: printf("Error renaming %s to %s!\n",fname,path);
590: remove(fname);
591: continue; }
592: user.misc|=USER_PHOTO;
593: fseek(stream,(ftell(index)/sizeof(ixb_t))*sizeof(user_t),SEEK_SET);
594: fwrite(&user,sizeof(user_t),1,stream);
595: if(!strnicmp(user.system,system,25))
596: putsmsg(user.number
597: ,"\1n\1h\1mYour photo has been imported into "
598: "\1wMatch Maker\1n\7\r\n");
599: continue; }
600:
601: if(!stricmp(msg.subj,"->WALL<-")) {
602: buf=smb_getmsgtxt(&smb,&msg,0);
603: smb_freemsgmem(&msg);
604: if(!buf)
605: continue;
606: memset(&wall,0,sizeof(wall_t));
607: hp=buf;
608: while(*hp && *hp<SP) hp++;
609: for(i=0;*hp>=SP && i<25;i++,hp++)
610: wall.name[i]=*hp;
611: wall.name[i]=0;
612: hp+=2; /* Skip CRLF */
613: for(i=0;*hp>=SP && i<40;i++,hp++)
614: wall.system[i]=*hp;
615: wall.system[i]=0;
616: hp+=2; /* Skip CRLF */
617: for(i=0;i<5;i++) {
618: for(j=0;*hp>=SP && j<70;j++,hp++)
619: wall.text[i][j]=*hp;
620: wall.text[i][j]=0;
621: hp+=2; }
622:
623: wall.written=ahtoul((char *)hp);
624: wall.imported=time(NULL);
625: FREE((char *)buf);
626: decrypt(wall.name,wall.written);
627: decrypt(wall.system,wall.written);
628: for(i=0;i<5;i++) {
629: decrypt(wall.text[i],wall.written);
630: if(trash(wall.text[i])) {
631: printf("Rejected: Wall writing found in trash!\n");
632: break; } }
633: if(i<5)
634: continue;
635: if((wallfile=sopen("WALL.DAB",O_WRONLY|O_BINARY|O_CREAT,SH_DENYNO
636: ,S_IWRITE|S_IREAD))==-1) {
637: printf("Couldn't open WALL.DAB!\n");
638: continue; }
639: lseek(wallfile,0L,SEEK_END);
640: write(wallfile,&wall,sizeof(wall_t));
641: close(wallfile);
642: continue; }
643:
644: if(wallonly) {
645: smb_freemsgmem(&msg);
646: continue; }
647:
648: if(!stricmp(msg.subj,"->ALL<-")
649: || !stricmp(msg.subj,"->SYS<-")
650: || !stricmp(msg.subj,"->ONE<-")) {
651: sprintf(str,"%.3s%05lu.MSG",msg.subj+2,msg.idx.number);
652: buf=smb_getmsgtxt(&smb,&msg,0);
653: smb_freemsgmem(&msg);
654: if(!buf)
655: continue;
656: l=ahtoul((char *)buf);
657: if(!l)
658: continue;
659: for(i=0;buf[i];i++)
660: if(buf[i]==LF)
661: break;
662: if(buf[i]!=LF)
663: continue;
664: if((msgfile=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1) {
665: printf("error opening %s\n",str);
666: continue; }
667: if((tmpfile=fdopen(msgfile,"wb"))==NULL) {
668: close(msgfile);
669: printf("error fdopening %s\n",str);
670: continue; }
671: fprintf(tmpfile,"%08lx\r\n",l);
672: l^=0x305F6C81UL;
673: for(i++;buf[i];i++)
674: fputc(cryptchar(buf[i],l^(i&7)),tmpfile);
675: fclose(tmpfile);
676: putsmsg(1,"\1n\1h\1mNew announcement in \1wMatch Maker\1n\7\r\n");
677: continue; }
678:
679:
680: j=strlen(msg.subj);
681: for(i=0;i<j;i++)
682: if(!isdigit(msg.subj[i]))
683: break;
684: if(i<j) { /* at least one non-digit, must be telegram */
685: if(strnicmp(msg.subj,system,25)) {
686: smb_freemsgmem(&msg);
687: continue; }
688: buf=smb_getmsgtxt(&smb,&msg,0);
689: smb_freemsgmem(&msg);
690: if(!buf)
691: continue;
692: l=0;
693: while(buf[l] && buf[l]!='}') /* Find first text on line */
694: l++;
695: if(!buf[l] || !buf[++l]) {
696: FREE(buf);
697: continue; }
698: touser=ahtoul((char *)buf+l);
699: while(buf[l] && buf[l]>=SP) /* Go to end of line */
700: l++;
701: while(buf[l] && buf[l]<=SP) /* next line */
702: l++;
703: i=0;
704: while(buf[l]) {
705: if(buf[l]==LF && buf[l+1]==CR) { /* blank line */
706: telegram[i++]=LF;
707: break; }
708: telegram[i++]=buf[l++]; }
709: telegram[i]=0;
710: decrypt(telegram,touser);
711: printf("Telegram to %u\n",touser);
712: if(trash(telegram))
713: printf("Rejected: Contents in trash!\n");
714: else {
715: putsmsg(touser,TGRAM_NOTICE);
716: puttgram(touser,telegram); }
717: FREE(buf);
718: continue;
719: }
720:
721: if(tgramonly) {
722: smb_freemsgmem(&msg);
723: continue; }
724:
725: if(!msg.from[0]) {
726: smb_freemsgmem(&msg);
727: printf("Blank 'from' field.\n");
728: continue; }
729:
730: l=atol(msg.subj);
731: if(!l || l>65535L) {
732: smb_freemsgmem(&msg);
733: printf("Invalid profile.\n");
734: continue; }
735: fprintf(stderr,"Searching for %lu @ %s",l,msg.from);
736: sprintf(str,"%.25s",msg.from);
737: strupr(str);
738: system_crc=crc32(str);
739:
740: rewind(index);
741: memset(&user,0,sizeof(user_t));
742: while(1) {
743: if(!fread(&ixb,sizeof(ixb_t),1,index)) {
744: memset(&user,0,sizeof(user_t));
745: break; }
746: if(ixb.number==l && ixb.system==system_crc) {
747: fseek(index,ftell(index)-sizeof(ixb_t),SEEK_SET);
748: fseek(stream,(ftell(index)/sizeof(ixb_t))*sizeof(user_t),SEEK_SET);
749: fread(&user,sizeof(user_t),1,stream);
750: if(!(user.misc&USER_FROMSMB)) {
751: memset(&user,0,sizeof(user_t));
752: fread(&ixb,sizeof(ixb_t),1,index);
753: continue; }
754: break; } }
755: fprintf(stderr,"\n");
756:
757: if(!user.number) {
758: fprintf(stderr,"Searching for unused record...");
759: rewind(index);
760: while(1) { /* Find deleted record */
761: if(!fread(&ixb,sizeof(ixb_t),1,index))
762: break;
763: if(ixb.number==0) {
764: fseek(index,ftell(index)-sizeof(ixb_t),SEEK_SET);
765: break; } }
766: user.created=time(NULL);
767: user.number=l;
768: sprintf(user.system,"%-.40s",msg.from);
769: fprintf(stderr,"\n"); }
770:
771: fseek(stream,(ftell(index)/sizeof(ixb_t))*sizeof(user_t),SEEK_SET);
772: user.updated=time(NULL);
773: user.misc|=USER_FROMSMB;
774: buf=smb_getmsgtxt(&smb,&msg,0);
775: l=0;
776: while(buf[l]) {
777: while(buf[l] && buf[l]<=SP) /* Find first text on line */
778: l++;
779: if(!strnicmp((char *)buf+l,"0:",2)) {
780: l+=2;
781: sprintf(user.name,"%-.25s",(char *)buf+l);
782: truncsp(user.name);
783: decrypt(user.name,user.number); }
784: if(!strnicmp((char *)buf+l,"1:",2)) {
785: l+=2;
786: sprintf(user.realname,"%-.25s",(char *)buf+l);
787: truncsp(user.realname);
788: decrypt(user.realname,user.number); }
789: if(!strnicmp((char *)buf+l,"2:",2)) {
790: l+=2;
791: sprintf(user.birth,"%-.8s",(char *)buf+l);
792: decrypt(user.birth,user.number); }
793: if(!strnicmp((char *)buf+l,"3:",2)) {
794: l+=2;
795: sprintf(user.location,"%-.30s",(char *)buf+l);
796: truncsp(user.location);
797: decrypt(user.location,user.number); }
798: if(!strnicmp((char *)buf+l,"4:",2)) {
799: l+=2;
800: sprintf(user.zipcode,"%-.10s",(char *)buf+l);
801: truncsp(user.zipcode);
802: decrypt(user.zipcode,user.number); }
803: if(!strnicmp((char *)buf+l,"5:",2)) {
804: l+=2;
805: sprintf(user.min_zipcode,"%-.10s",(char *)buf+l);
806: truncsp(user.min_zipcode);
807: decrypt(user.min_zipcode,user.number); }
808: if(!strnicmp((char *)buf+l,"6:",2)) {
809: l+=2;
810: sprintf(user.max_zipcode,"%-.10s",(char *)buf+l);
811: truncsp(user.max_zipcode);
812: decrypt(user.max_zipcode,user.number); }
813: if(!strnicmp((char *)buf+l,"7:",2)) {
814: l+=2;
815: sprintf(user.mbtype,"%-.4s",(char *)buf+l);
816: truncsp(user.mbtype);
817: decrypt(user.mbtype,user.number); }
818:
819: if(!strnicmp((char *)buf+l,"A:",2)) {
820: l+=2;
821: sprintf(user.note[0],"%-.50s",(char *)buf+l);
822: truncsp(user.note[0]);
823: decrypt(user.note[0],user.number); }
824: if(!strnicmp((char *)buf+l,"B:",2)) {
825: l+=2;
826: sprintf(user.note[1],"%-.50s",(char *)buf+l);
827: truncsp(user.note[1]);
828: decrypt(user.note[1],user.number); }
829: if(!strnicmp((char *)buf+l,"C:",2)) {
830: l+=2;
831: sprintf(user.note[2],"%-.50s",(char *)buf+l);
832: truncsp(user.note[2]);
833: decrypt(user.note[2],user.number); }
834: if(!strnicmp((char *)buf+l,"D:",2)) {
835: l+=2;
836: sprintf(user.note[3],"%-.50s",(char *)buf+l);
837: truncsp(user.note[3]);
838: decrypt(user.note[3],user.number); }
839: if(!strnicmp((char *)buf+l,"E:",2)) {
840: l+=2;
841: sprintf(user.note[4],"%-.50s",(char *)buf+l);
842: truncsp(user.note[4]);
843: decrypt(user.note[4],user.number); }
844:
845: if(!strnicmp((char *)buf+l,"F:",2)) {
846: l+=2;
847: user.sex=buf[l];
848: user.pref_sex=buf[l+1]; }
849:
850: if(!strnicmp((char *)buf+l,"G:",2)) {
851: l+=2;
852: user.marital=ahtoul((char *)buf+l); }
853: if(!strnicmp((char *)buf+l,"H:",2)) {
854: l+=2;
855: user.pref_marital=ahtoul((char *)buf+l); }
856:
857: if(!strnicmp((char *)buf+l,"I:",2)) {
858: l+=2;
859: user.race=ahtoul((char *)buf+l); }
860: if(!strnicmp((char *)buf+l,"J:",2)) {
861: l+=2;
862: user.pref_race=ahtoul((char *)buf+l); }
863:
864: if(!strnicmp((char *)buf+l,"K:",2)) {
865: l+=2;
866: user.hair=ahtoul((char *)buf+l); }
867: if(!strnicmp((char *)buf+l,"L:",2)) {
868: l+=2;
869: user.pref_hair=ahtoul((char *)buf+l); }
870:
871: if(!strnicmp((char *)buf+l,"M:",2)) {
872: l+=2;
873: user.eyes=ahtoul((char *)buf+l); }
874: if(!strnicmp((char *)buf+l,"N:",2)) {
875: l+=2;
876: user.pref_eyes=ahtoul((char *)buf+l); }
877:
878: if(!strnicmp((char *)buf+l,"O:",2)) {
879: l+=2;
880: user.weight=ahtoul((char *)buf+l); }
881: if(!strnicmp((char *)buf+l,"P:",2)) {
882: l+=2;
883: user.min_weight=ahtoul((char *)buf+l); }
884: if(!strnicmp((char *)buf+l,"Q:",2)) {
885: l+=2;
886: user.max_weight=ahtoul((char *)buf+l); }
887:
888: if(!strnicmp((char *)buf+l,"R:",2)) {
889: l+=2;
890: user.height=ahtoul((char *)buf+l); }
891: if(!strnicmp((char *)buf+l,"S:",2)) {
892: l+=2;
893: user.min_height=ahtoul((char *)buf+l); }
894: if(!strnicmp((char *)buf+l,"T:",2)) {
895: l+=2;
896: user.max_height=ahtoul((char *)buf+l); }
897:
898: if(!strnicmp((char *)buf+l,"U:",2)) {
899: l+=2;
900: user.min_age=ahtoul((char *)buf+l); }
901: if(!strnicmp((char *)buf+l,"V:",2)) {
902: l+=2;
903: user.max_age=ahtoul((char *)buf+l); }
904:
905: if(!strnicmp((char *)buf+l,"W:",2)) {
906: l+=2;
907: user.purity=ahtoul((char *)buf+l); }
908:
909: if(!strnicmp((char *)buf+l,"X:",2)) {
910: l+=2;
911: user.income=ahtoul((char *)buf+l); }
912: if(!strnicmp((char *)buf+l,"Y:",2)) {
913: l+=2;
914: user.min_income=ahtoul((char *)buf+l); }
915: if(!strnicmp((char *)buf+l,"Z:",2)) {
916: l+=2;
917: user.max_income=ahtoul((char *)buf+l); }
918:
919: if(toupper(buf[l])=='*' && isdigit(buf[l+1])) { /* Questionnaires */
920: i=buf[l+1]-'0';
921: l+=2;
922: sprintf(user.queans[i].name,"%-.8s",(char *)buf+l);
923: truncsp(user.queans[i].name);
924: decrypt(user.queans[i].name,user.number);
925: while(buf[l] && buf[l]>=SP) l++; /* Go to end of line */
926: for(j=0;j<20;j++) {
927: while(buf[l] && buf[l]<=SP) l++;
928: user.queans[i].self[j]=ahtoul((char *)buf+l);
929: l+=5;
930: user.queans[i].pref[j]=ahtoul((char *)buf+l);
931: l+=5; } }
932:
933: while(buf[l] && buf[l]>=SP) /* Go to end of line */
934: l++; }
935:
936: if(getage(user.birth)<min_age) /* Too young */
937: printf("Rejected: User's age (%u) less than minimum age (%u)\n"
938: ,getage(user.birth),min_age);
939: else if(user.name[0]<SP || user.realname[0]<SP || user.system[0]<SP
940: || user.location[0]<SP || user.zipcode[0]<SP || user.birth[0]<SP)
941: printf("Rejected: Invalid user string\n");
942: else if(trash(user.name))
943: printf("Rejected: User's name (%s) in trash!\n",user.name);
944: else if(trash(user.location))
945: printf("Rejected: User's location (%s) in trash!\n",user.location);
946: else if(trash(user.note[0]) || trash(user.note[1]) || trash(user.note[2])
947: || trash(user.note[3]) || trash(user.note[4]))
948: printf("Rejected: User's personal text in trash!\n");
949: else {
950: fwrite(&user,sizeof(user_t),1,stream);
951: strupr(user.name);
952: ixb.name=crc32(user.name);
953: strupr(user.system);
954: user.system[25]=0;
955: ixb.system=crc32(user.system);
956: ixb.number=user.number;
957: ixb.updated=user.updated;
958: fwrite(&ixb,sizeof(ixb_t),1,index); }
959: FREE((char *)buf);
960: smb_freemsgmem(&msg);
961: }
962:
963: lseek(file,0L,SEEK_SET);
964: write(file,&high,4);
965: close(file);
966: return(0);
967: }
968:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.