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