xref: /freebsd/usr.sbin/ypserv/common/yplib_host.c (revision 4d65a7c6951cea0333f1a0c1b32c38489cdfa6c5)
158458d06SMarcelo Araujo /*	$OpenBSD: yplib_host.c,v 1.18 2015/01/16 06:40:22 deraadt Exp $ */
258458d06SMarcelo Araujo 
358458d06SMarcelo Araujo /*
458458d06SMarcelo Araujo  * Copyright (c) 1992, 1993 Theo de Raadt <deraadt@theos.com>
558458d06SMarcelo Araujo  * All rights reserved.
658458d06SMarcelo Araujo  *
758458d06SMarcelo Araujo  * Redistribution and use in source and binary forms, with or without
858458d06SMarcelo Araujo  * modification, are permitted provided that the following conditions
958458d06SMarcelo Araujo  * are met:
1058458d06SMarcelo Araujo  * 1. Redistributions of source code must retain the above copyright
1158458d06SMarcelo Araujo  *    notice, this list of conditions and the following disclaimer.
1258458d06SMarcelo Araujo  * 2. Redistributions in binary form must reproduce the above copyright
1358458d06SMarcelo Araujo  *    notice, this list of conditions and the following disclaimer in the
1458458d06SMarcelo Araujo  *    documentation and/or other materials provided with the distribution.
1558458d06SMarcelo Araujo  *
1658458d06SMarcelo Araujo  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
1758458d06SMarcelo Araujo  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
1858458d06SMarcelo Araujo  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1958458d06SMarcelo Araujo  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
2058458d06SMarcelo Araujo  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2158458d06SMarcelo Araujo  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2258458d06SMarcelo Araujo  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2358458d06SMarcelo Araujo  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2458458d06SMarcelo Araujo  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2558458d06SMarcelo Araujo  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2658458d06SMarcelo Araujo  * SUCH DAMAGE.
2758458d06SMarcelo Araujo  */
2858458d06SMarcelo Araujo 
2958458d06SMarcelo Araujo #include <sys/param.h>
3058458d06SMarcelo Araujo #include <sys/socket.h>
3158458d06SMarcelo Araujo #include <sys/types.h>
3258458d06SMarcelo Araujo #include <sys/uio.h>
3358458d06SMarcelo Araujo #include <sys/file.h>
3458458d06SMarcelo Araujo 
3558458d06SMarcelo Araujo #include <ctype.h>
3658458d06SMarcelo Araujo #include <err.h>
3758458d06SMarcelo Araujo #include <errno.h>
3858458d06SMarcelo Araujo #include <netdb.h>
3958458d06SMarcelo Araujo #include <stdio.h>
4058458d06SMarcelo Araujo #include <stdlib.h>
4158458d06SMarcelo Araujo #include <string.h>
4258458d06SMarcelo Araujo #include <unistd.h>
4358458d06SMarcelo Araujo 
4458458d06SMarcelo Araujo #include <netinet/in.h>
4558458d06SMarcelo Araujo #include <arpa/inet.h>
4658458d06SMarcelo Araujo 
4758458d06SMarcelo Araujo #include <rpc/rpc.h>
4858458d06SMarcelo Araujo #include <rpc/xdr.h>
4958458d06SMarcelo Araujo #include <rpcsvc/yp.h>
5058458d06SMarcelo Araujo #include <rpcsvc/ypclnt.h>
5158458d06SMarcelo Araujo 
5258458d06SMarcelo Araujo #include "yplib_host.h"
5358458d06SMarcelo Araujo 
54*69b50387SJohn Baldwin extern bool_t xdr_ypresp_all_seq(XDR *, unsigned long *);
55*69b50387SJohn Baldwin 
5658458d06SMarcelo Araujo extern int (*ypresp_allfn)(u_long, char *, int, char *, int, void *);
5758458d06SMarcelo Araujo extern void *ypresp_data;
5858458d06SMarcelo Araujo 
5958458d06SMarcelo Araujo static int _yplib_host_timeout = 10;
6058458d06SMarcelo Araujo 
6158458d06SMarcelo Araujo CLIENT *
yp_bind_host(char * server,u_long program,u_long version,u_short port,int usetcp)6258458d06SMarcelo Araujo yp_bind_host(char *server, u_long program, u_long version, u_short port,
6358458d06SMarcelo Araujo     int usetcp)
6458458d06SMarcelo Araujo {
6558458d06SMarcelo Araujo 	struct sockaddr_in rsrv_sin;
6658458d06SMarcelo Araujo 	static CLIENT *client;
6758458d06SMarcelo Araujo 	struct hostent *h;
6858458d06SMarcelo Araujo 	struct timeval tv;
6958458d06SMarcelo Araujo 	int rsrv_sock;
7058458d06SMarcelo Araujo 
7158458d06SMarcelo Araujo 	memset(&rsrv_sin, 0, sizeof rsrv_sin);
7258458d06SMarcelo Araujo 	rsrv_sin.sin_len = sizeof rsrv_sin;
7358458d06SMarcelo Araujo 	rsrv_sin.sin_family = AF_INET;
7458458d06SMarcelo Araujo 	rsrv_sock = RPC_ANYSOCK;
7558458d06SMarcelo Araujo 	if (port != 0)
7658458d06SMarcelo Araujo 		rsrv_sin.sin_port = htons(port);
7758458d06SMarcelo Araujo 
7858458d06SMarcelo Araujo 	if (*server >= '0' && *server <= '9') {
7958458d06SMarcelo Araujo 		if (inet_aton(server, &rsrv_sin.sin_addr) == 0) {
8058458d06SMarcelo Araujo 			errx(1, "inet_aton: invalid address %s.",
8158458d06SMarcelo Araujo 			    server);
8258458d06SMarcelo Araujo 		}
8358458d06SMarcelo Araujo 	} else {
8458458d06SMarcelo Araujo 		h = gethostbyname(server);
8558458d06SMarcelo Araujo 		if (h == NULL) {
8658458d06SMarcelo Araujo 			errx(1, "gethostbyname: unknown host %s.",
8758458d06SMarcelo Araujo 			    server);
8858458d06SMarcelo Araujo 		}
8958458d06SMarcelo Araujo 		rsrv_sin.sin_addr.s_addr = *(u_int32_t *)h->h_addr;
9058458d06SMarcelo Araujo 	}
9158458d06SMarcelo Araujo 
9258458d06SMarcelo Araujo 	tv.tv_sec = 10;
9358458d06SMarcelo Araujo 	tv.tv_usec = 0;
9458458d06SMarcelo Araujo 
9558458d06SMarcelo Araujo 	if (usetcp)
9658458d06SMarcelo Araujo 		client = clnttcp_create(&rsrv_sin, program, version,
9758458d06SMarcelo Araujo 		    &rsrv_sock, 0, 0);
9858458d06SMarcelo Araujo 	else
9958458d06SMarcelo Araujo 		client = clntudp_create(&rsrv_sin, program, version, tv,
10058458d06SMarcelo Araujo 		    &rsrv_sock);
10158458d06SMarcelo Araujo 
10258458d06SMarcelo Araujo 	if (client == NULL) {
10358458d06SMarcelo Araujo 		errx(1, "clntudp_create: no contact with host %s.",
10458458d06SMarcelo Araujo 		    server);
10558458d06SMarcelo Araujo 	}
10658458d06SMarcelo Araujo 
10758458d06SMarcelo Araujo 	return (client);
10858458d06SMarcelo Araujo }
10958458d06SMarcelo Araujo 
11058458d06SMarcelo Araujo CLIENT *
yp_bind_local(u_long program,u_long version)11158458d06SMarcelo Araujo yp_bind_local(u_long program, u_long version)
11258458d06SMarcelo Araujo {
11358458d06SMarcelo Araujo 	struct sockaddr_in rsrv_sin;
11458458d06SMarcelo Araujo 	static CLIENT *client;
11558458d06SMarcelo Araujo 	struct timeval tv;
11658458d06SMarcelo Araujo 	int rsrv_sock;
11758458d06SMarcelo Araujo 
11858458d06SMarcelo Araujo 	memset(&rsrv_sin, 0, sizeof rsrv_sin);
11958458d06SMarcelo Araujo 	rsrv_sin.sin_len = sizeof rsrv_sin;
12058458d06SMarcelo Araujo 	rsrv_sin.sin_family = AF_INET;
12158458d06SMarcelo Araujo 	rsrv_sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
12258458d06SMarcelo Araujo 	rsrv_sock = RPC_ANYSOCK;
12358458d06SMarcelo Araujo 
12458458d06SMarcelo Araujo 	tv.tv_sec = 10;
12558458d06SMarcelo Araujo 	tv.tv_usec = 0;
12658458d06SMarcelo Araujo 
12758458d06SMarcelo Araujo 	client = clntudp_create(&rsrv_sin, program, version, tv, &rsrv_sock);
12858458d06SMarcelo Araujo 	if (client == NULL) {
12958458d06SMarcelo Araujo 		errx(1, "clntudp_create: no contact with localhost.");
13058458d06SMarcelo Araujo 	}
13158458d06SMarcelo Araujo 
13258458d06SMarcelo Araujo 	return (client);
13358458d06SMarcelo Araujo }
13458458d06SMarcelo Araujo 
13558458d06SMarcelo Araujo int
yp_match_host(CLIENT * client,char * indomain,char * inmap,const char * inkey,int inkeylen,char ** outval,int * outvallen)13658458d06SMarcelo Araujo yp_match_host(CLIENT *client, char *indomain, char *inmap, const char *inkey,
13758458d06SMarcelo Araujo     int inkeylen, char **outval, int *outvallen)
13858458d06SMarcelo Araujo {
13958458d06SMarcelo Araujo 	struct ypresp_val yprv;
14058458d06SMarcelo Araujo 	struct ypreq_key yprk;
14158458d06SMarcelo Araujo 	struct timeval tv;
14258458d06SMarcelo Araujo 	int r;
14358458d06SMarcelo Araujo 
14458458d06SMarcelo Araujo 	*outval = NULL;
14558458d06SMarcelo Araujo 	*outvallen = 0;
14658458d06SMarcelo Araujo 
14758458d06SMarcelo Araujo 	tv.tv_sec = _yplib_host_timeout;
14858458d06SMarcelo Araujo 	tv.tv_usec = 0;
14958458d06SMarcelo Araujo 
15058458d06SMarcelo Araujo 	yprk.domain = indomain;
15158458d06SMarcelo Araujo 	yprk.map = inmap;
15258458d06SMarcelo Araujo 	yprk.key.keydat_val = (char *)inkey;
15358458d06SMarcelo Araujo 	yprk.key.keydat_len = inkeylen;
15458458d06SMarcelo Araujo 
15558458d06SMarcelo Araujo 	memset(&yprv, 0, sizeof yprv);
15658458d06SMarcelo Araujo 
15758458d06SMarcelo Araujo 	r = clnt_call(client, YPPROC_MATCH,
15858458d06SMarcelo Araujo 	    (xdrproc_t)xdr_ypreq_key, &yprk,
15958458d06SMarcelo Araujo 	    (xdrproc_t)xdr_ypresp_val, &yprv, tv);
16058458d06SMarcelo Araujo 	if (r != RPC_SUCCESS)
16158458d06SMarcelo Araujo 		clnt_perror(client, "yp_match_host: clnt_call");
16258458d06SMarcelo Araujo 	if ( !(r = ypprot_err(yprv.stat)) ) {
16358458d06SMarcelo Araujo 		*outvallen = yprv.val.valdat_len;
16458458d06SMarcelo Araujo 		*outval = malloc(*outvallen + 1);
16558458d06SMarcelo Araujo 		memcpy(*outval, yprv.val.valdat_val, *outvallen);
16658458d06SMarcelo Araujo 		(*outval)[*outvallen] = '\0';
16758458d06SMarcelo Araujo 	}
16858458d06SMarcelo Araujo 	xdr_free((xdrproc_t)xdr_ypresp_val, (char *)&yprv);
16958458d06SMarcelo Araujo 
17058458d06SMarcelo Araujo 	return (r);
17158458d06SMarcelo Araujo }
17258458d06SMarcelo Araujo 
17358458d06SMarcelo Araujo int
yp_first_host(CLIENT * client,char * indomain,char * inmap,char ** outkey,int * outkeylen,char ** outval,int * outvallen)17458458d06SMarcelo Araujo yp_first_host(CLIENT *client, char *indomain, char *inmap, char **outkey,
17558458d06SMarcelo Araujo     int *outkeylen, char **outval, int *outvallen)
17658458d06SMarcelo Araujo {
17758458d06SMarcelo Araujo 	struct ypresp_key_val yprkv;
17858458d06SMarcelo Araujo 	struct ypreq_nokey yprnk;
17958458d06SMarcelo Araujo 	struct timeval tv;
18058458d06SMarcelo Araujo 	int r;
18158458d06SMarcelo Araujo 
18258458d06SMarcelo Araujo 	*outkey = *outval = NULL;
18358458d06SMarcelo Araujo 	*outkeylen = *outvallen = 0;
18458458d06SMarcelo Araujo 
18558458d06SMarcelo Araujo 	tv.tv_sec = _yplib_host_timeout;
18658458d06SMarcelo Araujo 	tv.tv_usec = 0;
18758458d06SMarcelo Araujo 
18858458d06SMarcelo Araujo 	yprnk.domain = indomain;
18958458d06SMarcelo Araujo 	yprnk.map = inmap;
19058458d06SMarcelo Araujo 	memset(&yprkv, 0, sizeof yprkv);
19158458d06SMarcelo Araujo 
19258458d06SMarcelo Araujo 	r = clnt_call(client, YPPROC_FIRST,
19358458d06SMarcelo Araujo 	    (xdrproc_t)xdr_ypreq_nokey, &yprnk,
19458458d06SMarcelo Araujo 	    (xdrproc_t)xdr_ypresp_key_val, &yprkv, tv);
19558458d06SMarcelo Araujo 	if (r != RPC_SUCCESS)
19658458d06SMarcelo Araujo 		clnt_perror(client, "yp_first_host: clnt_call");
19758458d06SMarcelo Araujo 	if ( !(r = ypprot_err(yprkv.stat)) ) {
19858458d06SMarcelo Araujo 		*outkeylen = yprkv.key.keydat_len;
19958458d06SMarcelo Araujo 		*outkey = malloc(*outkeylen+1);
20058458d06SMarcelo Araujo 		memcpy(*outkey, yprkv.key.keydat_val, *outkeylen);
20158458d06SMarcelo Araujo 		(*outkey)[*outkeylen] = '\0';
20258458d06SMarcelo Araujo 		*outvallen = yprkv.val.valdat_len;
20358458d06SMarcelo Araujo 		*outval = malloc(*outvallen+1);
20458458d06SMarcelo Araujo 		memcpy(*outval, yprkv.val.valdat_val, *outvallen);
20558458d06SMarcelo Araujo 		(*outval)[*outvallen] = '\0';
20658458d06SMarcelo Araujo 	}
20758458d06SMarcelo Araujo 	xdr_free((xdrproc_t)xdr_ypresp_key_val, (char *)&yprkv);
20858458d06SMarcelo Araujo 
20958458d06SMarcelo Araujo 	return (r);
21058458d06SMarcelo Araujo }
21158458d06SMarcelo Araujo 
21258458d06SMarcelo Araujo int
yp_next_host(CLIENT * client,char * indomain,char * inmap,char * inkey,int inkeylen,char ** outkey,int * outkeylen,char ** outval,int * outvallen)21358458d06SMarcelo Araujo yp_next_host(CLIENT *client, char *indomain, char *inmap, char *inkey,
21458458d06SMarcelo Araujo     int inkeylen, char **outkey, int *outkeylen, char **outval, int *outvallen)
21558458d06SMarcelo Araujo {
21658458d06SMarcelo Araujo 	struct ypresp_key_val yprkv;
21758458d06SMarcelo Araujo 	struct ypreq_key yprk;
21858458d06SMarcelo Araujo 	struct timeval tv;
21958458d06SMarcelo Araujo 	int r;
22058458d06SMarcelo Araujo 
22158458d06SMarcelo Araujo 	*outkey = *outval = NULL;
22258458d06SMarcelo Araujo 	*outkeylen = *outvallen = 0;
22358458d06SMarcelo Araujo 
22458458d06SMarcelo Araujo 	tv.tv_sec = _yplib_host_timeout;
22558458d06SMarcelo Araujo 	tv.tv_usec = 0;
22658458d06SMarcelo Araujo 
22758458d06SMarcelo Araujo 	yprk.domain = indomain;
22858458d06SMarcelo Araujo 	yprk.map = inmap;
22958458d06SMarcelo Araujo 	yprk.key.keydat_val = inkey;
23058458d06SMarcelo Araujo 	yprk.key.keydat_len = inkeylen;
23158458d06SMarcelo Araujo 	memset(&yprkv, 0, sizeof yprkv);
23258458d06SMarcelo Araujo 
23358458d06SMarcelo Araujo 	r = clnt_call(client, YPPROC_NEXT,
23458458d06SMarcelo Araujo 	    (xdrproc_t)xdr_ypreq_key, &yprk,
23558458d06SMarcelo Araujo 	    (xdrproc_t)xdr_ypresp_key_val, &yprkv, tv);
23658458d06SMarcelo Araujo 	if (r != RPC_SUCCESS)
23758458d06SMarcelo Araujo 		clnt_perror(client, "yp_next_host: clnt_call");
23858458d06SMarcelo Araujo 	if ( !(r = ypprot_err(yprkv.stat)) ) {
23958458d06SMarcelo Araujo 		*outkeylen = yprkv.key.keydat_len;
24058458d06SMarcelo Araujo 		*outkey = malloc(*outkeylen+1);
24158458d06SMarcelo Araujo 		memcpy(*outkey, yprkv.key.keydat_val, *outkeylen);
24258458d06SMarcelo Araujo 		(*outkey)[*outkeylen] = '\0';
24358458d06SMarcelo Araujo 		*outvallen = yprkv.val.valdat_len;
24458458d06SMarcelo Araujo 		*outval = malloc(*outvallen+1);
24558458d06SMarcelo Araujo 		memcpy(*outval, yprkv.val.valdat_val, *outvallen);
24658458d06SMarcelo Araujo 		(*outval)[*outvallen] = '\0';
24758458d06SMarcelo Araujo 	}
24858458d06SMarcelo Araujo 	xdr_free((xdrproc_t)xdr_ypresp_key_val, (char *)&yprkv);
24958458d06SMarcelo Araujo 
25058458d06SMarcelo Araujo 	return (r);
25158458d06SMarcelo Araujo }
25258458d06SMarcelo Araujo 
25358458d06SMarcelo Araujo int
yp_all_host(CLIENT * client,char * indomain,char * inmap,struct ypall_callback * incallback)25458458d06SMarcelo Araujo yp_all_host(CLIENT *client, char *indomain, char *inmap,
25558458d06SMarcelo Araujo     struct ypall_callback *incallback)
25658458d06SMarcelo Araujo {
25758458d06SMarcelo Araujo 	struct ypreq_nokey yprnk;
25858458d06SMarcelo Araujo 	struct timeval tv;
25958458d06SMarcelo Araujo 	u_long status;
26058458d06SMarcelo Araujo 
26158458d06SMarcelo Araujo 	tv.tv_sec = _yplib_host_timeout;
26258458d06SMarcelo Araujo 	tv.tv_usec = 0;
26358458d06SMarcelo Araujo 
26458458d06SMarcelo Araujo 	yprnk.domain = indomain;
26558458d06SMarcelo Araujo 	yprnk.map = inmap;
26658458d06SMarcelo Araujo 	ypresp_allfn = incallback->foreach;
26758458d06SMarcelo Araujo 	ypresp_data = (void *)incallback->data;
26858458d06SMarcelo Araujo 
26958458d06SMarcelo Araujo 	(void) clnt_call(client, YPPROC_ALL,
27058458d06SMarcelo Araujo 	    (xdrproc_t)xdr_ypreq_nokey, &yprnk,
27158458d06SMarcelo Araujo 	    (xdrproc_t)xdr_ypresp_all_seq, &status, tv);
27258458d06SMarcelo Araujo 	if (status != YP_FALSE)
27358458d06SMarcelo Araujo 		return ypprot_err(status);
27458458d06SMarcelo Araujo 
27558458d06SMarcelo Araujo 	return (0);
27658458d06SMarcelo Araujo }
27758458d06SMarcelo Araujo 
27858458d06SMarcelo Araujo int
yp_order_host(CLIENT * client,char * indomain,char * inmap,u_int32_t * outorder)27958458d06SMarcelo Araujo yp_order_host(CLIENT *client, char *indomain, char *inmap, u_int32_t *outorder)
28058458d06SMarcelo Araujo {
28158458d06SMarcelo Araujo 	struct ypresp_order ypro;
28258458d06SMarcelo Araujo 	struct ypreq_nokey yprnk;
28358458d06SMarcelo Araujo 	struct timeval tv;
28458458d06SMarcelo Araujo 	int r;
28558458d06SMarcelo Araujo 
28658458d06SMarcelo Araujo 	tv.tv_sec = _yplib_host_timeout;
28758458d06SMarcelo Araujo 	tv.tv_usec = 0;
28858458d06SMarcelo Araujo 
28958458d06SMarcelo Araujo 	yprnk.domain = indomain;
29058458d06SMarcelo Araujo 	yprnk.map = inmap;
29158458d06SMarcelo Araujo 
29258458d06SMarcelo Araujo 	memset(&ypro, 0, sizeof ypro);
29358458d06SMarcelo Araujo 
29458458d06SMarcelo Araujo 	r = clnt_call(client, YPPROC_ORDER,
29558458d06SMarcelo Araujo 	    (xdrproc_t)xdr_ypreq_nokey, &yprnk,
29658458d06SMarcelo Araujo 	    (xdrproc_t)xdr_ypresp_order, &ypro, tv);
29758458d06SMarcelo Araujo 	if (r != RPC_SUCCESS)
29858458d06SMarcelo Araujo 		clnt_perror(client, "yp_order_host: clnt_call");
29958458d06SMarcelo Araujo 	*outorder = ypro.ordernum;
30058458d06SMarcelo Araujo 	xdr_free((xdrproc_t)xdr_ypresp_order, (char *)&ypro);
30158458d06SMarcelo Araujo 
30258458d06SMarcelo Araujo 	return ypprot_err(ypro.stat);
30358458d06SMarcelo Araujo }
30458458d06SMarcelo Araujo 
30558458d06SMarcelo Araujo int
yp_master_host(CLIENT * client,char * indomain,char * inmap,char ** outname)30658458d06SMarcelo Araujo yp_master_host(CLIENT *client, char *indomain, char *inmap, char **outname)
30758458d06SMarcelo Araujo {
30858458d06SMarcelo Araujo 	struct ypresp_master yprm;
30958458d06SMarcelo Araujo 	struct ypreq_nokey yprnk;
31058458d06SMarcelo Araujo 	struct timeval tv;
31158458d06SMarcelo Araujo 	int r;
31258458d06SMarcelo Araujo 
31358458d06SMarcelo Araujo 	tv.tv_sec = _yplib_host_timeout;
31458458d06SMarcelo Araujo 	tv.tv_usec = 0;
31558458d06SMarcelo Araujo 	yprnk.domain = indomain;
31658458d06SMarcelo Araujo 	yprnk.map = inmap;
31758458d06SMarcelo Araujo 
31858458d06SMarcelo Araujo 	memset(&yprm, 0, sizeof yprm);
31958458d06SMarcelo Araujo 
32058458d06SMarcelo Araujo 	r = clnt_call(client, YPPROC_MASTER,
32158458d06SMarcelo Araujo 	    (xdrproc_t)xdr_ypreq_nokey, &yprnk,
32258458d06SMarcelo Araujo 	    (xdrproc_t)xdr_ypresp_master, &yprm, tv);
32358458d06SMarcelo Araujo 	if (r != RPC_SUCCESS)
32458458d06SMarcelo Araujo 		clnt_perror(client, "yp_master: clnt_call");
32558458d06SMarcelo Araujo 	if (!(r = ypprot_err(yprm.stat)))
32658458d06SMarcelo Araujo 		*outname = strdup(yprm.peer);
32758458d06SMarcelo Araujo 	xdr_free((xdrproc_t)xdr_ypresp_master, (char *)&yprm);
32858458d06SMarcelo Araujo 
32958458d06SMarcelo Araujo 	return (r);
33058458d06SMarcelo Araujo }
33158458d06SMarcelo Araujo 
33258458d06SMarcelo Araujo int
yp_maplist_host(CLIENT * client,char * indomain,struct ypmaplist ** outmaplist)33358458d06SMarcelo Araujo yp_maplist_host(CLIENT *client, char *indomain, struct ypmaplist **outmaplist)
33458458d06SMarcelo Araujo {
33558458d06SMarcelo Araujo 	struct ypresp_maplist ypml;
33658458d06SMarcelo Araujo 	struct timeval tv;
33758458d06SMarcelo Araujo 	int r;
33858458d06SMarcelo Araujo 
33958458d06SMarcelo Araujo 	tv.tv_sec = _yplib_host_timeout;
34058458d06SMarcelo Araujo 	tv.tv_usec = 0;
34158458d06SMarcelo Araujo 
34258458d06SMarcelo Araujo 	memset(&ypml, 0, sizeof ypml);
34358458d06SMarcelo Araujo 
34458458d06SMarcelo Araujo 	r = clnt_call(client, YPPROC_MAPLIST,
34558458d06SMarcelo Araujo 	    (xdrproc_t)xdr_domainname, &indomain,
34658458d06SMarcelo Araujo 	    (xdrproc_t)xdr_ypresp_maplist, &ypml, tv);
34758458d06SMarcelo Araujo 	if (r != RPC_SUCCESS)
34858458d06SMarcelo Araujo 		clnt_perror(client, "yp_maplist: clnt_call");
34958458d06SMarcelo Araujo 	*outmaplist = ypml.maps;
35058458d06SMarcelo Araujo 	/* NO: xdr_free(xdr_ypresp_maplist, &ypml);*/
35158458d06SMarcelo Araujo 
35258458d06SMarcelo Araujo 	return ypprot_err(ypml.stat);
35358458d06SMarcelo Araujo }
354