git: 9front

Download patch

ref: 550eaf7a69b2436afd7c74640a3cb2b3db1cf2e1
parent: 07cab9063b14f16673a7bc1d6c78beadd25edf29
parent: faf7494e66d01a91b896dcb84e90dc38da998b8e
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Tue Sep 16 12:42:16 EDT 2014

merge

--- 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 @@
 		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;
 }
--