xdryp.c revision 1919
159407Sobrien/*
259407Sobrien * Copyright (c) 1992/3 Theo de Raadt <deraadt@fsa.ca>
360844Sobrien * All rights reserved.
459407Sobrien *
5216351Stijl * Redistribution and use in source and binary forms, with or without
685593Sobrien * modification, are permitted provided that the following conditions
7216351Stijl * are met:
859407Sobrien * 1. Redistributions of source code must retain the above copyright
996516Sru *    notice, this list of conditions and the following disclaimer.
1059407Sobrien * 2. Redistributions in binary form must reproduce the above copyright
1196530Sru *    notice, this list of conditions and the following disclaimer in the
12216351Stijl *    documentation and/or other materials provided with the distribution.
13216351Stijl * 3. The name of the author may not be used to endorse or promote
1496530Sru *    products derived from this software without specific prior written
15216351Stijl *    permission.
16216351Stijl *
1759407Sobrien * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
18216351Stijl * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19216351Stijl * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20200038Skib * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
21216351Stijl * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22216351Stijl * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23216351Stijl * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24216351Stijl * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25216351Stijl * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26216351Stijl * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27216351Stijl * SUCH DAMAGE.
28216351Stijl */
29216351Stijl
30216351Stijl#ifndef LINT
31216351Stijlstatic char *rcsid = "$Id: xdryp.c,v 1.1 1993/11/01 23:56:28 paul Exp $";
32216351Stijl#endif
33216351Stijl
34216351Stijl#include <sys/param.h>
35216351Stijl#include <sys/types.h>
36216351Stijl#include <sys/socket.h>
37216351Stijl#include <stdio.h>
38216351Stijl#include <ctype.h>
39216351Stijl#include <rpc/rpc.h>
40216351Stijl#include <rpc/xdr.h>
41216351Stijl#include <rpcsvc/yp_prot.h>
4259407Sobrien#include <rpcsvc/ypclnt.h>
43100872Sru
4496516Sruextern int (*ypresp_allfn)();
4559407Sobrienextern void *ypresp_data;
4659407Sobrien
47struct ypresp_all {
48	bool_t more;
49	union {
50		struct ypresp_key_val val;
51	} ypresp_all_u;
52};
53
54bool_t
55xdr_domainname(xdrs, objp)
56XDR *xdrs;
57char *objp;
58{
59	if (!xdr_string(xdrs, &objp, YPMAXDOMAIN)) {
60		return (FALSE);
61	}
62	return (TRUE);
63}
64
65bool_t
66xdr_peername(xdrs, objp)
67XDR *xdrs;
68char *objp;
69{
70	if (!xdr_string(xdrs, &objp, YPMAXPEER)) {
71		return (FALSE);
72	}
73	return (TRUE);
74}
75
76bool_t
77xdr_datum(xdrs, objp)
78XDR *xdrs;
79datum *objp;
80{
81	if (!xdr_bytes(xdrs, (char **)&objp->dptr, (u_int *)&objp->dsize, YPMAXRECORD)) {
82		return (FALSE);
83	}
84	return (TRUE);
85}
86
87bool_t
88xdr_mapname(xdrs, objp)
89XDR *xdrs;
90char *objp;
91{
92	if (!xdr_string(xdrs, &objp, YPMAXMAP)) {
93		return (FALSE);
94	}
95	return (TRUE);
96}
97
98bool_t
99xdr_ypreq_key(xdrs, objp)
100XDR *xdrs;
101struct ypreq_key *objp;
102{
103	if (!xdr_domainname(xdrs, objp->domain)) {
104		return (FALSE);
105	}
106	if (!xdr_mapname(xdrs, objp->map)) {
107		return (FALSE);
108	}
109	if (!xdr_datum(xdrs, &objp->keydat)) {
110		return (FALSE);
111	}
112	return (TRUE);
113}
114
115bool_t
116xdr_ypreq_nokey(xdrs, objp)
117XDR *xdrs;
118struct ypreq_nokey *objp;
119{
120	if (!xdr_domainname(xdrs, objp->domain)) {
121		return (FALSE);
122	}
123	if (!xdr_mapname(xdrs, objp->map)) {
124		return (FALSE);
125	}
126	return (TRUE);
127}
128
129bool_t
130xdr_yp_inaddr(xdrs, objp)
131XDR *xdrs;
132struct in_addr *objp;
133{
134	if (!xdr_opaque(xdrs, (caddr_t)&objp->s_addr, sizeof objp->s_addr)) {
135		return (FALSE);
136	}
137	return (TRUE);
138}
139
140bool_t
141xdr_ypbind_binding(xdrs, objp)
142XDR *xdrs;
143struct ypbind_binding *objp;
144{
145	if (!xdr_yp_inaddr(xdrs, &objp->ypbind_binding_addr)) {
146		return (FALSE);
147	}
148	if (!xdr_opaque(xdrs, (void *)&objp->ypbind_binding_port,
149	    sizeof objp->ypbind_binding_port)) {
150		return (FALSE);
151	}
152	return (TRUE);
153}
154
155bool_t
156xdr_ypbind_resptype(xdrs, objp)
157XDR *xdrs;
158enum ypbind_resptype *objp;
159{
160	if (!xdr_enum(xdrs, (enum_t *)objp)) {
161		return (FALSE);
162	}
163	return (TRUE);
164}
165
166bool_t
167xdr_ypstat(xdrs, objp)
168XDR *xdrs;
169enum ypbind_resptype *objp;
170{
171	if (!xdr_enum(xdrs, (enum_t *)objp)) {
172		return (FALSE);
173	}
174	return (TRUE);
175}
176
177bool_t
178xdr_ypbind_resp(xdrs, objp)
179XDR *xdrs;
180struct ypbind_resp *objp;
181{
182	if (!xdr_ypbind_resptype(xdrs, &objp->ypbind_status)) {
183		return (FALSE);
184	}
185	switch (objp->ypbind_status) {
186	case YPBIND_FAIL_VAL:
187		if (!xdr_u_int(xdrs, (u_int *)&objp->ypbind_respbody.ypbind_error)) {
188			return (FALSE);
189		}
190		break;
191	case YPBIND_SUCC_VAL:
192		if (!xdr_ypbind_binding(xdrs, &objp->ypbind_respbody.ypbind_bindinfo)) {
193			return (FALSE);
194		}
195		break;
196	default:
197		return (FALSE);
198	}
199	return (TRUE);
200}
201
202bool_t
203xdr_ypresp_val(xdrs, objp)
204XDR *xdrs;
205struct ypresp_val *objp;
206{
207	if (!xdr_ypstat(xdrs, &objp->status)) {
208		return (FALSE);
209	}
210	if (!xdr_datum(xdrs, &objp->valdat)) {
211		return (FALSE);
212	}
213	return (TRUE);
214}
215
216bool_t
217xdr_ypbind_setdom(xdrs, objp)
218XDR *xdrs;
219struct ypbind_setdom *objp;
220{
221	if (!xdr_domainname(xdrs, objp->ypsetdom_domain)) {
222		return (FALSE);
223	}
224	if (!xdr_ypbind_binding(xdrs, &objp->ypsetdom_binding)) {
225		return (FALSE);
226	}
227	if (!xdr_u_short(xdrs, &objp->ypsetdom_vers)) {
228		return (FALSE);
229	}
230	return (TRUE);
231}
232
233bool_t
234xdr_ypresp_key_val(xdrs, objp)
235XDR *xdrs;
236struct ypresp_key_val *objp;
237{
238	if (!xdr_ypstat(xdrs, &objp->status)) {
239		return (FALSE);
240	}
241	if (!xdr_datum(xdrs, &objp->valdat)) {
242		return (FALSE);
243	}
244	if (!xdr_datum(xdrs, &objp->keydat)) {
245		return (FALSE);
246	}
247	return (TRUE);
248}
249
250bool_t
251xdr_ypresp_all(xdrs, objp)
252XDR *xdrs;
253struct ypresp_all *objp;
254{
255	if (!xdr_bool(xdrs, &objp->more)) {
256		return (FALSE);
257	}
258	switch (objp->more) {
259	case TRUE:
260		if (!xdr_ypresp_key_val(xdrs, &objp->ypresp_all_u.val)) {
261			return (FALSE);
262		}
263		break;
264	case FALSE:
265		break;
266	default:
267		return (FALSE);
268	}
269	return (TRUE);
270}
271
272bool_t
273xdr_ypresp_all_seq(xdrs, objp)
274XDR *xdrs;
275u_long *objp;
276{
277	struct ypresp_all out;
278	u_long status;
279	char *key, *val;
280	int r;
281
282	bzero(&out, sizeof out);
283	while(1) {
284		if( !xdr_ypresp_all(xdrs, &out)) {
285			xdr_free(xdr_ypresp_all, (char *)&out);
286			*objp = YP_YPERR;
287			return FALSE;
288		}
289		if(out.more == 0) {
290			xdr_free(xdr_ypresp_all, (char *)&out);
291			return FALSE;
292		}
293		status = out.ypresp_all_u.val.status;
294		switch(status) {
295		case YP_TRUE:
296			key = (char *)malloc(out.ypresp_all_u.val.keydat.dsize + 1);
297			bcopy(out.ypresp_all_u.val.keydat.dptr, key,
298				out.ypresp_all_u.val.keydat.dsize);
299			key[out.ypresp_all_u.val.keydat.dsize] = '\0';
300			val = (char *)malloc(out.ypresp_all_u.val.valdat.dsize + 1);
301			bcopy(out.ypresp_all_u.val.valdat.dptr, val,
302				out.ypresp_all_u.val.valdat.dsize);
303			val[out.ypresp_all_u.val.valdat.dsize] = '\0';
304			xdr_free(xdr_ypresp_all, (char *)&out);
305
306			r = (*ypresp_allfn)(status,
307				key, out.ypresp_all_u.val.keydat.dsize,
308				val, out.ypresp_all_u.val.valdat.dsize,
309				ypresp_data);
310			*objp = status;
311			free(key);
312			free(val);
313			if(r)
314				return TRUE;
315			break;
316		case YP_NOMORE:
317			xdr_free(xdr_ypresp_all, (char *)&out);
318			return TRUE;
319		default:
320			xdr_free(xdr_ypresp_all, (char *)&out);
321			*objp = status;
322			return TRUE;
323		}
324	}
325}
326
327bool_t
328xdr_ypresp_master(xdrs, objp)
329XDR *xdrs;
330struct ypresp_master *objp;
331{
332	if (!xdr_ypstat(xdrs, &objp->status)) {
333		return (FALSE);
334	}
335	if (!xdr_string(xdrs, &objp->master, YPMAXPEER)) {
336		return (FALSE);
337	}
338	return (TRUE);
339}
340
341bool_t
342xdr_ypmaplist_str(xdrs, objp)
343XDR *xdrs;
344char *objp;
345{
346	if (!xdr_string(xdrs, &objp, YPMAXMAP+1)) {
347		return (FALSE);
348	}
349	return (TRUE);
350}
351
352bool_t
353xdr_ypmaplist(xdrs, objp)
354XDR *xdrs;
355struct ypmaplist *objp;
356{
357	if (!xdr_ypmaplist_str(xdrs, objp->ypml_name)) {
358		return (FALSE);
359	}
360	if (!xdr_pointer(xdrs, (caddr_t *)&objp->ypml_next,
361	    sizeof(struct ypmaplist), xdr_ypmaplist)) {
362		return (FALSE);
363	}
364	return (TRUE);
365}
366
367bool_t
368xdr_ypresp_maplist(xdrs, objp)
369XDR *xdrs;
370struct ypresp_maplist *objp;
371{
372	if (!xdr_ypstat(xdrs, &objp->status)) {
373		return (FALSE);
374	}
375	if (!xdr_pointer(xdrs, (caddr_t *)&objp->list,
376	    sizeof(struct ypmaplist), xdr_ypmaplist)) {
377		return (FALSE);
378	}
379	return (TRUE);
380}
381
382bool_t
383xdr_ypresp_order(xdrs, objp)
384XDR *xdrs;
385struct ypresp_order *objp;
386{
387	if (!xdr_ypstat(xdrs, &objp->status)) {
388		return (FALSE);
389	}
390	if (!xdr_u_long(xdrs, &objp->ordernum)) {
391		return (FALSE);
392	}
393	return (TRUE);
394}
395