-: 0:Source:xdr_reference.c -: 0:Graph:/var/tsitkova/Sources/v10/trunk/src/lib/rpc/xdr_reference.so.gcno -: 0:Data:/var/tsitkova/Sources/v10/trunk/src/lib/rpc/xdr_reference.so.gcda -: 0:Runs:959 -: 0:Programs:1 -: 1:/* @(#)xdr_reference.c 2.1 88/07/29 4.0 RPCSRC */ -: 2:/* -: 3: * Copyright (c) 2010, Oracle America, Inc. -: 4: * -: 5: * All rights reserved. -: 6: * -: 7: * Redistribution and use in source and binary forms, with or without -: 8: * modification, are permitted provided that the following conditions are met: -: 9: * -: 10: * * Redistributions of source code must retain the above copyright -: 11: * notice, this list of conditions and the following disclaimer. -: 12: * -: 13: * * Redistributions in binary form must reproduce the above copyright -: 14: * notice, this list of conditions and the following disclaimer in -: 15: * the documentation and/or other materials provided with the -: 16: * distribution. -: 17: * -: 18: * * Neither the name of the "Oracle America, Inc." nor the names of -: 19: * its contributors may be used to endorse or promote products -: 20: * derived from this software without specific prior written permission. -: 21: * -: 22: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS -: 23: * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -: 24: * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A -: 25: * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -: 26: * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -: 27: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED -: 28: * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -: 29: * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -: 30: * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -: 31: * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -: 32: * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -: 33: */ -: 34:#if !defined(lint) && defined(SCCSIDS) -: 35:static char sccsid[] = "@(#)xdr_reference.c 1.11 87/08/11 SMI"; -: 36:#endif -: 37: -: 38:/* -: 39: * xdr_reference.c, Generic XDR routines impelmentation. -: 40: * -: 41: * These are the "non-trivial" xdr primitives used to serialize and de-serialize -: 42: * "pointers". See xdr.h for more info on the interface to xdr. -: 43: */ -: 44: -: 45:#include -: 46:#include -: 47:#include -: 48:#include -: 49: -: 50:#define LASTUNSIGNED ((u_int)0-1) -: 51: -: 52:/* -: 53: * XDR an indirect pointer -: 54: * xdr_reference is for recursively translating a structure that is -: 55: * referenced by a pointer inside the structure that is currently being -: 56: * translated. pp references a pointer to storage. If *pp is null -: 57: * the necessary storage is allocated. -: 58: * size is the sizeof the referneced structure. -: 59: * proc is the routine to handle the referenced structure. -: 60: */ -: 61:bool_t #####: 62:xdr_reference( -: 63: XDR *xdrs, -: 64: caddr_t *pp, /* the pointer to work on */ -: 65: u_int size, /* size of the object pointed to */ -: 66: xdrproc_t proc /* xdr routine to handle the object */ -: 67: ) -: 68:{ #####: 69: register caddr_t loc = *pp; -: 70: register bool_t stat; -: 71: #####: 72: if (loc == NULL) #####: 73: switch (xdrs->x_op) { -: 74: case XDR_FREE: #####: 75: return (TRUE); -: 76: -: 77: case XDR_DECODE: #####: 78: *pp = loc = (caddr_t) mem_alloc(size); #####: 79: if (loc == NULL) { #####: 80: (void) fprintf(stderr, -: 81: "xdr_reference: out of memory\n"); #####: 82: return (FALSE); -: 83: } #####: 84: memset(loc, 0, size); -: 85: break; -: 86: -: 87: case XDR_ENCODE: -: 88: break; -: 89: } -: 90: #####: 91: stat = (*proc)(xdrs, loc, LASTUNSIGNED); -: 92: #####: 93: if (xdrs->x_op == XDR_FREE) { #####: 94: mem_free(loc, size); #####: 95: *pp = NULL; -: 96: } #####: 97: return (stat); -: 98:} -: 99: -: 100: -: 101:/* -: 102: * xdr_pointer(): -: 103: * -: 104: * XDR a pointer to a possibly recursive data structure. This -: 105: * differs with xdr_reference in that it can serialize/deserialiaze -: 106: * trees correctly. -: 107: * -: 108: * What's sent is actually a union: -: 109: * -: 110: * union object_pointer switch (boolean b) { -: 111: * case TRUE: object_data data; -: 112: * case FALSE: void nothing; -: 113: * } -: 114: * -: 115: * > objpp: Pointer to the pointer to the object. -: 116: * > obj_size: size of the object. -: 117: * > xdr_obj: routine to XDR an object. -: 118: * -: 119: */ -: 120:bool_t #####: 121:xdr_pointer( -: 122: XDR *xdrs, -: 123: char **objpp, -: 124: u_int obj_size, -: 125: xdrproc_t xdr_obj) -: 126:{ -: 127: -: 128: bool_t more_data; -: 129: #####: 130: more_data = (*objpp != NULL); #####: 131: if (! xdr_bool(xdrs,&more_data)) { #####: 132: return (FALSE); -: 133: } #####: 134: if (! more_data) { #####: 135: *objpp = NULL; #####: 136: return (TRUE); -: 137: } #####: 138: return (xdr_reference(xdrs,objpp,obj_size,xdr_obj)); -: 139:}