|
|
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.