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