rdarena.c 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. #include "stdinc.h"
  2. #include "dat.h"
  3. #include "fns.h"
  4. static int verbose;
  5. void
  6. usage(void)
  7. {
  8. fprint(2, "usage: rdarena [-v] arenapart arena\n");
  9. threadexitsall(0);
  10. }
  11. static void
  12. rdarena(Arena *arena)
  13. {
  14. ZBlock *b;
  15. u64int a, e;
  16. u32int bs;
  17. fprint(2, "copying %s to standard output\n", arena->name);
  18. printarena(2, arena);
  19. bs = MaxIoSize;
  20. if(bs < arena->blocksize)
  21. bs = arena->blocksize;
  22. b = alloczblock(bs, 0, arena->blocksize);
  23. e = arena->base + arena->size + arena->blocksize;
  24. for(a = arena->base - arena->blocksize; a + arena->blocksize <= e; a += bs){
  25. if(a + bs > e)
  26. bs = arena->blocksize;
  27. if(readpart(arena->part, a, b->data, bs) < 0)
  28. fprint(2, "can't copy %s, read at %lld failed: %r\n", arena->name, a);
  29. if(write(1, b->data, bs) != bs)
  30. sysfatal("can't copy %s, write at %lld failed: %r", arena->name, a);
  31. }
  32. freezblock(b);
  33. }
  34. void
  35. threadmain(int argc, char *argv[])
  36. {
  37. ArenaPart *ap;
  38. Part *part;
  39. char *file, *aname;
  40. int i;
  41. ventifmtinstall();
  42. statsinit();
  43. ARGBEGIN{
  44. case 'v':
  45. verbose++;
  46. break;
  47. default:
  48. usage();
  49. break;
  50. }ARGEND
  51. readonly = 1;
  52. if(argc != 2)
  53. usage();
  54. file = argv[0];
  55. aname = argv[1];
  56. part = initpart(file, OREAD|ODIRECT);
  57. if(part == nil)
  58. sysfatal("can't open partition %s: %r", file);
  59. ap = initarenapart(part);
  60. if(ap == nil)
  61. sysfatal("can't initialize arena partition in %s: %r", file);
  62. if(verbose)
  63. printarenapart(2, ap);
  64. initdcache(8 * MaxDiskBlock);
  65. for(i = 0; i < ap->narenas; i++){
  66. if(strcmp(ap->arenas[i]->name, aname) == 0){
  67. rdarena(ap->arenas[i]);
  68. threadexitsall(0);
  69. }
  70. }
  71. sysfatal("couldn't find arena %s\n", aname);
  72. }