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: }

Defined functions

xdr_array defined in line 56; used 2 times

Defined variables

sccsid defined in line 30; never used

Defined macros

LASTUNSIGNED defined in line 45; used 1 times
Last modified: 1985-04-19
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 901
Valid CSS Valid XHTML 1.0 Strict