xdryp.c revision 7573
1/* 2 * Copyright (c) 1992/3 Theo de Raadt <deraadt@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 31static char *rcsid = "$Id: xdryp.c,v 1.1 1994/08/07 23:04:54 wollman 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 <string.h> 39#include <stdlib.h> 40#include <ctype.h> 41#include <rpc/rpc.h> 42#include <rpc/xdr.h> 43#include <rpcsvc/yp_prot.h> 44#include <rpcsvc/ypclnt.h> 45 46extern int (*ypresp_allfn)(); 47extern void *ypresp_data; 48 49struct ypresp_all { 50 bool_t more; 51 union { 52 struct ypresp_key_val val; 53 } ypresp_all_u; 54}; 55 56enum ypxfrstat { 57 YPXFR_SUCC = 1, 58 YPXFR_AGE = 2, 59 YPXFR_NOMAP = -1, 60 YPXFR_NODOM = -2, 61 YPXFR_RSRC = -3, 62 YPXFR_RPC = -4, 63 YPXFR_MADDR = -5, 64 YPXFR_YPERR = -6, 65 YPXFR_BADARGS = -7, 66 YPXFR_DBM = -8, 67 YPXFR_FILE = -9, 68 YPXFR_SKEW = -10, 69 YPXFR_CLEAR = -11, 70 YPXFR_FORCE = -12, 71 YPXFR_XFRERR = -13, 72 YPXFR_REFUSED = -14, 73}; 74 75struct ypresp_xfr { 76 u_int transid; 77 enum ypxfrstat xfrstat; 78}; 79 80bool_t 81xdr_domainname(xdrs, objp) 82XDR *xdrs; 83char *objp; 84{ 85 if (!xdr_string(xdrs, &objp, YPMAXDOMAIN)) { 86 return (FALSE); 87 } 88 return (TRUE); 89} 90 91bool_t 92xdr_peername(xdrs, objp) 93XDR *xdrs; 94char *objp; 95{ 96 if (!xdr_string(xdrs, &objp, YPMAXPEER)) { 97 return (FALSE); 98 } 99 return (TRUE); 100} 101 102bool_t 103xdr_datum(xdrs, objp) 104XDR *xdrs; 105datum *objp; 106{ 107 if (!xdr_bytes(xdrs, (char **)&objp->dptr, (u_int *)&objp->dsize, YPMAXRECORD)) { 108 return (FALSE); 109 } 110 return (TRUE); 111} 112 113bool_t 114xdr_mapname(xdrs, objp) 115XDR *xdrs; 116char *objp; 117{ 118 if (!xdr_string(xdrs, &objp, YPMAXMAP)) { 119 return (FALSE); 120 } 121 return (TRUE); 122} 123 124bool_t 125xdr_ypreq_key(xdrs, objp) 126XDR *xdrs; 127struct ypreq_key *objp; 128{ 129 if (!xdr_domainname(xdrs, objp->domain)) { 130 return (FALSE); 131 } 132 if (!xdr_mapname(xdrs, objp->map)) { 133 return (FALSE); 134 } 135 if (!xdr_datum(xdrs, &objp->keydat)) { 136 return (FALSE); 137 } 138 return (TRUE); 139} 140 141bool_t 142xdr_ypreq_nokey(xdrs, objp) 143XDR *xdrs; 144struct ypreq_nokey *objp; 145{ 146 if (!xdr_domainname(xdrs, objp->domain)) { 147 return (FALSE); 148 } 149 if (!xdr_mapname(xdrs, objp->map)) { 150 return (FALSE); 151 } 152 return (TRUE); 153} 154 155bool_t 156xdr_yp_inaddr(xdrs, objp) 157XDR *xdrs; 158struct in_addr *objp; 159{ 160 if (!xdr_opaque(xdrs, (caddr_t)&objp->s_addr, sizeof objp->s_addr)) { 161 return (FALSE); 162 } 163 return (TRUE); 164} 165 166bool_t 167xdr_ypbind_binding(xdrs, objp) 168XDR *xdrs; 169struct ypbind_binding *objp; 170{ 171 if (!xdr_yp_inaddr(xdrs, &objp->ypbind_binding_addr)) { 172 return (FALSE); 173 } 174 if (!xdr_opaque(xdrs, (void *)&objp->ypbind_binding_port, 175 sizeof objp->ypbind_binding_port)) { 176 return (FALSE); 177 } 178 return (TRUE); 179} 180 181bool_t 182xdr_ypbind_resptype(xdrs, objp) 183XDR *xdrs; 184enum ypbind_resptype *objp; 185{ 186 if (!xdr_enum(xdrs, (enum_t *)objp)) { 187 return (FALSE); 188 } 189 return (TRUE); 190} 191 192bool_t 193xdr_ypstat(xdrs, objp) 194XDR *xdrs; 195enum ypbind_resptype *objp; 196{ 197 if (!xdr_enum(xdrs, (enum_t *)objp)) { 198 return (FALSE); 199 } 200 return (TRUE); 201} 202 203bool_t 204xdr_ypbind_resp(xdrs, objp) 205XDR *xdrs; 206struct ypbind_resp *objp; 207{ 208 if (!xdr_ypbind_resptype(xdrs, &objp->ypbind_status)) { 209 return (FALSE); 210 } 211 switch (objp->ypbind_status) { 212 case YPBIND_FAIL_VAL: 213 if (!xdr_u_int(xdrs, (u_int *)&objp->ypbind_respbody.ypbind_error)) { 214 return (FALSE); 215 } 216 break; 217 case YPBIND_SUCC_VAL: 218 if (!xdr_ypbind_binding(xdrs, &objp->ypbind_respbody.ypbind_bindinfo)) { 219 return (FALSE); 220 } 221 break; 222 default: 223 return (FALSE); 224 } 225 return (TRUE); 226} 227 228bool_t 229xdr_ypresp_val(xdrs, objp) 230XDR *xdrs; 231struct ypresp_val *objp; 232{ 233 if (!xdr_ypstat(xdrs, &objp->status)) { 234 return (FALSE); 235 } 236 if (!xdr_datum(xdrs, &objp->valdat)) { 237 return (FALSE); 238 } 239 return (TRUE); 240} 241 242bool_t 243xdr_ypbind_setdom(xdrs, objp) 244XDR *xdrs; 245struct ypbind_setdom *objp; 246{ 247 if (!xdr_domainname(xdrs, objp->ypsetdom_domain)) { 248 return (FALSE); 249 } 250 if (!xdr_ypbind_binding(xdrs, &objp->ypsetdom_binding)) { 251 return (FALSE); 252 } 253 if (!xdr_u_short(xdrs, &objp->ypsetdom_vers)) { 254 return (FALSE); 255 } 256 return (TRUE); 257} 258 259bool_t 260xdr_ypresp_key_val(xdrs, objp) 261XDR *xdrs; 262struct ypresp_key_val *objp; 263{ 264 if (!xdr_ypstat(xdrs, &objp->status)) { 265 return (FALSE); 266 } 267 if (!xdr_datum(xdrs, &objp->valdat)) { 268 return (FALSE); 269 } 270 if (!xdr_datum(xdrs, &objp->keydat)) { 271 return (FALSE); 272 } 273 return (TRUE); 274} 275 276bool_t 277xdr_ypresp_all(xdrs, objp) 278XDR *xdrs; 279struct ypresp_all *objp; 280{ 281 if (!xdr_bool(xdrs, &objp->more)) { 282 return (FALSE); 283 } 284 switch (objp->more) { 285 case TRUE: 286 if (!xdr_ypresp_key_val(xdrs, &objp->ypresp_all_u.val)) { 287 return (FALSE); 288 } 289 break; 290 case FALSE: 291 break; 292 default: 293 return (FALSE); 294 } 295 return (TRUE); 296} 297 298bool_t 299xdr_ypresp_all_seq(xdrs, objp) 300XDR *xdrs; 301u_long *objp; 302{ 303 struct ypresp_all out; 304 u_long status; 305 char *key, *val; 306 int r; 307 308 bzero(&out, sizeof out); 309 while(1) { 310 if( !xdr_ypresp_all(xdrs, &out)) { 311 xdr_free(xdr_ypresp_all, (char *)&out); 312 *objp = YP_YPERR; 313 return FALSE; 314 } 315 if(out.more == 0) { 316 xdr_free(xdr_ypresp_all, (char *)&out); 317 return FALSE; 318 } 319 status = out.ypresp_all_u.val.status; 320 switch(status) { 321 case YP_TRUE: 322 key = (char *)malloc(out.ypresp_all_u.val.keydat.dsize + 1); 323 bcopy(out.ypresp_all_u.val.keydat.dptr, key, 324 out.ypresp_all_u.val.keydat.dsize); 325 key[out.ypresp_all_u.val.keydat.dsize] = '\0'; 326 val = (char *)malloc(out.ypresp_all_u.val.valdat.dsize + 1); 327 bcopy(out.ypresp_all_u.val.valdat.dptr, val, 328 out.ypresp_all_u.val.valdat.dsize); 329 val[out.ypresp_all_u.val.valdat.dsize] = '\0'; 330 xdr_free(xdr_ypresp_all, (char *)&out); 331 332 r = (*ypresp_allfn)(status, 333 key, out.ypresp_all_u.val.keydat.dsize, 334 val, out.ypresp_all_u.val.valdat.dsize, 335 ypresp_data); 336 *objp = status; 337 free(key); 338 free(val); 339 if(r) 340 return TRUE; 341 break; 342 case YP_NOMORE: 343 xdr_free(xdr_ypresp_all, (char *)&out); 344 return TRUE; 345 default: 346 xdr_free(xdr_ypresp_all, (char *)&out); 347 *objp = status; 348 return TRUE; 349 } 350 } 351} 352 353bool_t 354xdr_ypresp_master(xdrs, objp) 355XDR *xdrs; 356struct ypresp_master *objp; 357{ 358 if (!xdr_ypstat(xdrs, &objp->status)) { 359 return (FALSE); 360 } 361 if (!xdr_string(xdrs, &objp->master, YPMAXPEER)) { 362 return (FALSE); 363 } 364 return (TRUE); 365} 366 367bool_t 368xdr_ypmaplist_str(xdrs, objp) 369XDR *xdrs; 370char *objp; 371{ 372 if (!xdr_string(xdrs, &objp, YPMAXMAP+1)) { 373 return (FALSE); 374 } 375 return (TRUE); 376} 377 378bool_t 379xdr_ypmaplist(xdrs, objp) 380XDR *xdrs; 381struct ypmaplist *objp; 382{ 383 if (!xdr_ypmaplist_str(xdrs, objp->ypml_name)) { 384 return (FALSE); 385 } 386 if (!xdr_pointer(xdrs, (caddr_t *)&objp->ypml_next, 387 sizeof(struct ypmaplist), xdr_ypmaplist)) { 388 return (FALSE); 389 } 390 return (TRUE); 391} 392 393bool_t 394xdr_ypresp_maplist(xdrs, objp) 395XDR *xdrs; 396struct ypresp_maplist *objp; 397{ 398 if (!xdr_ypstat(xdrs, &objp->status)) { 399 return (FALSE); 400 } 401 if (!xdr_pointer(xdrs, (caddr_t *)&objp->list, 402 sizeof(struct ypmaplist), xdr_ypmaplist)) { 403 return (FALSE); 404 } 405 return (TRUE); 406} 407 408bool_t 409xdr_ypresp_order(xdrs, objp) 410XDR *xdrs; 411struct ypresp_order *objp; 412{ 413 if (!xdr_ypstat(xdrs, &objp->status)) { 414 return (FALSE); 415 } 416 if (!xdr_u_long(xdrs, &objp->ordernum)) { 417 return (FALSE); 418 } 419 return (TRUE); 420} 421 422bool_t 423xdr_ypxfrstat(xdrs, objp) 424XDR *xdrs; 425enum ypxfrstat *objp; 426{ 427 if (!xdr_enum(xdrs, (enum_t *)objp)) { 428 return (FALSE); 429 } 430 return (TRUE); 431} 432 433bool_t 434xdr_ypresp_xfr(xdrs, objp) 435XDR *xdrs; 436struct ypresp_xfr *objp; 437{ 438 if (!xdr_u_int(xdrs, &objp->transid)) { 439 return (FALSE); 440 } 441 if (!xdr_ypxfrstat(xdrs, &objp->xfrstat)) { 442 return (FALSE); 443 } 444 return (TRUE); 445} 446 447bool_t 448xdr_ypmap_parms(xdrs, objp) 449XDR *xdrs; 450struct ypmap_parms *objp; 451{ 452 if (!xdr_domainname(xdrs, &objp->domain)) { 453 return (FALSE); 454 } 455 if (!xdr_mapname(xdrs, &objp->map)) { 456 return (FALSE); 457 } 458 if (!xdr_u_long(xdrs, &objp->ordernum)) { 459 return (FALSE); 460 } 461 if (!xdr_peername(xdrs, &objp->owner)) { 462 return (FALSE); 463 } 464} 465 466bool_t 467xdr_ypreq_xfr(xdrs, objp) 468XDR *xdrs; 469struct ypreq_xfr *objp; 470{ 471 if (!xdr_ypmap_parms(xdrs, &objp->map_parms)) { 472 return (FALSE); 473 } 474 if (!xdr_u_long(xdrs, &objp->transid)) { 475 return (FALSE); 476 } 477 if (!xdr_u_long(xdrs, &objp->proto)) { 478 return (FALSE); 479 } 480 if (!xdr_u_short(xdrs, &objp->port)) { 481 return (FALSE); 482 } 483 return (TRUE); 484} 485 486bool_t 487xdr_yppush_status(xdrs, objp) 488XDR *xdrs; 489enum yppush_status *objp; 490{ 491 if (!xdr_enum(xdrs, (enum_t *)objp)) { 492 return (FALSE); 493 } 494 return (TRUE); 495} 496 497bool_t 498xdr_yppushresp_xfr(xdrs, objp) 499XDR *xdrs; 500struct yppushresp_xfr *objp; 501{ 502 if (!xdr_u_long(xdrs, &objp->transid)) { 503 return (FALSE); 504 } 505 if (!xdr_yppush_status(xdrs, &objp->status)) { 506 return (FALSE); 507 } 508 return (TRUE); 509} 510