From a00f7315512124c7193080ef4b3bcf64c171f1d2 Mon Sep 17 00:00:00 2001 From: Bill Paul Date: Sat, 15 Apr 1995 23:35:46 +0000 Subject: [PATCH] In environments with multiple NIS servers (a master and several slaves) one ypbind broadcast can yield several responses. This can lead to some confusion: the syslog message from ypbind will indicate a rebinding to the first server that responds, but we may subsequently change our binding to another server when the other responses arrive. This results in ypbind reporting 'server OK' to one address and ypwhich reporting a binding to another. The behavior of the rpc_received() function has been changed to prevent this: subsequent responses received after a binding has already been established are ignored. Rebinding gratuitously each time we get a new response is silly anyway. Also backed out the non-fix I made in my last ypbind commit. (Pass me the extra large conical hat, please.) (At some point I'm going to seriously re-work ypbind and the _yp_dobind() library function to bring them in line with SunOS's documented behavior: binding requests are supposed to be 'client-driven.' The _yp_dobind() function should be responsible for retrying connections in response to calls from client programs rather than having ypbind broadcasting continously until a server responds. The current setup works okay in normal operation, but we broadcast far too often than we should.) --- usr.sbin/ypbind/ypbind.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/usr.sbin/ypbind/ypbind.c b/usr.sbin/ypbind/ypbind.c index fc322a1d2f8c..29f92a0794bc 100644 --- a/usr.sbin/ypbind/ypbind.c +++ b/usr.sbin/ypbind/ypbind.c @@ -28,7 +28,7 @@ */ #ifndef LINT -static char rcsid[] = "$Id: ypbind.c,v 1.4 1995/02/26 04:42:48 wpaul Exp $"; +static char rcsid[] = "$Id: ypbind.c,v 1.5 1995/04/02 03:10:55 wpaul Exp $"; #endif #include @@ -671,6 +671,16 @@ int force; if( strcmp(ypdb->dom_domain, dom) == 0) break; + if (ypdb != NULL && ypdb->dom_vers == YPVERS && ypdb->dom_alive == 1 && + ypdb->dom_server_addr.sin_addr.s_addr != raddrp->sin_addr.s_addr) + /* + * We're received a second response to one of our broadcasts + * from another server, and we've already bound: drop + * the response on the floor. No sense changing servers + * for no reason. + */ + return; + if(ypdb==NULL) { if(force==0) return; @@ -713,15 +723,15 @@ int force; sprintf(path, "%s/%s.%d", BINDINGDIR, ypdb->dom_domain, ypdb->dom_vers); #ifdef O_SHLOCK - if( (fd=open(path, O_CREAT|O_SHLOCK|O_RDWR|O_TRUNC, 0644)) < 0) { + if( (fd=open(path, O_CREAT|O_SHLOCK|O_RDWR|O_TRUNC, 0644)) == -1) { (void)mkdir(BINDINGDIR, 0755); - if( (fd=open(path, O_CREAT|O_SHLOCK|O_RDWR|O_TRUNC, 0644)) < 0) + if( (fd=open(path, O_CREAT|O_SHLOCK|O_RDWR|O_TRUNC, 0644)) == -1) return; } #else - if( (fd=open(path, O_CREAT|O_RDWR|O_TRUNC, 0644)) < 0) { + if( (fd=open(path, O_CREAT|O_RDWR|O_TRUNC, 0644)) == -1) { (void)mkdir(BINDINGDIR, 0755); - if( (fd=open(path, O_CREAT|O_RDWR|O_TRUNC, 0644)) < 0) + if( (fd=open(path, O_CREAT|O_RDWR|O_TRUNC, 0644)) == -1) return; } flock(fd, LOCK_SH);