|
|
1.1 ! root 1: /* FIXSMB.C */ ! 2: ! 3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ ! 4: ! 5: /* Re-generates an SMB message base based on SHD and SDT files */ ! 6: ! 7: #include "smblib.h" ! 8: ! 9: smb_t smb; ! 10: ! 11: char *usage="usage: fixsmb [/opts] <smb_file>\n" ! 12: "\n" ! 13: " opts:\n" ! 14: " m - force mail format instead of sub-board format\n" ! 15: "\n" ! 16: " ex: FIXSMB /M MAIL\n" ! 17: " or: FIXSMB DEBATE\n"; ! 18: ! 19: void remove_re(char *str) ! 20: { ! 21: while(!strnicmp(str,"RE:",3)) { ! 22: strcpy(str,str+3); ! 23: while(str[0]==SP) ! 24: strcpy(str,str+1); } ! 25: } ! 26: ! 27: /****************************************************************************/ ! 28: /* Updates 16-bit "rcrc" with character 'ch' */ ! 29: /****************************************************************************/ ! 30: void ucrc16(uchar ch, ushort *rcrc) { ! 31: ushort i, cy; ! 32: uchar nch=ch; ! 33: ! 34: for (i=0; i<8; i++) { ! 35: cy=*rcrc & 0x8000; ! 36: *rcrc<<=1; ! 37: if (nch & 0x80) *rcrc |= 1; ! 38: nch<<=1; ! 39: if (cy) *rcrc ^= 0x1021; } ! 40: } ! 41: ! 42: /****************************************************************************/ ! 43: /* Returns 16-crc of string (not counting terminating NULL) */ ! 44: /****************************************************************************/ ! 45: ushort crc16(char *str) ! 46: { ! 47: int i=0; ! 48: ushort crc=0; ! 49: ! 50: ucrc16(0,&crc); ! 51: while(str[i]) ! 52: ucrc16(str[i++],&crc); ! 53: ucrc16(0,&crc); ! 54: ucrc16(0,&crc); ! 55: return(crc); ! 56: } ! 57: ! 58: #define MAIL (1<<0) ! 59: ! 60: int main(int argc, char **argv) ! 61: { ! 62: char str[128],c; ! 63: int i,w,mode=0; ! 64: ulong l,length,size,n,m; ! 65: smbmsg_t msg; ! 66: smbstatus_t status; ! 67: ! 68: printf("\nFIXSMB v1.22 � Rebuild Synchronet Message Base � Developed 1995-1997 " ! 69: "Rob Swindell\n"); ! 70: ! 71: smb.file[0]=0; ! 72: for(i=1;i<argc;i++) ! 73: if(argv[i][0]=='/') ! 74: switch(toupper(argv[i][1])) { ! 75: case 'M': ! 76: mode|=MAIL; ! 77: break; ! 78: default: ! 79: printf(usage); ! 80: exit(1); } ! 81: else ! 82: strcpy(smb.file,argv[i]); ! 83: ! 84: if(!smb.file[0]) { ! 85: printf(usage); ! 86: exit(1); } ! 87: ! 88: strupr(smb.file); ! 89: smb.retry_time=30; ! 90: ! 91: if((i=smb_open(&smb))!=0) { ! 92: printf("smb_open returned %d\n",i); ! 93: exit(1); } ! 94: ! 95: if((i=smb_locksmbhdr(&smb))!=0) { ! 96: smb_close(&smb); ! 97: printf("smb_locksmbhdr returned %d\n",i); ! 98: exit(1); } ! 99: ! 100: if((i=smb_getstatus(&smb))!=0) { ! 101: smb_unlocksmbhdr(&smb); ! 102: smb_close(&smb); ! 103: printf("smb_getstatus returned %d\n",i); ! 104: exit(1); } ! 105: ! 106: if(mode&MAIL && !(status.attr&SMB_EMAIL)) { ! 107: status.attr|=SMB_EMAIL; ! 108: if((i=smb_putstatus(&smb))!=0) { ! 109: smb_unlocksmbhdr(&smb); ! 110: smb_close(&smb); ! 111: printf("smb_putstatus returned %d\n",i); ! 112: exit(1); } } ! 113: ! 114: if(!(status.attr&SMB_HYPERALLOC)) { ! 115: ! 116: if((i=smb_open_ha(&smb))!=0) { ! 117: smb_close(&smb); ! 118: printf("smb_open_ha returned %d\n",i); ! 119: exit(1); } ! 120: ! 121: if((i=smb_open_da(&smb))!=0) { ! 122: smb_close(&smb); ! 123: printf("smb_open_da returned %d\n",i); ! 124: exit(1); } ! 125: ! 126: rewind(smb.sha_fp); ! 127: chsize(fileno(smb.sha_fp),0L); /* Truncate the header allocation file */ ! 128: rewind(smb.sda_fp); ! 129: chsize(fileno(smb.sda_fp),0L); /* Truncate the data allocation file */ ! 130: } ! 131: ! 132: rewind(smb.sid_fp); ! 133: chsize(fileno(smb.sid_fp),0L); /* Truncate the index */ ! 134: ! 135: ! 136: if(!(status.attr&SMB_HYPERALLOC)) { ! 137: length=filelength(fileno(smb.sdt_fp)); ! 138: w=0; ! 139: for(l=0;l<length;l+=SDT_BLOCK_LEN) /* Init .SDA file to NULL */ ! 140: fwrite(&w,2,1,smb.sda_fp); ! 141: ! 142: length=filelength(fileno(smb.shd_fp)); ! 143: c=0; ! 144: for(l=0;l<length;l+=SHD_BLOCK_LEN) /* Init .SHD file to NULL */ ! 145: fwrite(&c,1,1,smb.sha_fp); } ! 146: else ! 147: length=filelength(fileno(smb.shd_fp)); ! 148: ! 149: n=1; /* messsage number */ ! 150: for(l=status.header_offset;l<length;l+=size) { ! 151: printf("\r%2u%% ",(long)(100.0/((float)length/l))); ! 152: msg.idx.offset=l; ! 153: if((i=smb_lockmsghdr(&smb,&msg))!=0) { ! 154: printf("\n(%06lX) smb_lockmsghdr returned %d\n",l,i); ! 155: continue; } ! 156: if((i=smb_getmsghdr(&smb,&msg))!=0) { ! 157: smb_unlockmsghdr(&smb,&msg); ! 158: printf("\n(%06lX) smb_getmsghdr returned %d\n",l,i); ! 159: size=SHD_BLOCK_LEN; ! 160: continue; } ! 161: smb_unlockmsghdr(&smb,&msg); ! 162: printf("#%-5lu (%06lX) %-25.25s ",msg.hdr.number,l,msg.from); ! 163: if(!(msg.hdr.attr&MSG_DELETE)) { /* Don't index deleted messages */ ! 164: msg.offset=n-1; ! 165: msg.hdr.number=n; ! 166: msg.idx.number=n; ! 167: msg.idx.attr=msg.hdr.attr; ! 168: msg.idx.time=msg.hdr.when_imported.time; ! 169: strcpy(str,msg.subj); ! 170: strlwr(str); ! 171: remove_re(str); ! 172: msg.idx.subj=crc16(str); ! 173: if(status.attr&SMB_EMAIL) { ! 174: if(msg.to_ext) ! 175: msg.idx.to=atoi(msg.to_ext); ! 176: else ! 177: msg.idx.to=0; ! 178: if(msg.from_ext) ! 179: msg.idx.from=atoi(msg.from_ext); ! 180: else ! 181: msg.idx.from=0; } ! 182: else { ! 183: strcpy(str,msg.to); ! 184: strlwr(str); ! 185: msg.idx.to=crc16(str); ! 186: strcpy(str,msg.from); ! 187: strlwr(str); ! 188: msg.idx.from=crc16(str); } ! 189: if((i=smb_putmsg(&smb,&msg))!=0) { ! 190: printf("\nsmb_putmsg returned %d\n",i); ! 191: continue; } ! 192: n++; } ! 193: else ! 194: printf("Not indexing deleted message\n"); ! 195: size=smb_getmsghdrlen(&msg); ! 196: while(size%SHD_BLOCK_LEN) ! 197: size++; ! 198: ! 199: if(!(status.attr&SMB_HYPERALLOC)) { ! 200: /**************************/ ! 201: /* Allocate header blocks */ ! 202: /**************************/ ! 203: fseek(smb.sha_fp,(l-status.header_offset)/SHD_BLOCK_LEN,SEEK_SET); ! 204: if(msg.hdr.attr&MSG_DELETE) c=0; /* mark as free */ ! 205: else c=1; /* or allocated */ ! 206: ! 207: for(i=0;i<size/SHD_BLOCK_LEN;i++) ! 208: fputc(c,smb.sha_fp); ! 209: ! 210: /************************/ ! 211: /* Allocate data blocks */ ! 212: /************************/ ! 213: ! 214: if(!(msg.hdr.attr&MSG_DELETE)) ! 215: smb_incdat(&smb,msg.hdr.offset,smb_getmsgdatlen(&msg),1); ! 216: } ! 217: ! 218: smb_freemsgmem(&msg); } ! 219: printf("\nDone.\n"); ! 220: status.total_msgs=status.last_msg=n-1; ! 221: if((i=smb_putstatus(&smb))!=0) ! 222: printf("\nsmb_putstatus returned %d\n",i); ! 223: smb_unlocksmbhdr(&smb); ! 224: smb_close(&smb); ! 225: return(0); ! 226: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.