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