summaryrefslogtreecommitdiff
path: root/appl/cmd/lockfs.b
diff options
context:
space:
mode:
Diffstat (limited to 'appl/cmd/lockfs.b')
-rw-r--r--appl/cmd/lockfs.b93
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;
+}