home *** CD-ROM | disk | FTP | other *** search
/ Gold Fish 3 / goldfish_volume_3.bin / files / comm / tcp / amitcp-sdk / src / rpclib / rpc_callmsg.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-09-29  |  4.5 KB  |  167 lines

  1. /*
  2.  * $Id: rpc_callmsg.c,v 4.2 1994/09/29 23:48:50 jraja Exp $
  3.  *
  4.  * Copyright © 1994 AmiTCP/IP Group,
  5.  *                  Network Solutions Development Inc.
  6.  *                  All rights reserved. 
  7.  */
  8.  
  9. /* @(#)rpc_callmsg.c    2.1 88/07/29 4.0 RPCSRC */
  10. #if !defined(lint) && defined(SCCSIDS)
  11. static char sccsid[] = "@(#)rpc_callmsg.c 1.4 87/08/11 Copyr 1984 Sun Micro";
  12. #endif
  13.  
  14. /*
  15.  * Copyright (C) 1984, Sun Microsystems, Inc.
  16.  */
  17.  
  18. #include <sys/param.h>
  19. #include <rpc/rpc.h>
  20.  
  21. /*
  22.  * XDR a call message
  23.  */
  24. bool_t XDRFUN
  25. xdr_callmsg(xdrs, cmsg)
  26.     register XDR *xdrs;
  27.     register struct rpc_msg *cmsg;
  28. {
  29.     register long *buf;
  30.     register struct opaque_auth *oa;
  31.  
  32.     if (xdrs->x_op == XDR_ENCODE) {
  33.         if (cmsg->rm_call.cb_cred.oa_length > MAX_AUTH_BYTES) {
  34.             return (FALSE);
  35.         }
  36.         if (cmsg->rm_call.cb_verf.oa_length > MAX_AUTH_BYTES) {
  37.             return (FALSE);
  38.         }
  39.         buf = XDR_INLINE(xdrs, 8 * BYTES_PER_XDR_UNIT
  40.             + RNDUP(cmsg->rm_call.cb_cred.oa_length)
  41.             + 2 * BYTES_PER_XDR_UNIT
  42.             + RNDUP(cmsg->rm_call.cb_verf.oa_length));
  43.         if (buf != NULL) {
  44.             IXDR_PUT_LONG(buf, cmsg->rm_xid);
  45.             IXDR_PUT_ENUM(buf, cmsg->rm_direction);
  46.             if (cmsg->rm_direction != CALL) {
  47.                 return (FALSE);
  48.             }
  49.             IXDR_PUT_LONG(buf, cmsg->rm_call.cb_rpcvers);
  50.             if (cmsg->rm_call.cb_rpcvers != RPC_MSG_VERSION) {
  51.                 return (FALSE);
  52.             }
  53.             IXDR_PUT_LONG(buf, cmsg->rm_call.cb_prog);
  54.             IXDR_PUT_LONG(buf, cmsg->rm_call.cb_vers);
  55.             IXDR_PUT_LONG(buf, cmsg->rm_call.cb_proc);
  56.             oa = &cmsg->rm_call.cb_cred;
  57.             IXDR_PUT_ENUM(buf, oa->oa_flavor);
  58.             IXDR_PUT_LONG(buf, oa->oa_length);
  59.             if (oa->oa_length) {
  60.                 bcopy(oa->oa_base, (caddr_t)buf, oa->oa_length);
  61.                 buf += RNDUP(oa->oa_length) / sizeof (long);
  62.             }
  63.             oa = &cmsg->rm_call.cb_verf;
  64.             IXDR_PUT_ENUM(buf, oa->oa_flavor);
  65.             IXDR_PUT_LONG(buf, oa->oa_length);
  66.             if (oa->oa_length) {
  67.                 bcopy(oa->oa_base, (caddr_t)buf, oa->oa_length);
  68.                 /* no real need....
  69.                 buf += RNDUP(oa->oa_length) / sizeof (long);
  70.                 */
  71.             }
  72.             return (TRUE);
  73.         }
  74.     }
  75.     if (xdrs->x_op == XDR_DECODE) {
  76.         buf = XDR_INLINE(xdrs, 8 * BYTES_PER_XDR_UNIT);
  77.         if (buf != NULL) {
  78.             cmsg->rm_xid = IXDR_GET_LONG(buf);
  79.             cmsg->rm_direction = IXDR_GET_ENUM(buf, enum msg_type);
  80.             if (cmsg->rm_direction != CALL) {
  81.                 return (FALSE);
  82.             }
  83.             cmsg->rm_call.cb_rpcvers = IXDR_GET_LONG(buf);
  84.             if (cmsg->rm_call.cb_rpcvers != RPC_MSG_VERSION) {
  85.                 return (FALSE);
  86.             }
  87.             cmsg->rm_call.cb_prog = IXDR_GET_LONG(buf);
  88.             cmsg->rm_call.cb_vers = IXDR_GET_LONG(buf);
  89.             cmsg->rm_call.cb_proc = IXDR_GET_LONG(buf);
  90.             oa = &cmsg->rm_call.cb_cred;
  91.             oa->oa_flavor = IXDR_GET_ENUM(buf, enum_t);
  92.             oa->oa_length = IXDR_GET_LONG(buf);
  93.             if (oa->oa_length) {
  94.                 if (oa->oa_length > MAX_AUTH_BYTES) {
  95.                     return (FALSE);
  96.                 }
  97.                 if (oa->oa_base == NULL) {
  98.                     oa->oa_base = (caddr_t)
  99.                         mem_alloc(oa->oa_length);
  100.                 }
  101.                 buf = XDR_INLINE(xdrs, RNDUP(oa->oa_length));
  102.                 if (buf == NULL) {
  103.                     if (xdr_opaque(xdrs, oa->oa_base,
  104.                         oa->oa_length) == FALSE) {
  105.                         return (FALSE);
  106.                     }
  107.                 } else {
  108.                     bcopy((caddr_t)buf, oa->oa_base,
  109.                         oa->oa_length);
  110.                     /* no real need....
  111.                     buf += RNDUP(oa->oa_length) /
  112.                         sizeof (long);
  113.                     */
  114.                 }
  115.             }
  116.             oa = &cmsg->rm_call.cb_verf;
  117.             buf = XDR_INLINE(xdrs, 2 * BYTES_PER_XDR_UNIT);
  118.             if (buf == NULL) {
  119.                 if (xdr_enum(xdrs, &oa->oa_flavor) == FALSE ||
  120.                     xdr_u_int(xdrs, &oa->oa_length) == FALSE) {
  121.                     return (FALSE);
  122.                 }
  123.             } else {
  124.                 oa->oa_flavor = IXDR_GET_ENUM(buf, enum_t);
  125.                 oa->oa_length = IXDR_GET_LONG(buf);
  126.             }
  127.             if (oa->oa_length) {
  128.                 if (oa->oa_length > MAX_AUTH_BYTES) {
  129.                     return (FALSE);
  130.                 }
  131.                 if (oa->oa_base == NULL) {
  132.                     oa->oa_base = (caddr_t)
  133.                         mem_alloc(oa->oa_length);
  134.                 }
  135.                 buf = XDR_INLINE(xdrs, RNDUP(oa->oa_length));
  136.                 if (buf == NULL) {
  137.                     if (xdr_opaque(xdrs, oa->oa_base,
  138.                         oa->oa_length) == FALSE) {
  139.                         return (FALSE);
  140.                     }
  141.                 } else {
  142.                     bcopy((caddr_t)buf, oa->oa_base,
  143.                         oa->oa_length);
  144.                     /* no real need...
  145.                     buf += RNDUP(oa->oa_length) /
  146.                         sizeof (long);
  147.                     */
  148.                 }
  149.             }
  150.             return (TRUE);
  151.         }
  152.     }
  153.     if (
  154.         xdr_u_long(xdrs, &(cmsg->rm_xid)) &&
  155.         xdr_enum(xdrs, (enum_t *)&(cmsg->rm_direction)) &&
  156.         (cmsg->rm_direction == CALL) &&
  157.         xdr_u_long(xdrs, &(cmsg->rm_call.cb_rpcvers)) &&
  158.         (cmsg->rm_call.cb_rpcvers == RPC_MSG_VERSION) &&
  159.         xdr_u_long(xdrs, &(cmsg->rm_call.cb_prog)) &&
  160.         xdr_u_long(xdrs, &(cmsg->rm_call.cb_vers)) &&
  161.         xdr_u_long(xdrs, &(cmsg->rm_call.cb_proc)) &&
  162.         xdr_opaque_auth(xdrs, &(cmsg->rm_call.cb_cred)) )
  163.         return (xdr_opaque_auth(xdrs, &(cmsg->rm_call.cb_verf)));
  164.     return (FALSE);
  165. }
  166.  
  167.