Add more tests.
[kopensolaris-gnu/glibc.git] / sunrpc / rpc_cmsg.c
index a4d5ef3..dea0753 100644 (file)
@@ -6,23 +6,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
@@ -38,153 +38,167 @@ static char sccsid[] = "@(#)rpc_callmsg.c 1.4 87/08/11 Copyr 1984 Sun Micro";
  *
  */
 
+#include <string.h>
 #include <sys/param.h>
-
 #include <rpc/rpc.h>
 
 /*
  * XDR a call message
  */
 bool_t
-xdr_callmsg(xdrs, cmsg)
-       register XDR *xdrs;
-       register struct rpc_msg *cmsg;
+xdr_callmsg (XDR *xdrs, struct rpc_msg *cmsg)
 {
-       register long *buf;
-       register struct opaque_auth *oa;
+  int32_t *buf;
+  struct opaque_auth *oa;
 
-       if (xdrs->x_op == XDR_ENCODE) {
-               if (cmsg->rm_call.cb_cred.oa_length > MAX_AUTH_BYTES) {
-                       return (FALSE);
+  if (xdrs->x_op == XDR_ENCODE)
+    {
+      if (cmsg->rm_call.cb_cred.oa_length > MAX_AUTH_BYTES)
+       {
+         return (FALSE);
+       }
+      if (cmsg->rm_call.cb_verf.oa_length > MAX_AUTH_BYTES)
+       {
+         return (FALSE);
+       }
+      buf = XDR_INLINE (xdrs, 8 * BYTES_PER_XDR_UNIT
+                       + RNDUP (cmsg->rm_call.cb_cred.oa_length)
+                       + 2 * BYTES_PER_XDR_UNIT
+                       + RNDUP (cmsg->rm_call.cb_verf.oa_length));
+      if (buf != NULL)
+       {
+         IXDR_PUT_LONG (buf, cmsg->rm_xid);
+         IXDR_PUT_ENUM (buf, cmsg->rm_direction);
+         if (cmsg->rm_direction != CALL)
+           return FALSE;
+         IXDR_PUT_LONG (buf, cmsg->rm_call.cb_rpcvers);
+         if (cmsg->rm_call.cb_rpcvers != RPC_MSG_VERSION)
+           return FALSE;
+         IXDR_PUT_LONG (buf, cmsg->rm_call.cb_prog);
+         IXDR_PUT_LONG (buf, cmsg->rm_call.cb_vers);
+         IXDR_PUT_LONG (buf, cmsg->rm_call.cb_proc);
+         oa = &cmsg->rm_call.cb_cred;
+         IXDR_PUT_ENUM (buf, oa->oa_flavor);
+         IXDR_PUT_INT32 (buf, oa->oa_length);
+         if (oa->oa_length)
+           {
+             memcpy ((caddr_t) buf, oa->oa_base, oa->oa_length);
+             buf = (int32_t *) ((char *) buf + RNDUP (oa->oa_length));
+           }
+         oa = &cmsg->rm_call.cb_verf;
+         IXDR_PUT_ENUM (buf, oa->oa_flavor);
+         IXDR_PUT_INT32 (buf, oa->oa_length);
+         if (oa->oa_length)
+           {
+             memcpy ((caddr_t) buf, oa->oa_base, oa->oa_length);
+             /* no real need....
+                buf = (long *) ((char *) buf + RNDUP(oa->oa_length));
+              */
+           }
+         return TRUE;
+       }
+    }
+  if (xdrs->x_op == XDR_DECODE)
+    {
+      buf = XDR_INLINE (xdrs, 8 * BYTES_PER_XDR_UNIT);
+      if (buf != NULL)
+       {
+         cmsg->rm_xid = IXDR_GET_LONG (buf);
+         cmsg->rm_direction = IXDR_GET_ENUM (buf, enum msg_type);
+         if (cmsg->rm_direction != CALL)
+           {
+             return FALSE;
+           }
+         cmsg->rm_call.cb_rpcvers = IXDR_GET_LONG (buf);
+         if (cmsg->rm_call.cb_rpcvers != RPC_MSG_VERSION)
+           {
+             return FALSE;
+           }
+         cmsg->rm_call.cb_prog = IXDR_GET_LONG (buf);
+         cmsg->rm_call.cb_vers = IXDR_GET_LONG (buf);
+         cmsg->rm_call.cb_proc = IXDR_GET_LONG (buf);
+         oa = &cmsg->rm_call.cb_cred;
+         oa->oa_flavor = IXDR_GET_ENUM (buf, enum_t);
+         oa->oa_length = IXDR_GET_INT32 (buf);
+         if (oa->oa_length)
+           {
+             if (oa->oa_length > MAX_AUTH_BYTES)
+               return FALSE;
+             if (oa->oa_base == NULL)
+               {
+                 oa->oa_base = (caddr_t)
+                   mem_alloc (oa->oa_length);
                }
-               if (cmsg->rm_call.cb_verf.oa_length > MAX_AUTH_BYTES) {
-                       return (FALSE);
+             buf = XDR_INLINE (xdrs, RNDUP (oa->oa_length));
+             if (buf == NULL)
+               {
+                 if (INTUSE(xdr_opaque) (xdrs, oa->oa_base,
+                                         oa->oa_length) == FALSE)
+                   return FALSE;
                }
-               buf = XDR_INLINE(xdrs, 8 * BYTES_PER_XDR_UNIT
-                       + RNDUP(cmsg->rm_call.cb_cred.oa_length)
-                       + 2 * BYTES_PER_XDR_UNIT
-                       + RNDUP(cmsg->rm_call.cb_verf.oa_length));
-               if (buf != NULL) {
-                       IXDR_PUT_LONG(buf, cmsg->rm_xid);
-                       IXDR_PUT_ENUM(buf, cmsg->rm_direction);
-                       if (cmsg->rm_direction != CALL) {
-                               return (FALSE);
-                       }
-                       IXDR_PUT_LONG(buf, cmsg->rm_call.cb_rpcvers);
-                       if (cmsg->rm_call.cb_rpcvers != RPC_MSG_VERSION) {
-                               return (FALSE);
-                       }
-                       IXDR_PUT_LONG(buf, cmsg->rm_call.cb_prog);
-                       IXDR_PUT_LONG(buf, cmsg->rm_call.cb_vers);
-                       IXDR_PUT_LONG(buf, cmsg->rm_call.cb_proc);
-                       oa = &cmsg->rm_call.cb_cred;
-                       IXDR_PUT_ENUM(buf, oa->oa_flavor);
-                       IXDR_PUT_LONG(buf, oa->oa_length);
-                       if (oa->oa_length) {
-                               bcopy(oa->oa_base, (caddr_t)buf, oa->oa_length);
-                               buf = (long *) ((char *) buf + RNDUP(oa->oa_length));
-                       }
-                       oa = &cmsg->rm_call.cb_verf;
-                       IXDR_PUT_ENUM(buf, oa->oa_flavor);
-                       IXDR_PUT_LONG(buf, oa->oa_length);
-                       if (oa->oa_length) {
-                               bcopy(oa->oa_base, (caddr_t)buf, oa->oa_length);
-                               /* no real need....
-                               buf = (long *) ((char *) buf + RNDUP(oa->oa_length));
-                               */
-                       }
-                       return (TRUE);
+             else
+               {
+                 memcpy (oa->oa_base, (caddr_t) buf, oa->oa_length);
+                 /* no real need....
+                    buf = (long *) ((char *) buf
+                    + RNDUP(oa->oa_length));
+                  */
                }
-       }
-       if (xdrs->x_op == XDR_DECODE) {
-               buf = XDR_INLINE(xdrs, 8 * BYTES_PER_XDR_UNIT);
-               if (buf != NULL) {
-                       cmsg->rm_xid = IXDR_GET_LONG(buf);
-                       cmsg->rm_direction = IXDR_GET_ENUM(buf, enum msg_type);
-                       if (cmsg->rm_direction != CALL) {
-                               return (FALSE);
-                       }
-                       cmsg->rm_call.cb_rpcvers = IXDR_GET_LONG(buf);
-                       if (cmsg->rm_call.cb_rpcvers != RPC_MSG_VERSION) {
-                               return (FALSE);
-                       }
-                       cmsg->rm_call.cb_prog = IXDR_GET_LONG(buf);
-                       cmsg->rm_call.cb_vers = IXDR_GET_LONG(buf);
-                       cmsg->rm_call.cb_proc = IXDR_GET_LONG(buf);
-                       oa = &cmsg->rm_call.cb_cred;
-                       oa->oa_flavor = IXDR_GET_ENUM(buf, enum_t);
-                       oa->oa_length = IXDR_GET_LONG(buf);
-                       if (oa->oa_length) {
-                               if (oa->oa_length > MAX_AUTH_BYTES) {
-                                       return (FALSE);
-                               }
-                               if (oa->oa_base == NULL) {
-                                       oa->oa_base = (caddr_t)
-                                               mem_alloc(oa->oa_length);
-                               }
-                               buf = XDR_INLINE(xdrs, RNDUP(oa->oa_length));
-                               if (buf == NULL) {
-                                       if (xdr_opaque(xdrs, oa->oa_base,
-                                           oa->oa_length) == FALSE) {
-                                               return (FALSE);
-                                       }
-                               } else {
-                                       bcopy((caddr_t)buf, oa->oa_base,
-                                           oa->oa_length);
-                                       /* no real need....
-                                       buf = (long *) ((char *) buf
-                                             + RNDUP(oa->oa_length));
-                                       */
-                               }
-                       }
-                       oa = &cmsg->rm_call.cb_verf;
-                       buf = XDR_INLINE(xdrs, 2 * BYTES_PER_XDR_UNIT);
-                       if (buf == NULL) {
-                               if (xdr_enum(xdrs, &oa->oa_flavor) == FALSE ||
-                                   xdr_u_int(xdrs, &oa->oa_length) == FALSE) {
-                                       return (FALSE);
-                               }
-                       } else {
-                               oa->oa_flavor = IXDR_GET_ENUM(buf, enum_t);
-                               oa->oa_length = IXDR_GET_LONG(buf);
-                       }
-                       if (oa->oa_length) {
-                               if (oa->oa_length > MAX_AUTH_BYTES) {
-                                       return (FALSE);
-                               }
-                               if (oa->oa_base == NULL) {
-                                       oa->oa_base = (caddr_t)
-                                               mem_alloc(oa->oa_length);
-                               }
-                               buf = XDR_INLINE(xdrs, RNDUP(oa->oa_length));
-                               if (buf == NULL) {
-                                       if (xdr_opaque(xdrs, oa->oa_base,
-                                           oa->oa_length) == FALSE) {
-                                               return (FALSE);
-                                       }
-                               } else {
-                                       bcopy((caddr_t)buf, oa->oa_base,
-                                           oa->oa_length);
-                                       /* no real need...
-                                       buf = (long *) ((char *) buf
-                                             + RNDUP(oa->oa_length));
-                                       */
-                               }
-                       }
-                       return (TRUE);
+           }
+         oa = &cmsg->rm_call.cb_verf;
+         buf = XDR_INLINE (xdrs, 2 * BYTES_PER_XDR_UNIT);
+         if (buf == NULL)
+           {
+             if (INTUSE(xdr_enum) (xdrs, &oa->oa_flavor) == FALSE ||
+                 INTUSE(xdr_u_int) (xdrs, &oa->oa_length) == FALSE)
+               {
+                 return FALSE;
                }
+           }
+         else
+           {
+             oa->oa_flavor = IXDR_GET_ENUM (buf, enum_t);
+             oa->oa_length = IXDR_GET_INT32 (buf);
+           }
+         if (oa->oa_length)
+           {
+             if (oa->oa_length > MAX_AUTH_BYTES)
+               return FALSE;
+             if (oa->oa_base == NULL)
+               {
+                 oa->oa_base = (caddr_t)
+                   mem_alloc (oa->oa_length);
+               }
+             buf = XDR_INLINE (xdrs, RNDUP (oa->oa_length));
+             if (buf == NULL)
+               {
+                 if (INTUSE(xdr_opaque) (xdrs, oa->oa_base,
+                                         oa->oa_length) == FALSE)
+                   return FALSE;
+               }
+             else
+               {
+                 memcpy (oa->oa_base, (caddr_t) buf, oa->oa_length);
+                 /* no real need...
+                    buf = (long *) ((char *) buf
+                    + RNDUP(oa->oa_length));
+                  */
+               }
+           }
+         return TRUE;
        }
-       if (
-           xdr_u_long(xdrs, &(cmsg->rm_xid)) &&
-           xdr_enum(xdrs, (enum_t *)&(cmsg->rm_direction)) &&
-           (cmsg->rm_direction == CALL) &&
-           xdr_u_long(xdrs, &(cmsg->rm_call.cb_rpcvers)) &&
-           (cmsg->rm_call.cb_rpcvers == RPC_MSG_VERSION) &&
-           xdr_u_long(xdrs, &(cmsg->rm_call.cb_prog)) &&
-           xdr_u_long(xdrs, &(cmsg->rm_call.cb_vers)) &&
-           xdr_u_long(xdrs, &(cmsg->rm_call.cb_proc)) &&
-           xdr_opaque_auth(xdrs, &(cmsg->rm_call.cb_cred)) )
-           return (xdr_opaque_auth(xdrs, &(cmsg->rm_call.cb_verf)));
-       return (FALSE);
+    }
+  if (
+       INTUSE(xdr_u_long) (xdrs, &(cmsg->rm_xid)) &&
+       INTUSE(xdr_enum) (xdrs, (enum_t *) & (cmsg->rm_direction)) &&
+       (cmsg->rm_direction == CALL) &&
+       INTUSE(xdr_u_long) (xdrs, &(cmsg->rm_call.cb_rpcvers)) &&
+       (cmsg->rm_call.cb_rpcvers == RPC_MSG_VERSION) &&
+       INTUSE(xdr_u_long) (xdrs, &(cmsg->rm_call.cb_prog)) &&
+       INTUSE(xdr_u_long) (xdrs, &(cmsg->rm_call.cb_vers)) &&
+       INTUSE(xdr_u_long) (xdrs, &(cmsg->rm_call.cb_proc)) &&
+       INTUSE(xdr_opaque_auth) (xdrs, &(cmsg->rm_call.cb_cred)))
+    return INTUSE(xdr_opaque_auth) (xdrs, &(cmsg->rm_call.cb_verf));
+  return FALSE;
 }
-
+INTDEF(xdr_callmsg)