|
|
1.1 ! root 1: /* fixsmb.c */ ! 2: ! 3: /* Synchronet message base (SMB) index re-generator */ ! 4: ! 5: /* $Id: fixsmb.c,v 1.3 2000/11/02 13:00:55 rswindell Exp $ */ ! 6: ! 7: /**************************************************************************** ! 8: * @format.tab-size 4 (Plain Text/Source Code File Header) * ! 9: * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * ! 10: * * ! 11: * Copyright 2000 Rob Swindell - http://www.synchro.net/copyright.html * ! 12: * * ! 13: * This program is free software; you can redistribute it and/or * ! 14: * modify it under the terms of the GNU General Public License * ! 15: * as published by the Free Software Foundation; either version 2 * ! 16: * of the License, or (at your option) any later version. * ! 17: * See the GNU General Public License for more details: gpl.txt or * ! 18: * http://www.fsf.org/copyleft/gpl.html * ! 19: * * ! 20: * Anonymous FTP access to the most recent released source is available at * ! 21: * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * ! 22: * * ! 23: * Anonymous CVS access to the development source and modification history * ! 24: * is available at cvs.synchro.net:/cvsroot/sbbs, example: * ! 25: * cvs -d :pserver:[email protected]:/cvsroot/sbbs login * ! 26: * (just hit return, no password is necessary) * ! 27: * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src * ! 28: * * ! 29: * For Synchronet coding style and modification guidelines, see * ! 30: * http://www.synchro.net/source.html * ! 31: * * ! 32: * You are encouraged to submit any modifications (preferably in Unix diff * ! 33: * format) via e-mail to [email protected] * ! 34: * * ! 35: * Note: If this box doesn't appear square, then you need to fix your tabs. * ! 36: ****************************************************************************/ ! 37: ! 38: #include <stdlib.h> /* atoi */ ! 39: #include <string.h> /* strnicmp */ ! 40: #include <ctype.h> /* toupper */ ! 41: ! 42: #include "smblib.h" ! 43: #include "smbwrap.h" ! 44: ! 45: smb_t smb; ! 46: ! 47: char *usage="usage: fixsmb [/opts] <smb_file>\n" ! 48: "\n" ! 49: " opts:\n" ! 50: " m - force mail format instead of sub-board format\n" ! 51: "\n" ! 52: " ex: FIXSMB /M MAIL\n" ! 53: " or: FIXSMB DEBATE\n"; ! 54: ! 55: void remove_re(char *str) ! 56: { ! 57: while(!strnicmp(str,"RE:",3)) { ! 58: strcpy(str,str+3); ! 59: while(str[0]==SP) ! 60: strcpy(str,str+1); } ! 61: } ! 62: ! 63: /****************************************************************************/ ! 64: /* Updates 16-bit "rcrc" with character 'ch' */ ! 65: /****************************************************************************/ ! 66: void ucrc16(uchar ch, ushort *rcrc) { ! 67: ushort i, cy; ! 68: uchar nch=ch; ! 69: ! 70: for (i=0; i<8; i++) { ! 71: cy=*rcrc & 0x8000; ! 72: *rcrc<<=1; ! 73: if (nch & 0x80) *rcrc |= 1; ! 74: nch<<=1; ! 75: if (cy) *rcrc ^= 0x1021; } ! 76: } ! 77: ! 78: /****************************************************************************/ ! 79: /* Returns 16-crc of string (not counting terminating NULL) */ ! 80: /****************************************************************************/ ! 81: ushort crc16(char *str) ! 82: { ! 83: int i=0; ! 84: ushort crc=0; ! 85: ! 86: ucrc16(0,&crc); ! 87: while(str[i]) ! 88: ucrc16(str[i++],&crc); ! 89: ucrc16(0,&crc); ! 90: ucrc16(0,&crc); ! 91: return(crc); ! 92: } ! 93: ! 94: #define MAIL (1<<0) ! 95: ! 96: int main(int argc, char **argv) ! 97: { ! 98: char str[128],c; ! 99: int i,w,mode=0; ! 100: ulong l,length,size,n; ! 101: smbmsg_t msg; ! 102: ! 103: printf("\nFIXSMB v1.23 - Rebuild Synchronet Message Base Index - by Rob Swindell\n"); ! 104: ! 105: smb.file[0]=0; ! 106: for(i=1;i<argc;i++) ! 107: if(argv[i][0]=='/') ! 108: switch(toupper(argv[i][1])) { ! 109: case 'M': ! 110: mode|=MAIL; ! 111: break; ! 112: default: ! 113: printf(usage); ! 114: exit(1); } ! 115: else ! 116: strcpy(smb.file,argv[i]); ! 117: ! 118: if(!smb.file[0]) { ! 119: printf(usage); ! 120: exit(1); } ! 121: ! 122: smb.retry_time=30; ! 123: ! 124: if((i=smb_open(&smb))!=0) { ! 125: printf("smb_open returned %d\n",i); ! 126: exit(1); } ! 127: ! 128: if((i=smb_locksmbhdr(&smb))!=0) { ! 129: smb_close(&smb); ! 130: printf("smb_locksmbhdr returned %d\n",i); ! 131: exit(1); } ! 132: ! 133: if((i=smb_getstatus(&smb))!=0) { ! 134: smb_unlocksmbhdr(&smb); ! 135: smb_close(&smb); ! 136: printf("smb_getstatus returned %d\n",i); ! 137: exit(1); } ! 138: ! 139: if(mode&MAIL && !(smb.status.attr&SMB_EMAIL)) { ! 140: smb.status.attr|=SMB_EMAIL; ! 141: if((i=smb_putstatus(&smb))!=0) { ! 142: smb_unlocksmbhdr(&smb); ! 143: smb_close(&smb); ! 144: printf("smb_putstatus returned %d\n",i); ! 145: exit(1); } } ! 146: ! 147: if(!(smb.status.attr&SMB_HYPERALLOC)) { ! 148: ! 149: if((i=smb_open_ha(&smb))!=0) { ! 150: smb_close(&smb); ! 151: printf("smb_open_ha returned %d\n",i); ! 152: exit(1); } ! 153: ! 154: if((i=smb_open_da(&smb))!=0) { ! 155: smb_close(&smb); ! 156: printf("smb_open_da returned %d\n",i); ! 157: exit(1); } ! 158: ! 159: rewind(smb.sha_fp); ! 160: chsize(fileno(smb.sha_fp),0L); /* Truncate the header allocation file */ ! 161: rewind(smb.sda_fp); ! 162: chsize(fileno(smb.sda_fp),0L); /* Truncate the data allocation file */ ! 163: } ! 164: ! 165: rewind(smb.sid_fp); ! 166: chsize(fileno(smb.sid_fp),0L); /* Truncate the index */ ! 167: ! 168: ! 169: if(!(smb.status.attr&SMB_HYPERALLOC)) { ! 170: length=filelength(fileno(smb.sdt_fp)); ! 171: w=0; ! 172: for(l=0;l<length;l+=SDT_BLOCK_LEN) /* Init .SDA file to NULL */ ! 173: fwrite(&w,2,1,smb.sda_fp); ! 174: ! 175: length=filelength(fileno(smb.shd_fp)); ! 176: c=0; ! 177: for(l=0;l<length;l+=SHD_BLOCK_LEN) /* Init .SHD file to NULL */ ! 178: fwrite(&c,1,1,smb.sha_fp); } ! 179: else ! 180: length=filelength(fileno(smb.shd_fp)); ! 181: ! 182: n=1; /* messsage number */ ! 183: for(l=smb.status.header_offset;l<length;l+=size) { ! 184: size=SHD_BLOCK_LEN; ! 185: printf("\r%2u%% ",(long)(100.0/((float)length/l))); ! 186: msg.idx.offset=l; ! 187: if((i=smb_lockmsghdr(&smb,&msg))!=0) { ! 188: printf("\n(%06lX) smb_lockmsghdr returned %d\n",l,i); ! 189: continue; } ! 190: if((i=smb_getmsghdr(&smb,&msg))!=0) { ! 191: smb_unlockmsghdr(&smb,&msg); ! 192: printf("\n(%06lX) smb_getmsghdr returned %d\n",l,i); ! 193: continue; } ! 194: smb_unlockmsghdr(&smb,&msg); ! 195: printf("#%-5lu (%06lX) %-25.25s ",msg.hdr.number,l,msg.from); ! 196: if(!(msg.hdr.attr&MSG_DELETE)) { /* Don't index deleted messages */ ! 197: msg.offset=n-1; ! 198: msg.hdr.number=n; ! 199: msg.idx.number=n; ! 200: msg.idx.attr=msg.hdr.attr; ! 201: msg.idx.time=msg.hdr.when_imported.time; ! 202: strcpy(str,msg.subj); ! 203: strlwr(str); ! 204: remove_re(str); ! 205: msg.idx.subj=crc16(str); ! 206: if(smb.status.attr&SMB_EMAIL) { ! 207: if(msg.to_ext) ! 208: msg.idx.to=atoi(msg.to_ext); ! 209: else ! 210: msg.idx.to=0; ! 211: if(msg.from_ext) ! 212: msg.idx.from=atoi(msg.from_ext); ! 213: else ! 214: msg.idx.from=0; } ! 215: else { ! 216: strcpy(str,msg.to); ! 217: strlwr(str); ! 218: msg.idx.to=crc16(str); ! 219: strcpy(str,msg.from); ! 220: strlwr(str); ! 221: msg.idx.from=crc16(str); } ! 222: if((i=smb_putmsg(&smb,&msg))!=0) { ! 223: printf("\nsmb_putmsg returned %d\n",i); ! 224: continue; } ! 225: n++; } ! 226: else ! 227: printf("Not indexing deleted message\n"); ! 228: size=smb_getmsghdrlen(&msg); ! 229: while(size%SHD_BLOCK_LEN) ! 230: size++; ! 231: ! 232: if(!(smb.status.attr&SMB_HYPERALLOC)) { ! 233: /**************************/ ! 234: /* Allocate header blocks */ ! 235: /**************************/ ! 236: fseek(smb.sha_fp,(l-smb.status.header_offset)/SHD_BLOCK_LEN,SEEK_SET); ! 237: if(msg.hdr.attr&MSG_DELETE) c=0; /* mark as free */ ! 238: else c=1; /* or allocated */ ! 239: ! 240: for(i=0;i<(int)(size/SHD_BLOCK_LEN);i++) ! 241: fputc(c,smb.sha_fp); ! 242: ! 243: /************************/ ! 244: /* Allocate data blocks */ ! 245: /************************/ ! 246: ! 247: if(!(msg.hdr.attr&MSG_DELETE)) ! 248: smb_incdat(&smb,msg.hdr.offset,smb_getmsgdatlen(&msg),1); ! 249: } ! 250: ! 251: smb_freemsgmem(&msg); } ! 252: printf("\nDone.\n"); ! 253: smb.status.total_msgs=smb.status.last_msg=n-1; ! 254: if((i=smb_putstatus(&smb))!=0) ! 255: printf("\nsmb_putstatus returned %d\n",i); ! 256: smb_unlocksmbhdr(&smb); ! 257: smb_close(&smb); ! 258: return(0); ! 259: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.