xdryp.c revision 1.29 1 /* $NetBSD: xdryp.c,v 1.29 2005/11/29 03:12:01 christos Exp $ */
2
3 /*
4 * Copyright (c) 1996 Jason R. Thorpe <thorpej (at) NetBSD.org>.
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
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.
15 * 3. All advertising materials mentioning features or use of this software
16 * must display the following acknowledgement:
17 * This product includes software developed for the NetBSD Project
18 * by Jason R. Thorpe.
19 * 4. The name of the author may not be used to endorse or promote products
20 * derived from this software without specific prior written permission.
21 *
22 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
23 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
24 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
26 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 * SUCH DAMAGE.
33 */
34
35 /*
36 * Copyright (c) 1992, 1993 Theo de Raadt <deraadt (at) fsa.ca>
37 * All rights reserved.
38 *
39 * Redistribution and use in source and binary forms, with or without
40 * modification, are permitted provided that the following conditions
41 * are met:
42 * 1. Redistributions of source code must retain the above copyright
43 * notice, this list of conditions and the following disclaimer.
44 * 2. Redistributions in binary form must reproduce the above copyright
45 * notice, this list of conditions and the following disclaimer in the
46 * documentation and/or other materials provided with the distribution.
47 *
48 *
49 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
50 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
51 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
52 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
53 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
54 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
55 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
56 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
57 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
58 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
59 * SUCH DAMAGE.
60 */
61
62 #include <sys/cdefs.h>
63 #if defined(LIBC_SCCS) && !defined(lint)
64 __RCSID("$NetBSD: xdryp.c,v 1.29 2005/11/29 03:12:01 christos Exp $");
65 #endif
66
67 /*
68 * XDR routines used by the YP protocol. Note that these routines do
69 * not strictly conform to the RPC definition in yp.x. This file
70 * replicates the functions exported by the Sun YP API; reality is
71 * often inaccurate.
72 */
73
74 #include "namespace.h"
75
76 #include <sys/param.h>
77 #include <sys/socket.h>
78
79 #include <assert.h>
80 #include <ctype.h>
81 #include <stdio.h>
82 #include <stdlib.h>
83 #include <string.h>
84
85 #include <rpc/rpc.h>
86 #include <rpc/xdr.h>
87 #include <rpcsvc/yp_prot.h>
88 #include <rpcsvc/ypclnt.h>
89
90 #ifdef __weak_alias
91 __weak_alias(xdr_datum,_xdr_datum)
92 __weak_alias(xdr_domainname,_xdr_domainname)
93 __weak_alias(xdr_mapname,_xdr_mapname)
94 __weak_alias(xdr_peername,_xdr_peername)
95 __weak_alias(xdr_yp_inaddr,_xdr_yp_inaddr)
96 __weak_alias(xdr_ypall,_xdr_ypall)
97 __weak_alias(xdr_ypbind_resp,_xdr_ypbind_resp)
98 __weak_alias(xdr_ypbind_setdom,_xdr_ypbind_setdom)
99 __weak_alias(xdr_ypdomain_wrap_string,_xdr_ypdomain_wrap_string)
100 __weak_alias(xdr_ypmap_parms,_xdr_ypmap_parms)
101 __weak_alias(xdr_ypmap_wrap_string,_xdr_ypmap_wrap_string)
102 __weak_alias(xdr_ypmaplist,_xdr_ypmaplist)
103 __weak_alias(xdr_ypowner_wrap_string,_xdr_ypowner_wrap_string)
104 __weak_alias(xdr_yppushresp_xfr,_xdr_yppushresp_xfr)
105 __weak_alias(xdr_ypreq_key,_xdr_ypreq_key)
106 __weak_alias(xdr_ypreq_nokey,_xdr_ypreq_nokey)
107 __weak_alias(xdr_ypreq_xfr,_xdr_ypreq_xfr)
108 __weak_alias(xdr_ypresp_key_val,_xdr_ypresp_key_val)
109 __weak_alias(xdr_ypresp_maplist,_xdr_ypresp_maplist)
110 __weak_alias(xdr_ypresp_master,_xdr_ypresp_master)
111 __weak_alias(xdr_ypresp_order,_xdr_ypresp_order)
112 __weak_alias(xdr_ypresp_val,_xdr_ypresp_val)
113 #endif
114
115 /*
116 * Functions used only within this file.
117 */
118 static bool_t xdr_ypbind_binding __P((XDR *, struct ypbind_binding *));
119 static bool_t xdr_ypbind_resptype __P((XDR *, enum ypbind_resptype *));
120 static bool_t xdr_ypstat __P((XDR *, enum ypbind_resptype *));
121 static bool_t xdr_ypmaplist_str __P((XDR *, char *));
122
123 __warn_references(xdr_domainname,
124 "warning: this program uses xdr_domainname(), which is deprecated and buggy.")
125
126 bool_t
127 xdr_domainname(xdrs, objp)
128 XDR *xdrs;
129 char *objp;
130 {
131
132 _DIAGASSERT(xdrs != NULL);
133 _DIAGASSERT(objp != NULL);
134
135 return xdr_string(xdrs, &objp, YPMAXDOMAIN);
136 }
137
138 __warn_references(xdr_peername,
139 "warning: this program uses xdr_peername(), which is deprecated and buggy.")
140
141 bool_t
142 xdr_peername(xdrs, objp)
143 XDR *xdrs;
144 char *objp;
145 {
146
147 _DIAGASSERT(xdrs != NULL);
148 _DIAGASSERT(objp != NULL);
149
150 return xdr_string(xdrs, &objp, YPMAXPEER);
151 }
152
153 __warn_references(xdr_mapname,
154 "warning: this program uses xdr_mapname(), which is deprecated and buggy.")
155
156 bool_t
157 xdr_mapname(xdrs, objp)
158 XDR *xdrs;
159 char *objp;
160 {
161
162 _DIAGASSERT(xdrs != NULL);
163 _DIAGASSERT(objp != NULL);
164
165 return xdr_string(xdrs, &objp, YPMAXMAP);
166 }
167
168 bool_t
169 xdr_ypdomain_wrap_string(xdrs, objp)
170 XDR *xdrs;
171 char **objp;
172 {
173
174 _DIAGASSERT(xdrs != NULL);
175 _DIAGASSERT(objp != NULL);
176
177 return xdr_string(xdrs, objp, YPMAXDOMAIN);
178 }
179
180 bool_t
181 xdr_ypmap_wrap_string(xdrs, objp)
182 XDR *xdrs;
183 char **objp;
184 {
185
186 _DIAGASSERT(xdrs != NULL);
187 _DIAGASSERT(objp != NULL);
188
189 return xdr_string(xdrs, objp, YPMAXMAP);
190 }
191
192 bool_t
193 xdr_ypowner_wrap_string(xdrs, objp)
194 XDR *xdrs;
195 char **objp;
196 {
197
198 _DIAGASSERT(xdrs != NULL);
199 _DIAGASSERT(objp != NULL);
200
201 return xdr_string(xdrs, objp, YPMAXPEER);
202 }
203
204 bool_t
205 xdr_datum(xdrs, objp)
206 XDR *xdrs;
207 datum *objp;
208 {
209
210 _DIAGASSERT(xdrs != NULL);
211 _DIAGASSERT(objp != NULL);
212
213 return xdr_bytes(xdrs, __UNCONST(&objp->dptr),
214 (u_int *)&objp->dsize, YPMAXRECORD);
215 }
216
217 bool_t
218 xdr_ypreq_key(xdrs, objp)
219 XDR *xdrs;
220 struct ypreq_key *objp;
221 {
222
223 _DIAGASSERT(xdrs != NULL);
224 _DIAGASSERT(objp != NULL);
225
226 if (!xdr_ypdomain_wrap_string(xdrs, __UNCONST(&objp->domain)))
227 return FALSE;
228
229 if (!xdr_ypmap_wrap_string(xdrs, __UNCONST(&objp->map)))
230 return FALSE;
231
232 if (!xdr_datum(xdrs, &objp->keydat))
233 return FALSE;
234
235 return TRUE;
236 }
237
238 bool_t
239 xdr_ypreq_nokey(xdrs, objp)
240 XDR *xdrs;
241 struct ypreq_nokey *objp;
242 {
243
244 _DIAGASSERT(xdrs != NULL);
245 _DIAGASSERT(objp != NULL);
246
247 if (!xdr_ypdomain_wrap_string(xdrs, __UNCONST(&objp->domain)))
248 return FALSE;
249
250 if (!xdr_ypmap_wrap_string(xdrs, __UNCONST(&objp->map)))
251 return FALSE;
252
253 return TRUE;
254 }
255
256 bool_t
257 xdr_yp_inaddr(xdrs, objp)
258 XDR *xdrs;
259 struct in_addr *objp;
260 {
261
262 _DIAGASSERT(xdrs != NULL);
263 _DIAGASSERT(objp != NULL);
264
265 return xdr_opaque(xdrs, (caddr_t)(void *)&objp->s_addr,
266 sizeof objp->s_addr);
267 }
268
269 static bool_t
270 xdr_ypbind_binding(xdrs, objp)
271 XDR *xdrs;
272 struct ypbind_binding *objp;
273 {
274
275 _DIAGASSERT(xdrs != NULL);
276 _DIAGASSERT(objp != NULL);
277
278 if (!xdr_yp_inaddr(xdrs, &objp->ypbind_binding_addr))
279 return FALSE;
280
281 if (!xdr_opaque(xdrs, (void *)&objp->ypbind_binding_port,
282 sizeof objp->ypbind_binding_port))
283 return FALSE;
284
285 return TRUE;
286 }
287
288 static bool_t
289 xdr_ypbind_resptype(xdrs, objp)
290 XDR *xdrs;
291 enum ypbind_resptype *objp;
292 {
293
294 _DIAGASSERT(xdrs != NULL);
295 _DIAGASSERT(objp != NULL);
296
297 return xdr_enum(xdrs, (enum_t *)(void *)objp);
298 }
299
300 static bool_t
301 xdr_ypstat(xdrs, objp)
302 XDR *xdrs;
303 enum ypbind_resptype *objp;
304 {
305
306 _DIAGASSERT(xdrs != NULL);
307 _DIAGASSERT(objp != NULL);
308
309 return xdr_enum(xdrs, (enum_t *)(void *)objp);
310 }
311
312 bool_t
313 xdr_ypbind_resp(xdrs, objp)
314 XDR *xdrs;
315 struct ypbind_resp *objp;
316 {
317
318 _DIAGASSERT(xdrs != NULL);
319 _DIAGASSERT(objp != NULL);
320
321 if (!xdr_ypbind_resptype(xdrs, &objp->ypbind_status))
322 return FALSE;
323
324 switch (objp->ypbind_status) {
325 case YPBIND_FAIL_VAL:
326 return xdr_u_int(xdrs,
327 (u_int *)&objp->ypbind_respbody.ypbind_error);
328
329 case YPBIND_SUCC_VAL:
330 return xdr_ypbind_binding(xdrs,
331 &objp->ypbind_respbody.ypbind_bindinfo);
332
333 default:
334 return FALSE;
335 }
336 /* NOTREACHED */
337 }
338
339 bool_t
340 xdr_ypresp_val(xdrs, objp)
341 XDR *xdrs;
342 struct ypresp_val *objp;
343 {
344
345 _DIAGASSERT(xdrs != NULL);
346 _DIAGASSERT(objp != NULL);
347
348 if (!xdr_ypstat(xdrs, (enum ypbind_resptype *)(void *)&objp->status))
349 return FALSE;
350
351 if (!xdr_datum(xdrs, &objp->valdat))
352 return FALSE;
353
354 return TRUE;
355 }
356
357 bool_t
358 xdr_ypbind_setdom(xdrs, objp)
359 XDR *xdrs;
360 struct ypbind_setdom *objp;
361 {
362 char *cp;
363
364 _DIAGASSERT(xdrs != NULL);
365 _DIAGASSERT(objp != NULL);
366
367 cp = objp->ypsetdom_domain;
368
369 if (!xdr_ypdomain_wrap_string(xdrs, &cp))
370 return FALSE;
371
372 if (!xdr_ypbind_binding(xdrs, &objp->ypsetdom_binding))
373 return FALSE;
374
375 if (!xdr_u_int(xdrs, &objp->ypsetdom_vers))
376 return FALSE;
377
378 return TRUE;
379 }
380
381 bool_t
382 xdr_ypresp_key_val(xdrs, objp)
383 XDR *xdrs;
384 struct ypresp_key_val *objp;
385 {
386
387 _DIAGASSERT(xdrs != NULL);
388 _DIAGASSERT(objp != NULL);
389
390 if (!xdr_ypstat(xdrs, (enum ypbind_resptype *)(void *)&objp->status))
391 return FALSE;
392
393 if (!xdr_datum(xdrs, &objp->valdat))
394 return FALSE;
395
396 if (!xdr_datum(xdrs, &objp->keydat))
397 return FALSE;
398
399 return TRUE;
400 }
401
402 bool_t
403 xdr_ypall(xdrs, incallback)
404 XDR *xdrs;
405 struct ypall_callback *incallback;
406 {
407 struct ypresp_key_val out;
408 char key[YPMAXRECORD], val[YPMAXRECORD];
409 bool_t more, status;
410
411 _DIAGASSERT(xdrs != NULL);
412 _DIAGASSERT(incallback != NULL);
413
414 /*
415 * Set up key/val struct to be used during the transaction.
416 */
417 memset(&out, 0, sizeof out);
418 out.keydat.dptr = key;
419 out.keydat.dsize = sizeof(key);
420 out.valdat.dptr = val;
421 out.valdat.dsize = sizeof(val);
422
423 for (;;) {
424 /* Values pending? */
425 if (!xdr_bool(xdrs, &more))
426 return FALSE; /* can't tell! */
427 if (!more)
428 return TRUE; /* no more */
429
430 /* Transfer key/value pair. */
431 status = xdr_ypresp_key_val(xdrs, &out);
432
433 /*
434 * If we succeeded, call the callback function.
435 * The callback will return TRUE when it wants
436 * no more values. If we fail, indicate the
437 * error.
438 */
439 if (status) {
440 if ((*incallback->foreach)((int)out.status,
441 __UNCONST(out.keydat.dptr), out.keydat.dsize,
442 __UNCONST(out.valdat.dptr), out.valdat.dsize,
443 incallback->data))
444 return TRUE;
445 } else
446 return FALSE;
447 }
448 }
449
450 bool_t
451 xdr_ypresp_master(xdrs, objp)
452 XDR *xdrs;
453 struct ypresp_master *objp;
454 {
455
456 _DIAGASSERT(xdrs != NULL);
457 _DIAGASSERT(objp != NULL);
458
459 if (!xdr_ypstat(xdrs, (enum ypbind_resptype *)(void *)&objp->status))
460 return FALSE;
461
462 if (!xdr_string(xdrs, &objp->master, YPMAXPEER))
463 return FALSE;
464
465 return TRUE;
466 }
467
468 static bool_t
469 xdr_ypmaplist_str(xdrs, objp)
470 XDR *xdrs;
471 char *objp;
472 {
473
474 _DIAGASSERT(xdrs != NULL);
475 _DIAGASSERT(objp != NULL);
476
477 return xdr_string(xdrs, &objp, YPMAXMAP+1);
478 }
479
480 bool_t
481 xdr_ypmaplist(xdrs, objp)
482 XDR *xdrs;
483 struct ypmaplist *objp;
484 {
485
486 _DIAGASSERT(xdrs != NULL);
487 _DIAGASSERT(objp != NULL);
488
489 if (!xdr_ypmaplist_str(xdrs, objp->ypml_name))
490 return FALSE;
491
492 if (!xdr_pointer(xdrs, (caddr_t *)&objp->ypml_next,
493 sizeof(struct ypmaplist), (xdrproc_t)xdr_ypmaplist))
494 return FALSE;
495
496 return TRUE;
497 }
498
499 bool_t
500 xdr_ypresp_maplist(xdrs, objp)
501 XDR *xdrs;
502 struct ypresp_maplist *objp;
503 {
504
505 _DIAGASSERT(xdrs != NULL);
506 _DIAGASSERT(objp != NULL);
507
508 if (!xdr_ypstat(xdrs, (enum ypbind_resptype *)(void *)&objp->status))
509 return FALSE;
510
511 if (!xdr_pointer(xdrs, (caddr_t *)&objp->list,
512 sizeof(struct ypmaplist), (xdrproc_t)xdr_ypmaplist))
513 return FALSE;
514
515 return TRUE;
516 }
517
518 bool_t
519 xdr_ypresp_order(xdrs, objp)
520 XDR *xdrs;
521 struct ypresp_order *objp;
522 {
523
524 _DIAGASSERT(xdrs != NULL);
525 _DIAGASSERT(objp != NULL);
526
527 if (!xdr_ypstat(xdrs, (enum ypbind_resptype *)(void *)&objp->status))
528 return FALSE;
529
530 if (!xdr_u_int(xdrs, &objp->ordernum))
531 return FALSE;
532
533 return TRUE;
534 }
535
536 bool_t
537 xdr_ypreq_xfr(xdrs, objp)
538 XDR *xdrs;
539 struct ypreq_xfr *objp;
540 {
541
542 _DIAGASSERT(xdrs != NULL);
543 _DIAGASSERT(objp != NULL);
544
545 if (!xdr_ypmap_parms(xdrs, &objp->map_parms))
546 return FALSE;
547
548 if (!xdr_u_int(xdrs, &objp->transid))
549 return FALSE;
550
551 if (!xdr_u_int(xdrs, &objp->proto))
552 return FALSE;
553
554 if (!xdr_u_int(xdrs, &objp->port))
555 return FALSE;
556
557 return TRUE;
558 }
559
560 bool_t
561 xdr_ypmap_parms(xdrs, objp)
562 XDR *xdrs;
563 struct ypmap_parms *objp;
564 {
565
566 _DIAGASSERT(xdrs != NULL);
567 _DIAGASSERT(objp != NULL);
568
569 if (!xdr_ypdomain_wrap_string(xdrs, __UNCONST(&objp->domain)))
570 return FALSE;
571
572 if (!xdr_ypmap_wrap_string(xdrs, __UNCONST(&objp->map)))
573 return FALSE;
574
575 if (!xdr_u_int(xdrs, &objp->ordernum))
576 return FALSE;
577
578 if (!xdr_ypowner_wrap_string(xdrs, &objp->owner))
579 return FALSE;
580
581 return TRUE;
582 }
583
584 bool_t
585 xdr_yppushresp_xfr(xdrs, objp)
586 XDR *xdrs;
587 struct yppushresp_xfr *objp;
588 {
589
590 _DIAGASSERT(xdrs != NULL);
591 _DIAGASSERT(objp != NULL);
592
593 if (!xdr_u_int(xdrs, &objp->transid))
594 return FALSE;
595
596 if (!xdr_enum(xdrs, (enum_t *)&objp->status))
597 return FALSE;
598
599 return TRUE;
600 }
601