Home | History | Annotate | Line # | Download | only in rpc
xdr_reference.c revision 1.15.4.1
      1  1.15.4.1      yamt /*	$NetBSD: xdr_reference.c,v 1.15.4.1 2012/10/30 18:58:57 yamt Exp $	*/
      2       1.3       cgd 
      3       1.1       cgd /*
      4       1.1       cgd  * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
      5       1.1       cgd  * unrestricted use provided that this legend is included on all tape
      6       1.1       cgd  * media and as a part of the software program in whole or part.  Users
      7       1.1       cgd  * may copy or modify Sun RPC without charge, but are not authorized
      8       1.1       cgd  * to license or distribute it to anyone else except as part of a product or
      9       1.1       cgd  * program developed by the user.
     10       1.1       cgd  *
     11       1.1       cgd  * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
     12       1.1       cgd  * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
     13       1.1       cgd  * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
     14       1.1       cgd  *
     15       1.1       cgd  * Sun RPC is provided with no support and without any obligation on the
     16       1.1       cgd  * part of Sun Microsystems, Inc. to assist in its use, correction,
     17       1.1       cgd  * modification or enhancement.
     18       1.1       cgd  *
     19       1.1       cgd  * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
     20       1.1       cgd  * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
     21       1.1       cgd  * OR ANY PART THEREOF.
     22       1.1       cgd  *
     23       1.1       cgd  * In no event will Sun Microsystems, Inc. be liable for any lost revenue
     24       1.1       cgd  * or profits or other special, indirect and consequential damages, even if
     25       1.1       cgd  * Sun has been advised of the possibility of such damages.
     26       1.1       cgd  *
     27       1.1       cgd  * Sun Microsystems, Inc.
     28       1.1       cgd  * 2550 Garcia Avenue
     29       1.1       cgd  * Mountain View, California  94043
     30       1.1       cgd  */
     31       1.1       cgd 
     32       1.6  christos #include <sys/cdefs.h>
     33       1.1       cgd #if defined(LIBC_SCCS) && !defined(lint)
     34       1.6  christos #if 0
     35       1.6  christos static char *sccsid = "@(#)xdr_reference.c 1.11 87/08/11 SMI";
     36       1.6  christos static char *sccsid = "@(#)xdr_reference.c	2.1 88/07/29 4.0 RPCSRC";
     37       1.6  christos #else
     38  1.15.4.1      yamt __RCSID("$NetBSD: xdr_reference.c,v 1.15.4.1 2012/10/30 18:58:57 yamt Exp $");
     39       1.6  christos #endif
     40       1.1       cgd #endif
     41       1.1       cgd 
     42       1.1       cgd /*
     43      1.14       wiz  * xdr_reference.c, Generic XDR routines implementation.
     44       1.1       cgd  *
     45       1.1       cgd  * Copyright (C) 1987, Sun Microsystems, Inc.
     46       1.1       cgd  *
     47       1.1       cgd  * These are the "non-trivial" xdr primitives used to serialize and de-serialize
     48       1.1       cgd  * "pointers".  See xdr.h for more info on the interface to xdr.
     49       1.1       cgd  */
     50       1.1       cgd 
     51       1.7       jtc #include "namespace.h"
     52      1.11     lukem 
     53      1.11     lukem #include <err.h>
     54       1.1       cgd #include <stdio.h>
     55       1.2       cgd #include <stdlib.h>
     56       1.4       jtc #include <string.h>
     57      1.11     lukem 
     58       1.1       cgd #include <rpc/types.h>
     59       1.1       cgd #include <rpc/xdr.h>
     60       1.7       jtc 
     61       1.7       jtc #ifdef __weak_alias
     62      1.13   mycroft __weak_alias(xdr_pointer,_xdr_pointer)
     63      1.13   mycroft __weak_alias(xdr_reference,_xdr_reference)
     64       1.7       jtc #endif
     65       1.1       cgd 
     66       1.1       cgd /*
     67       1.1       cgd  * XDR an indirect pointer
     68       1.1       cgd  * xdr_reference is for recursively translating a structure that is
     69       1.1       cgd  * referenced by a pointer inside the structure that is currently being
     70       1.1       cgd  * translated.  pp references a pointer to storage. If *pp is null
     71       1.1       cgd  * the  necessary storage is allocated.
     72       1.1       cgd  * size is the sizeof the referneced structure.
     73       1.1       cgd  * proc is the routine to handle the referenced structure.
     74       1.1       cgd  */
     75       1.1       cgd bool_t
     76  1.15.4.1      yamt xdr_reference(XDR *xdrs, caddr_t *pp, u_int size, xdrproc_t proc)
     77       1.1       cgd {
     78      1.11     lukem 	caddr_t loc = *pp;
     79      1.11     lukem 	bool_t stat;
     80       1.1       cgd 
     81       1.1       cgd 	if (loc == NULL)
     82       1.1       cgd 		switch (xdrs->x_op) {
     83       1.1       cgd 		case XDR_FREE:
     84       1.1       cgd 			return (TRUE);
     85       1.1       cgd 
     86       1.1       cgd 		case XDR_DECODE:
     87      1.15  christos 			*pp = loc = mem_alloc(size);
     88       1.1       cgd 			if (loc == NULL) {
     89      1.11     lukem 				warnx("xdr_reference: out of memory");
     90       1.1       cgd 				return (FALSE);
     91       1.1       cgd 			}
     92      1.12  christos 			memset(loc, 0, size);
     93       1.1       cgd 			break;
     94       1.6  christos 
     95       1.6  christos 		case XDR_ENCODE:
     96       1.6  christos 			break;
     97       1.6  christos 		}
     98       1.1       cgd 
     99       1.5       jtc 	stat = (*proc)(xdrs, loc);
    100       1.1       cgd 
    101       1.1       cgd 	if (xdrs->x_op == XDR_FREE) {
    102       1.1       cgd 		mem_free(loc, size);
    103       1.1       cgd 		*pp = NULL;
    104       1.1       cgd 	}
    105       1.1       cgd 	return (stat);
    106       1.1       cgd }
    107       1.1       cgd 
    108       1.1       cgd 
    109       1.1       cgd /*
    110       1.1       cgd  * xdr_pointer():
    111       1.1       cgd  *
    112       1.1       cgd  * XDR a pointer to a possibly recursive data structure. This
    113       1.1       cgd  * differs with xdr_reference in that it can serialize/deserialiaze
    114       1.1       cgd  * trees correctly.
    115       1.1       cgd  *
    116       1.1       cgd  *  What's sent is actually a union:
    117       1.1       cgd  *
    118       1.1       cgd  *  union object_pointer switch (boolean b) {
    119       1.1       cgd  *  case TRUE: object_data data;
    120       1.1       cgd  *  case FALSE: void nothing;
    121       1.1       cgd  *  }
    122       1.1       cgd  *
    123       1.1       cgd  * > objpp: Pointer to the pointer to the object.
    124       1.1       cgd  * > obj_size: size of the object.
    125       1.1       cgd  * > xdr_obj: routine to XDR an object.
    126       1.1       cgd  *
    127       1.1       cgd  */
    128       1.1       cgd bool_t
    129  1.15.4.1      yamt xdr_pointer(XDR *xdrs, char **objpp, u_int obj_size, xdrproc_t xdr_obj)
    130       1.1       cgd {
    131      1.10     lukem 
    132       1.1       cgd 	bool_t more_data;
    133       1.1       cgd 
    134       1.1       cgd 	more_data = (*objpp != NULL);
    135       1.1       cgd 	if (! xdr_bool(xdrs,&more_data)) {
    136       1.1       cgd 		return (FALSE);
    137       1.1       cgd 	}
    138       1.1       cgd 	if (! more_data) {
    139       1.1       cgd 		*objpp = NULL;
    140       1.1       cgd 		return (TRUE);
    141       1.1       cgd 	}
    142      1.10     lukem 	return (xdr_reference(xdrs,objpp,obj_size,xdr_obj));
    143       1.1       cgd }
    144