StRoot  1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
fs.C
1 #include <stdio.h>
2 #include <sys/types.h>
3 #include <sys/stat.h>
4 #include <fcntl.h>
5 #include <errno.h>
6 #include <string.h>
7 #include <stdlib.h>
8 #include <unistd.h>
9 #include <time.h>
10 #include <ctype.h>
11 #include <SUNRT/clock.h>
12 #include "sfs_index.h"
13 #include "get_line.h"
14 #include <rtsLog.h>
15 
16 char g_filename[100];
17 sfs_index *idx;
18 int idx_fd;
19 
20 char *striptodir(char *str)
21 {
22  char *ostr = str;
23  char *lslash = str-1;
24 
25  while(*str != '\0') {
26  if(*str == '/') {
27  // If already a dir, roll back to previous dir
28  if(*(str+1) != '\0') lslash = str;
29  }
30  str++;
31  }
32 
33  lslash++;
34  *lslash = '\0';
35  return ostr;
36 }
37 
38 
39 
40 int fs_cd(int argc, char *argv[])
41 {
42  if(argc !=2) return -1;
43 
44  if(idx->cd(argv[1]) < 0) {
45  printf("%s is invalid directory\n",argv[1]);
46  }
47 
48  //write_env("PWD", idx->cwd);
49  printf("pwd set to %s\n", idx->cwd);
50 
51  return 0;
52 }
53 
54 int fs_pwd()
55 {
56  printf("%s\n", idx->cwd);
57  return 0;
58 }
59 
60 
61 int fs_mount(int argc, char *argv[])
62 {
63  if(idx) {
64  idx->umount();
65  delete idx;
66  }
67 
68  double t = record_time();
69  if(argc < 2) {
70  printf("mount <daqfilename>\n");
71  return -1;
72  }
73 
74  const char *pwd=getenv("PWD");
75  char fn[255];
76 
77  if(argv[1][0] == '/') {
78  strcpy(fn,argv[1]);
79  }
80  else {
81  if(pwd == NULL) pwd = "/";
82  sprintf(fn,"%s/%s",pwd,argv[1]);
83  }
84 
85 #if defined(__USE_LARGEFILE64) || defined(_LARGEFILE64_SOURCE)
86  struct stat64 filestat;
87  if(stat64(fn,&filestat) < 0)
88 #else
89  struct stat filestat;
90  if(stat(fn,&filestat) < 0)
91 #endif
92  {
93  printf("Error reading file %s: %s\n",fn,strerror(errno));
94  return 1;
95  }
96 
97 #if defined(__USE_LARGEFILE64) || defined(_LARGEFILE64_SOURCE)
98  idx_fd = open64(fn, O_RDONLY);
99 #else
100  idx_fd = open(fn, O_RDONLY);
101 #endif
102 
103  if(idx_fd < 0) {
104  printf("Error reading file %s\n",fn);
105  strcpy(g_filename, "NONE");
106 
107  //write_env("MOUNT", "NONE");
108  //write_env("PWD", "NONE");
109  return -1;
110  }
111 
112  idx = new sfs_index;
113 
114  idx->mount(fn, O_RDONLY);
115  t = record_time();
116 
117 #if defined(__USE_LARGEFILE64) || defined(_LARGEFILE64_SOURCE)
118  printf("Mounted file %s: %lld bytes in %5.2f sec\n",fn,(long long int)filestat.st_size,t);
119 #else
120  printf("Mounted file %s: %d bytes in %5.2f sec\n",fn,filestat.st_size,t);
121 #endif
122 
123  //write_env("MOUNT", fn);
124  //write_env("PWD", "/");
125 
126  // printf("MNTDI\n");
127  strcpy(g_filename, fn);
128  return 0;
129 }
130 
131 int getDirSize(fs_dir *dir) {
132  int sz = 0;
133 
134  fs_dirent *entry;
135  fs_dirent storage;
136  while((entry = idx->readdir(dir, &storage))) {
137 
138  sz += entry->sz;
139 
140  if(entry->has_child) {
141  fs_dir *ndir = idx->opendir(entry->full_name);
142  sz += getDirSize(ndir);
143  idx->closedir(ndir);
144  }
145  }
146 
147  return sz;
148 }
149 
150 int getEntrySize(fs_dirent *entry)
151 {
152  int sz = entry->sz;
153 
154  if(entry->has_child) {
155  fs_dir *ndir = idx->opendir(entry->full_name);
156  sz += getDirSize(ndir);
157  idx->closedir(ndir);
158  }
159 
160  return sz;
161 }
162 
163 int ls_dir(const char *tabs, int recurse, fs_dir *dir)
164 {
165  // char ntabs[40];
166  // sprintf(ntabs, "%s\t", tabs);
167  if(recurse > 0) recurse--;
168 
169  fs_dirent *entry;
170  fs_dirent storage;
171  while((entry = idx->readdir(dir, &storage))) {
172 
173  int sz = getEntrySize(entry);
174  printf("%s [%7d bytes] %s%c\n",
175  tabs, sz, entry->full_name,entry->has_child?'/':' ');
176 
177  if(recurse && entry->has_child) {
178  fs_dir *ndir = idx->opendir(entry->full_name);
179  ls_dir(tabs, recurse, ndir);
180  idx->closedir(ndir);
181  }
182  }
183  return 0;
184 }
185 
186 int fs_ls(int argc, char *argv[])
187 {
188  int recurse = 0;
189 
190  if(argc > 1) {
191  if(memcmp(argv[1], "-r", 2) == 0) {
192  recurse = 999;
193  if(strlen(argv[1]) > 2) {
194  recurse = atoi(&argv[1][2]);
195  }
196 
197  }
198  }
199 
200  //printf("start.n\n");
201  fs_dir *dir = idx->opendir(idx->cwd);
202  if(!dir) {
203  printf("Error opening directory %s\n",idx->cwd);
204  return -1;
205  }
206 
207  ls_dir("", recurse, dir);
208 
209  idx->closedir(dir);
210 
211  return 0;
212 }
213 
214 int fs_cat(int argc, char *argv[])
215 {
216  if(argc < 2) {
217  printf("cat <file> <optional output file>\n");
218  return -1;
219  }
220 
221  //printf("[%s: %s %s]\n",idx->pwd(),argv[0], argv[1]);
222  int type;
223  if(strcmp(argv[0], "cat") == 0) type = 0;
224  else if (strcmp(argv[0], "od") == 0) type = 8;
225  else type = 1;
226 
227  int sz = idx->fileSize(argv[1]);
228  if(sz < 0) return -1;
229 
230  char *buff = (char *)malloc(sz);
231  if(!buff) {
232  printf("Error allocating %d bytes\n",sz);
233  return -1;
234  }
235 
236  int ret = idx->read(argv[1], buff, sz);
237  if(ret != sz) {
238  printf("Error reading %d bytes\n",sz);
239  }
240 
241  if(strcmp(argv[0], "save") == 0) {
242  if(argc < 3) {
243  printf("Need a filename\n");
244  free(buff);
245  return -1;
246  }
247 #if defined(__USE_LARGEFILE64) || defined(_LARGEFILE64_SOURCE)
248  int fd = open64(argv[2], O_WRONLY | O_CREAT,0777);
249 #else
250  int fd = open(argv[2], O_WRONLY | O_CREAT, 0777);
251 #endif
252 
253  if(fd < 0) {
254  free(buff);
255  printf("error opening file %s\n",argv[2]);
256  return -1;
257  }
258  int ret = write(fd,buff,sz);
259  if(ret < sz) {
260  printf("Error writing to file %s (only wrote %d of %d bytes\n",
261  argv[2], ret, sz);
262  free(buff);
263  return -1;
264  }
265  close(fd);
266  free(buff);
267  return 0;
268  }
269 
270  if(type == 0) {
271  write(STDOUT_FILENO, buff, sz);
272  write(STDOUT_FILENO, "\n", sizeof("\n"));
273 
274  }
275  else if (type == 8) { // hex dump
276  //printf("Header:\n");
277  //fsBankReader::headerdump(buff);
278  //printf("Data:\n");
279  fs_index::hexdump(buff, sz);
280  printf("\n");
281  }
282  else { // strings...
283  int instr = 0;
284  for(int i=0;i<sz;i++) {
285  if(isprint(buff[i])) {
286  instr = 1;
287  putchar(buff[i]);
288  }
289  else {
290  if(instr == 1) {
291  printf("\n");
292  instr = 0;
293  }
294  }
295  }
296  printf("\n");
297  }
298 
299  free(buff);
300  return 0;
301 }
302 
303 
304 
305 int help()
306 {
307  printf("fs <cmd> <args>\n");
308 
309  printf("\tcd <dir>\n");
310  printf("\tdump\n");
311  printf("\tpwd\n");
312  printf("\tmount <file>\n");
313  printf("\tls\n");
314 
315  printf("\tstrings <fn>\n");
316  printf("\tod <fn>\n");
317  printf("\tsave <fn> <ofn>\n");
318  printf("\tsize <dir>\n");
319  printf("\n\n");
320  return 1;
321 }
322 
323 
324 int docmd(int argc, char *argv[])
325 {
326  if((strcmp(argv[0], "mount") == 0)) {
327  fs_mount(argc, argv);
328  return 0;
329  }
330 
331  if(!idx) {
332  printf("No mounted file: mount a file first\n");
333  help();
334  return 0;
335  }
336  else if(strcmp(argv[0], "pwd") == 0) {
337  fs_pwd();
338  return 0;
339  }
340  else if(strcmp(argv[0], "cd") == 0) {
341  fs_cd(argc, argv);
342  return 0;
343  }
344  else if(strcmp(argv[0], "ls") == 0) {
345  fs_ls(argc, argv);
346  return 0;
347  }
348  else if(strcmp(argv[0], "dump") == 0) {
349  idx->dump(idx_fd);
350  return 0;
351  }
352  else if(strcmp(argv[0], "od") == 0) {
353  fs_cat(argc, argv);
354  return 0;
355  }
356  else if(strcmp(argv[0], "save") == 0) {
357  fs_cat(argc, argv);
358  return 0;
359  }
360  else if(strcmp(argv[0], "strings") == 0) {
361  fs_cat(argc, argv);
362  return 0;
363  }
364  else if(strcmp(argv[0], "size") == 0) {
365  SfsDirsize x;
366  ((sfs_index *)idx)->getDirSize(argv[1], &x);
367  printf("x->size = %lld x->dataSize = %lld\n",x.size, x.dataSize);
368  return 0;
369  }
370  else {
371  printf("\nInvalid command: %s\n\n",argv[0]);
372  help();
373  return 0;
374  }
375 }
376 
377 
378 int main(int argc, char *argv[])
379 {
380  // Parse cmds...
381  char *av[10];
382  int ac = 0;
383 
384  rtsLogOutput(2);
385  rtsLogLevel(WARN);
386  strcpy(g_filename, "none");
387 
388  idx = NULL;
389 
390  if(argc > 1) {
391  // Try mounting...
392 #if defined(__USE_LARGEFILE64) || defined(_LARGEFILE64_SOURCE)
393  struct stat64 sstat;
394  int ret = stat64(argv[1], &sstat);
395 #else
396  struct stat sstat;
397  int ret = stat(argv[1], &sstat);
398 #endif
399 
400  if(ret != 0) {
401  printf("No file %s\n",argv[1]);
402  return -1;
403  }
404 
405  if(argc == 2) {
406  av[0] = (char *)"mount";
407  av[1] = argv[1];
408  ac = 2;
409 
410  docmd(ac, av);
411  }
412  else {
413  idx = new sfs_index();
414  int ret = idx->mountSingleDir(argv[1]);
415  if(ret < 0) {
416  printf("Error reading %s\n", argv[1]);
417  return -1;
418  }
419  do {
420 
421  if(strcmp(argv[2],"ls") != 0) { // if not cd to event directory
422  fs_dir *d = idx->opendir("/");
423  if(d) {
424  fs_dirent storage;
425  fs_dirent *e = idx->readdir(d, &storage);
426  if(e) idx->cd(e->full_name);
427  idx->closedir(d);
428  }
429  }
430 
431  docmd(argc-2, &argv[2]);
432  ret = idx->mountNextDir();
433  } while(ret > 0);
434 
435 
436  return 0;
437  }
438  }
439 
440  for(;;) {
441  char *_strtok_static_;
442  char buff[256];
443  char pwd[100];
444 
445  if(!idx) {
446  strcpy(pwd, "none");
447  }
448  else {
449  strcpy(pwd, idx->pwd());
450  }
451 
452  printf("%s:%s > ", g_filename, pwd);
453 
454  fflush(stdout);
455 
456  get_line(buff);
457 
458  av[0] = strtok_r(buff, " ", &_strtok_static_);
459  if(av[0] == NULL) continue;
460 
461  for(ac = 1; ac < 10; ac++) {
462  av[ac] = strtok_r(NULL, " ", &_strtok_static_);
463  if(av[ac] == NULL) break;
464  }
465 
466  if(strcmp(av[0], "quit") == 0) break;
467 
468  docmd(ac, av);
469 
470  }
471 
472  return 0;
473 }
474 
475 
476