xdryp.c revision 1.5 1 /*
2 * Copyright (c) 1992/3 Theo de Raadt <deraadt (at) fsa.ca>
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. The name of the author may not be used to endorse or promote
14 * products derived from this software without specific prior written
15 * permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
18 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
21 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 */
29
30 #ifndef LINT
31 static char *rcsid = "$Id: xdryp.c,v 1.5 1993/08/26 00:48:20 jtc Exp $";
32 #endif
33
34 #include <sys/param.h>
35 #include <sys/types.h>
36 #include <sys/socket.h>
37 #include <stdio.h>
38 #include <ctype.h>
39 #include <rpc/rpc.h>
40 #include <rpc/xdr.h>
41 #include <rpcsvc/yp_prot.h>
42 #include <rpcsvc/ypclnt.h>
43
44 extern int (*ypresp_allfn)();
45 extern void *ypresp_data;
46
47 struct ypresp_all {
48 bool_t more;
49 union {
50 struct ypresp_key_val val;
51 } ypresp_all_u;
52 };
53
54 bool_t
55 xdr_domainname(xdrs, objp)
56 XDR *xdrs;
57 char *objp;
58 {
59 if (!xdr_string(xdrs, &objp, YPMAXDOMAIN)) {
60 return (FALSE);
61 }
62 return (TRUE);
63 }
64
65 bool_t
66 xdr_peername(xdrs, objp)
67 XDR *xdrs;
68 char *objp;
69 {
70 if (!xdr_string(xdrs, &objp, YPMAXPEER)) {
71 return (FALSE);
72 }
73 return (TRUE);
74 }
75
76 bool_t
77 xdr_datum(xdrs, objp)
78 XDR *xdrs;
79 datum *objp;
80 {
81 if (!xdr_bytes(xdrs, (char **)&objp->dptr, (u_int *)&objp->dsize, YPMAXRECORD)) {
82 return (FALSE);
83 }
84 return (TRUE);
85 }
86
87 bool_t
88 xdr_mapname(xdrs, objp)
89 XDR *xdrs;
90 char *objp;
91 {
92 if (!xdr_string(xdrs, &objp, YPMAXMAP)) {
93 return (FALSE);
94 }
95 return (TRUE);
96 }
97
98 bool_t
99 xdr_ypreq_key(xdrs, objp)
100 XDR *xdrs;
101 struct 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
115 bool_t
116 xdr_ypreq_nokey(xdrs, objp)
117 XDR *xdrs;
118 struct 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
129 bool_t
130 xdr_yp_inaddr(xdrs, objp)
131 XDR *xdrs;
132 struct 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
140 bool_t
141 xdr_ypbind_binding(xdrs, objp)
142 XDR *xdrs;
143 struct 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
155 bool_t
156 xdr_ypbind_resptype(xdrs, objp)
157 XDR *xdrs;
158 enum ypbind_resptype *objp;
159 {
160 if (!xdr_enum(xdrs, (enum_t *)objp)) {
161 return (FALSE);
162 }
163 return (TRUE);
164 }
165
166 bool_t
167 xdr_ypstat(xdrs, objp)
168 XDR *xdrs;
169 enum ypbind_resptype *objp;
170 {
171 if (!xdr_enum(xdrs, (enum_t *)objp)) {
172 return (FALSE);
173 }
174 return (TRUE);
175 }
176
177 bool_t
178 xdr_ypbind_resp(xdrs, objp)
179 XDR *xdrs;
180 struct 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
202 bool_t
203 xdr_ypresp_val(xdrs, objp)
204 XDR *xdrs;
205 struct 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
216 bool_t
217 xdr_ypbind_setdom(xdrs, objp)
218 XDR *xdrs;
219 struct 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
233 bool_t
234 xdr_ypresp_key_val(xdrs, objp)
235 XDR *xdrs;
236 struct 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
250 bool_t
251 xdr_ypresp_all(xdrs, objp)
252 XDR *xdrs;
253 struct 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
272 bool_t
273 xdr_ypresp_all_seq(xdrs, objp)
274 XDR *xdrs;
275 u_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
327 bool_t
328 xdr_ypresp_master(xdrs, objp)
329 XDR *xdrs;
330 struct 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
341 bool_t
342 xdr_ypmaplist_str(xdrs, objp)
343 XDR *xdrs;
344 char *objp;
345 {
346 if (!xdr_string(xdrs, &objp, YPMAXMAP+1)) {
347 return (FALSE);
348 }
349 return (TRUE);
350 }
351
352 bool_t
353 xdr_ypmaplist(xdrs, objp)
354 XDR *xdrs;
355 struct 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
367 bool_t
368 xdr_ypresp_maplist(xdrs, objp)
369 XDR *xdrs;
370 struct 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
382 bool_t
383 xdr_ypresp_order(xdrs, objp)
384 XDR *xdrs;
385 struct 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