URI: 
       trdarena.c - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       trdarena.c (1693B)
       ---
            1 #include "stdinc.h"
            2 #include "dat.h"
            3 #include "fns.h"
            4 
            5 static int verbose, quiet;
            6 
            7 void
            8 usage(void)
            9 {
           10         fprint(2, "usage: rdarena [-qv] arenapart arena\n");
           11         threadexitsall(0);
           12 }
           13 
           14 static void
           15 rdarena(Arena *arena)
           16 {
           17         ZBlock *b;
           18         u64int a, e;
           19         u32int bs;
           20 
           21         if (!quiet) {
           22                 fprint(2, "copying %s to standard output\n", arena->name);
           23                 printarena(2, arena);
           24         }
           25 
           26         bs = MaxIoSize;
           27         if(bs < arena->blocksize)
           28                 bs = arena->blocksize;
           29 
           30         b = alloczblock(bs, 0, arena->blocksize);
           31         e = arena->base + arena->size + arena->blocksize;
           32         for(a = arena->base - arena->blocksize; a + arena->blocksize <= e; a += bs){
           33                 if(a + bs > e)
           34                         bs = arena->blocksize;
           35                 if(readpart(arena->part, a, b->data, bs) < 0)
           36                         fprint(2, "can't copy %s, read at %lld failed: %r\n", arena->name, a);
           37                 if(write(1, b->data, bs) != bs)
           38                         sysfatal("can't copy %s, write at %lld failed: %r", arena->name, a);
           39         }
           40 
           41         freezblock(b);
           42 }
           43 
           44 void
           45 threadmain(int argc, char *argv[])
           46 {
           47         ArenaPart *ap;
           48         Part *part;
           49         char *file, *aname;
           50         int i;
           51 
           52         ventifmtinstall();
           53         statsinit();
           54 
           55         ARGBEGIN{
           56         case 'q':
           57                 quiet++;
           58                 break;
           59         case 'v':
           60                 verbose++;
           61                 break;
           62         default:
           63                 usage();
           64                 break;
           65         }ARGEND
           66 
           67         readonly = 1;
           68 
           69         if(argc != 2)
           70                 usage();
           71 
           72         file = argv[0];
           73         aname = argv[1];
           74 
           75         part = initpart(file, OREAD|ODIRECT);
           76         if(part == nil)
           77                 sysfatal("can't open partition %s: %r", file);
           78 
           79         ap = initarenapart(part);
           80         if(ap == nil)
           81                 sysfatal("can't initialize arena partition in %s: %r", file);
           82 
           83         if(verbose)
           84                 printarenapart(2, ap);
           85 
           86         initdcache(8 * MaxDiskBlock);
           87 
           88         for(i = 0; i < ap->narenas; i++){
           89                 if(strcmp(ap->arenas[i]->name, aname) == 0){
           90                         rdarena(ap->arenas[i]);
           91                         threadexitsall(0);
           92                 }
           93         }
           94 
           95         sysfatal("couldn't find arena %s", aname);
           96 }