The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/xdr/xdr_array.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*      $NetBSD: xdr_array.c,v 1.12 2000/01/22 22:19:18 mycroft Exp $   */
    2 
    3 /*
    4  * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
    5  * unrestricted use provided that this legend is included on all tape
    6  * media and as a part of the software program in whole or part.  Users
    7  * may copy or modify Sun RPC without charge, but are not authorized
    8  * to license or distribute it to anyone else except as part of a product or
    9  * program developed by the user.
   10  *
   11  * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
   12  * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
   13  * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
   14  *
   15  * Sun RPC is provided with no support and without any obligation on the
   16  * part of Sun Microsystems, Inc. to assist in its use, correction,
   17  * modification or enhancement.
   18  *
   19  * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
   20  * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
   21  * OR ANY PART THEREOF.
   22  *
   23  * In no event will Sun Microsystems, Inc. be liable for any lost revenue
   24  * or profits or other special, indirect and consequential damages, even if
   25  * Sun has been advised of the possibility of such damages.
   26  *
   27  * Sun Microsystems, Inc.
   28  * 2550 Garcia Avenue
   29  * Mountain View, California  94043
   30  */
   31 
   32 #if defined(LIBC_SCCS) && !defined(lint)
   33 static char *sccsid2 = "@(#)xdr_array.c 1.10 87/08/11 Copyr 1984 Sun Micro";
   34 static char *sccsid = "@(#)xdr_array.c  2.1 88/07/29 4.0 RPCSRC";
   35 #endif
   36 #include <sys/cdefs.h>
   37 __FBSDID("$FreeBSD: releng/11.2/sys/xdr/xdr_array.c 177633 2008-03-26 15:23:12Z dfr $");
   38 
   39 /*
   40  * xdr_array.c, Generic XDR routines impelmentation.
   41  *
   42  * Copyright (C) 1984, Sun Microsystems, Inc.
   43  *
   44  * These are the "non-trivial" xdr primitives used to serialize and de-serialize
   45  * arrays.  See xdr.h for more info on the interface to xdr.
   46  */
   47 
   48 #include <sys/param.h>
   49 #include <sys/systm.h>
   50 #include <sys/limits.h>
   51 #include <sys/malloc.h>
   52 
   53 #include <rpc/types.h>
   54 #include <rpc/xdr.h>
   55 
   56 /*
   57  * XDR an array of arbitrary elements
   58  * *addrp is a pointer to the array, *sizep is the number of elements.
   59  * If addrp is NULL (*sizep * elsize) bytes are allocated.
   60  * elsize is the size (in bytes) of each element, and elproc is the
   61  * xdr procedure to call to handle each element of the array.
   62  */
   63 bool_t
   64 xdr_array(XDR *xdrs,
   65     caddr_t *addrp,             /* array pointer */
   66     u_int *sizep,               /* number of elements */
   67     u_int maxsize,              /* max numberof elements */
   68     u_int elsize,               /* size in bytes of each element */
   69     xdrproc_t elproc)           /* xdr routine to handle each element */
   70 {
   71         u_int i;
   72         caddr_t target = *addrp;
   73         u_int c;  /* the actual element count */
   74         bool_t stat = TRUE;
   75         u_int nodesize;
   76 
   77         /* like strings, arrays are really counted arrays */
   78         if (!xdr_u_int(xdrs, sizep)) {
   79                 return (FALSE);
   80         }
   81         c = *sizep;
   82         if ((c > maxsize || UINT_MAX/elsize < c) &&
   83             (xdrs->x_op != XDR_FREE)) {
   84                 return (FALSE);
   85         }
   86         nodesize = c * elsize;
   87 
   88         /*
   89          * if we are deserializing, we may need to allocate an array.
   90          * We also save time by checking for a null array if we are freeing.
   91          */
   92         if (target == NULL)
   93                 switch (xdrs->x_op) {
   94                 case XDR_DECODE:
   95                         if (c == 0)
   96                                 return (TRUE);
   97                         *addrp = target = mem_alloc(nodesize);
   98                         if (target == NULL) {
   99                                 printf("xdr_array: out of memory");
  100                                 return (FALSE);
  101                         }
  102                         memset(target, 0, nodesize);
  103                         break;
  104 
  105                 case XDR_FREE:
  106                         return (TRUE);
  107 
  108                 case XDR_ENCODE:
  109                         break;
  110         }
  111         
  112         /*
  113          * now we xdr each element of array
  114          */
  115         for (i = 0; (i < c) && stat; i++) {
  116                 stat = (*elproc)(xdrs, target);
  117                 target += elsize;
  118         }
  119 
  120         /*
  121          * the array may need freeing
  122          */
  123         if (xdrs->x_op == XDR_FREE) {
  124                 mem_free(*addrp, nodesize);
  125                 *addrp = NULL;
  126         }
  127         return (stat);
  128 }
  129 
  130 /*
  131  * xdr_vector():
  132  *
  133  * XDR a fixed length array. Unlike variable-length arrays,
  134  * the storage of fixed length arrays is static and unfreeable.
  135  * > basep: base of the array
  136  * > size: size of the array
  137  * > elemsize: size of each element
  138  * > xdr_elem: routine to XDR each element
  139  */
  140 bool_t
  141 xdr_vector(XDR *xdrs, char *basep, u_int nelem, u_int elemsize,
  142     xdrproc_t xdr_elem)
  143 {
  144         u_int i;
  145         char *elptr;
  146 
  147         elptr = basep;
  148         for (i = 0; i < nelem; i++) {
  149                 if (!(*xdr_elem)(xdrs, elptr)) {
  150                         return(FALSE);
  151                 }
  152                 elptr += elemsize;
  153         }
  154         return(TRUE);   
  155 }

Cache object: 1af30a5399ed3ccb17fccc95b8a1d45b


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.