obsd44-pass1-20090123
[openafs.git] / src / rx / xdr_arrayn.c
index a9c1751..0860afe 100644 (file)
  * 2550 Garcia Avenue
  * Mountain View, California  94043
  */
+#include <afsconfig.h>
 #include <afs/param.h>
-#if !defined(NeXT)
-#ifndef lint
-static char sccsid[] = "@(#)xdr_array.c 1.1 86/02/03 Copyr 1984 Sun Micro";
+
+RCSID
+    ("$Header$");
+
+#if defined(AFS_OBSD44_ENV) && defined(KERNEL) && !defined(UKERNEL)
+/* XXX osi_alloc, please find and fix */
+#include "osi_machdep.h"
 #endif
 
+#if !defined(NeXT)
+
 /*
  * xdr_array.c, Generic XDR routines impelmentation.
  *
@@ -42,10 +49,13 @@ static char sccsid[] = "@(#)xdr_array.c 1.1 86/02/03 Copyr 1984 Sun Micro";
  */
 
 #if defined(KERNEL) && !defined(UKERNEL)
+
 #include <sys/param.h>
 #ifdef AFS_LINUX20_ENV
-#include "../h/string.h"
+#include "h/string.h"
+#if 0
 #define bzero(A,C) memset((A), 0, (C))
+#endif
 #else
 #include <sys/systm.h>
 #endif
@@ -53,15 +63,6 @@ static char sccsid[] = "@(#)xdr_array.c 1.1 86/02/03 Copyr 1984 Sun Micro";
 #include <stdio.h>
 #endif
 #include "xdr.h"
-#if defined(KERNEL) && !defined(UKERNEL)
-#ifdef        AFS_DEC_ENV
-#include <afs/longc_procs.h>
-#endif
-#endif
-
-#ifndef osi_alloc
-char *osi_alloc();
-#endif
 
 #define LASTUNSIGNED   ((u_int)0-1)
 
@@ -73,67 +74,77 @@ char *osi_alloc();
  * elsize is the size (in bytes) of each element, and elproc is the
  * xdr procedure to call to handle each element of the array.
  */
+/*
+       caddr_t *addrp;         * array pointer *
+       u_int *sizep;           * number of elements *
+       u_int maxsize;          * max numberof elements *
+       u_int elsize;           * size in bytes of each element *
+       xdrproc_t elproc;       * xdr routine to handle each element *
+*/
 #ifdef KERNEL
-bool_t xdr_arrayN(xdrs, addrp, sizep, maxsize, elsize, elproc)
-       register XDR *xdrs;
-       caddr_t *addrp;         /* array pointer */
-       u_int *sizep;           /* number of elements */
-       u_int maxsize;          /* max numberof elements */
-       u_int elsize;           /* size in bytes of each element */
-       xdrproc_t elproc;       /* xdr routine to handle each element */
+bool_t
+xdr_arrayN(register XDR * xdrs, caddr_t * addrp, u_int * sizep, u_int maxsize,
+          u_int elsize, xdrproc_t elproc)
 {
-       register u_int i;
-       register caddr_t target = *addrp;
-       register u_int c;  /* the actual element count */
-       register bool_t stat = TRUE;
-       register int nodesize;
-
-       /* like strings, arrays are really counted arrays */
-       if (! xdr_u_int(xdrs, sizep)) {
-               return (FALSE);
-       }
-       c = *sizep;
-       if ((c > maxsize) && (xdrs->x_op != XDR_FREE)) {
+    register u_int i;
+    register caddr_t target = *addrp;
+    register u_int c;          /* the actual element count */
+    register bool_t stat = TRUE;
+    register u_int nodesize;
+
+    i = ((~0) >> 1) / elsize;
+    if (maxsize > i)
+       maxsize = i;
+
+    /* like strings, arrays are really counted arrays */
+    if (!xdr_u_int(xdrs, sizep)) {
+       return (FALSE);
+    }
+    c = *sizep;
+    if ((c > maxsize) && (xdrs->x_op != XDR_FREE)) {
+       return (FALSE);
+    }
+    nodesize = c * elsize;
+
+    /*
+     * if we are deserializing, we may need to allocate an array.
+     * We also save time by checking for a null array if we are freeing.
+     */
+    if (target == NULL)
+       switch (xdrs->x_op) {
+       case XDR_DECODE:
+           if (c == 0)
+               return (TRUE);
+           *addrp = target = (caddr_t) osi_alloc(nodesize);
+           if (target == NULL) {
                return (FALSE);
-       }
-       nodesize = c * elsize;
-
-       /*
-        * if we are deserializing, we may need to allocate an array.
-        * We also save time by checking for a null array if we are freeing.
-        */
-       if (target == NULL)
-               switch (xdrs->x_op) {
-               case XDR_DECODE:
-                       if (c == 0)
-                               return (TRUE);
-                       *addrp = target = osi_alloc(nodesize);
-                       if (target == NULL) {
-                               return (FALSE);
-                       }
-                       bzero(target, (u_int)nodesize);
-                       break;
-
-               case XDR_FREE:
-                       return (TRUE);
-       }
-       
-       /*
-        * now we xdr each element of array
-        */
-       for (i = 0; (i < c) && stat; i++) {
-               stat = (*elproc)(xdrs, target, LASTUNSIGNED);
-               target += elsize;
-       }
+           }
+           memset(target, 0, (u_int) nodesize);
+           break;
 
-       /*
-        * the array may need freeing
-        */
-       if (xdrs->x_op == XDR_FREE) {
-               osi_free(*addrp, nodesize);
-               *addrp = NULL;
+       case XDR_FREE:
+           return (TRUE);
+
+       case XDR_ENCODE:
+           break;
        }
-       return (stat);
+
+    /*
+     * now we xdr each element of array
+     */
+    for (i = 0; (i < c) && stat; i++) {
+       stat = (*elproc) (xdrs, target, LASTUNSIGNED);
+       target += elsize;
+    }
+
+    /*
+     * the array may need freeing
+     */
+    if (xdrs->x_op == XDR_FREE) {
+       osi_free(*addrp, nodesize);
+       *addrp = NULL;
+    }
+    return (stat);
 }
 #endif
 #endif /* NeXT */