diff options
Diffstat (limited to 'appl/cmd/lockfs.b')
| -rw-r--r-- | appl/cmd/lockfs.b | 93 |
1 files changed, 42 insertions, 51 deletions
diff --git a/appl/cmd/lockfs.b b/appl/cmd/lockfs.b index 1b958de2..e15c897c 100644 --- a/appl/cmd/lockfs.b +++ b/appl/cmd/lockfs.b @@ -16,6 +16,8 @@ include "keyring.m"; keyring: Keyring; include "security.m"; auth: Auth; +include "dial.m"; + dial: Dial; Lockfs: module { init: fn(nil: ref Draw->Context, argv: list of string); @@ -71,19 +73,12 @@ 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); @@ -105,6 +100,9 @@ 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"); @@ -114,55 +112,52 @@ 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->arg(); - 'a' => - alg := arg->arg(); - if (alg == nil) - usage(); - algs = alg :: algs; + addr = arg->earg(); + 'k' => + addr = arg->earg(); + 'a' or 'e' => + algs = arg->earg() :: algs; 'A' => doauth = 0; 'v' => verbose = 1; * => - usage(); + arg->usage(); } } argv = arg->argv(); if (argv == nil || (addr != nil && tl argv != nil)) - usage(); + arg->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); - 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"); + auth->init(); } mountpoint := lockdir = hd argv; if (tl argv != nil) mountpoint = hd tl argv; if (addr != nil) { - if (doauth && algs == nil) - algs = "none" :: nil; # XXX is this default a bad idea? + if (doauth){ + if(algs == nil) + algs = "none" :: nil; # XXX is this default a bad idea? + keyspec += " :alg='"+flatten(algs, ' ')+"'"; + } srvrq := chan of (ref Sys->FD, string, Uproc); srvsync := chan of (int, string); - spawn listener(addr, srvrq, srvsync, algs); + spawn listener(addr, keyspec, srvrq, srvsync, algs); (srvpid, err) := <-srvsync; srvsync = nil; if (srvpid == -1) { @@ -633,28 +628,28 @@ revrqlist(ls: list of ref Openreq) : list of ref Openreq } # addr should be, e.g. tcp!*!2345 -listener(addr: string, ch: chan of (ref Sys->FD, string, Uproc), +listener(addr: string, keyspec: string, ch: chan of (ref Sys->FD, string, Uproc), sync: chan of (int, string), algs: list of string) { - addr = netmkaddr(addr, "tcp", "33234"); - (ok, c) := sys->announce(addr);; - if (ok == -1) { + addr = dial->netmkaddr(addr, "tcp", "33234"); + c := dial->announce(addr); + if(c == nil) { sync <-= (-1, sys->sprint("cannot anounce on %s: %r", addr)); return; } sync <-= (sys->pctl(0, nil), nil); for (;;) { - (n, nc) := sys->listen(c); - if (n == -1) { + nc := dial->listen(c); + if (nc == nil) { ch <-= (nil, sys->sprint("listen failed: %r"), nil); return; } - dfd := sys->open(nc.dir + "/data", Sys->ORDWR); + dfd := dial->accept(nc); if (dfd != nil) { if (algs == nil) ch <-= (dfd, nil, nil); else - spawn authenticator(dfd, ch, algs); + spawn authenticator(dfd, keyspec, ch); } } } @@ -662,9 +657,9 @@ listener(addr: 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, ch: chan of (ref Sys->FD, string, Uproc), algs: list of string) +authenticator(dfd: ref Sys->FD, keyspec: string, ch: chan of (ref Sys->FD, string, Uproc)) { - (fd, err) := auth->server(algs, authinfo, dfd, 1); + (fd, err) := auth->auth(keyspec, dfd, 1); if (fd == nil) { if (verbose) sys->fprint(stderr, "lockfs: authentication failed: %s\n", err); @@ -730,21 +725,6 @@ 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); @@ -771,3 +751,14 @@ 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; +} |
