URI:
       tallow plan9-style branded disks as configs - 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
       ---
   DIR commit 91872ab97b7c9cabacef61f37b90a1af29f257af
   DIR parent c482feff4bc6002f0c1373a8d41e04f86dda5a21
  HTML Author: rsc <devnull@localhost>
       Date:   Thu,  3 May 2007 03:14:30 +0000
       
       allow plan9-style branded disks as configs
       
       Diffstat:
         M src/cmd/venti/srv/ifile.c           |      51 +++++++++++++++++++++++++++++--
         A src/cmd/venti/srv/readifile.c       |      29 +++++++++++++++++++++++++++++
       
       2 files changed, 77 insertions(+), 3 deletions(-)
       ---
   DIR diff --git a/src/cmd/venti/srv/ifile.c b/src/cmd/venti/srv/ifile.c
       t@@ -5,11 +5,56 @@
        int
        readifile(IFile *f, char *name)
        {
       +        int m;
       +        Part *p;
                ZBlock *b;
       -
       -        b = readfile(name);
       -        if(b == nil)
       +        u8int *z;
       +        
       +        p = initpart(name, OREAD);
       +        if(p == nil)
       +                return -1;
       +        b = alloczblock(8192, 1, 0);
       +        if(b == nil){
       +                seterr(EOk, "can't alloc for %s: %R", name);
       +                return -1;
       +        }
       +        if(p->size > PartBlank){
       +                /*
       +                 * this is likely a real venti partition, in which case
       +                 * we're looking for the config file stored as 8k at end of PartBlank.
       +                 */
       +                if(readpart(p, PartBlank-8192, b->data, 8192) < 0){
       +                        seterr(EOk, "can't read %s: %r", name);
       +                        freezblock(b);
       +                        freepart(p);
       +                        return -1;
       +                }
       +                m = 5+1+6+1;
       +                if(memcmp(b->data, "venti config\n", m) != 0){
       +                        seterr(EOk, "bad venti config magic in %s", name);
       +                        freezblock(b);
       +                        freepart(p);
       +                        return -1;
       +                }
       +                b->data += m;
       +                b->len -= m;
       +                z = memchr(b->data, 0, b->len);
       +                if(z)
       +                        b->len = z - b->data;
       +        }else if(p->size > 8192){
       +                seterr(EOk, "config file is too large");
       +                freepart(p);
       +                freezblock(b);
                        return -1;
       +        }else{
       +                freezblock(b);
       +                b = readfile(name);
       +                if(b == nil){
       +                        freepart(p);
       +                        return -1;
       +                }
       +        }
       +        freepart(p);
                f->name = name;
                f->b = b;
                f->pos = 0;
   DIR diff --git a/src/cmd/venti/srv/readifile.c b/src/cmd/venti/srv/readifile.c
       t@@ -0,0 +1,29 @@
       +#include "stdinc.h"
       +#include "dat.h"
       +#include "fns.h"
       +
       +void
       +usage(void)
       +{
       +        fprint(2, "usage: readifile file\n");
       +        threadexitsall("usage");
       +}
       +
       +void
       +threadmain(int argc, char *argv[])
       +{
       +        IFile ifile;
       +
       +        ARGBEGIN{
       +        default:
       +                usage();
       +        }ARGEND
       +        
       +        if(argc != 1)
       +                usage();
       +        
       +        if(readifile(&ifile, argv[0]) < 0)
       +                sysfatal("readifile %s: %r", argv[0]);
       +        write(1, ifile.b->data, ifile.b->len);
       +        threadexitsall(nil);
       +}