summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2014-09-16 16:42:16 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2014-09-16 16:42:16 +0200
commit187aad97beeb440e4dc938597370f3259b66c579 (patch)
treece2e46967b95f48b0b528422eb0b3d154e8363b9
parente5c47ca18e2ac3768b124edbd9f48310f3206d26 (diff)
parente060bc6df6f04d5cffab38bc4b67145503ca60f3 (diff)
downloadplan9front-187aad97beeb440e4dc938597370f3259b66c579.tar.xz
merge
-rw-r--r--sys/src/libauthsrv/authdial.c29
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;
}