URI: 
       tvcat.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
       ---
       tvcat.c (1576B)
       ---
            1 #include <u.h>
            2 #include <libc.h>
            3 #include <venti.h>
            4 #include <diskfs.h>
            5 #include <thread.h>
            6 
            7 void
            8 usage(void)
            9 {
           10         fprint(2, "usage: vcat [-z] score >diskfile\n");
           11         threadexitsall("usage");
           12 }
           13 
           14 void
           15 threadmain(int argc, char **argv)
           16 {
           17         extern int nfilereads;
           18         char *pref;
           19         int zerotoo;
           20         uchar score[VtScoreSize];
           21         u8int *zero;
           22         u32int i;
           23         u32int n;
           24         Block *b;
           25         Disk *disk;
           26         Fsys *fsys;
           27         VtCache *c;
           28         VtConn *z;
           29 
           30         zerotoo = 0;
           31         ARGBEGIN{
           32         case 'z':
           33                 zerotoo = 1;
           34                 break;
           35         default:
           36                 usage();
           37         }ARGEND
           38 
           39         if(argc != 1)
           40                 usage();
           41 
           42         fmtinstall('V', vtscorefmt);
           43 
           44         if(vtparsescore(argv[0], &pref, score) < 0)
           45                 sysfatal("bad score '%s'", argv[0]);
           46         if((z = vtdial(nil)) == nil)
           47                 sysfatal("vtdial: %r");
           48         if(vtconnect(z) < 0)
           49                 sysfatal("vtconnect: %r");
           50         if((c = vtcachealloc(z, 16384*32)) == nil)
           51                 sysfatal("vtcache: %r");
           52         if((disk = diskopenventi(c, score)) == nil)
           53                 sysfatal("diskopenventi: %r");
           54         if((fsys = fsysopen(disk)) == nil)
           55                 sysfatal("fsysopen: %r");
           56 
           57         zero = emalloc(fsys->blocksize);
           58         fprint(2, "%d blocks total\n", fsys->nblock);
           59         n = 0;
           60         for(i=0; i<fsys->nblock; i++){
           61                 if((b = fsysreadblock(fsys, i)) != nil){
           62                         if(pwrite(1, b->data, fsys->blocksize,
           63                             (u64int)fsys->blocksize*i) != fsys->blocksize)
           64                                 fprint(2, "error writing block %lud: %r\n", i);
           65                         n++;
           66                         blockput(b);
           67                 }else if(zerotoo || i==fsys->nblock-1)
           68                         if(pwrite(1, zero, fsys->blocksize,
           69                             (u64int)fsys->blocksize*i) != fsys->blocksize)
           70                                 fprint(2, "error writing block %lud: %r\n", i);
           71         }
           72         fprint(2, "%d blocks in use, %d file reads\n", n, nfilereads);
           73         threadexitsall(nil);
           74 }