]>
git.saurik.com Git - apple/libinfo.git/blob - rpc.subproj/rpc_callmsg.c
   2  * Copyright (c) 1999-2018 Apple Inc. All rights reserved. 
   4  * @APPLE_LICENSE_HEADER_START@ 
   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 
  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 
  22  * @APPLE_LICENSE_HEADER_END@ 
  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. 
  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. 
  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. 
  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. 
  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. 
  48  * Sun Microsystems, Inc. 
  50  * Mountain View, California  94043 
  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";*/ 
  56 static char *rcsid 
= "$Id: rpc_callmsg.c,v 1.4 2003/06/23 17:24:59 majka Exp $"; 
  62  * Copyright (C) 1984, Sun Microsystems, Inc. 
  66 #include "libinfo_common.h" 
  70 #include <sys/param.h> 
  74 extern bool_t           
xdr_opaque_auth(); 
  81 xdr_callmsg(xdrs
, cmsg
) 
  83         register struct rpc_msg 
*cmsg
; 
  90         register struct opaque_auth 
*oa
; 
  92         if (xdrs
->x_op 
== XDR_ENCODE
) { 
  93                 if (cmsg
->rm_call
.cb_cred
.oa_length 
> MAX_AUTH_BYTES
) { 
  96                 if (cmsg
->rm_call
.cb_verf
.oa_length 
> MAX_AUTH_BYTES
) { 
 100                 buf 
= (int *)XDR_INLINE(xdrs
, 8 * BYTES_PER_XDR_UNIT
 
 101                                                                  + RNDUP(cmsg
->rm_call
.cb_cred
.oa_length
) 
 102                                                                  + 2 * BYTES_PER_XDR_UNIT
 
 103                                                                  + RNDUP(cmsg
->rm_call
.cb_verf
.oa_length
)); 
 105                 buf 
= (long *)XDR_INLINE(xdrs
, 8 * BYTES_PER_XDR_UNIT
 
 106                                                                  + RNDUP(cmsg
->rm_call
.cb_cred
.oa_length
) 
 107                                                                  + 2 * BYTES_PER_XDR_UNIT
 
 108                                                                  + RNDUP(cmsg
->rm_call
.cb_verf
.oa_length
)); 
 111                         IXDR_PUT_LONG(buf
, cmsg
->rm_xid
); 
 112                         IXDR_PUT_ENUM(buf
, cmsg
->rm_direction
); 
 113                         if (cmsg
->rm_direction 
!= CALL
) { 
 116                         IXDR_PUT_LONG(buf
, cmsg
->rm_call
.cb_rpcvers
); 
 117                         if (cmsg
->rm_call
.cb_rpcvers 
!= RPC_MSG_VERSION
) { 
 120                         IXDR_PUT_LONG(buf
, cmsg
->rm_call
.cb_prog
); 
 121                         IXDR_PUT_LONG(buf
, cmsg
->rm_call
.cb_vers
); 
 122                         IXDR_PUT_LONG(buf
, cmsg
->rm_call
.cb_proc
); 
 123                         oa 
= &cmsg
->rm_call
.cb_cred
; 
 124                         IXDR_PUT_ENUM(buf
, oa
->oa_flavor
); 
 125                         IXDR_PUT_LONG(buf
, oa
->oa_length
); 
 127                                 bcopy(oa
->oa_base
, (caddr_t
)buf
, oa
->oa_length
); 
 129                                 buf 
+= RNDUP(oa
->oa_length
) / sizeof (int); 
 131                                 buf 
+= RNDUP(oa
->oa_length
) / sizeof (long); 
 134                         oa 
= &cmsg
->rm_call
.cb_verf
; 
 135                         IXDR_PUT_ENUM(buf
, oa
->oa_flavor
); 
 136                         IXDR_PUT_LONG(buf
, oa
->oa_length
); 
 138                                 bcopy(oa
->oa_base
, (caddr_t
)buf
, oa
->oa_length
); 
 140                                 * N.B. Fix this for __LP64__ if it is uncommented * 
 141                                 buf += RNDUP(oa->oa_length) / sizeof (long); 
 147         if (xdrs
->x_op 
== XDR_DECODE
) { 
 149                 buf 
= (int *)XDR_INLINE(xdrs
, 8 * BYTES_PER_XDR_UNIT
); 
 151                 buf 
= (long *)XDR_INLINE(xdrs
, 8 * BYTES_PER_XDR_UNIT
); 
 154                         cmsg
->rm_xid 
= IXDR_GET_LONG(buf
); 
 155                         cmsg
->rm_direction 
= IXDR_GET_ENUM(buf
, enum msg_type
); 
 156                         if (cmsg
->rm_direction 
!= CALL
) { 
 159                         cmsg
->rm_call
.cb_rpcvers 
= IXDR_GET_LONG(buf
); 
 160                         if (cmsg
->rm_call
.cb_rpcvers 
!= RPC_MSG_VERSION
) { 
 163                         cmsg
->rm_call
.cb_prog 
= IXDR_GET_LONG(buf
); 
 164                         cmsg
->rm_call
.cb_vers 
= IXDR_GET_LONG(buf
); 
 165                         cmsg
->rm_call
.cb_proc 
= IXDR_GET_LONG(buf
); 
 166                         oa 
= &cmsg
->rm_call
.cb_cred
; 
 167                         oa
->oa_flavor 
= IXDR_GET_ENUM(buf
, enum_t
); 
 168                         oa
->oa_length 
= IXDR_GET_LONG(buf
); 
 170                                 if (oa
->oa_length 
> MAX_AUTH_BYTES
) { 
 173                                 if (oa
->oa_base 
== NULL
) { 
 174                                         oa
->oa_base 
= (caddr_t
) 
 175                                                 mem_alloc(oa
->oa_length
); 
 178                                 buf 
= (int *)XDR_INLINE(xdrs
, RNDUP(oa
->oa_length
)); 
 180                                 buf 
= (long *)XDR_INLINE(xdrs
, RNDUP(oa
->oa_length
)); 
 183                                         if (xdr_opaque(xdrs
, oa
->oa_base
, 
 184                                             oa
->oa_length
) == FALSE
) { 
 188                                         bcopy((caddr_t
)buf
, oa
->oa_base
, 
 191                                         * N.B. Fix this for __LP64__ if it is uncommented * 
 192                                         buf += RNDUP(oa->oa_length) / sizeof (long); 
 196                         oa 
= &cmsg
->rm_call
.cb_verf
; 
 198                         buf 
= (int *)XDR_INLINE(xdrs
, 2 * BYTES_PER_XDR_UNIT
); 
 200                         buf 
= (long *)XDR_INLINE(xdrs
, 2 * BYTES_PER_XDR_UNIT
); 
 203                                 if (xdr_enum(xdrs
, &oa
->oa_flavor
) == FALSE 
|| 
 204                                     xdr_u_int(xdrs
, &oa
->oa_length
) == FALSE
) { 
 208                                 oa
->oa_flavor 
= IXDR_GET_ENUM(buf
, enum_t
); 
 209                                 oa
->oa_length 
= IXDR_GET_LONG(buf
); 
 212                                 if (oa
->oa_length 
> MAX_AUTH_BYTES
) { 
 215                                 if (oa
->oa_base 
== NULL
) { 
 216                                         oa
->oa_base 
= (caddr_t
) 
 217                                                 mem_alloc(oa
->oa_length
); 
 220                                 buf 
= (int *)XDR_INLINE(xdrs
, RNDUP(oa
->oa_length
)); 
 222                                 buf 
= (long *)XDR_INLINE(xdrs
, RNDUP(oa
->oa_length
)); 
 225                                         if (xdr_opaque(xdrs
, oa
->oa_base
, 
 226                                             oa
->oa_length
) == FALSE
) { 
 230                                         bcopy((caddr_t
)buf
, oa
->oa_base
, 
 233                                         * N.B. Fix this for __LP64__ if it is uncommented * 
 234                                         buf += RNDUP(oa->oa_length) / sizeof (long); 
 242             xdr_u_long(xdrs
, &(cmsg
->rm_xid
)) && 
 243             xdr_enum(xdrs
, (enum_t 
*)&(cmsg
->rm_direction
)) && 
 244             (cmsg
->rm_direction 
== CALL
) && 
 245             xdr_u_long(xdrs
, &(cmsg
->rm_call
.cb_rpcvers
)) && 
 246             (cmsg
->rm_call
.cb_rpcvers 
== RPC_MSG_VERSION
) && 
 247             xdr_u_long(xdrs
, &(cmsg
->rm_call
.cb_prog
)) && 
 248             xdr_u_long(xdrs
, &(cmsg
->rm_call
.cb_vers
)) && 
 249             xdr_u_long(xdrs
, &(cmsg
->rm_call
.cb_proc
)) && 
 250             xdr_opaque_auth(xdrs
, &(cmsg
->rm_call
.cb_cred
)) ) 
 251             return (xdr_opaque_auth(xdrs
, &(cmsg
->rm_call
.cb_verf
)));