|
|
1.1 ! root 1: /* ! 2: * Sun RPC is a product of Sun Microsystems, Inc. and is provided for ! 3: * unrestricted use provided that this legend is included on all tape ! 4: * media and as a part of the software program in whole or part. Users ! 5: * may copy or modify Sun RPC without charge, but are not authorized ! 6: * to license or distribute it to anyone else except as part of a product or ! 7: * program developed by the user. ! 8: * ! 9: * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE ! 10: * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR ! 11: * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. ! 12: * ! 13: * Sun RPC is provided with no support and without any obligation on the ! 14: * part of Sun Microsystems, Inc. to assist in its use, correction, ! 15: * modification or enhancement. ! 16: * ! 17: * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE ! 18: * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC ! 19: * OR ANY PART THEREOF. ! 20: * ! 21: * In no event will Sun Microsystems, Inc. be liable for any lost revenue ! 22: * or profits or other special, indirect and consequential damages, even if ! 23: * Sun has been advised of the possibility of such damages. ! 24: * ! 25: * Sun Microsystems, Inc. ! 26: * 2550 Garcia Avenue ! 27: * Mountain View, California 94043 ! 28: */ ! 29: #ifndef lint ! 30: static char sccsid[] = "@(#)xdr_reference.c 1.2 85/02/26 Copyr 1984 Sun Micro"; ! 31: #endif ! 32: ! 33: /* ! 34: * xdr_reference.c, Generic XDR routines impelmentation. ! 35: * ! 36: * Copyright (C) 1984, Sun Microsystems, Inc. ! 37: * ! 38: * These are the "non-trivial" xdr primitives used to serialize and de-serialize ! 39: * "pointers". See xdr.h for more info on the interface to xdr. ! 40: */ ! 41: ! 42: #include "types.h" ! 43: #include "xdr.h" ! 44: #include <stdio.h> ! 45: #define LASTUNSIGNED ((u_int)0-1) ! 46: ! 47: char *mem_alloc(); ! 48: ! 49: /* ! 50: * XDR an indirect pointer ! 51: * xdr_reference is for recursively translating a structure that is ! 52: * referenced by a pointer inside the structure that is currently being ! 53: * translated. pp references a pointer to storage. If *pp is null ! 54: * the necessary storage is allocated. ! 55: * size is the sizeof the referneced structure. ! 56: * proc is the routine to handle the referenced structure. ! 57: */ ! 58: bool_t ! 59: xdr_reference(xdrs, pp, size, proc) ! 60: register XDR *xdrs; ! 61: caddr_t *pp; /* the pointer to work on */ ! 62: u_int size; /* size of the object pointed to */ ! 63: xdrproc_t proc; /* xdr routine to handle the object */ ! 64: { ! 65: register caddr_t loc = *pp; ! 66: register bool_t stat; ! 67: ! 68: if (loc == NULL) ! 69: switch (xdrs->x_op) { ! 70: case XDR_FREE: ! 71: return (TRUE); ! 72: ! 73: case XDR_DECODE: ! 74: *pp = loc = mem_alloc(size); ! 75: if (loc == NULL) { ! 76: fprintf(stderr, ! 77: "xdr_reference: out of memory\n"); ! 78: return (FALSE); ! 79: } ! 80: bzero(loc, (int)size); ! 81: break; ! 82: } ! 83: ! 84: stat = (*proc)(xdrs, loc, LASTUNSIGNED); ! 85: ! 86: if (xdrs->x_op == XDR_FREE) { ! 87: mem_free(loc, size); ! 88: *pp = NULL; ! 89: } ! 90: return (stat); ! 91: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.