diff options
| author | forsyth <forsyth@vitanuova.com> | 2009-12-15 21:49:42 +0000 |
|---|---|---|
| committer | forsyth <forsyth@vitanuova.com> | 2009-12-15 21:49:42 +0000 |
| commit | 2493b5a079897c5a607ea8ea381e4346dee8cb84 (patch) | |
| tree | 5e20455ae2cf03b418001f5a436ffe32199e3f17 | |
| parent | 3b28b169a99e08b4e7cc408963d9e79c3446a87f (diff) | |
20091215-2149
| -rw-r--r-- | appl/cmd/lockfs.b | 86 | ||||
| -rw-r--r-- | dis/lockfs.dis | bin | 13080 -> 13438 bytes |
2 files changed, 50 insertions, 36 deletions
diff --git a/appl/cmd/lockfs.b b/appl/cmd/lockfs.b index e15c897c..766c6f64 100644 --- a/appl/cmd/lockfs.b +++ b/appl/cmd/lockfs.b @@ -73,12 +73,19 @@ Uproc: type chan of (ref Ureq, chan of (ref Sys->FD, string)); maxqidpath := big 1; locks: list of ref Lockfile; lockdir: string; +authinfo: ref Keyring->Authinfo; timefd: ref Sys->FD; MAXCONN: con 20; verbose := 0; +usage() +{ + sys->fprint(stderr, "usage: lockfs [-A] [-a alg]... [-p addr] dir [mountpoint]\n"); + raise "fail:usage"; +} + badmodule(p: string) { sys->fprint(stderr, "lockfs: cannot load %s: %r\n", p); @@ -92,6 +99,9 @@ init(nil: ref Draw->Context, argv: list of string) styx = load Styx Styx->PATH; if (styx == nil) badmodule(Styx->PATH); + dial = load Dial Dial->PATH; + if (dial == nil) + badmodule(Dial->PATH); styx->init(); styxlib = load Styxlib Styxlib->PATH; if (styxlib == nil) @@ -100,9 +110,6 @@ init(nil: ref Draw->Context, argv: list of string) devgen = load Dirgenmod "$self"; if (devgen == nil) badmodule("self as Dirgenmod"); - dial = load Dial Dial->PATH; - if(dial == nil) - badmodule(Dial->PATH); timefd = sys->open("/dev/time", sys->OREAD); if (timefd == nil) { sys->fprint(stderr, "lockfs: cannot open /dev/time: %r\n"); @@ -112,52 +119,55 @@ init(nil: ref Draw->Context, argv: list of string) if (arg == nil) badmodule(Arg->PATH); arg->init(argv); - arg->setusage("lockfs [-A] [-e 'crypt hash'] ... [-k keyspec] [-p addr] dir [mountpoint]"); addr := ""; doauth := 1; algs: list of string; - keyspec: string; while ((opt := arg->opt()) != 0) { case opt { 'p' => - addr = arg->earg(); - 'k' => - addr = arg->earg(); - 'a' or 'e' => - algs = arg->earg() :: algs; + addr = arg->arg(); + 'a' => + alg := arg->arg(); + if (alg == nil) + usage(); + algs = alg :: algs; 'A' => doauth = 0; 'v' => verbose = 1; * => - arg->usage(); + usage(); } } argv = arg->argv(); if (argv == nil || (addr != nil && tl argv != nil)) - arg->usage(); + usage(); if (addr == nil) doauth = 0; # no authentication necessary for local mount if (doauth) { auth = load Auth Auth->PATH; if (auth == nil) badmodule(Auth->PATH); - auth->init(); + if ((e := auth->init()) != nil) { + sys->fprint(stderr, "lockfs: cannot init auth: %s\n", e); + raise "fail:errors"; + } + keyring = load Keyring Keyring->PATH; + if (keyring == nil) + badmodule(Keyring->PATH); + authinfo = keyring->readauthinfo("/usr/" + user() + "/keyring/default"); } mountpoint := lockdir = hd argv; if (tl argv != nil) mountpoint = hd tl argv; if (addr != nil) { - if (doauth){ - if(algs == nil) - algs = "none" :: nil; # XXX is this default a bad idea? - keyspec += " :alg='"+flatten(algs, ' ')+"'"; - } + if (doauth && algs == nil) + algs = "none" :: nil; # XXX is this default a bad idea? srvrq := chan of (ref Sys->FD, string, Uproc); srvsync := chan of (int, string); - spawn listener(addr, keyspec, srvrq, srvsync, algs); + spawn listener(addr, srvrq, srvsync, algs); (srvpid, err) := <-srvsync; srvsync = nil; if (srvpid == -1) { @@ -628,12 +638,12 @@ revrqlist(ls: list of ref Openreq) : list of ref Openreq } # addr should be, e.g. tcp!*!2345 -listener(addr: string, keyspec: string, ch: chan of (ref Sys->FD, string, Uproc), +listener(addr: string, ch: chan of (ref Sys->FD, string, Uproc), sync: chan of (int, string), algs: list of string) { addr = dial->netmkaddr(addr, "tcp", "33234"); c := dial->announce(addr); - if(c == nil) { + if (c == nil) { sync <-= (-1, sys->sprint("cannot anounce on %s: %r", addr)); return; } @@ -644,12 +654,12 @@ listener(addr: string, keyspec: string, ch: chan of (ref Sys->FD, string, Uproc) ch <-= (nil, sys->sprint("listen failed: %r"), nil); return; } - dfd := dial->accept(nc); + dfd := sys->open(nc.dir + "/data", Sys->ORDWR); if (dfd != nil) { if (algs == nil) ch <-= (dfd, nil, nil); else - spawn authenticator(dfd, keyspec, ch); + spawn authenticator(dfd, ch, algs); } } } @@ -657,9 +667,9 @@ listener(addr: string, keyspec: string, ch: chan of (ref Sys->FD, string, Uproc) # authenticate a connection, setting the user id appropriately, # and then act as a server, performing file operations # on behalf of the central process. -authenticator(dfd: ref Sys->FD, keyspec: string, ch: chan of (ref Sys->FD, string, Uproc)) +authenticator(dfd: ref Sys->FD, ch: chan of (ref Sys->FD, string, Uproc), algs: list of string) { - (fd, err) := auth->auth(keyspec, dfd, 1); + (fd, err) := auth->server(algs, authinfo, dfd, 1); if (fd == nil) { if (verbose) sys->fprint(stderr, "lockfs: authentication failed: %s\n", err); @@ -725,6 +735,21 @@ doreq(greq: ref Ureq): (ref Sys->FD, string) return (fd, err); } +netmkaddr(addr, net, svc: string): string +{ + if(net == nil) + net = "net"; + (n, nil) := sys->tokenize(addr, "!"); + if(n <= 1){ + if(svc== nil) + return sys->sprint("%s!%s", net, addr); + return sys->sprint("%s!%s!%s", net, addr, svc); + } + if(svc == nil || n > 2) + return addr; + return sys->sprint("%s!%s", addr, svc); +} + user(): string { fd := sys->open("/dev/user", sys->OREAD); @@ -751,14 +776,3 @@ now(): int return 0; return int (big string buf[0:n] / big 1000000); } - -flatten(l: list of string, sep: int): string -{ - s := ""; - for(; l != nil; l = tl l){ - if(s != "") - s[len s] = sep; - s += hd l; - } - return s; -} diff --git a/dis/lockfs.dis b/dis/lockfs.dis Binary files differindex 77dc8c3d..53906a49 100644 --- a/dis/lockfs.dis +++ b/dis/lockfs.dis |
