1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
/* $Id$ */
/*
typedef struct fileheader_t {
char filename[FNLEN];
char recommend;
char owner[IDLEN + 2];
char date[6];
char title[TTLEN + 1];
int money;
unsigned char filemode;
} fileheader_t;
*/
#include "bbs.h"
void dumpfh(fileheader_t fh)
{
char *c;
printf("dumping fh\n");
for( c= (char*)&fh; (c-(char*)&fh)<sizeof(fh); c++)
if(isprint(*c)) printf("%c",*c);
else printf("[%02d]",(unsigned int)*c);
printf("\n");
}
int main(int argc, char **argv) {
int count=0;
fileheader_t pfh, fh;
FILE *fp, *fo=NULL;
int offset=0;
if(argc < 2) {
fprintf(stderr, "Usage: %s \n", argv[0]);
return 1;
}
if(!(fp=fopen(argv[1],"r")))
{printf("fileopen error!\n");
return 0;}
if(argc >2)
fo=fopen(argv[2],"w");
for(count=0; fread(&fh, sizeof(fh), 1, fp) >0; count++)
{
if(fh.owner[0]=='M' && fh.owner[1]=='.')
{
count--;
fseek(fp,FNLEN+1-sizeof(fh),SEEK_CUR);
printf("%d,offset forth!---dump\n", count);
dumpfh(pfh);
dumpfh(fh);
offset=1;
continue;
}
if(fh.filename[1]!='.' && offset==1)
{
fseek(fp,-FNLEN-1-sizeof(fh),SEEK_CUR);
printf("%d,offset back!\n", count);
offset=0;
continue;
}
if(fh.filename[0]==0 || fh.owner[0]==0 || fh.owner[0]=='-')
{
if(fh.filename[0]==0) unlink(fh.filename);
continue;
}
pfh=fh;
fh.recommend =0;
if(fo)
fwrite(&fh, sizeof(fh), 1, fo);
}
fclose(fp);
if(fo) fclose(fo);
return 0;
}
|