|
|
1.1 root 1: /* UTIEXPRT.C */
2:
3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
4:
5: #include "sbbs.h"
6: #include "uti.h"
7: #include "post.h"
8:
9: char *nulstr="";
10: smb_t smb;
11:
12: ulong loadmsgs(post_t huge **post, ulong ptr)
13: {
14: int i;
15: long l=0;
16: idxrec_t idx;
17:
18:
19: if((i=smb_locksmbhdr(&smb))!=0) { /* Be sure noone deletes or */
20: errormsg(WHERE,ERR_LOCK,smb.file,i); /* adds while we're reading */
21: return(0L); }
22:
23: fseek(smb.sid_fp,0L,SEEK_SET);
24: while(!feof(smb.sid_fp)) {
25: if(!fread(&idx,sizeof(idxrec_t),1,smb.sid_fp))
26: break;
27:
28: if(idx.number<ptr || idx.attr&MSG_DELETE)
29: continue;
30:
31: if(idx.attr&MSG_MODERATED && !(idx.attr&MSG_VALIDATED))
32: break;
33:
34: if(((*post)=(post_t huge *)REALLOC((*post),sizeof(post_t)*(l+1)))
35: ==NULL) {
36: smb_unlocksmbhdr(&smb);
37: errormsg(WHERE,ERR_ALLOC,smb.file,sizeof(post_t)*(l+1));
38: return(l); }
39: (*post)[l].offset=idx.offset;
40: (*post)[l].number=idx.number;
41: l++; }
42: smb_unlocksmbhdr(&smb);
43: return(l);
44: }
45:
46:
47: int main(int argc, char **argv)
48: {
49: char str[512],*buf,ch,*outbuf;
50: ushort xlat;
51: int i,file,tear,cr,net=0,lzh;
52: uint subnum;
53: long l,m,length,buflen;
54: ulong msgnum,posts,exported=0;
55: FILE *stream;
56: post_t huge *post;
57: smbmsg_t msg;
58: struct date date;
59: struct time curtime;
60:
61: PREPSCREEN;
62:
63: printf("Synchronet UTIEXPRT v%s\n",VER);
64:
65: if(argc<3)
66: exit(1);
67:
68: if(argc>4 && !stricmp(argv[4],"/NETWORK"))
69: net=1;
70:
71: uti_init("UTIEXPRT",argc,argv);
72:
73: if((file=nopen(argv[3],O_CREAT|O_TRUNC|O_WRONLY))==-1)
74: bail(2);
75: if((stream=fdopen(file,"wb"))==NULL)
76: bail(2);
77: setvbuf(stream,0,_IOFBF,4096);
78:
79: subnum=getsubnum(argv[1]);
80: if((int)subnum==-1)
81: bail(7);
82: msgnum=atol(argv[2]);
83:
84: sprintf(smb.file,"%s%s",sub[subnum]->data_dir,sub[subnum]->code);
85: smb.retry_time=30;
86: if((i=smb_open(&smb))!=0) {
87: errormsg(WHERE,ERR_OPEN,smb.file,i);
88: bail(5); }
89:
90: post=NULL;
91: posts=loadmsgs(&post,msgnum);
92:
93: printf("\nExporting\n\n");
94: for(l=0;l<posts;l++) {
95: printf("\rScanning: %lu of %lu Exported: %lu",l+1,posts,exported);
96: msg.idx.offset=post[l].offset;
97: if((i=smb_lockmsghdr(&smb,&msg))!=0) {
98: errormsg(WHERE,ERR_LOCK,smb.file,i);
99: continue; }
100: i=smb_getmsghdr(&smb,&msg);
101: if(i || msg.hdr.number!=post[l].number) {
102: smb_unlockmsghdr(&smb,&msg);
103: smb_freemsgmem(&msg);
104:
105: msg.hdr.number=post[l].number;
106: if((i=smb_getmsgidx(&smb,&msg))!=0) {
107: errormsg(WHERE,ERR_READ,smb.file,i);
108: continue; }
109: if((i=smb_lockmsghdr(&smb,&msg))!=0) {
110: errormsg(WHERE,ERR_LOCK,smb.file,i);
111: continue; }
112: if((i=smb_getmsghdr(&smb,&msg))!=0) {
113: smb_unlockmsghdr(&smb,&msg);
114: errormsg(WHERE,ERR_READ,smb.file,i);
115: continue; } }
116:
117: if(net /* Network */
118: && (!strncmpi(msg.subj,"NE:",3) /* No Echo */
119: || msg.from_net.type==NET_POSTLINK)) { /* from PostLink */
120: smb_unlockmsghdr(&smb,&msg);
121: smb_freemsgmem(&msg);
122: continue; } /* From a Fido node, ignore it */
123:
124: if(net && !(sub[subnum]->misc&SUB_GATE) && msg.from_net.type) {
125: smb_unlockmsghdr(&smb,&msg);
126: smb_freemsgmem(&msg);
127: continue; }
128:
129: exported++;
130:
131: fprintf(stream,"%s\r\n%s\r\n%s\r\n"
132: ,msg.to,msg.from,msg.subj);
133: unixtodos(msg.hdr.when_written.time,&date,&curtime);
134: fprintf(stream,"%lu\r\n%lu\r\n%02u/%02u/%02u\r\n%02u:%02u\r\n"
135: "%s\r\n%c\r\n%c\r\nTEXT:\r\n"
136: ,msg.hdr.number
137: ,msg.hdr.thread_orig
1.1.1.2 ! root 138: ,date.da_mon,date.da_day,TM_YEAR(date.da_year-1900)
1.1 root 139: ,curtime.ti_hour,curtime.ti_min
140: ,msg.hdr.attr&MSG_PRIVATE ? "PRIVATE" : "PUBLIC"
141: ,msg.hdr.attr&MSG_READ ? 'Y':'N'
142: ,strncmpi(msg.subj,"NE:",3) ? 'Y':'N');
143:
144: for(i=0;i<msg.hdr.total_dfields;i++) {
145:
146: if(msg.dfield[i].type!=TEXT_BODY
147: && msg.dfield[i].type!=TEXT_TAIL)
148: continue; /* skip non-text data fields */
149:
150: if(msg.dfield[i].length<3) /* need at least 3 bytes */
151: continue;
152:
153: fseek(smb.sdt_fp,msg.hdr.offset+msg.dfield[i].offset,SEEK_SET);
154:
155: lzh=0;
156: fread(&xlat,2,1,smb.sdt_fp);
157: if(xlat==XLAT_LZH) {
158: lzh=1;
159: fread(&xlat,2,1,smb.sdt_fp); }
160: if(xlat!=XLAT_NONE) /* no translations supported */
161: continue;
162:
163: length=msg.dfield[i].length-2;
164: if(lzh)
165: length-=2;
166:
167: if((buf=MALLOC(length))==NULL) {
168: errormsg(WHERE,ERR_ALLOC,nulstr,length);
169: continue; }
170:
171: fread(buf,length,1,smb.sdt_fp);
172:
173: if(lzh) {
174: buflen=*(long *)buf;
175: if((outbuf=MALLOC(buflen))==NULL) {
176: errormsg(WHERE,ERR_ALLOC,"lzh",buflen);
177: FREE(buf);
178: continue; }
179: length=lzh_decode(buf,length,outbuf);
180: FREE(buf);
181: buf=outbuf; }
182:
183: tear=0;
184: for(m=0,cr=1;m<length;m++) {
185: if(buf[m]==1) { /* Ctrl-A, so skip it and the next char */
186: m++;
187: continue; }
188: if(buf[m]==0) /* Ignore line feeds */
189: continue;
190:
191: if(m+3<length && cr && buf[m]=='-' && buf[m+1]=='-'
192: && buf[m+2]=='-' && (buf[m+3]==CR || buf[m+3]==SP))
193: tear=1;
194:
195: if(buf[m]==LF)
196: cr=1;
197: else
198: cr=0;
199:
200: if(sub[subnum]->misc&SUB_ASCII) {
201: if(buf[m]<SP && buf[m]!=CR) /* Ctrl ascii */
202: buf[m]='.'; /* converted to '.' */
203: if((uchar)buf[m]>0x7f) /* extended ASCII */
204: buf[m]='*'; } /* converted to '*' */
205: fputc(buf[m],stream); }
206: fprintf(stream,"\r\n");
207: FREE(buf); }
208:
209: if(!(sub[subnum]->misc&SUB_NOTAG)) {
210: if(!tear) /* No previous tear line */
211: fprintf(stream,"---\r\n"); /* so add one */
212: if(sub[subnum]->misc&SUB_ASCII) ch='*';
213: else ch='�';
214: fprintf(stream," %c Synchronet UTI v%s\r\n",ch,VER); }
215:
216: fprintf(stream,"\xff\r\n");
217: smb_unlockmsghdr(&smb,&msg);
218: smb_freemsgmem(&msg); }
219:
220: sprintf(str,"%20s Scanned %lu, Exported %lu\r\n"
221: ,"",posts,exported);
222: write(logfile,str,strlen(str));
223: printf("\nDone.\n");
224: smb_close(&smb);
225: FREE(post);
226: bail(0);
227: return(0);
228: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.