rdarena.c 1.7 KB

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