Back to index

glibc  2.9
Functions
rpc_cmsg.c File Reference
#include <string.h>
#include <sys/param.h>
#include <rpc/rpc.h>

Go to the source code of this file.

Functions

bool_t xdr_callmsg (XDR *xdrs, struct rpc_msg *cmsg)

Function Documentation

bool_t xdr_callmsg ( XDR xdrs,
struct rpc_msg cmsg 
)

Definition at line 49 of file rpc_cmsg.c.

{
  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 (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)
       {
         (void) IXDR_PUT_LONG (buf, cmsg->rm_xid);
         (void) IXDR_PUT_ENUM (buf, cmsg->rm_direction);
         if (cmsg->rm_direction != CALL)
           return FALSE;
         (void) IXDR_PUT_LONG (buf, cmsg->rm_call.cb_rpcvers);
         if (cmsg->rm_call.cb_rpcvers != RPC_MSG_VERSION)
           return FALSE;
         (void) IXDR_PUT_LONG (buf, cmsg->rm_call.cb_prog);
         (void) IXDR_PUT_LONG (buf, cmsg->rm_call.cb_vers);
         (void) IXDR_PUT_LONG (buf, cmsg->rm_call.cb_proc);
         oa = &cmsg->rm_call.cb_cred;
         (void) IXDR_PUT_ENUM (buf, oa->oa_flavor);
         (void) 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;
         (void) IXDR_PUT_ENUM (buf, oa->oa_flavor);
         (void) 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);
              }
             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));
                 */
              }
           }
         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 (
       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;
}

Here is the call graph for this function:

Here is the caller graph for this function: