]>
git.saurik.com Git - apple/libinfo.git/blob - nis.subproj/ypmatch_cache.c
2 * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
4 * @APPLE_LICENSE_HEADER_START@
6 * Copyright (c) 1999-2003 Apple Computer, Inc. All Rights Reserved.
8 * This file contains Original Code and/or Modifications of Original Code
9 * as defined in and that are subject to the Apple Public Source License
10 * Version 2.0 (the 'License'). You may not use this file except in
11 * compliance with the License. Please obtain a copy of the License at
12 * http://www.opensource.apple.com/apsl/ and read it before using this
15 * The Original Code and all software distributed under the License are
16 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
17 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
18 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
20 * Please see the License for the specific language governing rights and
21 * limitations under the License.
23 * @APPLE_LICENSE_HEADER_END@
26 * Copyright (c) 1992, 1993 Theo de Raadt <deraadt@theos.com>
27 * All rights reserved.
29 * Redistribution and use in source and binary forms, with or without
30 * modification, are permitted provided that the following conditions
32 * 1. Redistributions of source code must retain the above copyright
33 * notice, this list of conditions and the following disclaimer.
34 * 2. Redistributions in binary form must reproduce the above copyright
35 * notice, this list of conditions and the following disclaimer in the
36 * documentation and/or other materials provided with the distribution.
37 * 3. All advertising materials mentioning features or use of this software
38 * must display the following acknowledgement:
39 * This product includes software developed by Theo de Raadt.
40 * 4. The name of the author may not be used to endorse or promote products
41 * derived from this software without specific prior written permission.
43 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
44 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
45 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
46 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
47 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
48 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
49 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
50 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
51 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
52 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
56 #if defined(LIBC_SCCS) && !defined(lint)
57 static char *rcsid
= "$OpenBSD: ypmatch_cache.c,v 1.6 1996/12/03 08:20:06 deraadt Exp $";
58 #endif /* LIBC_SCCS and not lint */
60 #include <sys/param.h>
61 #include <sys/types.h>
62 #include <sys/socket.h>
72 #include <rpcsvc/yp.h>
73 #include <rpcsvc/ypclnt.h>
74 /* #define YPMATCHCACHE */
75 #include "ypinternal.h"
81 ypmatch_add(map
, key
, keylen
, val
, vallen
)
88 struct ypmatch_ent
*ep
;
93 for (ep
= ypmc
; ep
; ep
= ep
->next
)
97 if ((ep
= malloc(sizeof *ep
)) == NULL
)
99 (void)memset(ep
, 0, sizeof *ep
);
114 if ((ep
->key
= malloc(keylen
)) == NULL
)
117 if ((ep
->val
= malloc(vallen
)) == NULL
) {
126 (void)memcpy(ep
->key
, key
, ep
->keylen
);
127 (void)memcpy(ep
->val
, val
, ep
->vallen
);
130 if (strcmp(ep
->map
, map
)) {
132 if ((ep
->map
= strdup(map
)) == NULL
)
136 if ((ep
->map
= strdup(map
)) == NULL
)
140 ep
->expire_t
= t
+ _yplib_cache
;
145 ypmatch_find(map
, key
, keylen
, val
, vallen
)
152 struct ypmatch_ent
*ep
;
160 for (ep
= ypmc
; ep
; ep
= ep
->next
) {
161 if (ep
->keylen
!= keylen
)
163 if (strcmp(ep
->map
, map
))
165 if (memcmp(ep
->key
, key
, keylen
))
167 if (t
> ep
->expire_t
)
171 *vallen
= ep
->vallen
;
179 yp_match(indomain
, inmap
, inkey
, inkeylen
, outval
, outvallen
)
180 const char *indomain
;
187 struct dom_binding
*ysd
;
188 struct ypresp_val yprv
;
190 struct ypreq_key yprk
;
193 if (indomain
== NULL
|| *indomain
== '\0' ||
194 strlen(indomain
) > YPMAXDOMAIN
|| inmap
== NULL
||
195 *inmap
== '\0' || strlen(inmap
) > YPMAXMAP
||
196 inkey
== NULL
|| inkeylen
== 0)
197 return YPERR_BADARGS
;
203 if (_yp_dobind(indomain
, &ysd
) != 0)
207 if (!strcmp(_yp_domain
, indomain
) && ypmatch_find(inmap
, inkey
,
208 inkeylen
, &yprv
.val
.valdat_val
, &yprv
.val
.valdat_len
)) {
209 *outvallen
= yprv
.val
.valdat_len
;
210 if ((*outval
= malloc(*outvallen
+ 1)) == NULL
) {
214 (void)memcpy(*outval
, yprv
.val
.valdat_val
, *outvallen
);
215 (*outval
)[*outvallen
] = '\0';
221 tv
.tv_sec
= _yplib_timeout
;
224 yprk
.domain
= (char *)indomain
;
225 yprk
.map
= (char *)inmap
;
226 yprk
.key
.keydat_val
= (char *) inkey
;
227 yprk
.key
.keydat_len
= inkeylen
;
229 memset(&yprv
, 0, sizeof yprv
);
231 r
= clnt_call(ysd
->dom_client
, YPPROC_MATCH
,
232 xdr_ypreq_key
, &yprk
, xdr_ypresp_val
, &yprv
, tv
);
233 if (r
!= RPC_SUCCESS
) {
235 clnt_perror(ysd
->dom_client
, "yp_match: clnt_call");
239 if (!(r
= ypprot_err(yprv
.stat
))) {
240 *outvallen
= yprv
.val
.valdat_len
;
241 if ((*outval
= malloc(*outvallen
+ 1)) == NULL
) {
245 (void)memcpy(*outval
, yprv
.val
.valdat_val
, *outvallen
);
246 (*outval
)[*outvallen
] = '\0';
248 if (strcmp(_yp_domain
, indomain
) == 0)
249 if (!ypmatch_add(inmap
, inkey
, inkeylen
,
250 *outval
, *outvallen
))
255 xdr_free(xdr_ypresp_val
, (char *) &yprv
);
261 yp_next(indomain
, inmap
, inkey
, inkeylen
, outkey
, outkeylen
, outval
, outvallen
)
262 const char *indomain
;
271 struct ypresp_key_val yprkv
;
272 struct ypreq_key yprk
;
273 struct dom_binding
*ysd
;
277 if (indomain
== NULL
|| *indomain
== '\0' ||
278 strlen(indomain
) > YPMAXDOMAIN
|| inmap
== NULL
||
279 *inmap
== '\0' || strlen(inmap
) > YPMAXMAP
)
280 return YPERR_BADARGS
;
282 *outkey
= *outval
= NULL
;
283 *outkeylen
= *outvallen
= 0;
286 if (_yp_dobind(indomain
, &ysd
) != 0)
289 tv
.tv_sec
= _yplib_timeout
;
292 yprk
.domain
= (char *)indomain
;
293 yprk
.map
= (char *)inmap
;
294 yprk
.key
.keydat_val
= (char *)inkey
;
295 yprk
.key
.keydat_len
= inkeylen
;
296 (void)memset(&yprkv
, 0, sizeof yprkv
);
298 r
= clnt_call(ysd
->dom_client
, YPPROC_NEXT
,
299 xdr_ypreq_key
, &yprk
, xdr_ypresp_key_val
, &yprkv
, tv
);
300 if (r
!= RPC_SUCCESS
) {
302 clnt_perror(ysd
->dom_client
, "yp_next: clnt_call");
306 if (!(r
= ypprot_err(yprkv
.stat
))) {
307 *outkeylen
= yprkv
.key
.keydat_len
;
308 if ((*outkey
= malloc(*outkeylen
+ 1)) == NULL
)
311 (void)memcpy(*outkey
, yprkv
.key
.keydat_val
, *outkeylen
);
312 (*outkey
)[*outkeylen
] = '\0';
314 *outvallen
= yprkv
.val
.valdat_len
;
315 if ((*outval
= malloc(*outvallen
+ 1)) == NULL
)
318 (void)memcpy(*outval
, yprkv
.val
.valdat_val
, *outvallen
);
319 (*outval
)[*outvallen
] = '\0';
322 xdr_free(xdr_ypresp_key_val
, (char *) &yprkv
);