rx: always use/protect the xdr routines in the kernel
[openafs.git] / src / rx / xdr_array.c
index 7d07294..8f8ddc9 100644 (file)
@@ -5,23 +5,23 @@
  * may copy or modify Sun RPC without charge, but are not authorized
  * to license or distribute it to anyone else except as part of a product or
  * program developed by the user.
- * 
+ *
  * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
  * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
  * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
- * 
+ *
  * Sun RPC is provided with no support and without any obligation on the
  * part of Sun Microsystems, Inc. to assist in its use, correction,
  * modification or enhancement.
- * 
+ *
  * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
  * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
  * OR ANY PART THEREOF.
- * 
+ *
  * In no event will Sun Microsystems, Inc. be liable for any lost revenue
  * or profits or other special, indirect and consequential damages, even if
  * Sun has been advised of the possibility of such damages.
- * 
+ *
  * Sun Microsystems, Inc.
  * 2550 Garcia Avenue
  * Mountain View, California  94043
 #include <afsconfig.h>
 #include <afs/param.h>
 
-RCSID("$Header$");
-
 #ifndef        NeXT
 
+#ifndef KERNEL
+# include <roken.h>
+#endif
+
+#include "rx.h"
+
 /*
  * xdr_array.c, Generic XDR routines impelmentation.
  *
@@ -42,7 +46,8 @@ RCSID("$Header$");
  * arrays.  See xdr.h for more info on the interface to xdr.
  */
 
-#ifdef KERNEL
+#if defined(KERNEL) && !defined(UKERNEL)
+
 #include <sys/param.h>
 #ifdef AFS_LINUX20_ENV
 #include "h/string.h"
@@ -50,10 +55,13 @@ RCSID("$Header$");
 #define bzero(A,C) memset((A), 0, (C))
 #endif
 #else
+#ifndef AFS_DARWIN90_ENV
 #include <sys/systm.h>
+#endif
 #endif /* AFS_LINUX20_ENV */
 #else
 #include <stdio.h>
+#include <string.h>
 #endif
 #include "xdr.h"
 
@@ -67,7 +75,7 @@ RCSID("$Header$");
  * 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 *
@@ -75,63 +83,69 @@ RCSID("$Header$");
        xdrproc_t elproc;       * xdr routine to handle each element *
 */
 
-bool_t xdr_array(register XDR *xdrs, caddr_t *addrp, u_int *sizep, 
-       u_int maxsize, u_int elsize, xdrproc_t elproc)
+bool_t
+xdr_array(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 u_int nodesize;
+    u_int i;
+    caddr_t target = *addrp;
+    u_int c;           /* the actual element count */
+    bool_t stat = TRUE;
+    u_int nodesize;
 
-        i = ((~0) >> 1) / elsize;
-        if (maxsize > i) maxsize = i;
+    /* FIXME: this does not look correct: MSVC 6 computes -1 / elsize here */
+    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)) {
+    /* 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);
-                       }
-                       memset(target, 0, (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;
+
+       case XDR_FREE:
+           return (TRUE);
 
-       /*
-        * the array may need freeing
-        */
-       if (xdrs->x_op == XDR_FREE) {
-               osi_free(*addrp, nodesize);
-               *addrp = NULL;
+       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 /* NeXT */