StRoot  1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
fs_ex.C
1 #include <stdio.h>
2 #include <string.h>
3 #include <stdlib.h>
4 #include <sys/types.h>
5 #include <sys/stat.h>
6 #include <fcntl.h>
7 #include <rts.h>
8 #include "sfs_index.h"
9 #include <SUNRT/clock.h>
10 
11 
12 int main(int argc, char *argv[])
13 {
14  if(argc != 2) {
15  printf("fs_ex filename\n");
16  return 0;
17  }
18 
19  int fd = open(argv[1], O_RDONLY);
20  if(fd < 0) {
21  printf("Bad file...%s\n",argv[1]);
22  }
23 
24  printf("Sizeof inode=%ld\n",sizeof(fs_inode));
25  fs_index *idx;
26 
27  char ff[4];
28  read(fd, ff, 4);
29  lseek(fd, 0, SEEK_SET);
30 
31  //if(memcmp(ff, "SFS", 3) == 0) {
32  // sfs file...
33  printf("SFS format input file...\n");
34 
35  idx = new sfs_index;
36  //}
37  //else {
38  // printf("DAQ format input file...\n");
39 
40  //idx = new daqr_index;
41  //}
42 
43  close(fd);
44  //idx->ls(fd);
45 
46  double t;
47  printf("Building index for file %s...\n",argv[1]);
48  record_time();
49  idx->mount(argv[1],O_RDONLY);
50  t = record_time();
51  printf("time to build index of %d inodes = %5.2lf seconds\n",idx->n_inodes,t);
52 
53 
54  // use opendir/readdir same as unix directory api
55  fs_dir *dir = idx->opendir("/");
56  if(!dir) {
57  printf("Bad /\n");
58  return 0;
59  }
60 
61  fs_dirent *entry;
62 
63  printf("First 10 elements in /\n");
64  int i=0;
65  while((entry = idx->readdir(dir))) {
66 
67  printf("%lld %d (%s)(%s)%c\n",entry->offset, entry->sz, idx->cwd,entry->d_name,entry->has_child ? '/' : ' ');
68 
69 
70  if(i++ > 10) break;
71  }
72 
73  idx->closedir(dir);
74 
75  // now, trace first directory to a file and dump it...
76  fs_dir *dirs[20];
77  dirs[0] = idx->opendir("/");
78  if(!dirs[0]) {
79  printf("bad...\n");
80  return 0;
81  }
82 
83  i=0;
84  while(i<20) {
85  entry = idx->readdir(dirs[i]);
86  if(entry->has_child) { // this is a directory!
87  i++;
88  printf("i=%d entry->sz=%d, name=%s\n",i,entry->sz,entry->full_name);
89  dirs[i] = idx->opendir(entry->full_name);
90  if(!dirs[i]) {
91  printf("bad...\n");
92  return 0;
93  }
94  continue;
95  }
96 
97  break; // we have bottomed out at a file.
98  }
99 
100  while(i>=0) {
101  idx->closedir(dirs[i]);
102  i--;
103  }
104 
105  printf("%lld %d %s\n",entry->offset, entry->sz, entry->full_name);
106 
107  /*
108  int ret = lseek(fd, entry->offset, SEEK_SET);
109  if(ret != entry->offset) {
110  printf("Seek failed...\n");
111  return 0;
112  }
113 
114  char *buff = (char *)malloc(entry->sz);
115  if(!buff) {
116  printf("malloc faild...\n");
117  return 0;
118  }
119 
120  ret = read(fd, buff, entry->sz);
121 
122  char *cc = buff;
123  for(int i=0;i<entry->sz;i++,cc++) {
124  if(i%80==0) putchar('\n');
125  if(isprint(*cc)) putchar(*cc);
126  else putchar('.');
127  }
128 
129  putchar('\n');
130  free(buff);
131  close(fd);
132 
133  return 0;
134  */
135 }