diff options
| author | Bill Paul <wpaul@FreeBSD.org> | 1995-04-09 19:26:23 +0000 |
|---|---|---|
| committer | Bill Paul <wpaul@FreeBSD.org> | 1995-04-09 19:26:23 +0000 |
| commit | f067dfeabcf09a6ffc55207f965e6549b61dbc3d (patch) | |
| tree | f5a27ea5fc84f68d18e36167c48209ad9ccdf945 | |
| parent | cb7533f5327755c1560651c63138cfa0afe066cb (diff) | |
Notes
| -rw-r--r-- | lib/libc/yp/yplib.c | 30 |
1 files changed, 24 insertions, 6 deletions
diff --git a/lib/libc/yp/yplib.c b/lib/libc/yp/yplib.c index 198365cb7f3c..b0b6b8b751df 100644 --- a/lib/libc/yp/yplib.c +++ b/lib/libc/yp/yplib.c @@ -28,7 +28,7 @@ */ #ifndef LINT -static char *rcsid = "$Id: yplib.c,v 1.2 1995/03/21 00:48:55 wpaul Exp $"; +static char *rcsid = "$Id: yplib.c,v 1.4 1995/03/24 21:21:37 wpaul Exp $"; #endif #include <sys/param.h> @@ -180,6 +180,7 @@ struct dom_binding **ypdb; int clnt_sock, fd, gpid; CLIENT *client; int new=0, r; + char *_defaultdom; gpid = getpid(); if( !(pid==-1 || pid==gpid) ) { @@ -251,10 +252,27 @@ again: goto gotit; } else { /* no lock on binding file, YP is dead. */ + /* + * XXX Not necessarily: the caller might be asking + * for a domain that we simply aren't bound to yet. + * Check that the binding file for the default domain + * is also unlocked before giving up. + */ close(fd); - if(new) - free(ysd); - return YPERR_YPBIND; + if (new) { + if (yp_get_default_domain(&_defaultdom)) + return YPERR_NODOM; + sprintf(path, "%s/%s.%d", BINDINGDIR, _defaultdom, 2); + if((fd=open(path, O_RDONLY)) > 0 && + (flock(fd, LOCK_EX|LOCK_NB)) == -1 && + errno==EWOULDBLOCK) { + close(fd); + } else { + close(fd); /* for paranoia's sake */ + free(ysd); + return YPERR_YPBIND; + } + } } } #endif @@ -262,7 +280,7 @@ again: bzero((char *)&clnt_sin, sizeof clnt_sin); clnt_sin.sin_family = AF_INET; clnt_sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK); - + clnt_sock = RPC_ANYSOCK; client = clnttcp_create(&clnt_sin, YPBINDPROG, YPBINDVERS, &clnt_sock, 0, 0); @@ -279,7 +297,7 @@ again: xdr_domainname, dom, xdr_ypbind_resp, &ypbr, tv); if(r != RPC_SUCCESS) { fprintf(stderr, - "YP: server for domain %s not responding, still trying\n", dom); + "YP: server for domain %s not responding, retrying\n", dom); clnt_destroy(client); ysd->dom_vers = -1; goto again; |
