|
|
1.1 root 1: /* OUTPHOTO.C */
2:
3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
4:
5: /* Scans SMM database and posts any photographs into the an SMB base */
6:
7: #define uint unsigned int
8:
9: #include <dos.h>
10: #include <share.h>
11: #include "smblib.h"
12: #include "smmdefs.h"
13: #include "crc32.h"
14:
15: #define DAYS 15L // Hatch every 15 days
16:
17: smb_t smb;
18: extern int daylight=0;
19: extern long timezone=0L;
20:
21: unsigned _stklen=16000; /* Set stack size in code, not header */
22:
23: /****************************************************************************/
24: /* Checks the disk drive for the existence of a file. Returns 1 if it */
25: /* exists, 0 if it doesn't. */
26: /****************************************************************************/
27: char fexist(char *filespec)
28: {
29: struct ffblk f;
30:
31: if(findfirst(filespec,&f,0)==0)
32: return(1);
33: return(0);
34: }
35:
36:
37: /****************************************************************************/
38: /* Updates 16-bit "rcrc" with character 'ch' */
39: /****************************************************************************/
40: void ucrc16(uchar ch, ushort *rcrc) {
41: ushort i, cy;
42: uchar nch=ch;
43:
44: for (i=0; i<8; i++) {
45: cy=*rcrc & 0x8000;
46: *rcrc<<=1;
47: if (nch & 0x80) *rcrc |= 1;
48: nch<<=1;
49: if (cy) *rcrc ^= 0x1021; }
50: }
51:
52: /****************************************************************************/
53: /* Returns 16-crc of string (not counting terminating NULL) */
54: /****************************************************************************/
55: ushort crc16(char *str)
56: {
57: int i=0;
58: ushort crc=0;
59:
60: ucrc16(0,&crc);
61: while(str[i])
62: ucrc16(str[i++],&crc);
63: ucrc16(0,&crc);
64: ucrc16(0,&crc);
65: return(crc);
66: }
67:
68: /****************************************************************************/
69: /* Returns 32-crc of string (not counting terminating NULL) */
70: /****************************************************************************/
71: ulong crc32(char *str)
72: {
73: int i=0;
74: ulong crc=0xffffffffUL;
75:
76: while(str[i])
77: crc=ucrc32(str[i++],crc);
78: crc=~crc;
79: return(crc);
80: }
81:
82:
83: char *base41(unsigned int i, char *str)
84: {
85: char c;
86: unsigned int j=41*41,k;
87:
88: for(c=0;c<3;c++) {
89: k=i/j;
90: str[c]='0'+k;
91: i-=(k*j);
92: j/=41;
93: if(str[c]>=':')
94: str[c]='A'+(str[c]-':');
95: if(str[c]>='[')
96: str[c]='#'+(str[c]-'['); }
97: str[c]=0;
98: return(str);
99: }
100:
101:
102:
103: time_t checktime()
104: {
105: struct tm tm;
106:
107: memset(&tm,0,sizeof(tm));
108: tm.tm_year=94;
109: tm.tm_mday=1;
110: return(mktime(&tm)^0x2D24BD00L);
111: }
112:
113: #define BUF_LEN 8192
114:
115: int main(int argc, char **argv)
116: {
117: uchar str[128],tmp[128],buf[BUF_LEN],fname[64],path[128],*p,ch;
118: int i,j,file,in,linelen,all=0;
119: ushort xlat;
120: long length,l;
121: ulong offset,crc;
122: time_t now;
123: struct ffblk ff;
124: user_t user;
125: smbmsg_t msg;
126: FILE *stream;
127:
128: fprintf(stderr,"\nOUTPHOTO %s - Write SMM photos to SMB - Developed 1995-1997 "
129: "Rob Swindell\n\n",__DATE__);
130:
131: if(checktime()) {
132: printf("Time problem!\n");
133: return(-1); }
134:
135: if(argc<3) {
136: fprintf(stderr,"usage: outphoto <smm.dab> <smb_file>\n\n");
137: fprintf(stderr,"example: outphoto c:\\sbbs\\xtrn\\smm\\smm.dab "
138: "c:\\sbbs\\data\\subs\\syncdata\n");
139: return(1); }
140:
141: for(i=3;i<argc;i++)
142: if(!stricmp(argv[i],"/ALL"))
143: all=1;
144:
145: strcpy(smb.file,argv[2]);
146: strupr(smb.file);
147:
148: strcpy(str,argv[1]);
149: strupr(str);
150: if((file=open(str,O_RDWR|O_BINARY|O_DENYNONE))==-1) {
151: printf("error opening %s\n",str);
152: return(1); }
153: if((stream=fdopen(file,"w+b"))==NULL) {
154: printf("error fdopening %s\n",str);
155: return(1); }
156: setvbuf(stream,NULL,_IOFBF,4096);
157:
158: sprintf(str,"%s.SHD",smb.file);
159: if(!fexist(str)) {
160: printf("%s doesn't exist\n",smb.file);
161: return(0); }
162: fprintf(stderr,"Opening %s\n",smb.file);
163: smb.retry_time=30;
164: if((i=smb_open(&smb))!=0) {
165: printf("smb_open returned %d\n",i);
166: return(1); }
167:
168: now=time(NULL);
169: while(!feof(stream)) {
170: if(!fread(&user,sizeof(user_t),1,stream))
171: break;
172:
173: if(user.misc&USER_DELETED || !(user.misc&USER_PHOTO))
174: continue;
175:
176: printf("Photo: %-25.25s %.24s "
177: ,user.name,ctime(&user.photo));
178:
179: if(user.photo && now-user.photo<DAYS*24L*60L*60L && !all) {
180: printf("skipping\n");
181: continue; }
182: printf("hatching\n");
183:
184: for(i=0;user.system[i];i++)
185: if(isalnum(user.system[i]))
186: break;
187: if(!user.system[i])
188: fname[0]='~';
189: else
190: fname[0]=user.system[i];
191: for(i=strlen(user.system)-1;i>0;i--)
192: if(isalnum(user.system[i]))
193: break;
194: if(i<=0)
195: fname[1]='~';
196: else
197: fname[1]=user.system[i];
198: fname[2]=0;
199: strcpy(str,user.system);
200: strupr(str);
201: strcat(fname,base41(crc16(str),tmp));
202: strcat(fname,base41(user.number,tmp));
203: strcpy(path,argv[1]);
204: p=strchr(path,'\\');
205: if(p) *(p+1)=0;
206: else path[0]=0;
207: sprintf(str,"%sPHOTO\\%s.*",path,fname);
208: if(findfirst(str,&ff,0)) {
209: printf("%s doesn't exist!\n",str);
210: continue; }
211: strcpy(fname,ff.ff_name);
212: strcpy(path,argv[1]);
213: p=strchr(path,'\\');
214: if(p) *(p+1)=0;
215: else path[0]=0;
216: sprintf(str,"%sPHOTO\\%s",path,fname);
217:
218: printf("Exporting %s",str);
219: if((in=open(str,O_RDONLY|O_BINARY|SH_DENYWR))==-1) {
220: printf("\nError opening %s\n",str);
221: continue; }
222:
223: memset(buf,0,BUF_LEN);
224: crc=0xffffffffUL;
225: linelen=0;
226: sprintf(buf,"%lx\r\n",filelength(in)^4096);
227: l=strlen(buf);
228: while(l<(BUF_LEN-128)) {
229: if(!read(in,&ch,1))
230: break;
231: crc=ucrc32(ch,crc);
232: if(ch=='`') {
233: buf[l++]='`';
234: buf[l++]='`';
235: linelen++; }
236: else if(ch==0xff)
237: buf[l++]='\xee';
238: else if(ch<0xf)
239: buf[l++]=ch|0xf0;
240: else if(ch<0x20) {
241: buf[l++]='`';
242: buf[l++]=ch+'@';
243: linelen++; }
244: else if(ch>=0xf0) {
245: sprintf(str,"`%x",ch&0xf);
246: buf[l++]=str[0];
247: buf[l++]=str[1];
248: linelen++; }
249: else if(ch==0xe3) {
250: buf[l++]='`';
251: buf[l++]='g';
252: linelen++; }
253: else if(ch==0x8d) {
254: buf[l++]='`';
255: buf[l++]='h';
256: linelen++; }
257: else if(ch==0xee) {
258: buf[l++]='`';
259: buf[l++]='i';
260: linelen++; }
261: else
262: buf[l++]=ch;
263: linelen++;
264: if(linelen>=70) {
265: buf[l++]=CR;
266: buf[l++]=LF;
267: linelen=0; } }
268: buf[l]=0;
269: crc=~crc;
270: sprintf(str,"%lx\r\n--- OUTPHOTO %s",time(NULL),__DATE__);
271: strcat(buf,str);
272: printf("\n");
273:
274: length=strlen(buf); /* +2 for translation string */
275:
276: if(smb.status.attr&SMB_HYPERALLOC)
277: offset=smb_hallocdat(&smb);
278: else {
279: i=smb_open_da(&smb);
280: if(i) {
281: printf("smb_open_da returned %d\n",i);
282: exit(1); }
283: offset=smb_allocdat(&smb,length+2,1);
284: fclose(smb.sda_fp); }
285:
286: fseek(smb.sdt_fp,offset,SEEK_SET);
287: xlat=XLAT_NONE;
288: fwrite(&xlat,2,1,smb.sdt_fp);
289: fwrite(buf,length,1,smb.sdt_fp);
290: length+=2;
291:
292: memset(&msg,0,sizeof(smbmsg_t));
293: memcpy(msg.hdr.id,"SHD\x1a",4);
294: msg.hdr.version=SMB_VERSION;
295: msg.hdr.when_written.time=time(NULL);
296:
297: msg.hdr.offset=offset;
298:
299: strcpy(str,"SMM PHOTO");
300: i=smb_hfield(&msg,RECIPIENT,strlen(str),str);
301: if(i) {
302: printf("smb_hfield returned %d\n",i);
303: smb_freemsgdat(&smb,offset,length,1);
304: exit(1); }
305: strlwr(str);
306: msg.idx.to=crc16(str);
307:
308: strcpy(str,"Digital Dynamics");
309: i=smb_hfield(&msg,SENDER,strlen(str),str);
310: if(i) {
311: printf("smb_hfield returned %d\n",i);
312: smb_freemsgdat(&smb,offset,length,1);
313: exit(1); }
314: strlwr(str);
315: msg.idx.from=crc16(str);
316:
317: sprintf(tmp,"%.25s",user.system);
318: strupr(tmp);
319: sprintf(str,"%04lx%08lx%08lx%.3s"
320: ,user.number^0x191L,crc32(tmp)^0x90120e71L,crc^0x05296328L,fname+9);
321: i=smb_hfield(&msg,SUBJECT,strlen(str),str);
322: if(i) {
323: printf("smb_hfield returned %d\n",i);
324: smb_freemsgdat(&smb,offset,length,1);
325: exit(1); }
326: strlwr(str);
327: msg.idx.subj=crc16(str);
328:
329: i=smb_dfield(&msg,TEXT_BODY,length);
330: if(i) {
331: printf("smb_dfield returned %d\n",i);
332: smb_freemsgdat(&smb,offset,length,1);
333: exit(1); }
334:
335: i=smb_addmsghdr(&smb,&msg,smb.status.attr&SMB_HYPERALLOC);
336: if(i) {
337: printf("smb_addmsghdr returned %d\n",i);
338: smb_freemsgdat(&smb,offset,length,1);
339: exit(1); }
340: smb_freemsgmem(&msg);
341: fseek(stream,ftell(stream)-sizeof(user_t),SEEK_SET);
342: user.photo=time(NULL);
343: fwrite(&user,sizeof(user_t),1,stream);
344: fseek(stream,ftell(stream),SEEK_SET); }
345: return(0);
346: }
347:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.