|
|
1.1 root 1: /* SBL2SMB.C */
2:
3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
4:
5: /* Scans SBL database and posts any additions/updates into the an SMB base */
6:
7: #define uint unsigned int
8:
9: #include <dos.h>
10: #include "smblib.h"
11: #include "sbldefs.h"
12:
13: smb_t smb;
14: extern int daylight=0;
15: extern long timezone=0L;
16:
17: unsigned _stklen=16000;
18:
19: /****************************************************************************/
20: /* Checks the disk drive for the existence of a file. Returns 1 if it */
21: /* exists, 0 if it doesn't. */
22: /****************************************************************************/
23: char fexist(char *filespec)
24: {
25: struct ffblk f;
26:
27: if(findfirst(filespec,&f,0)==0)
28: return(1);
29: return(0);
30: }
31:
32:
33: /****************************************************************************/
34: /* Updates 16-bit "rcrc" with character 'ch' */
35: /****************************************************************************/
36: void ucrc16(uchar ch, ushort *rcrc) {
37: ushort i, cy;
38: uchar nch=ch;
39:
40: for (i=0; i<8; i++) {
41: cy=*rcrc & 0x8000;
42: *rcrc<<=1;
43: if (nch & 0x80) *rcrc |= 1;
44: nch<<=1;
45: if (cy) *rcrc ^= 0x1021; }
46: }
47:
48: /****************************************************************************/
49: /* Returns 16-crc of string (not counting terminating NULL) */
50: /****************************************************************************/
51: ushort crc16(char *str)
52: {
53: int i=0;
54: ushort crc=0;
55:
56: ucrc16(0,&crc);
57: while(str[i])
58: ucrc16(str[i++],&crc);
59: ucrc16(0,&crc);
60: ucrc16(0,&crc);
61: return(crc);
62: }
63:
64:
65: /****************************************************************************/
66: /* Converts unix time format (long - time_t) into a char str MM/DD/YY */
67: /****************************************************************************/
68: char *unixtodstr(time_t unix, char *str)
69: {
70: struct time curtime;
71: struct date date;
72:
73: if(!unix)
74: strcpy(str,"00/00/00");
75: else {
76: unixtodos(unix,&date,&curtime);
77: if((unsigned)date.da_mon>12) { /* DOS leap year bug */
78: date.da_mon=1;
79: date.da_year++; }
80: if((unsigned)date.da_day>31)
81: date.da_day=1;
82: sprintf(str,"%02u/%02u/%02u",date.da_mon,date.da_day
83: ,date.da_year>=2000 ? date.da_year-2000 : date.da_year-1900); }
84: return(str);
85: }
86:
87: #define BUF_LEN 8192
88:
89: int main(int argc, char **argv)
90: {
91: uchar str[128],tmp[128],buf[BUF_LEN],*p,software[128];
92: int i,file;
93: ushort xlat;
94: long length;
95: ulong offset;
96: time_t last,t;
97: bbs_t bbs;
98: smbmsg_t msg;
99: smbstatus_t status;
100: FILE *stream;
101:
102: fprintf(stderr,"\nSBL2SMB v2.00 - Write SBL to SMB - Developed 1994-1997 "
103: "Rob Swindell\n\n");
104: if(argc<3) {
105: fprintf(stderr,"usage: sbl2smb <sbl.dab> <smb_file> [/s:software]\n\n");
106: fprintf(stderr,"ex: sbl2smb c:\\sbbs\\xtrn\\sbl\\sbl.dab "
107: "c:\\sbbs\\data\\subs\\syncdata /s:syn\n");
108: return(1); }
109:
110: software[0]=0;
111: if(argc>3 && !strnicmp(argv[3],"/S:",3))
112: strcpy(software,argv[3]+3);
113:
114: strcpy(smb.file,argv[2]);
115: strupr(smb.file);
116:
117: strcpy(str,argv[1]);
118: strupr(str);
119: if((file=open(str,O_RDONLY|O_BINARY|O_DENYNONE))==-1) {
120: printf("error opening %s\n",str);
121: return(1); }
122: if((stream=fdopen(file,"rb"))==NULL) {
123: printf("error fdopening %s\n",str);
124: return(1); }
125: strcpy(tmp,str);
126: p=strrchr(tmp,'.');
127: if(p) {
128: (*p)=0;
129: strcat(tmp,"2SMB.DAB");
130: if((file=open(tmp,O_RDWR|O_BINARY|O_CREAT,S_IWRITE|S_IREAD))==-1) {
131: printf("error opening %s\n",str);
132: return(1); }
133: t=time(NULL);
134: if(read(file,&last,sizeof(time_t))!=sizeof(time_t))
135: last=t;
136: lseek(file,0L,SEEK_SET);
137: write(file,&t,sizeof(time_t));
138: close(file); }
139:
140: sprintf(str,"%s.SHD",smb.file);
141: if(!fexist(str)) {
142: printf("%s doesn't exist\n",smb.file);
143: return(0); }
144: fprintf(stderr,"Opening %s\n",smb.file);
145: smb.retry_time=30;
146: if((i=smb_open(&smb))!=0) {
147: printf("smb_open returned %d\n",i);
148: return(1); }
149: i=smb_locksmbhdr(&smb);
150: if(i) {
151: printf("smb_locksmbhdr returned %d\n",i);
152: return(1); }
153: i=smb_getstatus(&smb);
154: smb_unlocksmbhdr(&smb);
155: if(i) {
156: printf("smb_getstatus returned %d\n",i);
157: return(1); }
158:
159: while(!feof(stream)) {
160: if(!fread(&bbs,sizeof(bbs_t),1,stream))
161: break;
162: if(!bbs.name[0] || bbs.misc&FROM_SMB
163: || (bbs.updated<last && bbs.created<last))
164: continue;
165: if(software[0] && strnicmp(software,bbs.software,strlen(software)))
166: continue;
167:
168: printf("%s\r\n",bbs.name);
169: memset(buf,0,BUF_LEN);
170:
171: sprintf(str,"%-15.15s%s\r\n"
172: ,"Name:",bbs.name);
173: strcat(buf,str);
174:
175: sprintf(str,"%-15.15s%s\r\n"
176: ,"Birth:",unixtodstr(bbs.birth,tmp));
177: strcat(buf,str);
178:
179: sprintf(str,"%-15.15s%s\r\n"
180: ,"Software:",bbs.software);
181: strcat(buf,str);
182:
183: for(i=0;i<bbs.total_sysops;i++) {
184: sprintf(str,"%-15.15s%s\r\n"
185: ,"Sysop:",bbs.sysop[i]);
186: strcat(buf,str); }
187:
188: strcat(buf,"\r\n");
189: for(i=0;i<bbs.total_numbers;i++) {
190: sprintf(str,"%-15.15s%s\r\n"
191: ,"Number:",bbs.number[i].number);
192: strcat(buf,str);
193: sprintf(str,"%-15.15s%s\r\n"
194: ,"Modem:",bbs.number[i].modem);
195: strcat(buf,str);
196: sprintf(str,"%-15.15s%s\r\n"
197: ,"Location:",bbs.number[i].location);
198: strcat(buf,str);
199: sprintf(str,"%-15.15s%u\r\n"
200: ,"MinRate:",bbs.number[i].min_rate);
201: strcat(buf,str);
202: sprintf(str,"%-15.15s%u\r\n"
203: ,"MaxRate:",bbs.number[i].max_rate);
204: strcat(buf,str);
205: if(i+1<bbs.total_numbers)
206: strcat(buf,"\r\n"); }
207:
208: if(bbs.total_networks)
209: strcat(buf,"\r\n");
210: for(i=0;i<bbs.total_networks;i++) {
211: sprintf(str,"%-15.15s%s\r\n"
212: ,"Network:",bbs.network[i]);
213: strcat(buf,str);
214: sprintf(str,"%-15.15s%s\r\n"
215: ,"Address:",bbs.address[i]);
216: strcat(buf,str);
217: if(i+1<bbs.total_networks)
218: strcat(buf,"\r\n"); }
219:
220: strcat(buf,"\r\n");
221: for(i=0;i<bbs.total_terminals;i++) {
222: sprintf(str,"%-15.15s%s\r\n"
223: ,"Terminal:",bbs.terminal[i]);
224: strcat(buf,str); }
225:
226: strcat(buf,"\r\n");
227: sprintf(str,"%-15.15s%lu\r\n"
228: ,"Megs:",bbs.megs);
229: strcat(buf,str);
230: sprintf(str,"%-15.15s%lu\r\n"
231: ,"Msgs:",bbs.msgs);
232: strcat(buf,str);
233: sprintf(str,"%-15.15s%lu\r\n"
234: ,"Files:",bbs.files);
235: strcat(buf,str);
236: sprintf(str,"%-15.15s%u\r\n"
237: ,"Nodes:",bbs.nodes);
238: strcat(buf,str);
239: sprintf(str,"%-15.15s%u\r\n"
240: ,"Users:",bbs.users);
241: strcat(buf,str);
242: sprintf(str,"%-15.15s%u\r\n"
243: ,"Subs:",bbs.subs);
244: strcat(buf,str);
245: sprintf(str,"%-15.15s%u\r\n"
246: ,"Dirs:",bbs.dirs);
247: strcat(buf,str);
248: sprintf(str,"%-15.15s%u\r\n"
249: ,"Xtrns:",bbs.xtrns);
250: strcat(buf,str);
251:
252: if(bbs.desc[0][0])
253: strcat(buf,"\r\n");
254: for(i=0;i<5;i++) {
255: if(!bbs.desc[i][0])
256: break;
257: sprintf(str,"%-15.15s%s\r\n"
258: ,"Desc:",bbs.desc[i]);
259: strcat(buf,str); }
260:
261: strcat(buf,"\r\n--- SBL2SMB v1.10");
262:
263: length=strlen(buf); /* +2 for translation string */
264:
265: if(status.attr&SMB_HYPERALLOC)
266: offset=smb_hallocdat(&smb);
267: else {
268: i=smb_open_da(&smb);
269: if(i) {
270: printf("smb_open_da returned %d\n",i);
271: exit(1); }
272: offset=smb_allocdat(&smb,length+2,1);
273: fclose(smb.sda_fp); }
274:
275: fseek(smb.sdt_fp,offset,SEEK_SET);
276: xlat=XLAT_NONE;
277: fwrite(&xlat,2,1,smb.sdt_fp);
278: fwrite(buf,length,1,smb.sdt_fp);
279: length+=2;
280:
281: memset(&msg,0,sizeof(smbmsg_t));
282: memcpy(msg.hdr.id,"SHD\x1a",4);
283: msg.hdr.version=SMB_VERSION;
284: msg.hdr.when_written.time=time(NULL);
285:
286: msg.hdr.offset=offset;
287:
288: strcpy(str,"SBL");
289: i=smb_hfield(&msg,RECIPIENT,strlen(str),str);
290: if(i) {
291: printf("smb_hfield returned %d\n",i);
292: smb_freemsgdat(&smb,offset,length,1);
293: exit(1); }
294: strlwr(str);
295: msg.idx.to=crc16(str);
296:
297: strcpy(str,bbs.user);
298: i=smb_hfield(&msg,SENDER,strlen(str),str);
299: if(i) {
300: printf("smb_hfield returned %d\n",i);
301: smb_freemsgdat(&smb,offset,length,1);
302: exit(1); }
303: strlwr(str);
304: msg.idx.from=crc16(str);
305:
306: strcpy(str,bbs.name);
307: i=smb_hfield(&msg,SUBJECT,strlen(str),str);
308: if(i) {
309: printf("smb_hfield returned %d\n",i);
310: smb_freemsgdat(&smb,offset,length,1);
311: exit(1); }
312: strlwr(str);
313: msg.idx.subj=crc16(str);
314:
315: i=smb_dfield(&msg,TEXT_BODY,length);
316: if(i) {
317: printf("smb_dfield returned %d\n",i);
318: smb_freemsgdat(&smb,offset,length,1);
319: exit(1); }
320:
321: i=smb_addmsghdr(&smb,&msg,status.attr&SMB_HYPERALLOC);
322: if(i) {
323: printf("smb_addmsghdr returned %d\n",i);
324: smb_freemsgdat(&smb,offset,length,1);
325: exit(1); }
326: smb_freemsgmem(&msg); }
327: return(0);
328: }
329:
330: /* End of SBL2SMB.C */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.