summaryrefslogtreecommitdiff
path: root/lib/libc/yp
diff options
context:
space:
mode:
authorJordan K. Hubbard <jkh@FreeBSD.org>1996-06-03 05:12:29 +0000
committerJordan K. Hubbard <jkh@FreeBSD.org>1996-06-03 05:12:29 +0000
commitaccd7f182e87d2a1d578214211ee7ded32753803 (patch)
tree90de65019704d8a469505b67d00c11e813d480e0 /lib/libc/yp
parentc3287ad65e82f73d993c7537d1fc5a7a16199449 (diff)
Notes
Diffstat (limited to 'lib/libc/yp')
-rw-r--r--lib/libc/yp/Makefile.inc13
-rw-r--r--lib/libc/yp/xdryp.c444
-rw-r--r--lib/libc/yp/yplib.c321
3 files changed, 232 insertions, 546 deletions
diff --git a/lib/libc/yp/Makefile.inc b/lib/libc/yp/Makefile.inc
index 9afbedf26150..529de751828e 100644
--- a/lib/libc/yp/Makefile.inc
+++ b/lib/libc/yp/Makefile.inc
@@ -1,8 +1,17 @@
# from: @(#)Makefile.inc 5.3 (Berkeley) 2/20/91
-# $Id: Makefile.inc,v 1.1 1993/11/01 23:56:27 paul Exp $
+# $Id: Makefile.inc,v 1.1 1994/08/07 23:04:53 wollman Exp $
# yp sources
.PATH: ${.CURDIR}/yp
-SRCS+= xdryp.c yplib.c
+SRCS+= xdryp.c yp_xdr.c yplib.c
+CLEANFILES+= yp_xdr.c yp.h
+RPCSRC= ${.DESTDIR}/usr/include/rpcsvc/yp.x
+RPCGEN= rpcgen
+
+yp_xdr.c: ${RPCSRC} yp.h
+ ${RPCGEN} -c -o ${.TARGET} ${RPCSRC}
+
+yp.h: ${RPCSRC}
+ ${RPCGEN} -h -o ${.TARGET} ${RPCSRC}
diff --git a/lib/libc/yp/xdryp.c b/lib/libc/yp/xdryp.c
index c12250b70aa4..2bba485c9af5 100644
--- a/lib/libc/yp/xdryp.c
+++ b/lib/libc/yp/xdryp.c
@@ -28,76 +28,25 @@
*/
#ifndef LINT
-static char *rcsid = "$Id: xdryp.c,v 1.2 1995/04/02 01:02:17 wpaul Exp $";
+static char *rcsid = "$Id: xdryp.c,v 1.3 1995/04/02 19:58:29 wpaul Exp $";
#endif
-#include <sys/param.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <ctype.h>
#include <rpc/rpc.h>
-#include <rpc/xdr.h>
-#include <rpcsvc/yp_prot.h>
-#include <rpcsvc/ypclnt.h>
+#include <rpcsvc/yp.h>
extern int (*ypresp_allfn)();
extern void *ypresp_data;
-struct ypresp_all {
- bool_t more;
- union {
- struct ypresp_key_val val;
- } ypresp_all_u;
-};
-
-enum ypxfrstat {
- YPXFR_SUCC = 1,
- YPXFR_AGE = 2,
- YPXFR_NOMAP = -1,
- YPXFR_NODOM = -2,
- YPXFR_RSRC = -3,
- YPXFR_RPC = -4,
- YPXFR_MADDR = -5,
- YPXFR_YPERR = -6,
- YPXFR_BADARGS = -7,
- YPXFR_DBM = -8,
- YPXFR_FILE = -9,
- YPXFR_SKEW = -10,
- YPXFR_CLEAR = -11,
- YPXFR_FORCE = -12,
- YPXFR_XFRERR = -13,
- YPXFR_REFUSED = -14,
-};
-
-struct ypresp_xfr {
- u_int transid;
- enum ypxfrstat xfrstat;
-};
-
-bool_t
-xdr_domainname(xdrs, objp)
-XDR *xdrs;
-char *objp;
-{
- if (!xdr_string(xdrs, &objp, YPMAXDOMAIN)) {
- return (FALSE);
- }
- return (TRUE);
-}
-
-bool_t
-xdr_peername(xdrs, objp)
-XDR *xdrs;
-char *objp;
-{
- if (!xdr_string(xdrs, &objp, YPMAXPEER)) {
- return (FALSE);
- }
- return (TRUE);
-}
+/*
+ * I'm leaving the xdr_datum() function in purely for backwards
+ * compatibility. yplib.c doesn't actually use it, but it's listed
+ * in yp_prot.h as being available, so it's probably a good idea to
+ * leave it in in case somebody goes looking for it.
+ */
+typedef struct {
+ char *dptr;
+ int dsize;
+} datum;
bool_t
xdr_datum(xdrs, objp)
@@ -111,191 +60,6 @@ datum *objp;
}
bool_t
-xdr_mapname(xdrs, objp)
-XDR *xdrs;
-char *objp;
-{
- if (!xdr_string(xdrs, &objp, YPMAXMAP)) {
- return (FALSE);
- }
- return (TRUE);
-}
-
-bool_t
-xdr_ypreq_key(xdrs, objp)
-XDR *xdrs;
-struct ypreq_key *objp;
-{
- if (!xdr_domainname(xdrs, objp->domain)) {
- return (FALSE);
- }
- if (!xdr_mapname(xdrs, objp->map)) {
- return (FALSE);
- }
- if (!xdr_datum(xdrs, &objp->keydat)) {
- return (FALSE);
- }
- return (TRUE);
-}
-
-bool_t
-xdr_ypreq_nokey(xdrs, objp)
-XDR *xdrs;
-struct ypreq_nokey *objp;
-{
- if (!xdr_domainname(xdrs, objp->domain)) {
- return (FALSE);
- }
- if (!xdr_mapname(xdrs, objp->map)) {
- return (FALSE);
- }
- return (TRUE);
-}
-
-bool_t
-xdr_yp_inaddr(xdrs, objp)
-XDR *xdrs;
-struct in_addr *objp;
-{
- if (!xdr_opaque(xdrs, (caddr_t)&objp->s_addr, sizeof objp->s_addr)) {
- return (FALSE);
- }
- return (TRUE);
-}
-
-bool_t
-xdr_ypbind_binding(xdrs, objp)
-XDR *xdrs;
-struct ypbind_binding *objp;
-{
- if (!xdr_yp_inaddr(xdrs, &objp->ypbind_binding_addr)) {
- return (FALSE);
- }
- if (!xdr_opaque(xdrs, (void *)&objp->ypbind_binding_port,
- sizeof objp->ypbind_binding_port)) {
- return (FALSE);
- }
- return (TRUE);
-}
-
-bool_t
-xdr_ypbind_resptype(xdrs, objp)
-XDR *xdrs;
-enum ypbind_resptype *objp;
-{
- if (!xdr_enum(xdrs, (enum_t *)objp)) {
- return (FALSE);
- }
- return (TRUE);
-}
-
-bool_t
-xdr_ypstat(xdrs, objp)
-XDR *xdrs;
-enum ypbind_resptype *objp;
-{
- if (!xdr_enum(xdrs, (enum_t *)objp)) {
- return (FALSE);
- }
- return (TRUE);
-}
-
-bool_t
-xdr_ypbind_resp(xdrs, objp)
-XDR *xdrs;
-struct ypbind_resp *objp;
-{
- if (!xdr_ypbind_resptype(xdrs, &objp->ypbind_status)) {
- return (FALSE);
- }
- switch (objp->ypbind_status) {
- case YPBIND_FAIL_VAL:
- if (!xdr_u_int(xdrs, (u_int *)&objp->ypbind_respbody.ypbind_error)) {
- return (FALSE);
- }
- break;
- case YPBIND_SUCC_VAL:
- if (!xdr_ypbind_binding(xdrs, &objp->ypbind_respbody.ypbind_bindinfo)) {
- return (FALSE);
- }
- break;
- default:
- return (FALSE);
- }
- return (TRUE);
-}
-
-bool_t
-xdr_ypresp_val(xdrs, objp)
-XDR *xdrs;
-struct ypresp_val *objp;
-{
- if (!xdr_ypstat(xdrs, &objp->status)) {
- return (FALSE);
- }
- if (!xdr_datum(xdrs, &objp->valdat)) {
- return (FALSE);
- }
- return (TRUE);
-}
-
-bool_t
-xdr_ypbind_setdom(xdrs, objp)
-XDR *xdrs;
-struct ypbind_setdom *objp;
-{
- if (!xdr_domainname(xdrs, objp->ypsetdom_domain)) {
- return (FALSE);
- }
- if (!xdr_ypbind_binding(xdrs, &objp->ypsetdom_binding)) {
- return (FALSE);
- }
- if (!xdr_u_short(xdrs, &objp->ypsetdom_vers)) {
- return (FALSE);
- }
- return (TRUE);
-}
-
-bool_t
-xdr_ypresp_key_val(xdrs, objp)
-XDR *xdrs;
-struct ypresp_key_val *objp;
-{
- if (!xdr_ypstat(xdrs, &objp->status)) {
- return (FALSE);
- }
- if (!xdr_datum(xdrs, &objp->valdat)) {
- return (FALSE);
- }
- if (!xdr_datum(xdrs, &objp->keydat)) {
- return (FALSE);
- }
- return (TRUE);
-}
-
-bool_t
-xdr_ypresp_all(xdrs, objp)
-XDR *xdrs;
-struct ypresp_all *objp;
-{
- if (!xdr_bool(xdrs, &objp->more)) {
- return (FALSE);
- }
- switch (objp->more) {
- case TRUE:
- if (!xdr_ypresp_key_val(xdrs, &objp->ypresp_all_u.val)) {
- return (FALSE);
- }
- break;
- case FALSE:
- break;
- default:
- return (FALSE);
- }
- return (TRUE);
-}
-
-bool_t
xdr_ypresp_all_seq(xdrs, objp)
XDR *xdrs;
u_long *objp;
@@ -314,24 +78,25 @@ u_long *objp;
}
if(out.more == 0) {
xdr_free(xdr_ypresp_all, (char *)&out);
- return FALSE;
+ *objp = YP_NOMORE;
+ return TRUE;
}
- status = out.ypresp_all_u.val.status;
+ status = out.ypresp_all_u.val.stat;
switch(status) {
case YP_TRUE:
- key = (char *)malloc(out.ypresp_all_u.val.keydat.dsize + 1);
- bcopy(out.ypresp_all_u.val.keydat.dptr, key,
- out.ypresp_all_u.val.keydat.dsize);
- key[out.ypresp_all_u.val.keydat.dsize] = '\0';
- val = (char *)malloc(out.ypresp_all_u.val.valdat.dsize + 1);
- bcopy(out.ypresp_all_u.val.valdat.dptr, val,
- out.ypresp_all_u.val.valdat.dsize);
- val[out.ypresp_all_u.val.valdat.dsize] = '\0';
+ key = (char *)malloc(out.ypresp_all_u.val.key.keydat_len + 1);
+ bcopy(out.ypresp_all_u.val.key.keydat_val, key,
+ out.ypresp_all_u.val.key.keydat_len);
+ key[out.ypresp_all_u.val.key.keydat_len] = '\0';
+ val = (char *)malloc(out.ypresp_all_u.val.val.valdat_len + 1);
+ bcopy(out.ypresp_all_u.val.val.valdat_val, val,
+ out.ypresp_all_u.val.val.valdat_len);
+ val[out.ypresp_all_u.val.val.valdat_len] = '\0';
xdr_free(xdr_ypresp_all, (char *)&out);
r = (*ypresp_allfn)(status,
- key, out.ypresp_all_u.val.keydat.dsize,
- val, out.ypresp_all_u.val.valdat.dsize,
+ key, out.ypresp_all_u.val.key.keydat_len,
+ val, out.ypresp_all_u.val.val.valdat_len,
ypresp_data);
*objp = status;
free(key);
@@ -341,6 +106,7 @@ u_long *objp;
break;
case YP_NOMORE:
xdr_free(xdr_ypresp_all, (char *)&out);
+ *objp = YP_NOMORE;
return TRUE;
default:
xdr_free(xdr_ypresp_all, (char *)&out);
@@ -349,161 +115,3 @@ u_long *objp;
}
}
}
-
-bool_t
-xdr_ypresp_master(xdrs, objp)
-XDR *xdrs;
-struct ypresp_master *objp;
-{
- if (!xdr_ypstat(xdrs, &objp->status)) {
- return (FALSE);
- }
- if (!xdr_string(xdrs, &objp->master, YPMAXPEER)) {
- return (FALSE);
- }
- return (TRUE);
-}
-
-bool_t
-xdr_ypmaplist_str(xdrs, objp)
-XDR *xdrs;
-char *objp;
-{
- if (!xdr_string(xdrs, &objp, YPMAXMAP+1)) {
- return (FALSE);
- }
- return (TRUE);
-}
-
-bool_t
-xdr_ypmaplist(xdrs, objp)
-XDR *xdrs;
-struct ypmaplist *objp;
-{
- if (!xdr_ypmaplist_str(xdrs, objp->ypml_name)) {
- return (FALSE);
- }
- if (!xdr_pointer(xdrs, (caddr_t *)&objp->ypml_next,
- sizeof(struct ypmaplist), xdr_ypmaplist)) {
- return (FALSE);
- }
- return (TRUE);
-}
-
-bool_t
-xdr_ypresp_maplist(xdrs, objp)
-XDR *xdrs;
-struct ypresp_maplist *objp;
-{
- if (!xdr_ypstat(xdrs, &objp->status)) {
- return (FALSE);
- }
- if (!xdr_pointer(xdrs, (caddr_t *)&objp->list,
- sizeof(struct ypmaplist), xdr_ypmaplist)) {
- return (FALSE);
- }
- return (TRUE);
-}
-
-bool_t
-xdr_ypresp_order(xdrs, objp)
-XDR *xdrs;
-struct ypresp_order *objp;
-{
- if (!xdr_ypstat(xdrs, &objp->status)) {
- return (FALSE);
- }
- if (!xdr_u_long(xdrs, &objp->ordernum)) {
- return (FALSE);
- }
- return (TRUE);
-}
-
-bool_t
-xdr_ypxfrstat(xdrs, objp)
-XDR *xdrs;
-enum ypxfrstat *objp;
-{
- if (!xdr_enum(xdrs, (enum_t *)objp)) {
- return (FALSE);
- }
- return (TRUE);
-}
-
-bool_t
-xdr_ypresp_xfr(xdrs, objp)
-XDR *xdrs;
-struct ypresp_xfr *objp;
-{
- if (!xdr_u_int(xdrs, &objp->transid)) {
- return (FALSE);
- }
- if (!xdr_ypxfrstat(xdrs, &objp->xfrstat)) {
- return (FALSE);
- }
- return (TRUE);
-}
-
-bool_t
-xdr_ypmap_parms(xdrs, objp)
-XDR *xdrs;
-struct ypmap_parms *objp;
-{
- if (!xdr_domainname(xdrs, objp->domain)) {
- return (FALSE);
- }
- if (!xdr_mapname(xdrs, objp->map)) {
- return (FALSE);
- }
- if (!xdr_u_long(xdrs, &objp->ordernum)) {
- return (FALSE);
- }
- if (!xdr_peername(xdrs, objp->owner)) {
- return (FALSE);
- }
-}
-
-bool_t
-xdr_ypreq_xfr(xdrs, objp)
-XDR *xdrs;
-struct ypreq_xfr *objp;
-{
- if (!xdr_ypmap_parms(xdrs, &objp->map_parms)) {
- return (FALSE);
- }
- if (!xdr_u_long(xdrs, &objp->transid)) {
- return (FALSE);
- }
- if (!xdr_u_long(xdrs, &objp->proto)) {
- return (FALSE);
- }
- if (!xdr_u_short(xdrs, &objp->port)) {
- return (FALSE);
- }
- return (TRUE);
-}
-
-bool_t
-xdr_yppush_status(xdrs, objp)
-XDR *xdrs;
-enum yppush_status *objp;
-{
- if (!xdr_enum(xdrs, (enum_t *)objp)) {
- return (FALSE);
- }
- return (TRUE);
-}
-
-bool_t
-xdr_yppushresp_xfr(xdrs, objp)
-XDR *xdrs;
-struct yppushresp_xfr *objp;
-{
- if (!xdr_u_long(xdrs, &objp->transid)) {
- return (FALSE);
- }
- if (!xdr_yppush_status(xdrs, &objp->status)) {
- return (FALSE);
- }
- return (TRUE);
-}
diff --git a/lib/libc/yp/yplib.c b/lib/libc/yp/yplib.c
index 6e4da17ea3ab..0514fba6e905 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.12 1995/09/02 04:16:21 wpaul Exp $";
+static char *rcsid = "$Id: yplib.c,v 1.10.4.2 1995/10/05 20:22:00 davidg Exp $";
#endif
#include <sys/param.h>
@@ -43,7 +43,25 @@ static char *rcsid = "$Id: yplib.c,v 1.12 1995/09/02 04:16:21 wpaul Exp $";
#include <unistd.h>
#include <rpc/rpc.h>
#include <rpc/xdr.h>
-#include <rpcsvc/yp_prot.h>
+#include <rpcsvc/yp.h>
+
+
+/*
+ * We have to define these here due to clashes between yp_prot.h and
+ * yp.h.
+ */
+
+struct dom_binding {
+ struct dom_binding *dom_pnext;
+ char dom_domain[YPMAXDOMAIN + 1];
+ struct sockaddr_in dom_server_addr;
+ u_short dom_server_port;
+ int dom_socket;
+ CLIENT *dom_client;
+ u_short dom_local_port;
+ long dom_vers;
+};
+
#include <rpcsvc/ypclnt.h>
#ifndef BINDINGDIR
@@ -77,11 +95,11 @@ static struct ypmatch_ent {
static void
ypmatch_add(map, key, keylen, val, vallen)
-char *map;
-char *key;
-int keylen;
-char *val;
-int vallen;
+ char *map;
+ char *key;
+ int keylen;
+ char *val;
+ int vallen;
{
struct ypmatch_ent *ep;
time_t t;
@@ -137,11 +155,11 @@ int vallen;
static bool_t
ypmatch_find(map, key, keylen, val, vallen)
-char *map;
-char *key;
-int keylen;
-char **val;
-int *vallen;
+ char *map;
+ char *key;
+ int keylen;
+ char **val;
+ int *vallen;
{
struct ypmatch_ent *ep;
time_t t;
@@ -171,7 +189,7 @@ int *vallen;
char *
ypbinderr_string(incode)
-int incode;
+ int incode;
{
static char err[80];
switch(incode) {
@@ -190,8 +208,8 @@ int incode;
int
_yp_dobind(dom, ypdb)
-char *dom;
-struct dom_binding **ypdb;
+ char *dom;
+ struct dom_binding **ypdb;
{
static int pid = -1;
char path[MAXPATHLEN];
@@ -199,7 +217,7 @@ struct dom_binding **ypdb;
struct ypbind_resp ypbr;
struct timeval tv;
struct sockaddr_in clnt_sin;
- int clnt_sock, fd, gpid;
+ int clnt_sock, lfd, fd, gpid;
CLIENT *client;
int new = 0, r;
int retries = 0;
@@ -227,6 +245,7 @@ struct dom_binding **ypdb;
for(ysd = _ypbindlist; ysd; ysd = ysd->dom_pnext)
if( strcmp(dom, ysd->dom_domain) == 0)
break;
+
if(ysd==NULL) {
ysd = (struct dom_binding *)malloc(sizeof *ysd);
bzero((char *)ysd, sizeof *ysd);
@@ -234,6 +253,7 @@ struct dom_binding **ypdb;
ysd->dom_vers = 0;
new = 1;
}
+
again:
retries++;
if (retries > MAX_RETRIES) {
@@ -243,6 +263,14 @@ again:
}
#ifdef BINDINGDIR
if(ysd->dom_vers==0) {
+ /*
+ * We're trying to make a new binding: zorch the
+ * existing handle now (if any).
+ */
+ if(ysd->dom_client) {
+ clnt_destroy(ysd->dom_client);
+ ysd->dom_client = NULL;
+ }
sprintf(path, "%s/%s.%d", BINDINGDIR, dom, 2);
if( (fd=open(path, O_RDONLY)) == -1) {
/* no binding file, YP is dead. */
@@ -270,10 +298,10 @@ again:
bzero(&ysd->dom_server_addr, sizeof ysd->dom_server_addr);
ysd->dom_server_addr.sin_family = AF_INET;
ysd->dom_server_addr.sin_len = sizeof(struct sockaddr_in);
- ysd->dom_server_addr.sin_addr =
- ybr.ypbind_respbody.ypbind_bindinfo.ypbind_binding_addr;
+ ysd->dom_server_addr.sin_addr.s_addr =
+ *(u_long *)&ybr.ypbind_resp_u.ypbind_bindinfo.ypbind_binding_addr;
ysd->dom_server_addr.sin_port =
- ybr.ypbind_respbody.ypbind_bindinfo.ypbind_binding_port;
+ *(u_short *)&ybr.ypbind_resp_u.ypbind_bindinfo.ypbind_binding_port;
ysd->dom_server_port = ysd->dom_server_addr.sin_port;
close(fd);
@@ -288,6 +316,14 @@ again:
skipit:
#endif
if(ysd->dom_vers==-1 || ysd->dom_vers==0) {
+ /*
+ * We're trying to make a new binding: zorch the
+ * existing handle now (if any).
+ */
+ if(ysd->dom_client) {
+ clnt_destroy(ysd->dom_client);
+ ysd->dom_client = NULL;
+ }
bzero((char *)&clnt_sin, sizeof clnt_sin);
clnt_sin.sin_family = AF_INET;
clnt_sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
@@ -296,7 +332,16 @@ skipit:
client = clnttcp_create(&clnt_sin, YPBINDPROG, YPBINDVERS, &clnt_sock,
0, 0);
if(client==NULL) {
- clnt_pcreateerror("clnttcp_create");
+ /*
+ * These conditions indicate ypbind just isn't
+ * alive -- we probably don't want to shoot our
+ * mouth off in this case; instead generate error
+ * messages only for really exotic problems.
+ */
+ if (rpc_createerr.cf_stat != RPC_PROGNOTREGISTERED &&
+ (rpc_createerr.cf_stat != RPC_SYSTEMERROR &&
+ rpc_createerr.cf_error.re_errno == ECONNREFUSED))
+ clnt_pcreateerror("clnttcp_create");
if(new)
free(ysd);
return (YPERR_YPBIND);
@@ -305,12 +350,14 @@ skipit:
tv.tv_sec = _yplib_timeout/2;
tv.tv_usec = 0;
r = clnt_call(client, YPBINDPROC_DOMAIN,
- xdr_domainname, dom, xdr_ypbind_resp, &ypbr, tv);
+ xdr_domainname, (char *)&dom, xdr_ypbind_resp, &ypbr, tv);
if(r != RPC_SUCCESS) {
- fprintf(stderr,
- "YP: server for domain %s not responding, retrying\n", dom);
clnt_destroy(client);
ysd->dom_vers = -1;
+ if (r == RPC_PROGUNAVAIL || r == RPC_PROCUNAVAIL)
+ return(YPERR_YPBIND);
+ fprintf(stderr,
+ "YP: server for domain %s not responding, retrying\n", dom);
goto again;
} else {
if (ypbr.ypbind_status != YPBIND_SUCC_VAL) {
@@ -325,30 +372,31 @@ skipit:
bzero((char *)&ysd->dom_server_addr, sizeof ysd->dom_server_addr);
ysd->dom_server_addr.sin_family = AF_INET;
ysd->dom_server_addr.sin_port =
- ypbr.ypbind_respbody.ypbind_bindinfo.ypbind_binding_port;
+ *(u_short *)&ypbr.ypbind_resp_u.ypbind_bindinfo.ypbind_binding_port;
ysd->dom_server_addr.sin_addr.s_addr =
- ypbr.ypbind_respbody.ypbind_bindinfo.ypbind_binding_addr.s_addr;
+ *(u_long *)&ypbr.ypbind_resp_u.ypbind_bindinfo.ypbind_binding_addr;
ysd->dom_server_port =
- ypbr.ypbind_respbody.ypbind_bindinfo.ypbind_binding_port;
+ *(u_short *)&ypbr.ypbind_resp_u.ypbind_bindinfo.ypbind_binding_port;
gotit:
ysd->dom_vers = YPVERS;
strcpy(ysd->dom_domain, dom);
}
- tv.tv_sec = _yplib_timeout/2;
- tv.tv_usec = 0;
- if(ysd->dom_client)
- clnt_destroy(ysd->dom_client);
- ysd->dom_socket = RPC_ANYSOCK;
- ysd->dom_client = clntudp_create(&ysd->dom_server_addr,
- YPPROG, YPVERS, tv, &ysd->dom_socket);
- if(ysd->dom_client==NULL) {
- clnt_pcreateerror("clntudp_create");
- ysd->dom_vers = -1;
- goto again;
+ /* Don't rebuild the connection to the server unless we have to. */
+ if (ysd->dom_client == NULL) {
+ tv.tv_sec = _yplib_timeout/2;
+ tv.tv_usec = 0;
+ ysd->dom_socket = RPC_ANYSOCK;
+ ysd->dom_client = clntudp_create(&ysd->dom_server_addr,
+ YPPROG, YPVERS, tv, &ysd->dom_socket);
+ if(ysd->dom_client==NULL) {
+ clnt_pcreateerror("clntudp_create");
+ ysd->dom_vers = -1;
+ goto again;
+ }
+ if( fcntl(ysd->dom_socket, F_SETFD, 1) == -1)
+ perror("fcntl: F_SETFD");
}
- if( fcntl(ysd->dom_socket, F_SETFD, 1) == -1)
- perror("fcntl: F_SETFD");
if(new) {
ysd->dom_pnext = _ypbindlist;
@@ -362,30 +410,32 @@ gotit:
static void
_yp_unbind(ypb)
-struct dom_binding *ypb;
+ struct dom_binding *ypb;
{
- clnt_destroy(ypb->dom_client);
+ if (ypb->dom_client)
+ clnt_destroy(ypb->dom_client);
ypb->dom_client = NULL;
ypb->dom_socket = -1;
+ ypb->dom_vers = -1;
}
int
yp_bind(dom)
-char *dom;
+ char *dom;
{
return _yp_dobind(dom, NULL);
}
void
yp_unbind(dom)
-char *dom;
+ char *dom;
{
struct dom_binding *ypb, *ypbp;
ypbp = NULL;
for(ypb=_ypbindlist; ypb; ypb=ypb->dom_pnext) {
if( strcmp(dom, ypb->dom_domain) == 0) {
- clnt_destroy(ypb->dom_client);
+ _yp_unbind(ypb);
if(ypbp)
ypbp->dom_pnext = ypb->dom_pnext;
else
@@ -400,12 +450,12 @@ char *dom;
int
yp_match(indomain, inmap, inkey, inkeylen, outval, outvallen)
-char *indomain;
-char *inmap;
-const char *inkey;
-int inkeylen;
-char **outval;
-int *outvallen;
+ char *indomain;
+ char *inmap;
+ const char *inkey;
+ int inkeylen;
+ char **outval;
+ int *outvallen;
{
struct dom_binding *ysd;
struct ypresp_val yprv;
@@ -425,10 +475,10 @@ int *outvallen;
#ifdef YPMATCHCACHE
if( !strcmp(_yp_domain, indomain) && ypmatch_find(inmap, inkey,
- inkeylen, &yprv.valdat.dptr, &yprv.valdat.dsize)) {
- *outvallen = yprv.valdat.dsize;
+ inkeylen, &yprv.val.valdat_val, &yprv.val.valdat_len)) {
+ *outvallen = yprv.val.valdat_len;
*outval = (char *)malloc(*outvallen+1);
- bcopy(yprv.valdat.dptr, *outval, *outvallen);
+ bcopy(yprv.val.valdat_val, *outval, *outvallen);
(*outval)[*outvallen] = '\0';
return 0;
}
@@ -443,8 +493,8 @@ again:
yprk.domain = indomain;
yprk.map = inmap;
- yprk.keydat.dptr = (char *)inkey;
- yprk.keydat.dsize = inkeylen;
+ yprk.key.keydat_val = (char *)inkey;
+ yprk.key.keydat_len = inkeylen;
bzero((char *)&yprv, sizeof yprv);
@@ -452,21 +502,22 @@ again:
xdr_ypreq_key, &yprk, xdr_ypresp_val, &yprv, tv);
if(r != RPC_SUCCESS) {
clnt_perror(ysd->dom_client, "yp_match: clnt_call");
- ysd->dom_vers = -1;
+ _yp_unbind(ysd);
goto again;
}
- if( !(r=ypprot_err(yprv.status)) ) {
- *outvallen = yprv.valdat.dsize;
+
+ if( !(r=ypprot_err(yprv.stat)) ) {
+ *outvallen = yprv.val.valdat_len;
*outval = (char *)malloc(*outvallen+1);
- bcopy(yprv.valdat.dptr, *outval, *outvallen);
+ bcopy(yprv.val.valdat_val, *outval, *outvallen);
(*outval)[*outvallen] = '\0';
#ifdef YPMATCHCACHE
if( strcmp(_yp_domain, indomain)==0 )
ypmatch_add(inmap, inkey, inkeylen, *outval, *outvallen);
#endif
}
+
xdr_free(xdr_ypresp_val, (char *)&yprv);
- _yp_unbind(ysd);
return r;
}
@@ -484,12 +535,12 @@ char **domp;
int
yp_first(indomain, inmap, outkey, outkeylen, outval, outvallen)
-char *indomain;
-char *inmap;
-char **outkey;
-int *outkeylen;
-char **outval;
-int *outvallen;
+ char *indomain;
+ char *inmap;
+ char **outkey;
+ int *outkeylen;
+ char **outval;
+ int *outvallen;
{
struct ypresp_key_val yprkv;
struct ypreq_nokey yprnk;
@@ -521,34 +572,34 @@ again:
xdr_ypreq_nokey, &yprnk, xdr_ypresp_key_val, &yprkv, tv);
if(r != RPC_SUCCESS) {
clnt_perror(ysd->dom_client, "yp_first: clnt_call");
- ysd->dom_vers = 0;
+ _yp_unbind(ysd);
goto again;
}
- if( !(r=ypprot_err(yprkv.status)) ) {
- *outkeylen = yprkv.keydat.dsize;
+ if( !(r=ypprot_err(yprkv.stat)) ) {
+ *outkeylen = yprkv.key.keydat_len;
*outkey = (char *)malloc(*outkeylen+1);
- bcopy(yprkv.keydat.dptr, *outkey, *outkeylen);
+ bcopy(yprkv.key.keydat_val, *outkey, *outkeylen);
(*outkey)[*outkeylen] = '\0';
- *outvallen = yprkv.valdat.dsize;
+ *outvallen = yprkv.val.valdat_len;
*outval = (char *)malloc(*outvallen+1);
- bcopy(yprkv.valdat.dptr, *outval, *outvallen);
+ bcopy(yprkv.val.valdat_val, *outval, *outvallen);
(*outval)[*outvallen] = '\0';
}
+
xdr_free(xdr_ypresp_key_val, (char *)&yprkv);
- _yp_unbind(ysd);
return r;
}
int
yp_next(indomain, inmap, inkey, inkeylen, outkey, outkeylen, outval, outvallen)
-char *indomain;
-char *inmap;
-char *inkey;
-int inkeylen;
-char **outkey;
-int *outkeylen;
-char **outval;
-int *outvallen;
+ char *indomain;
+ char *inmap;
+ char *inkey;
+ int inkeylen;
+ char **outkey;
+ int *outkeylen;
+ char **outval;
+ int *outvallen;
{
struct ypresp_key_val yprkv;
struct ypreq_key yprk;
@@ -575,44 +626,44 @@ again:
yprk.domain = indomain;
yprk.map = inmap;
- yprk.keydat.dptr = inkey;
- yprk.keydat.dsize = inkeylen;
+ yprk.key.keydat_val = inkey;
+ yprk.key.keydat_len = inkeylen;
bzero((char *)&yprkv, sizeof yprkv);
r = clnt_call(ysd->dom_client, YPPROC_NEXT,
xdr_ypreq_key, &yprk, xdr_ypresp_key_val, &yprkv, tv);
if(r != RPC_SUCCESS) {
clnt_perror(ysd->dom_client, "yp_next: clnt_call");
- ysd->dom_vers = -1;
+ _yp_unbind(ysd);
goto again;
}
- if( !(r=ypprot_err(yprkv.status)) ) {
- *outkeylen = yprkv.keydat.dsize;
+ if( !(r=ypprot_err(yprkv.stat)) ) {
+ *outkeylen = yprkv.key.keydat_len;
*outkey = (char *)malloc(*outkeylen+1);
- bcopy(yprkv.keydat.dptr, *outkey, *outkeylen);
+ bcopy(yprkv.key.keydat_val, *outkey, *outkeylen);
(*outkey)[*outkeylen] = '\0';
- *outvallen = yprkv.valdat.dsize;
+ *outvallen = yprkv.val.valdat_len;
*outval = (char *)malloc(*outvallen+1);
- bcopy(yprkv.valdat.dptr, *outval, *outvallen);
+ bcopy(yprkv.val.valdat_val, *outval, *outvallen);
(*outval)[*outvallen] = '\0';
}
+
xdr_free(xdr_ypresp_key_val, (char *)&yprkv);
- _yp_unbind(ysd);
return r;
}
int
yp_all(indomain, inmap, incallback)
-char *indomain;
-char *inmap;
-struct ypall_callback *incallback;
+ char *indomain;
+ char *inmap;
+ struct ypall_callback *incallback;
{
struct ypreq_nokey yprnk;
struct dom_binding *ysd;
struct timeval tv;
struct sockaddr_in clnt_sin;
CLIENT *clnt;
- u_long status;
+ u_long status, savstat;
int clnt_sock;
/* Sanity check */
@@ -621,11 +672,16 @@ struct ypall_callback *incallback;
inmap == NULL || !strlen(inmap))
return YPERR_BADARGS;
+again:
+
if( _yp_dobind(indomain, &ysd) != 0)
return YPERR_DOMAIN;
tv.tv_sec = _yplib_timeout;
tv.tv_usec = 0;
+
+ /* YPPROC_ALL manufactures its own channel to ypserv using TCP */
+
clnt_sock = RPC_ANYSOCK;
clnt_sin = ysd->dom_server_addr;
clnt_sin.sin_port = 0;
@@ -640,22 +696,28 @@ struct ypall_callback *incallback;
ypresp_allfn = incallback->foreach;
ypresp_data = (void *)incallback->data;
- (void) clnt_call(clnt, YPPROC_ALL,
- xdr_ypreq_nokey, &yprnk, xdr_ypresp_all_seq, &status, tv);
+ if (clnt_call(clnt, YPPROC_ALL,
+ xdr_ypreq_nokey, &yprnk,
+ xdr_ypresp_all_seq, &status, tv) != RPC_SUCCESS) {
+ clnt_perror(ysd->dom_client, "yp_next: clnt_call");
+ clnt_destroy(clnt);
+ _yp_unbind(ysd);
+ goto again;
+ }
+
clnt_destroy(clnt);
+ savstat = status;
xdr_free(xdr_ypresp_all_seq, (char *)&status); /* not really needed... */
- _yp_unbind(ysd);
-
- if(status != YP_FALSE)
- return ypprot_err(status);
+ if(savstat != YP_NOMORE)
+ return ypprot_err(savstat);
return 0;
}
int
yp_order(indomain, inmap, outorder)
-char *indomain;
-char *inmap;
-int *outorder;
+ char *indomain;
+ char *inmap;
+ int *outorder;
{
struct dom_binding *ysd;
struct ypresp_order ypro;
@@ -685,21 +747,23 @@ again:
xdr_ypreq_nokey, &yprnk, xdr_ypresp_order, &ypro, tv);
if(r != RPC_SUCCESS) {
clnt_perror(ysd->dom_client, "yp_order: clnt_call");
- ysd->dom_vers = -1;
+ _yp_unbind(ysd);
goto again;
}
- *outorder = ypro.ordernum;
+ if( !(r=ypprot_err(ypro.stat)) ) {
+ *outorder = ypro.ordernum;
+ }
+
xdr_free(xdr_ypresp_order, (char *)&ypro);
- _yp_unbind(ysd);
- return ypprot_err(ypro.status);
+ return (r);
}
int
yp_master(indomain, inmap, outname)
-char *indomain;
-char *inmap;
-char **outname;
+ char *indomain;
+ char *inmap;
+ char **outname;
{
struct dom_binding *ysd;
struct ypresp_master yprm;
@@ -728,20 +792,21 @@ again:
xdr_ypreq_nokey, &yprnk, xdr_ypresp_master, &yprm, tv);
if(r != RPC_SUCCESS) {
clnt_perror(ysd->dom_client, "yp_master: clnt_call");
- ysd->dom_vers = -1;
+ _yp_unbind(ysd);
goto again;
}
- if( !(r=ypprot_err(yprm.status)) ) {
- *outname = (char *)strdup(yprm.master);
+
+ if( !(r=ypprot_err(yprm.stat)) ) {
+ *outname = (char *)strdup(yprm.peer);
}
+
xdr_free(xdr_ypresp_master, (char *)&yprm);
- _yp_unbind(ysd);
- return r;
+ return (r);
}
int
yp_maplist(indomain, outmaplist)
-char *indomain;
-struct ypmaplist **outmaplist;
+ char *indomain;
+ struct ypmaplist **outmaplist;
{
struct dom_binding *ysd;
struct ypresp_maplist ypml;
@@ -763,21 +828,23 @@ again:
bzero((char *)&ypml, sizeof ypml);
r = clnt_call(ysd->dom_client, YPPROC_MAPLIST,
- xdr_domainname, indomain, xdr_ypresp_maplist, &ypml, tv);
+ xdr_domainname,(char *)&indomain,xdr_ypresp_maplist,&ypml,tv);
if (r != RPC_SUCCESS) {
clnt_perror(ysd->dom_client, "yp_maplist: clnt_call");
- ysd->dom_vers = -1;
+ _yp_unbind(ysd);
goto again;
}
- *outmaplist = ypml.list;
+ if( !(r=ypprot_err(ypml.stat)) ) {
+ *outmaplist = ypml.maps;
+ }
+
/* NO: xdr_free(xdr_ypresp_maplist, &ypml);*/
- _yp_unbind(ysd);
- return ypprot_err(ypml.status);
+ return (r);
}
char *
yperr_string(incode)
-int incode;
+ int incode;
{
static char err[80];
@@ -823,7 +890,7 @@ int incode;
int
ypprot_err(incode)
-unsigned int incode;
+ unsigned int incode;
{
switch(incode) {
case YP_TRUE:
@@ -854,7 +921,7 @@ unsigned int incode;
int
_yp_check(dom)
-char **dom;
+ char **dom;
{
char *unused;
@@ -865,7 +932,9 @@ char **dom;
if(dom)
*dom = _yp_domain;
- if( yp_bind(_yp_domain)==0 )
+ if( yp_bind(_yp_domain)==0 ) {
+ yp_unbind(_yp_domain);
return 1;
+ }
return 0;
}