|
|
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_array.c 1.2 85/02/26 Copyr 1984 Sun Micro"; ! 31: #endif ! 32: ! 33: /* ! 34: * xdr_array.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: * arrays. 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 array of arbitrary elements ! 51: * *addrp is a pointer to the array, *sizep is the number of elements. ! 52: * If addrp is NULL (*sizep * elsize) bytes are allocated. ! 53: * elsize is the size (in bytes) of each element, and elproc is the ! 54: * xdr procedure to call to handle each element of the array. ! 55: */ ! 56: bool_t ! 57: xdr_array(xdrs, addrp, sizep, maxsize, elsize, elproc) ! 58: register XDR *xdrs; ! 59: caddr_t *addrp; /* array pointer */ ! 60: u_int *sizep; /* number of elements */ ! 61: u_int maxsize; /* max numberof elements */ ! 62: u_int elsize; /* size in bytes of each element */ ! 63: xdrproc_t elproc; /* xdr routine to handle each element */ ! 64: { ! 65: register u_int i; ! 66: register caddr_t target = *addrp; ! 67: register u_int c; /* the actual element count */ ! 68: register bool_t stat = TRUE; ! 69: register int nodesize; ! 70: ! 71: /* like strings, arrays are really counted arrays */ ! 72: if (! xdr_u_int(xdrs, sizep)) { ! 73: return (FALSE); ! 74: } ! 75: c = *sizep; ! 76: if ((c > maxsize) && (xdrs->x_op != XDR_FREE)) { ! 77: return (FALSE); ! 78: } ! 79: nodesize = c * elsize; ! 80: ! 81: /* ! 82: * if we are deserializing, we may need to allocate an array. ! 83: * We also save time by checking for a null array if we are freeing. ! 84: */ ! 85: if (target == NULL) ! 86: switch (xdrs->x_op) { ! 87: case XDR_DECODE: ! 88: if (c == 0) ! 89: return (TRUE); ! 90: *addrp = target = mem_alloc(nodesize); ! 91: if (target == NULL) { ! 92: fprintf(stderr, "xdr_array: out of memory\n"); ! 93: return (FALSE); ! 94: } ! 95: bzero(target, nodesize); ! 96: break; ! 97: ! 98: case XDR_FREE: ! 99: return (TRUE); ! 100: } ! 101: ! 102: /* ! 103: * now we xdr each element of array ! 104: */ ! 105: for (i = 0; (i < c) && stat; i++) { ! 106: stat = (*elproc)(xdrs, target, LASTUNSIGNED); ! 107: target += elsize; ! 108: } ! 109: ! 110: /* ! 111: * the array may need freeing ! 112: */ ! 113: if (xdrs->x_op == XDR_FREE) { ! 114: mem_free(*addrp, nodesize); ! 115: *addrp = NULL; ! 116: } ! 117: return (stat); ! 118: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.