summaryrefslogtreecommitdiff
path: root/appl/cmd
diff options
context:
space:
mode:
Diffstat (limited to 'appl/cmd')
-rw-r--r--appl/cmd/vacfs.b112
-rw-r--r--appl/cmd/vacget.b90
-rw-r--r--appl/cmd/vacput.b245
3 files changed, 268 insertions, 179 deletions
diff --git a/appl/cmd/vacfs.b b/appl/cmd/vacfs.b
index f707f568..9e7a024e 100644
--- a/appl/cmd/vacfs.b
+++ b/appl/cmd/vacfs.b
@@ -2,35 +2,36 @@ implement Vacfs;
include "sys.m";
sys: Sys;
+ sprint: import sys;
include "draw.m";
include "arg.m";
+include "dial.m";
+ dial: Dial;
include "string.m";
+ str: String;
include "daytime.m";
+ dt: Daytime;
include "venti.m";
+ venti: Venti;
+ Root, Entry, Score, Session: import venti;
+ Roottype, Dirtype, Pointertype0, Datatype: import venti;
include "vac.m";
+ vac: Vac;
+ Direntry, Vacdir, Vacfile: import vac;
include "styx.m";
styx: Styx;
Tmsg, Rmsg: import styx;
include "styxservers.m";
-
-str: String;
-daytime: Daytime;
-venti: Venti;
-vac: Vac;
-styxservers: Styxservers;
-
-print, sprint, fprint, fildes: import sys;
-Score, Session: import venti;
-Roottype, Dirtype, Pointertype0, Datatype: import venti;
-Root, Entry, Direntry, Metablock, Metaentry, Entrysize, Modeperm, Modeappend, Modeexcl, Modedir, Modesnapshot, Vacdir, Vacfile, Source: import vac;
-Styxserver, Fid, Navigator, Navop, Enotfound: import styxservers;
+ styxservers: Styxservers;
+ Styxserver, Fid, Navigator, Navop, Enotfound: import styxservers;
Vacfs: module {
init: fn(nil: ref Draw->Context, args: list of string);
};
-addr := "net!$venti!venti";
-dflag := pflag := 0;
+addr := "$venti";
+dflag: int;
+pflag: int;
session: ref Session;
ss: ref Styxserver;
@@ -183,7 +184,7 @@ getfile(qid: int): ref Elem.File
pick file := get(qid) {
File => return file;
}
- error("internal error, getfile");
+ fail("internal error, getfile");
return nil;
}
@@ -192,7 +193,7 @@ getdir(qid: int): ref Elem.Dir
pick d := get(qid) {
Dir => return d;
}
- error("internal error, getdir");
+ fail("internal error, getdir");
return nil;
}
@@ -200,8 +201,9 @@ init(nil: ref Draw->Context, args: list of string)
{
sys = load Sys Sys->PATH;
arg := load Arg Arg->PATH;
+ dial = load Dial Dial->PATH;
str = load String String->PATH;
- daytime = load Daytime Daytime->PATH;
+ dt = load Daytime Daytime->PATH;
venti = load Venti Venti->PATH;
styx = load Styx Styx->PATH;
styxservers = load Styxservers Styxservers->PATH;
@@ -213,7 +215,7 @@ init(nil: ref Draw->Context, args: list of string)
sys->pctl(sys->NEWPGRP, nil);
if(venti == nil || vac == nil)
- error("loading venti,vac");
+ fail("loading venti,vac");
arg->init(args);
arg->setusage(arg->progname()+" [-Ddp] [-a addr] [[tag:]score]");
@@ -221,11 +223,9 @@ init(nil: ref Draw->Context, args: list of string)
case ch {
'D' => styxservers->traceset(1);
'a' => addr = arg->earg();
- 'd' => dflag++;
- vac->dflag++;
+ 'd' => vac->dflag = dflag++;
'p' => pflag++;
- * => warn(sprint("bad option: -%c", ch));
- arg->usage();
+ * => arg->usage();
}
args = arg->argv();
if(len args > 1)
@@ -239,22 +239,23 @@ init(nil: ref Draw->Context, args: list of string)
if(tag == nil)
tag = "vac";
if(tag != "vac")
- error("bad score type: "+tag);
+ fail("bad score type: "+tag);
(ok, s) := Score.parse(scorestr);
if(ok != 0)
- error("bad score: "+scorestr);
+ fail("bad score: "+scorestr);
score = ref s;
}
- (cok, conn) := sys->dial(addr, nil);
- if(cok < 0)
- error(sprint("dialing %s: %r", addr));
+ addr = dial->netmkaddr(addr, "net", "venti");
+ cc := dial->dial(addr, nil);
+ if(cc == nil)
+ fail(sprint("dialing %s: %r", addr));
say("have connection");
- fd := conn.dfd;
+ fd := cc.dfd;
session = Session.new(fd);
if(session == nil)
- error(sprint("handshake: %r"));
+ fail(sprint("handshake: %r"));
say("have handshake");
rqid := 0;
@@ -262,14 +263,14 @@ init(nil: ref Draw->Context, args: list of string)
if(args == nil) {
de := Direntry.new();
de.uid = de.gid = de.mid = user();
- de.ctime = de.atime = de.mtime = daytime->now();
+ de.ctime = de.atime = de.mtime = dt->now();
de.mode = Vac->Modedir|8r755;
de.emode = Sys->DMDIR|8r755;
red = ref Elem.Dir(rqid, de, big 0, nil, rqid, 0, 0, nil);
} else {
(vd, de, err) := vac->vdroot(session, *score);
if(err != nil)
- error(err);
+ fail(err);
rqid = ++lastqid;
red = ref Elem.Dir(rqid, de, big 0, vd, rqid, 0, 0, nil);
}
@@ -284,12 +285,16 @@ init(nil: ref Draw->Context, args: list of string)
(msgc, ss) = Styxserver.new(sys->fildes(0), nav, big rqid);
for(;;) {
- pick m := <- msgc {
+ mm := <-msgc;
+ if(mm == nil)
+ fail("eof");
+
+ pick m := mm {
Readerror =>
- say("read error: "+m.error);
+ fail("read error: "+m.error);
Read =>
- say(sprint("have read, offset=%ubd count=%d", m.offset, m.count));
+ if(dflag) say(sprint("have read, offset=%ubd count=%d", m.offset, m.count));
(c, err) := ss.canread(m);
if(c == nil){
ss.reply(ref Rmsg.Error(m.tag, err));
@@ -353,14 +358,14 @@ navigator(c: chan of ref Navop)
loop:
for(;;) {
navop := <- c;
- say(sprint("have navop, path=%bd", navop.path));
+ if(dflag) say(sprint("have navop, path=%bd", navop.path));
pick n := navop {
Stat =>
- say(sprint("have stat"));
+ if(dflag) say(sprint("have stat"));
n.reply <-= (get(int n.path).stat(), nil);
Walk =>
- say(sprint("have walk, name=%q", n.name));
+ if(dflag) say(sprint("have walk, name=%q", n.name));
ed := getdir(int n.path);
(ne, err) := walk(ed, n.name);
if(err != nil) {
@@ -370,7 +375,7 @@ loop:
n.reply <-= (ne.stat(), nil);
Readdir =>
- say(sprint("have readdir path=%bd offset=%d count=%d", n.path, n.offset, n.count));
+ if(dflag) say(sprint("have readdir path=%bd offset=%d count=%d", n.path, n.offset, n.count));
if(n.path == big 0) {
n.reply <-= (nil, nil);
break;
@@ -423,22 +428,21 @@ loop:
user(): string
{
- if((fd := sys->open("/dev/user", Sys->OREAD)) != nil
- && (n := sys->read(fd, d := array[128] of byte, len d)) > 0)
+ fd := sys->open("/dev/user", Sys->OREAD);
+ if(fd != nil)
+ if((n := sys->read(fd, d := array[128] of byte, len d)) > 0)
return string d[:n];
return "nobody";
}
-error(s: string)
+pid(): int
{
- killgrp();
- fprint(fildes(2), "%s\n", s);
- raise "fail:"+s;
+ return sys->pctl(0, nil);
}
-warn(s: string)
+killgrp(pid: int)
{
- fprint(fildes(2), "%s\n", s);
+ sys->fprint(sys->open(sprint("/prog/%d/ctl", pid), sys->OWRITE), "killgrp");
}
say(s: string)
@@ -447,9 +451,17 @@ say(s: string)
warn(s);
}
-killgrp()
+fd2: ref Sys->FD;
+warn(s: string)
{
- fd := sys->open("/prog/"+string sys->pctl(0, nil)+"/ctl", sys->OWRITE);
- if(fd != nil)
- sys->fprint(fd, "killgrp\n");
+ if(fd2 == nil)
+ fd2 = sys->fildes(2);
+ sys->fprint(fd2, "%s\n", s);
+}
+
+fail(s: string)
+{
+ warn(s);
+ killgrp(pid());
+ raise "fail:"+s;
}
diff --git a/appl/cmd/vacget.b b/appl/cmd/vacget.b
index c14ad28a..f0491188 100644
--- a/appl/cmd/vacget.b
+++ b/appl/cmd/vacget.b
@@ -2,30 +2,33 @@ implement Vacget;
include "sys.m";
sys: Sys;
+ sprint: import sys;
include "draw.m";
include "bufio.m";
bufio: Bufio;
Iobuf: import bufio;
include "arg.m";
+include "dial.m";
+ dial: Dial;
include "string.m";
+ str: String;
include "venti.m";
+ venti: Venti;
+ Root, Entry, Score, Session: import venti;
include "vac.m";
-
-str: String;
-venti: Venti;
-vac: Vac;
-
-print, sprint, fprint, fildes: import sys;
-Score, Session: import venti;
-Roottype, Dirtype, Pointertype0, Datatype: import venti;
-Root, Entry, Direntry, Metablock, Metaentry, Entrysize, Modeperm, Modeappend, Modeexcl, Modedir, Modesnapshot, Vacdir, Vacfile, Source: import vac;
+ vac: Vac;
+ Direntry, Vacdir, Vacfile: import vac;
Vacget: module {
init: fn(nil: ref Draw->Context, args: list of string);
};
-addr := "net!$venti!venti";
-dflag := vflag := pflag := tflag := 0;
+addr := "$venti";
+dflag: int;
+vflag: int;
+pflag: int;
+tflag: int;
+
session: ref Session;
init(nil: ref Draw->Context, args: list of string)
@@ -33,26 +36,25 @@ init(nil: ref Draw->Context, args: list of string)
sys = load Sys Sys->PATH;
bufio = load Bufio Bufio->PATH;
arg := load Arg Arg->PATH;
+ dial = load Dial Dial->PATH;
str = load String String->PATH;
venti = load Venti Venti->PATH;
vac = load Vac Vac->PATH;
if(venti == nil || vac == nil)
- error("loading venti,vac");
+ fail("loading venti,vac");
venti->init();
vac->init();
arg->init(args);
- arg->setusage(sprint("%s [-dtv] [-a addr] [tag:]score", arg->progname()));
+ arg->setusage(arg->progname()+" [-dtv] [-a addr] [tag:]score");
while((c := arg->opt()) != 0)
case c {
'a' => addr = arg->earg();
- 'd' => dflag++;
- vac->dflag++;
+ 'd' => vac->dflag = dflag++;
'p' => pflag++;
't' => tflag++;
'v' => vflag++;
- * => warn(sprint("bad option: -%c", c));
- arg->usage();
+ * => arg->usage();
}
args = arg->argv();
if(len args != 1)
@@ -64,27 +66,28 @@ init(nil: ref Draw->Context, args: list of string)
if(tag == nil)
tag = "vac";
if(tag != "vac")
- error("bad score type: "+tag);
+ fail("bad score type: "+tag);
(sok, score) := Score.parse(scorestr);
if(sok != 0)
- error("bad score: "+scorestr);
+ fail("bad score: "+scorestr);
say("have score");
- (cok, conn) := sys->dial(addr, nil);
- if(cok < 0)
- error(sprint("dialing %s: %r", addr));
+ addr = dial->netmkaddr(addr, "net", "venti");
+ cc := dial->dial(addr, nil);
+ if(cc == nil)
+ fail(sprint("dialing %s: %r", addr));
say("have connection");
- fd := conn.dfd;
+ fd := cc.dfd;
session = Session.new(fd);
if(session == nil)
- error(sprint("handshake: %r"));
+ fail(sprint("handshake: %r"));
say("have handshake");
(vd, nil, err) := vac->vdroot(session, score);
if(err != nil)
- error(err);
+ fail(err);
say("starting walk");
walk(".", vd);
@@ -120,21 +123,21 @@ walk(path: string, vd: ref Vacdir)
for(;;) {
(n, de) := vd.readdir();
if(n < 0)
- error(sprint("reading direntry in %s: %r", path));
+ fail(sprint("reading direntry in %s: %r", path));
if(n == 0)
break;
- say("walk: have direntry, elem="+de.elem);
+ if(dflag) say("walk: have direntry, elem="+de.elem);
newpath := path+"/"+de.elem;
(e, me) := vd.open(de);
if(e == nil)
- error(sprint("reading entry for %s: %r", newpath));
+ fail(sprint("reading entry for %s: %r", newpath));
- oflags := de.mode&~(Modeperm|Modeappend|Modeexcl|Modedir|Modesnapshot);
+ oflags := de.mode&~(vac->Modeperm|vac->Modeappend|vac->Modeexcl|vac->Modedir|vac->Modesnapshot);
if(oflags)
warn(sprint("%s: not all bits in mode can be set: 0x%x", newpath, oflags));
if(tflag || vflag)
- print("%s\n", newpath);
+ sys->print("%s\n", newpath);
if(me != nil) {
if(!tflag)
@@ -148,10 +151,10 @@ walk(path: string, vd: ref Vacdir)
say("writing file");
fd := create(newpath, sys->OWRITE, de);
if(fd == nil)
- error(sprint("creating %s: %r", newpath));
+ fail(sprint("creating %s: %r", newpath));
bio := bufio->fopen(fd, bufio->OWRITE);
if(bio == nil)
- error(sprint("bufio fopen %s: %r", newpath));
+ fail(sprint("bufio fopen %s: %r", newpath));
buf := array[sys->ATOMICIO] of byte;
vf := Vacfile.new(session, e);
@@ -160,15 +163,15 @@ walk(path: string, vd: ref Vacdir)
if(rn == 0)
break;
if(rn < 0)
- error(sprint("reading vac %s: %r", newpath));
+ fail(sprint("reading vac %s: %r", newpath));
wn := bio.write(buf, rn);
if(wn != rn)
- error(sprint("writing local %s: %r", newpath));
+ fail(sprint("writing local %s: %r", newpath));
}
bok := bio.flush();
bio.close();
if(bok == bufio->ERROR || bok == bufio->EOF)
- error(sprint("bufio close: %r"));
+ fail(sprint("bufio close: %r"));
if(pflag) {
d := sys->nulldir;
@@ -181,19 +184,22 @@ walk(path: string, vd: ref Vacdir)
}
}
-error(s: string)
+say(s: string)
{
- fprint(fildes(2), "%s\n", s);
- raise "fail:"+s;
+ if(dflag)
+ warn(s);
}
+fd2: ref Sys->FD;
warn(s: string)
{
- fprint(fildes(2), "%s\n", s);
+ if(fd2 == nil)
+ fd2 = sys->fildes(2);
+ sys->fprint(fd2, "%s\n", s);
}
-say(s: string)
+fail(s: string)
{
- if(dflag)
- warn(s);
+ warn(s);
+ raise "fail:"+s;
}
diff --git a/appl/cmd/vacput.b b/appl/cmd/vacput.b
index e01bdd36..a1a07a48 100644
--- a/appl/cmd/vacput.b
+++ b/appl/cmd/vacput.b
@@ -2,81 +2,113 @@ implement Vacput;
include "sys.m";
sys: Sys;
+ sprint: import sys;
include "draw.m";
+include "arg.m";
include "daytime.m";
+ dt: Daytime;
include "bufio.m";
bufio: Bufio;
Iobuf: import bufio;
-include "arg.m";
+include "dial.m";
+ dial: Dial;
include "string.m";
+ str: String;
+include "tables.m";
+ tables: Tables;
+ Strhash: import tables;
include "venti.m";
+ venti: Venti;
+ Root, Entry, Score, Session: import venti;
include "vac.m";
-
-daytime: Daytime;
-str: String;
-venti: Venti;
-vac: Vac;
-
-print, sprint, fprint, fildes: import sys;
-Score, Session: import venti;
-Roottype, Dirtype, Pointertype0, Datatype: import venti;
-Root, Entry, Direntry, Metablock, Metaentry, Entrysize, File, Sink, MSink: import vac;
+ vac: Vac;
+ Direntry, File, Sink, MSink: import vac;
Vacput: module {
init: fn(nil: ref Draw->Context, args: list of string);
};
-addr := "net!$venti!venti";
-dflag := 0;
-vflag := 0;
+addr := "$venti";
+dflag: int;
+iflag: int;
+vflag: int;
+xflag: int;
blocksize := vac->Dsize;
+uid: string;
+gid: string;
+
+pathgen: big;
+
+bout: ref Iobuf;
session: ref Session;
name := "vac";
+itab,
+xtab: ref Strhash[string]; # include/exclude paths
init(nil: ref Draw->Context, args: list of string)
{
sys = load Sys Sys->PATH;
- daytime = load Daytime Daytime->PATH;
+ dt = load Daytime Daytime->PATH;
bufio = load Bufio Bufio->PATH;
arg := load Arg Arg->PATH;
+ dial = load Dial Dial->PATH;
str = load String String->PATH;
+ tables = load Tables Tables->PATH;
venti = load Venti Venti->PATH;
vac = load Vac Vac->PATH;
if(venti == nil || vac == nil)
- error("loading venti,vac");
+ fail("loading venti,vac");
venti->init();
vac->init();
arg->init(args);
- arg->setusage(sprint("%s [-dtv] [-a addr] [-b blocksize] [-n name] path ...", arg->progname()));
+ arg->setusage(arg->progname()+" [-dv] [-i | -x] [-a addr] [-b blocksize] [-n name] [-u uid] [-g gid] path ...");
while((c := arg->opt()) != 0)
case c {
'a' => addr = arg->earg();
'b' => blocksize = int arg->earg();
'n' => name = arg->earg();
- 'd' => dflag++;
- vac->dflag++;
+ 'd' => vac->dflag = dflag++;
+ 'i' => iflag++;
'v' => vflag++;
- * => warn(sprint("bad option: -%c", c));
- arg->usage();
+ 'x' => xflag++;
+ 'g' => gid = arg->earg();
+ 'u' => uid = arg->earg();
+ * => arg->usage();
}
args = arg->argv();
if(len args == 0)
arg->usage();
+ if(iflag && xflag) {
+ warn("cannot have both -i and -x");
+ arg->usage();
+ }
- (cok, conn) := sys->dial(addr, nil);
- if(cok < 0)
- error(sprint("dialing %s: %r", addr));
+ if(vflag)
+ bout = bufio->fopen(sys->fildes(1), bufio->OWRITE);
+
+ if(iflag || xflag) {
+ t := readpaths();
+ if(iflag)
+ itab = t;
+ else
+ xtab = t;
+ }
+
+ addr = dial->netmkaddr(addr, "net", "venti");
+ cc := dial->dial(addr, nil);
+ if(cc == nil)
+ fail(sprint("dialing %s: %r", addr));
say("have connection");
- fd := conn.dfd;
+ fd := cc.dfd;
session = Session.new(fd);
if(session == nil)
- error(sprint("handshake: %r"));
+ fail(sprint("handshake: %r"));
say("have handshake");
topde: ref Direntry;
- if(len args == 1 && ((nil, d) := sys->stat(hd args)).t0 == 0 && d.mode&Sys->DMDIR) {
+ if(len args == 1 && ((nil, d) := sys->stat(hd args)).t0 == 0 && (d.mode&Sys->DMDIR)) {
topde = Direntry.mk(d);
topde.elem = name;
} else {
@@ -86,7 +118,12 @@ init(nil: ref Draw->Context, args: list of string)
topde.mode = 8r777|Vac->Modedir;
topde.mtime = topde.atime = 0;
}
- topde.ctime = daytime->now();
+ topde.qid = pathgen++;
+ if(uid != nil)
+ topde.uid = uid;
+ if(gid != nil)
+ topde.gid = gid;
+ topde.ctime = dt->now();
s := Sink.new(session, blocksize);
ms := MSink.new(session, blocksize);
@@ -94,66 +131,93 @@ init(nil: ref Draw->Context, args: list of string)
writepath(hd args, s, ms);
say("tree written");
+ if(vflag && bout.flush() == bufio->ERROR)
+ fail(sprint("write stdout: %r"));
+
e0 := s.finish();
if(e0 == nil)
- error(sprint("writing top entry: %r"));
+ fail(sprint("writing top entry: %r"));
e1 := ms.finish();
if(e1 == nil)
- error(sprint("writing top meta entry: %r"));
- say(sprint("top entries written (%s, %s)", e0.score.text(), e1.score.text()));
+ fail(sprint("writing top meta entry: %r"));
+ topde.qidspace = 1;
+ topde.qidoff = big 0;
+ topde.qidmax = pathgen;
s2 := MSink.new(session, blocksize);
if(s2.add(topde) < 0)
- error(sprint("adding direntry for top entries: %r"));
+ fail(sprint("adding direntry for top entries: %r"));
e2 := s2.finish();
say("top meta entry written, "+e2.score.text());
- td := array[Entrysize*3] of byte;
- td[0*Entrysize:] = e0.pack();
- td[1*Entrysize:] = e1.pack();
- td[2*Entrysize:] = e2.pack();
- (tok, tscore) := session.write(Dirtype, td);
+ td := array[venti->Entrysize*3] of byte;
+ td[0*venti->Entrysize:] = e0.pack();
+ td[1*venti->Entrysize:] = e1.pack();
+ td[2*venti->Entrysize:] = e2.pack();
+ (tok, tscore) := session.write(venti->Dirtype, td);
if(tok < 0)
- error(sprint("writing top-level entries: %r"));
- say("top entry written, "+tscore.text());
+ fail(sprint("writing top-level entries: %r"));
- root := Root.new(name, "vac", tscore, blocksize, nil);
+ root := ref Root(venti->Rootversion, name, "vac", tscore, blocksize, nil);
rd := root.pack();
if(rd == nil)
- error(sprint("root pack: %r"));
- (rok, rscore) := session.write(Roottype, rd);
+ fail(sprint("root pack: %r"));
+ (rok, rscore) := session.write(venti->Roottype, rd);
if(rok < 0)
- error(sprint("writing root score: %r"));
- say("root written, "+rscore.text());
- print("vac:%s\n", rscore.text());
+ fail(sprint("writing root score: %r"));
+ sys->print("vac:%s\n", rscore.text());
if(session.sync() < 0)
- error(sprint("syncing server: %r"));
+ fail(sprint("syncing server: %r"));
+}
+
+readpaths(): ref Strhash[string]
+{
+ t := Strhash[string].new(199, nil);
+ b := bufio->fopen(sys->fildes(0), bufio->OREAD);
+ if(b == nil)
+ fail(sprint("fopen: %r"));
+ for(;;) {
+ s := b.gets('\n');
+ if(s == nil)
+ break;
+ if(s[len s-1] == '\n')
+ s = s[:len s-1];
+ t.add(s, s);
+ }
+ return t;
+}
+
+usepath(p: string): int
+{
+ if(itab != nil)
+ return itab.find(p) != nil;
+ if(xtab != nil)
+ return xtab.find(p) == nil;
+ return 1;
}
writepath(path: string, s: ref Sink, ms: ref MSink)
{
- if(vflag)
- print("%s\n", path);
-say("writepath "+path);
+ if(!usepath(path))
+ return;
+
+ if(vflag && bout.puts(path+"\n") == bufio->ERROR)
+ fail(sprint("write stdout: %r"));
+
fd := sys->open(path, sys->OREAD);
if(fd == nil)
- error(sprint("opening %s: %r", path));
+ fail(sprint("opening %s: %r", path));
(ok, dir) := sys->fstat(fd);
if(ok < 0)
- error(sprint("fstat %s: %r", path));
-say("writepath: file opened");
- if(dir.mode&sys->DMAUTH) {
- warn(path+": is auth file, skipping");
- return;
- }
- if(dir.mode&sys->DMTMP) {
- warn(path+": is temporary file, skipping");
- return;
- }
+ fail(sprint("fstat %s: %r", path));
+ if(dir.mode&sys->DMAUTH)
+ return warn(path+": is auth file, skipping");
+ if(dir.mode&sys->DMTMP)
+ return warn(path+": is temporary file, skipping");
e, me: ref Entry;
de: ref Direntry;
+ qid := pathgen++;
if(dir.mode & sys->DMDIR) {
-say("writepath: file is dir");
ns := Sink.new(session, blocksize);
nms := MSink.new(session, blocksize);
for(;;) {
@@ -161,7 +225,7 @@ say("writepath: file is dir");
if(n == 0)
break;
if(n < 0)
- error(sprint("dirread %s: %r", path));
+ fail(sprint("dirread %s: %r", path));
for(i := 0; i < len dirs; i++) {
d := dirs[i];
npath := path+"/"+d.name;
@@ -170,45 +234,49 @@ say("writepath: file is dir");
}
e = ns.finish();
if(e == nil)
- error(sprint("error flushing dirsink for %s: %r", path));
+ fail(sprint("error flushing dirsink for %s: %r", path));
me = nms.finish();
if(me == nil)
- error(sprint("error flushing metasink for %s: %r", path));
+ fail(sprint("error flushing metasink for %s: %r", path));
} else {
-say("writepath: file is normale file");
e = writefile(path, fd);
if(e == nil)
- error(sprint("error flushing filesink for %s: %r", path));
+ fail(sprint("error flushing filesink for %s: %r", path));
}
-say("writepath: wrote path, "+e.score.text());
+ case dir.name {
+ "/" => dir.name = "root";
+ "." => dir.name = "dot";
+ }
de = Direntry.mk(dir);
-say("writepath: have direntry");
+ de.qid = qid;
+ if(uid != nil)
+ de.uid = uid;
+ if(gid != nil)
+ de.gid = gid;
i := s.add(e);
if(i < 0)
- error(sprint("adding entry to sink: %r"));
+ fail(sprint("adding entry to sink: %r"));
mi := 0;
if(me != nil)
mi = s.add(me);
if(mi < 0)
- error(sprint("adding mentry to sink: %r"));
+ fail(sprint("adding mentry to sink: %r"));
de.entry = i;
de.mentry = mi;
i = ms.add(de);
if(i < 0)
- error(sprint("adding direntry to msink: %r"));
-say("writepath done");
+ fail(sprint("adding direntry to msink: %r"));
}
writefile(path: string, fd: ref Sys->FD): ref Entry
{
bio := bufio->fopen(fd, bufio->OREAD);
if(bio == nil)
- error(sprint("bufio opening %s: %r", path));
- say(sprint("bufio opened path %s", path));
+ fail(sprint("bufio opening %s: %r", path));
- f := File.new(session, Datatype, blocksize);
+ f := File.new(session, venti->Datatype, blocksize);
for(;;) {
buf := array[blocksize] of byte;
n := 0;
@@ -218,13 +286,12 @@ writefile(path: string, fd: ref Sys->FD): ref Entry
if(have == 0)
break;
if(have < 0)
- error(sprint("reading %s: %r", path));
+ fail(sprint("reading %s: %r", path));
n += have;
}
- say(sprint("have buf, length %d", n));
if(f.write(buf[:n]) < 0)
- error(sprint("writing %s: %r", path));
+ fail(sprint("writing %s: %r", path));
if(n != len buf)
break;
}
@@ -234,21 +301,19 @@ writefile(path: string, fd: ref Sys->FD): ref Entry
user(): string
{
- if((fd := sys->open("/dev/user", Sys->OREAD)) != nil
- && (n := sys->read(fd, d := array[128] of byte, len d)) > 0)
+ fd := sys->open("/dev/user", Sys->OREAD);
+ if(fd != nil)
+ if((n := sys->read(fd, d := array[128] of byte, len d)) > 0)
return string d[:n];
return "nobody";
}
-error(s: string)
-{
- warn(s);
- raise "fail:"+s;
-}
-
+fd2: ref Sys->FD;
warn(s: string)
{
- fprint(fildes(2), "%s\n", s);
+ if(fd2 == nil)
+ fd2 = sys->fildes(2);
+ sys->fprint(fd2, "%s\n", s);
}
say(s: string)
@@ -256,3 +321,9 @@ say(s: string)
if(dflag)
warn(s);
}
+
+fail(s: string)
+{
+ warn(s);
+ raise "fail:"+s;
+}