diff options
| author | cinap_lenrek <cinap_lenrek@felloff.net> | 2014-09-16 16:42:16 +0200 |
|---|---|---|
| committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2014-09-16 16:42:16 +0200 |
| commit | 187aad97beeb440e4dc938597370f3259b66c579 (patch) | |
| tree | ce2e46967b95f48b0b528422eb0b3d154e8363b9 | |
| parent | e5c47ca18e2ac3768b124edbd9f48310f3206d26 (diff) | |
| parent | e060bc6df6f04d5cffab38bc4b67145503ca60f3 (diff) | |
| download | plan9front-187aad97beeb440e4dc938597370f3259b66c579.tar.xz | |
merge
| -rw-r--r-- | sys/src/libauthsrv/authdial.c | 29 |
1 files changed, 22 insertions, 7 deletions
diff --git a/sys/src/libauthsrv/authdial.c b/sys/src/libauthsrv/authdial.c index c54803ba7..3c3352331 100644 --- a/sys/src/libauthsrv/authdial.c +++ b/sys/src/libauthsrv/authdial.c @@ -7,6 +7,7 @@ int authdial(char *netroot, char *dom) { + Ndbtuple *t, *nt; char *p; int rv; @@ -15,22 +16,36 @@ authdial(char *netroot, char *dom) return dial(netmkaddr("$auth", netroot, "ticket"), 0, 0, 0); /* look up an auth server in an authentication domain */ - p = csgetvalue(netroot, "authdom", dom, "auth", nil); + p = csgetvalue(netroot, "authdom", dom, "auth", &t); /* if that didn't work, just try the IP domain */ if(p == nil) - p = csgetvalue(netroot, "dom", dom, "auth", nil); + p = csgetvalue(netroot, "dom", dom, "auth", &t); + /* * if that didn't work, try p9auth.$dom. this is very helpful if * you can't edit /lib/ndb. */ - if(p == nil) + if(p == nil) { p = smprint("p9auth.%s", dom); - if(p == nil){ /* should no longer ever happen */ - werrstr("no auth server found for %s", dom); - return -1; + t = ndbnew("auth", p); } - rv = dial(netmkaddr(p, netroot, "ticket"), 0, 0, 0); free(p); + + /* + * allow multiple auth= attributes for backup auth servers, + * try each one in order. + */ + rv = -1; + for(nt = t; nt != nil; nt = nt->entry) { + if(strcmp(nt->attr, "auth") == 0) { + p = netmkaddr(nt->val, netroot, "ticket"); + rv = dial(p, 0, 0, 0); + if(rv >= 0) + break; + } + } + ndbfree(t); + return rv; } |
