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