1 /* @(#)rpc_callmsg.c 2.1 88/07/29 4.0 RPCSRC */ 2 /* 3 * Sun RPC is a product of Sun Microsystems, Inc. and is provided for 4 * unrestricted use provided that this legend is included on all tape 5 * media and as a part of the software program in whole or part. Users 6 * may copy or modify Sun RPC without charge, but are not authorized 7 * to license or distribute it to anyone else except as part of a product or 8 * program developed by the user. 9 * 10 * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE 11 * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR 12 * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. 13 * 14 * Sun RPC is provided with no support and without any obligation on the 15 * part of Sun Microsystems, Inc. to assist in its use, correction, 16 * modification or enhancement. 17 * 18 * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE 19 * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC 20 * OR ANY PART THEREOF. 21 * 22 * In no event will Sun Microsystems, Inc. be liable for any lost revenue 23 * or profits or other special, indirect and consequential damages, even if 24 * Sun has been advised of the possibility of such damages. 25 * 26 * Sun Microsystems, Inc. 27 * 2550 Garcia Avenue 28 * Mountain View, California 94043 29 */ 30 #if !defined(lint) && defined(SCCSIDS) 31 static char sccsid[] = "@(#)rpc_callmsg.c 1.4 87/08/11 Copyr 1984 Sun Micro"; 32 #endif 33 34 /* 35 * rpc_callmsg.c 36 * 37 * Copyright (C) 1984, Sun Microsystems, Inc. 38 * 39 */ 40 41 #include <sys/param.h> 42 43 #include <rpc/rpc.h> 44 45 /* 46 * XDR a call message 47 */ 48 bool_t 49 xdr_callmsg(xdrs, cmsg) 50 register XDR *xdrs; 51 register struct rpc_msg *cmsg; 52 { 53 register long *buf; 54 register struct opaque_auth *oa; 55 56 if (xdrs->x_op == XDR_ENCODE) { 57 if (cmsg->rm_call.cb_cred.oa_length > MAX_AUTH_BYTES) { 58 return (FALSE); 59 } 60 if (cmsg->rm_call.cb_verf.oa_length > MAX_AUTH_BYTES) { 61 return (FALSE); 62 } 63 buf = XDR_INLINE(xdrs, 8 * BYTES_PER_XDR_UNIT 64 + RNDUP(cmsg->rm_call.cb_cred.oa_length) 65 + 2 * BYTES_PER_XDR_UNIT 66 + RNDUP(cmsg->rm_call.cb_verf.oa_length)); 67 if (buf != NULL) { 68 IXDR_PUT_LONG(buf, cmsg->rm_xid); 69 IXDR_PUT_ENUM(buf, cmsg->rm_direction); 70 if (cmsg->rm_direction != CALL) { 71 return (FALSE); 72 } 73 IXDR_PUT_LONG(buf, cmsg->rm_call.cb_rpcvers); 74 if (cmsg->rm_call.cb_rpcvers != RPC_MSG_VERSION) { 75 return (FALSE); 76 } 77 IXDR_PUT_LONG(buf, cmsg->rm_call.cb_prog); 78 IXDR_PUT_LONG(buf, cmsg->rm_call.cb_vers); 79 IXDR_PUT_LONG(buf, cmsg->rm_call.cb_proc); 80 oa = &cmsg->rm_call.cb_cred; 81 IXDR_PUT_ENUM(buf, oa->oa_flavor); 82 IXDR_PUT_LONG(buf, oa->oa_length); 83 if (oa->oa_length) { 84 bcopy(oa->oa_base, (caddr_t)buf, oa->oa_length); 85 buf += RNDUP(oa->oa_length) / sizeof (long); 86 } 87 oa = &cmsg->rm_call.cb_verf; 88 IXDR_PUT_ENUM(buf, oa->oa_flavor); 89 IXDR_PUT_LONG(buf, oa->oa_length); 90 if (oa->oa_length) { 91 bcopy(oa->oa_base, (caddr_t)buf, oa->oa_length); 92 /* no real need.... 93 buf += RNDUP(oa->oa_length) / sizeof (long); 94 */ 95 } 96 return (TRUE); 97 } 98 } 99 if (xdrs->x_op == XDR_DECODE) { 100 buf = XDR_INLINE(xdrs, 8 * BYTES_PER_XDR_UNIT); 101 if (buf != NULL) { 102 cmsg->rm_xid = IXDR_GET_LONG(buf); 103 cmsg->rm_direction = IXDR_GET_ENUM(buf, enum msg_type); 104 if (cmsg->rm_direction != CALL) { 105 return (FALSE); 106 } 107 cmsg->rm_call.cb_rpcvers = IXDR_GET_LONG(buf); 108 if (cmsg->rm_call.cb_rpcvers != RPC_MSG_VERSION) { 109 return (FALSE); 110 } 111 cmsg->rm_call.cb_prog = IXDR_GET_LONG(buf); 112 cmsg->rm_call.cb_vers = IXDR_GET_LONG(buf); 113 cmsg->rm_call.cb_proc = IXDR_GET_LONG(buf); 114 oa = &cmsg->rm_call.cb_cred; 115 oa->oa_flavor = IXDR_GET_ENUM(buf, enum_t); 116 oa->oa_length = IXDR_GET_LONG(buf); 117 if (oa->oa_length) { 118 if (oa->oa_length > MAX_AUTH_BYTES) { 119 return (FALSE); 120 } 121 if (oa->oa_base == NULL) { 122 oa->oa_base = (caddr_t) 123 mem_alloc(oa->oa_length); 124 } 125 buf = XDR_INLINE(xdrs, RNDUP(oa->oa_length)); 126 if (buf == NULL) { 127 if (xdr_opaque(xdrs, oa->oa_base, 128 oa->oa_length) == FALSE) { 129 return (FALSE); 130 } 131 } else { 132 bcopy((caddr_t)buf, oa->oa_base, 133 oa->oa_length); 134 /* no real need.... 135 buf += RNDUP(oa->oa_length) / 136 sizeof (long); 137 */ 138 } 139 } 140 oa = &cmsg->rm_call.cb_verf; 141 buf = XDR_INLINE(xdrs, 2 * BYTES_PER_XDR_UNIT); 142 if (buf == NULL) { 143 if (xdr_enum(xdrs, &oa->oa_flavor) == FALSE || 144 xdr_u_int(xdrs, &oa->oa_length) == FALSE) { 145 return (FALSE); 146 } 147 } else { 148 oa->oa_flavor = IXDR_GET_ENUM(buf, enum_t); 149 oa->oa_length = IXDR_GET_LONG(buf); 150 } 151 if (oa->oa_length) { 152 if (oa->oa_length > MAX_AUTH_BYTES) { 153 return (FALSE); 154 } 155 if (oa->oa_base == NULL) { 156 oa->oa_base = (caddr_t) 157 mem_alloc(oa->oa_length); 158 } 159 buf = XDR_INLINE(xdrs, RNDUP(oa->oa_length)); 160 if (buf == NULL) { 161 if (xdr_opaque(xdrs, oa->oa_base, 162 oa->oa_length) == FALSE) { 163 return (FALSE); 164 } 165 } else { 166 bcopy((caddr_t)buf, oa->oa_base, 167 oa->oa_length); 168 /* no real need... 169 buf += RNDUP(oa->oa_length) / 170 sizeof (long); 171 */ 172 } 173 } 174 return (TRUE); 175 } 176 } 177 if ( 178 xdr_u_long(xdrs, &(cmsg->rm_xid)) && 179 xdr_enum(xdrs, (enum_t *)&(cmsg->rm_direction)) && 180 (cmsg->rm_direction == CALL) && 181 xdr_u_long(xdrs, &(cmsg->rm_call.cb_rpcvers)) && 182 (cmsg->rm_call.cb_rpcvers == RPC_MSG_VERSION) && 183 xdr_u_long(xdrs, &(cmsg->rm_call.cb_prog)) && 184 xdr_u_long(xdrs, &(cmsg->rm_call.cb_vers)) && 185 xdr_u_long(xdrs, &(cmsg->rm_call.cb_proc)) && 186 xdr_opaque_auth(xdrs, &(cmsg->rm_call.cb_cred)) ) 187 return (xdr_opaque_auth(xdrs, &(cmsg->rm_call.cb_verf))); 188 return (FALSE); 189 } 190 191