diff options
| author | Jordan K. Hubbard <jkh@FreeBSD.org> | 1996-06-03 05:12:29 +0000 |
|---|---|---|
| committer | Jordan K. Hubbard <jkh@FreeBSD.org> | 1996-06-03 05:12:29 +0000 |
| commit | accd7f182e87d2a1d578214211ee7ded32753803 (patch) | |
| tree | 90de65019704d8a469505b67d00c11e813d480e0 /lib/libc/yp | |
| parent | c3287ad65e82f73d993c7537d1fc5a7a16199449 (diff) | |
Notes
Diffstat (limited to 'lib/libc/yp')
| -rw-r--r-- | lib/libc/yp/Makefile.inc | 13 | ||||
| -rw-r--r-- | lib/libc/yp/xdryp.c | 444 | ||||
| -rw-r--r-- | lib/libc/yp/yplib.c | 321 |
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; } |
