1 /* $NetBSD: yp_first.c,v 1.16 2012/06/25 22:32:46 abs Exp $ */
4 * Copyright (c) 1992, 1993 Theo de Raadt <deraadt@fsa.ca>
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
17 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 #include <sys/cdefs.h>
30 #if defined(LIBC_SCCS) && !defined(lint)
31 __RCSID("$NetBSD: yp_first.c,v 1.16 2012/06/25 22:32:46 abs Exp $");
34 #include "namespace.h"
38 #include <rpcsvc/yp_prot.h>
39 #include <rpcsvc/ypclnt.h>
42 extern struct timeval _yplib_timeout
;
43 extern int _yplib_nerrs
;
44 extern int _yplib_bindtries
;
47 __weak_alias(yp_first
,_yp_first
)
48 __weak_alias(yp_next
,_yp_next
)
52 yp_first(const char *indomain
, const char *inmap
, char **outkey
,
53 int *outkeylen
, char **outval
, int *outvallen
)
55 struct ypresp_key_val yprkv
;
56 struct ypreq_nokey yprnk
;
57 struct dom_binding
*ysd
;
60 if (outkey
== NULL
|| outkeylen
== NULL
|| \
61 outval
== NULL
|| outvallen
== NULL
)
63 *outkey
= *outval
= NULL
;
64 *outkeylen
= *outvallen
= 0;
65 if (_yp_invalid_domain(indomain
))
67 if (inmap
== NULL
|| *inmap
== '\0'
68 || strlen(inmap
) > YPMAXMAP
)
72 if (_yp_dobind(indomain
, &ysd
) != 0)
75 yprnk
.domain
= indomain
;
77 (void)memset(&yprkv
, 0, sizeof yprkv
);
79 r
= clnt_call(ysd
->dom_client
, (rpcproc_t
)YPPROC_FIRST
,
80 (xdrproc_t
)xdr_ypreq_nokey
,
81 &yprnk
, (xdrproc_t
)xdr_ypresp_key_val
, &yprkv
, _yplib_timeout
);
82 if (r
!= RPC_SUCCESS
) {
83 if (_yplib_bindtries
<= 0 && ++nerrs
== _yplib_nerrs
) {
84 clnt_perror(ysd
->dom_client
, "yp_first: clnt_call");
86 } else if (_yplib_bindtries
> 0 && ++nerrs
== _yplib_bindtries
)
91 if (!(r
= ypprot_err(yprkv
.status
))) {
92 *outkeylen
= yprkv
.keydat
.dsize
;
93 if ((*outkey
= malloc((size_t)(*outkeylen
+ 1))) == NULL
)
96 (void)memcpy(*outkey
, yprkv
.keydat
.dptr
,
98 (*outkey
)[*outkeylen
] = '\0';
100 *outvallen
= yprkv
.valdat
.dsize
;
101 if ((*outval
= malloc((size_t)(*outvallen
+ 1))) == NULL
)
104 (void)memcpy(*outval
, yprkv
.valdat
.dptr
,
106 (*outval
)[*outvallen
] = '\0';
109 xdr_free((xdrproc_t
)xdr_ypresp_key_val
, (char *)(void *)&yprkv
);
125 yp_next(const char *indomain
, const char *inmap
, const char *inkey
,
126 int inkeylen
, char **outkey
, int *outkeylen
, char **outval
, int *outvallen
)
128 struct ypresp_key_val yprkv
;
129 struct ypreq_key yprk
;
130 struct dom_binding
*ysd
;
133 if (outkey
== NULL
|| outkeylen
== NULL
|| \
134 outval
== NULL
|| outvallen
== NULL
|| \
136 return YPERR_BADARGS
;
137 *outkey
= *outval
= NULL
;
138 *outkeylen
= *outvallen
= 0;
140 if (_yp_invalid_domain(indomain
))
141 return YPERR_BADARGS
;
142 if (inmap
== NULL
|| *inmap
== '\0'
143 || strlen(inmap
) > YPMAXMAP
)
144 return YPERR_BADARGS
;
147 if (_yp_dobind(indomain
, &ysd
) != 0)
150 yprk
.domain
= indomain
;
152 yprk
.keydat
.dptr
= inkey
;
153 yprk
.keydat
.dsize
= inkeylen
;
154 (void)memset(&yprkv
, 0, sizeof yprkv
);
156 r
= clnt_call(ysd
->dom_client
, (rpcproc_t
)YPPROC_NEXT
,
157 (xdrproc_t
)xdr_ypreq_key
,
158 &yprk
, (xdrproc_t
)xdr_ypresp_key_val
, &yprkv
, _yplib_timeout
);
159 if (r
!= RPC_SUCCESS
) {
160 if (_yplib_bindtries
<= 0 && ++nerrs
== _yplib_nerrs
) {
161 clnt_perror(ysd
->dom_client
, "yp_next: clnt_call");
163 } else if (_yplib_bindtries
> 0 && ++nerrs
== _yplib_bindtries
)
168 if (!(r
= ypprot_err(yprkv
.status
))) {
169 *outkeylen
= yprkv
.keydat
.dsize
;
170 if ((*outkey
= malloc((size_t)(*outkeylen
+ 1))) == NULL
)
173 (void)memcpy(*outkey
, yprkv
.keydat
.dptr
,
175 (*outkey
)[*outkeylen
] = '\0';
177 *outvallen
= yprkv
.valdat
.dsize
;
178 if ((*outval
= malloc((size_t)(*outvallen
+ 1))) == NULL
)
181 (void)memcpy(*outval
, yprkv
.valdat
.dptr
,
183 (*outval
)[*outvallen
] = '\0';
186 xdr_free((xdrproc_t
)xdr_ypresp_key_val
, (char *)(void *)&yprkv
);