1/* 2 * Copyright (c) 1999 Apple Computer, Inc. All rights reserved. 3 * 4 * @APPLE_LICENSE_HEADER_START@ 5 * 6 * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights 7 * Reserved. This file contains Original Code and/or Modifications of 8 * Original Code as defined in and that are subject to the Apple Public 9 * Source License Version 1.1 (the "License"). You may not use this file 10 * except in compliance with the License. Please obtain a copy of the 11 * License at http://www.apple.com/publicsource and read it before using 12 * this file. 13 * 14 * The Original Code and all software distributed under the License are 15 * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER 16 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 17 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT. Please see the 19 * License for the specific language governing rights and limitations 20 * under the License. 21 * 22 * @APPLE_LICENSE_HEADER_END@ 23 */ 24/* 25 * Sun RPC is a product of Sun Microsystems, Inc. and is provided for 26 * unrestricted use provided that this legend is included on all tape 27 * media and as a part of the software program in whole or part. Users 28 * may copy or modify Sun RPC without charge, but are not authorized 29 * to license or distribute it to anyone else except as part of a product or 30 * program developed by the user. 31 * 32 * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE 33 * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR 34 * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. 35 * 36 * Sun RPC is provided with no support and without any obligation on the 37 * part of Sun Microsystems, Inc. to assist in its use, correction, 38 * modification or enhancement. 39 * 40 * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE 41 * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC 42 * OR ANY PART THEREOF. 43 * 44 * In no event will Sun Microsystems, Inc. be liable for any lost revenue 45 * or profits or other special, indirect and consequential damages, even if 46 * Sun has been advised of the possibility of such damages. 47 * 48 * Sun Microsystems, Inc. 49 * 2550 Garcia Avenue 50 * Mountain View, California 94043 51 */ 52 53#if defined(LIBC_SCCS) && !defined(lint) 54/*static char *sccsid = "from: @(#)rpc_callmsg.c 1.4 87/08/11 Copyr 1984 Sun Micro";*/ 55/*static char *sccsid = "from: @(#)rpc_callmsg.c 2.1 88/07/29 4.0 RPCSRC";*/ 56static char *rcsid = "$Id: rpc_callmsg.c,v 1.4 2003/06/23 17:24:59 majka Exp $"; 57#endif 58 59/* 60 * rpc_callmsg.c 61 * 62 * Copyright (C) 1984, Sun Microsystems, Inc. 63 * 64 */ 65 66#include <stdlib.h> 67#include <string.h> 68#include <sys/param.h> 69 70#include <rpc/rpc.h> 71 72extern bool_t xdr_opaque_auth(); 73 74/* 75 * XDR a call message 76 */ 77bool_t 78xdr_callmsg(xdrs, cmsg) 79 register XDR *xdrs; 80 register struct rpc_msg *cmsg; 81{ 82#ifdef __LP64__ 83 int *buf; 84#else 85 register long *buf; 86#endif 87 register struct opaque_auth *oa; 88 89 if (xdrs->x_op == XDR_ENCODE) { 90 if (cmsg->rm_call.cb_cred.oa_length > MAX_AUTH_BYTES) { 91 return (FALSE); 92 } 93 if (cmsg->rm_call.cb_verf.oa_length > MAX_AUTH_BYTES) { 94 return (FALSE); 95 } 96#ifdef __LP64__ 97 buf = (int *)XDR_INLINE(xdrs, 8 * BYTES_PER_XDR_UNIT 98 + RNDUP(cmsg->rm_call.cb_cred.oa_length) 99 + 2 * BYTES_PER_XDR_UNIT 100 + RNDUP(cmsg->rm_call.cb_verf.oa_length)); 101#else 102 buf = (long *)XDR_INLINE(xdrs, 8 * BYTES_PER_XDR_UNIT 103 + RNDUP(cmsg->rm_call.cb_cred.oa_length) 104 + 2 * BYTES_PER_XDR_UNIT 105 + RNDUP(cmsg->rm_call.cb_verf.oa_length)); 106#endif 107 if (buf != NULL) { 108 IXDR_PUT_LONG(buf, cmsg->rm_xid); 109 IXDR_PUT_ENUM(buf, cmsg->rm_direction); 110 if (cmsg->rm_direction != CALL) { 111 return (FALSE); 112 } 113 IXDR_PUT_LONG(buf, cmsg->rm_call.cb_rpcvers); 114 if (cmsg->rm_call.cb_rpcvers != RPC_MSG_VERSION) { 115 return (FALSE); 116 } 117 IXDR_PUT_LONG(buf, cmsg->rm_call.cb_prog); 118 IXDR_PUT_LONG(buf, cmsg->rm_call.cb_vers); 119 IXDR_PUT_LONG(buf, cmsg->rm_call.cb_proc); 120 oa = &cmsg->rm_call.cb_cred; 121 IXDR_PUT_ENUM(buf, oa->oa_flavor); 122 IXDR_PUT_LONG(buf, oa->oa_length); 123 if (oa->oa_length) { 124 bcopy(oa->oa_base, (caddr_t)buf, oa->oa_length); 125#ifdef __LP64__ 126 buf += RNDUP(oa->oa_length) / sizeof (int); 127#else 128 buf += RNDUP(oa->oa_length) / sizeof (long); 129#endif 130 } 131 oa = &cmsg->rm_call.cb_verf; 132 IXDR_PUT_ENUM(buf, oa->oa_flavor); 133 IXDR_PUT_LONG(buf, oa->oa_length); 134 if (oa->oa_length) { 135 bcopy(oa->oa_base, (caddr_t)buf, oa->oa_length); 136 /* no real need.... 137 * N.B. Fix this for __LP64__ if it is uncommented * 138 buf += RNDUP(oa->oa_length) / sizeof (long); 139 */ 140 } 141 return (TRUE); 142 } 143 } 144 if (xdrs->x_op == XDR_DECODE) { 145#ifdef __LP64__ 146 buf = (int *)XDR_INLINE(xdrs, 8 * BYTES_PER_XDR_UNIT); 147#else 148 buf = (long *)XDR_INLINE(xdrs, 8 * BYTES_PER_XDR_UNIT); 149#endif 150 if (buf != NULL) { 151 cmsg->rm_xid = IXDR_GET_LONG(buf); 152 cmsg->rm_direction = IXDR_GET_ENUM(buf, enum msg_type); 153 if (cmsg->rm_direction != CALL) { 154 return (FALSE); 155 } 156 cmsg->rm_call.cb_rpcvers = IXDR_GET_LONG(buf); 157 if (cmsg->rm_call.cb_rpcvers != RPC_MSG_VERSION) { 158 return (FALSE); 159 } 160 cmsg->rm_call.cb_prog = IXDR_GET_LONG(buf); 161 cmsg->rm_call.cb_vers = IXDR_GET_LONG(buf); 162 cmsg->rm_call.cb_proc = IXDR_GET_LONG(buf); 163 oa = &cmsg->rm_call.cb_cred; 164 oa->oa_flavor = IXDR_GET_ENUM(buf, enum_t); 165 oa->oa_length = IXDR_GET_LONG(buf); 166 if (oa->oa_length) { 167 if (oa->oa_length > MAX_AUTH_BYTES) { 168 return (FALSE); 169 } 170 if (oa->oa_base == NULL) { 171 oa->oa_base = (caddr_t) 172 mem_alloc(oa->oa_length); 173 } 174#ifdef __LP64__ 175 buf = (int *)XDR_INLINE(xdrs, RNDUP(oa->oa_length)); 176#else 177 buf = (long *)XDR_INLINE(xdrs, RNDUP(oa->oa_length)); 178#endif 179 if (buf == NULL) { 180 if (xdr_opaque(xdrs, oa->oa_base, 181 oa->oa_length) == FALSE) { 182 return (FALSE); 183 } 184 } else { 185 bcopy((caddr_t)buf, oa->oa_base, 186 oa->oa_length); 187 /* no real need.... 188 * N.B. Fix this for __LP64__ if it is uncommented * 189 buf += RNDUP(oa->oa_length) / sizeof (long); 190 */ 191 } 192 } 193 oa = &cmsg->rm_call.cb_verf; 194#ifdef __LP64__ 195 buf = (int *)XDR_INLINE(xdrs, 2 * BYTES_PER_XDR_UNIT); 196#else 197 buf = (long *)XDR_INLINE(xdrs, 2 * BYTES_PER_XDR_UNIT); 198#endif 199 if (buf == NULL) { 200 if (xdr_enum(xdrs, &oa->oa_flavor) == FALSE || 201 xdr_u_int(xdrs, &oa->oa_length) == FALSE) { 202 return (FALSE); 203 } 204 } else { 205 oa->oa_flavor = IXDR_GET_ENUM(buf, enum_t); 206 oa->oa_length = IXDR_GET_LONG(buf); 207 } 208 if (oa->oa_length) { 209 if (oa->oa_length > MAX_AUTH_BYTES) { 210 return (FALSE); 211 } 212 if (oa->oa_base == NULL) { 213 oa->oa_base = (caddr_t) 214 mem_alloc(oa->oa_length); 215 } 216#ifdef __LP64__ 217 buf = (int *)XDR_INLINE(xdrs, RNDUP(oa->oa_length)); 218#else 219 buf = (long *)XDR_INLINE(xdrs, RNDUP(oa->oa_length)); 220#endif 221 if (buf == NULL) { 222 if (xdr_opaque(xdrs, oa->oa_base, 223 oa->oa_length) == FALSE) { 224 return (FALSE); 225 } 226 } else { 227 bcopy((caddr_t)buf, oa->oa_base, 228 oa->oa_length); 229 /* no real need... 230 * N.B. Fix this for __LP64__ if it is uncommented * 231 buf += RNDUP(oa->oa_length) / sizeof (long); 232 */ 233 } 234 } 235 return (TRUE); 236 } 237 } 238 if ( 239 xdr_u_long(xdrs, &(cmsg->rm_xid)) && 240 xdr_enum(xdrs, (enum_t *)&(cmsg->rm_direction)) && 241 (cmsg->rm_direction == CALL) && 242 xdr_u_long(xdrs, &(cmsg->rm_call.cb_rpcvers)) && 243 (cmsg->rm_call.cb_rpcvers == RPC_MSG_VERSION) && 244 xdr_u_long(xdrs, &(cmsg->rm_call.cb_prog)) && 245 xdr_u_long(xdrs, &(cmsg->rm_call.cb_vers)) && 246 xdr_u_long(xdrs, &(cmsg->rm_call.cb_proc)) && 247 xdr_opaque_auth(xdrs, &(cmsg->rm_call.cb_cred)) ) 248 return (xdr_opaque_auth(xdrs, &(cmsg->rm_call.cb_verf))); 249 return (FALSE); 250} 251 252