summaryrefslogtreecommitdiffstats
path: root/util/checkdir.c
blob: ac4cafa80be64d0ec51be3b688bcde6e0069155b (plain) (blame)
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
/* $Id: checkdir.c 1356 2003-11-22 02:16:02Z victor $ */
/*
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)
         {
           if(fh.filename[0]==0) unlink(fh.filename);
           continue;
         }
         pfh=fh; 
        if(fo)
           fwrite(&fh, sizeof(fh), 1, fo);
      }
    fclose(fp);
    if(fo) fclose(fo);
    return 0;
}