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