15772Sas200622 /* 25772Sas200622 * CDDL HEADER START 35772Sas200622 * 45772Sas200622 * The contents of this file are subject to the terms of the 55772Sas200622 * Common Development and Distribution License (the "License"). 65772Sas200622 * You may not use this file except in compliance with the License. 75772Sas200622 * 85772Sas200622 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 95772Sas200622 * or http://www.opensolaris.org/os/licensing. 105772Sas200622 * See the License for the specific language governing permissions 115772Sas200622 * and limitations under the License. 125772Sas200622 * 135772Sas200622 * When distributing Covered Code, include this CDDL HEADER in each 145772Sas200622 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 155772Sas200622 * If applicable, add the following below this CDDL HEADER, with the 165772Sas200622 * fields enclosed by brackets "[]" replaced with your own identifying 175772Sas200622 * information: Portions Copyright [yyyy] [name of copyright owner] 185772Sas200622 * 195772Sas200622 * CDDL HEADER END 205772Sas200622 */ 215772Sas200622 /* 22*7619SJose.Borrego@Sun.COM * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 235772Sas200622 * Use is subject to license terms. 245772Sas200622 */ 255772Sas200622 265772Sas200622 #include <strings.h> 275772Sas200622 #include <sys/param.h> 285772Sas200622 295772Sas200622 #include <smbsrv/libsmb.h> 305772Sas200622 #include <smbsrv/ndr.h> 315772Sas200622 #include <smbsrv/mlrpc.h> 325772Sas200622 335772Sas200622 #ifdef _BIG_ENDIAN 345772Sas200622 static const int mlrpc_native_byte_order = MLRPC_REPLAB_INTG_BIG_ENDIAN; 355772Sas200622 #else 365772Sas200622 static const int mlrpc_native_byte_order = MLRPC_REPLAB_INTG_LITTLE_ENDIAN; 375772Sas200622 #endif 385772Sas200622 395772Sas200622 int 405772Sas200622 mlrpc_encode_decode_common(struct mlrpc_xaction *mxa, int mode, unsigned opnum, 415772Sas200622 struct ndr_typeinfo *ti, void *datum) 425772Sas200622 { 435772Sas200622 struct mlndr_stream *mlnds; 445772Sas200622 int m_op = NDR_MODE_TO_M_OP(mode); 455772Sas200622 int rc; 465772Sas200622 475772Sas200622 if (m_op == NDR_M_OP_MARSHALL) 485772Sas200622 mlnds = &mxa->send_mlnds; 495772Sas200622 else 505772Sas200622 mlnds = &mxa->recv_mlnds; 515772Sas200622 525772Sas200622 /* 535772Sas200622 * Make sure that mlnds is in the correct mode 545772Sas200622 */ 555772Sas200622 if (!NDR_MODE_MATCH(mlnds, mode)) 565772Sas200622 return (MLRPC_DRC_FAULT_MODE_MISMATCH); 575772Sas200622 585772Sas200622 /* 595772Sas200622 * Perform the (un)marshalling 605772Sas200622 */ 615772Sas200622 if (mlndo_operation(mlnds, ti, opnum, datum)) 625772Sas200622 return (MLRPC_DRC_OK); 635772Sas200622 645772Sas200622 switch (mlnds->error) { 655772Sas200622 case NDR_ERR_MALLOC_FAILED: 665772Sas200622 rc = MLRPC_DRC_FAULT_OUT_OF_MEMORY; 675772Sas200622 break; 685772Sas200622 695772Sas200622 case NDR_ERR_SWITCH_VALUE_INVALID: 705772Sas200622 rc = MLRPC_DRC_FAULT_PARAM_0_INVALID; 715772Sas200622 break; 725772Sas200622 735772Sas200622 case NDR_ERR_UNDERFLOW: 745772Sas200622 rc = MLRPC_DRC_FAULT_RECEIVED_RUNT; 755772Sas200622 break; 765772Sas200622 775772Sas200622 case NDR_ERR_GROW_FAILED: 785772Sas200622 rc = MLRPC_DRC_FAULT_ENCODE_TOO_BIG; 795772Sas200622 break; 805772Sas200622 815772Sas200622 default: 825772Sas200622 if (m_op == NDR_M_OP_MARSHALL) 835772Sas200622 rc = MLRPC_DRC_FAULT_ENCODE_FAILED; 845772Sas200622 else 855772Sas200622 rc = MLRPC_DRC_FAULT_DECODE_FAILED; 865772Sas200622 break; 875772Sas200622 } 885772Sas200622 895772Sas200622 return (rc); 905772Sas200622 } 915772Sas200622 925772Sas200622 int 935772Sas200622 mlrpc_decode_call(struct mlrpc_xaction *mxa, void *params) 945772Sas200622 { 955772Sas200622 int rc; 965772Sas200622 975772Sas200622 rc = mlrpc_encode_decode_common(mxa, NDR_MODE_CALL_RECV, 985772Sas200622 mxa->opnum, mxa->binding->service->interface_ti, params); 995772Sas200622 1005772Sas200622 return (rc + MLRPC_PTYPE_REQUEST); 1015772Sas200622 } 1025772Sas200622 1035772Sas200622 int 1045772Sas200622 mlrpc_encode_return(struct mlrpc_xaction *mxa, void *params) 1055772Sas200622 { 1065772Sas200622 int rc; 1075772Sas200622 1085772Sas200622 rc = mlrpc_encode_decode_common(mxa, NDR_MODE_RETURN_SEND, 1095772Sas200622 mxa->opnum, mxa->binding->service->interface_ti, params); 1105772Sas200622 1115772Sas200622 return (rc + MLRPC_PTYPE_RESPONSE); 1125772Sas200622 } 1135772Sas200622 1145772Sas200622 int 1155772Sas200622 mlrpc_encode_call(struct mlrpc_xaction *mxa, void *params) 1165772Sas200622 { 1175772Sas200622 int rc; 1185772Sas200622 1195772Sas200622 rc = mlrpc_encode_decode_common(mxa, NDR_MODE_CALL_SEND, 1205772Sas200622 mxa->opnum, mxa->binding->service->interface_ti, params); 1215772Sas200622 1225772Sas200622 return (rc + MLRPC_PTYPE_REQUEST); 1235772Sas200622 } 1245772Sas200622 1255772Sas200622 int 1265772Sas200622 mlrpc_decode_return(struct mlrpc_xaction *mxa, void *params) 1275772Sas200622 { 1285772Sas200622 int rc; 1295772Sas200622 1305772Sas200622 rc = mlrpc_encode_decode_common(mxa, NDR_MODE_RETURN_RECV, 1315772Sas200622 mxa->opnum, mxa->binding->service->interface_ti, params); 1325772Sas200622 1335772Sas200622 return (rc + MLRPC_PTYPE_RESPONSE); 1345772Sas200622 } 1355772Sas200622 1365772Sas200622 int 1375772Sas200622 mlrpc_decode_pdu_hdr(struct mlrpc_xaction *mxa) 1385772Sas200622 { 139*7619SJose.Borrego@Sun.COM ndr_common_header_t *hdr = &mxa->recv_hdr.common_hdr; 1405772Sas200622 struct mlndr_stream *mlnds = &mxa->recv_mlnds; 1415772Sas200622 int ptype; 1425772Sas200622 int rc; 1435772Sas200622 int charset; 1445772Sas200622 int byte_order; 1455772Sas200622 1465772Sas200622 if (mlnds->m_op != NDR_M_OP_UNMARSHALL) 1475772Sas200622 return (MLRPC_DRC_FAULT_MODE_MISMATCH + 0xFF); 1485772Sas200622 1495772Sas200622 /* 1505772Sas200622 * All PDU headers are at least this big 1515772Sas200622 */ 152*7619SJose.Borrego@Sun.COM rc = MLNDS_GROW_PDU(mlnds, sizeof (ndr_common_header_t), 0); 1535772Sas200622 if (!rc) 1545772Sas200622 return (MLRPC_DRC_FAULT_RECEIVED_RUNT + 0xFF); 1555772Sas200622 1565772Sas200622 /* 1575772Sas200622 * Peek at the first eight bytes to figure out what we're doing. 1585772Sas200622 */ 1595772Sas200622 rc = MLNDS_GET_PDU(mlnds, 0, 8, (char *)hdr, 0, 0); 1605772Sas200622 if (!rc) 1615772Sas200622 return (MLRPC_DRC_FAULT_DECODE_FAILED + 0xFF); 1625772Sas200622 1635772Sas200622 /* 1645772Sas200622 * Verify the protocol version. 1655772Sas200622 */ 1665772Sas200622 if ((hdr->rpc_vers != 5) || (hdr->rpc_vers_minor != 0)) 1675772Sas200622 return (MLRPC_DRC_FAULT_DECODE_FAILED + 0xFF); 1685772Sas200622 1695772Sas200622 /* 1705772Sas200622 * Check for ASCII as the character set. This is an ASCII 1715772Sas200622 * versus EBCDIC option and has nothing to do with Unicode. 1725772Sas200622 */ 1735772Sas200622 charset = hdr->packed_drep.intg_char_rep & MLRPC_REPLAB_CHAR_MASK; 1745772Sas200622 if (charset != MLRPC_REPLAB_CHAR_ASCII) 1755772Sas200622 return (MLRPC_DRC_FAULT_DECODE_FAILED + 0xFF); 1765772Sas200622 1775772Sas200622 /* 1785772Sas200622 * Set the byte swap flag if the PDU byte-order 1795772Sas200622 * is different from the local byte-order. 1805772Sas200622 */ 1815772Sas200622 byte_order = hdr->packed_drep.intg_char_rep & MLRPC_REPLAB_INTG_MASK; 1825772Sas200622 mlnds->swap = (byte_order != mlrpc_native_byte_order) ? 1 : 0; 1835772Sas200622 1845772Sas200622 ptype = hdr->ptype; 1855772Sas200622 if (ptype == MLRPC_PTYPE_REQUEST && 1865772Sas200622 (hdr->pfc_flags & MLRPC_PFC_OBJECT_UUID) != 0) { 1875772Sas200622 ptype = MLRPC_PTYPE_REQUEST_WITH; /* fake for sizing */ 1885772Sas200622 } 1895772Sas200622 1905772Sas200622 mxa->ptype = hdr->ptype; 1915772Sas200622 1925772Sas200622 rc = mlrpc_encode_decode_common(mxa, 1935772Sas200622 NDR_M_OP_AND_DIR_TO_MODE(mlnds->m_op, mlnds->dir), 194*7619SJose.Borrego@Sun.COM ptype, &TYPEINFO(ndr_hdr), hdr); 1955772Sas200622 1965772Sas200622 return (rc + 0xFF); 1975772Sas200622 } 1985772Sas200622 1995772Sas200622 /* 2005772Sas200622 * Decode an RPC fragment header. Use mlrpc_decode_pdu_hdr() to process 2015772Sas200622 * the first fragment header then this function to process additional 2025772Sas200622 * fragment headers. 2035772Sas200622 */ 2045772Sas200622 void 205*7619SJose.Borrego@Sun.COM mlrpc_decode_frag_hdr(struct mlndr_stream *mlnds, ndr_common_header_t *hdr) 2065772Sas200622 { 207*7619SJose.Borrego@Sun.COM ndr_common_header_t *tmp; 2085772Sas200622 uint8_t *pdu; 2095772Sas200622 int byte_order; 2105772Sas200622 2115772Sas200622 pdu = (uint8_t *)mlnds->pdu_base_offset + mlnds->pdu_scan_offset; 2125772Sas200622 bcopy(pdu, hdr, MLRPC_RSP_HDR_SIZE); 2135772Sas200622 2145772Sas200622 /* 2155772Sas200622 * Swap non-byte fields if the PDU byte-order 2165772Sas200622 * is different from the local byte-order. 2175772Sas200622 */ 2185772Sas200622 byte_order = hdr->packed_drep.intg_char_rep & MLRPC_REPLAB_INTG_MASK; 2195772Sas200622 2205772Sas200622 if (byte_order != mlrpc_native_byte_order) { 2215772Sas200622 /*LINTED E_BAD_PTR_CAST_ALIGN*/ 222*7619SJose.Borrego@Sun.COM tmp = (ndr_common_header_t *)pdu; 2235772Sas200622 2245772Sas200622 mlnds_bswap(&tmp->frag_length, &hdr->frag_length, 2255772Sas200622 sizeof (WORD)); 2265772Sas200622 mlnds_bswap(&tmp->auth_length, &hdr->auth_length, 2275772Sas200622 sizeof (WORD)); 2285772Sas200622 mlnds_bswap(&tmp->call_id, &hdr->call_id, sizeof (DWORD)); 2295772Sas200622 } 2305772Sas200622 } 2315772Sas200622 2325772Sas200622 int 2335772Sas200622 mlrpc_encode_pdu_hdr(struct mlrpc_xaction *mxa) 2345772Sas200622 { 235*7619SJose.Borrego@Sun.COM ndr_common_header_t *hdr = &mxa->send_hdr.common_hdr; 2365772Sas200622 struct mlndr_stream *mlnds = &mxa->send_mlnds; 2375772Sas200622 int ptype; 2385772Sas200622 int rc; 2395772Sas200622 2405772Sas200622 if (mlnds->m_op != NDR_M_OP_MARSHALL) 2415772Sas200622 return (MLRPC_DRC_FAULT_MODE_MISMATCH + 0xFF); 2425772Sas200622 2435772Sas200622 ptype = hdr->ptype; 2445772Sas200622 if (ptype == MLRPC_PTYPE_REQUEST && 2455772Sas200622 (hdr->pfc_flags & MLRPC_PFC_OBJECT_UUID) != 0) { 2465772Sas200622 ptype = MLRPC_PTYPE_REQUEST_WITH; /* fake for sizing */ 2475772Sas200622 } 2485772Sas200622 2495772Sas200622 rc = mlrpc_encode_decode_common(mxa, 2505772Sas200622 NDR_M_OP_AND_DIR_TO_MODE(mlnds->m_op, mlnds->dir), 251*7619SJose.Borrego@Sun.COM ptype, &TYPEINFO(ndr_hdr), hdr); 2525772Sas200622 2535772Sas200622 return (rc + 0xFF); 2545772Sas200622 } 2555772Sas200622 2565772Sas200622 /* 2575772Sas200622 * This is a hand-coded derivative of the automatically generated 2585772Sas200622 * (un)marshalling routine for bind_ack headers. bind_ack headers 2595772Sas200622 * have an interior conformant array, which is inconsistent with 2605772Sas200622 * IDL/NDR rules. 2615772Sas200622 */ 2625772Sas200622 extern struct ndr_typeinfo ndt__uchar; 2635772Sas200622 extern struct ndr_typeinfo ndt__ushort; 2645772Sas200622 extern struct ndr_typeinfo ndt__ulong; 2655772Sas200622 266*7619SJose.Borrego@Sun.COM int mlndr__ndr_bind_ack_hdr(struct ndr_reference *encl_ref); 267*7619SJose.Borrego@Sun.COM struct ndr_typeinfo ndt__ndr_bind_ack_hdr = { 2685772Sas200622 1, /* NDR version */ 2695772Sas200622 3, /* alignment */ 2705772Sas200622 NDR_F_STRUCT, /* flags */ 271*7619SJose.Borrego@Sun.COM mlndr__ndr_bind_ack_hdr, /* ndr_func */ 2725772Sas200622 68, /* pdu_size_fixed_part */ 2735772Sas200622 0, /* pdu_size_variable_part */ 2745772Sas200622 68, /* c_size_fixed_part */ 2755772Sas200622 0, /* c_size_variable_part */ 2765772Sas200622 }; 2775772Sas200622 2785772Sas200622 /* 2795772Sas200622 * [_no_reorder] 2805772Sas200622 */ 2815772Sas200622 int 282*7619SJose.Borrego@Sun.COM mlndr__ndr_bind_ack_hdr(struct ndr_reference *encl_ref) 2835772Sas200622 { 284*7619SJose.Borrego@Sun.COM struct mlndr_stream *mlnds = encl_ref->stream; 285*7619SJose.Borrego@Sun.COM struct ndr_bind_ack_hdr *val = /*LINTED E_BAD_PTR_CAST_ALIGN*/ 286*7619SJose.Borrego@Sun.COM (struct ndr_bind_ack_hdr *)encl_ref->datum; 2875772Sas200622 struct ndr_reference myref; 2885772Sas200622 unsigned long offset; 2895772Sas200622 2905772Sas200622 bzero(&myref, sizeof (myref)); 2915772Sas200622 myref.enclosing = encl_ref; 2925772Sas200622 myref.stream = encl_ref->stream; 2935772Sas200622 myref.packed_alignment = 0; 2945772Sas200622 2955772Sas200622 /* do all members in order */ 296*7619SJose.Borrego@Sun.COM NDR_MEMBER(_ndr_common_header, common_hdr, 0UL); 2975772Sas200622 NDR_MEMBER(_ushort, max_xmit_frag, 16UL); 2985772Sas200622 NDR_MEMBER(_ushort, max_recv_frag, 18UL); 2995772Sas200622 NDR_MEMBER(_ulong, assoc_group_id, 20UL); 3005772Sas200622 3015772Sas200622 /* port any is the conformant culprit */ 3025772Sas200622 offset = 24UL; 3035772Sas200622 3045772Sas200622 switch (mlnds->m_op) { 3055772Sas200622 case NDR_M_OP_MARSHALL: 3065772Sas200622 val->sec_addr.length = 3075772Sas200622 strlen((char *)val->sec_addr.port_spec) + 1; 3085772Sas200622 break; 3095772Sas200622 3105772Sas200622 case NDR_M_OP_UNMARSHALL: 3115772Sas200622 break; 3125772Sas200622 3135772Sas200622 default: 3145772Sas200622 NDR_SET_ERROR(encl_ref, NDR_ERR_M_OP_INVALID); 3155772Sas200622 return (0); 3165772Sas200622 } 3175772Sas200622 3185772Sas200622 NDR_MEMBER(_ushort, sec_addr.length, offset); 3195772Sas200622 NDR_MEMBER_ARR_WITH_DIMENSION(_uchar, sec_addr.port_spec, 3205772Sas200622 offset+2UL, val->sec_addr.length); 3215772Sas200622 3225772Sas200622 offset += 2; 3235772Sas200622 offset += val->sec_addr.length; 3245772Sas200622 offset += (4 - offset) & 3; 3255772Sas200622 3265772Sas200622 NDR_MEMBER(_mlrpc_p_result_list, p_result_list, offset); 3275772Sas200622 return (1); 3285772Sas200622 } 3295772Sas200622 330*7619SJose.Borrego@Sun.COM /* 331*7619SJose.Borrego@Sun.COM * Assume a single presentation context element in the result list. 332*7619SJose.Borrego@Sun.COM */ 3335772Sas200622 unsigned 334*7619SJose.Borrego@Sun.COM mlrpc_bind_ack_hdr_size(struct mlrpc_xaction *mxa) 3355772Sas200622 { 336*7619SJose.Borrego@Sun.COM ndr_bind_ack_hdr_t *bahdr = &mxa->send_hdr.bind_ack_hdr; 3375772Sas200622 unsigned offset; 3385772Sas200622 unsigned length; 3395772Sas200622 3405772Sas200622 /* port any is the conformant culprit */ 3415772Sas200622 offset = 24UL; 3425772Sas200622 3435772Sas200622 length = strlen((char *)bahdr->sec_addr.port_spec) + 1; 3445772Sas200622 3455772Sas200622 offset += 2; 3465772Sas200622 offset += length; 3475772Sas200622 offset += (4 - offset) & 3; 348*7619SJose.Borrego@Sun.COM offset += sizeof (mlrpc_p_result_list_t); 3495772Sas200622 return (offset); 3505772Sas200622 } 351*7619SJose.Borrego@Sun.COM 352*7619SJose.Borrego@Sun.COM /* 353*7619SJose.Borrego@Sun.COM * This is a hand-coded derivative of the automatically generated 354*7619SJose.Borrego@Sun.COM * (un)marshalling routine for alter_context_rsp headers. 355*7619SJose.Borrego@Sun.COM * Alter context response headers have an interior conformant array, 356*7619SJose.Borrego@Sun.COM * which is inconsistent with IDL/NDR rules. 357*7619SJose.Borrego@Sun.COM */ 358*7619SJose.Borrego@Sun.COM int mlndr__ndr_alter_context_rsp_hdr(struct ndr_reference *encl_ref); 359*7619SJose.Borrego@Sun.COM struct ndr_typeinfo ndt__ndr_alter_context_rsp_hdr = { 360*7619SJose.Borrego@Sun.COM 1, /* NDR version */ 361*7619SJose.Borrego@Sun.COM 3, /* alignment */ 362*7619SJose.Borrego@Sun.COM NDR_F_STRUCT, /* flags */ 363*7619SJose.Borrego@Sun.COM mlndr__ndr_alter_context_rsp_hdr, /* ndr_func */ 364*7619SJose.Borrego@Sun.COM 56, /* pdu_size_fixed_part */ 365*7619SJose.Borrego@Sun.COM 0, /* pdu_size_variable_part */ 366*7619SJose.Borrego@Sun.COM 56, /* c_size_fixed_part */ 367*7619SJose.Borrego@Sun.COM 0, /* c_size_variable_part */ 368*7619SJose.Borrego@Sun.COM }; 369*7619SJose.Borrego@Sun.COM 370*7619SJose.Borrego@Sun.COM /* 371*7619SJose.Borrego@Sun.COM * [_no_reorder] 372*7619SJose.Borrego@Sun.COM */ 373*7619SJose.Borrego@Sun.COM int 374*7619SJose.Borrego@Sun.COM mlndr__ndr_alter_context_rsp_hdr(struct ndr_reference *encl_ref) 375*7619SJose.Borrego@Sun.COM { 376*7619SJose.Borrego@Sun.COM struct mlndr_stream *mlnds = encl_ref->stream; 377*7619SJose.Borrego@Sun.COM ndr_alter_context_rsp_hdr_t *val = /*LINTED E_BAD_PTR_CAST_ALIGN*/ 378*7619SJose.Borrego@Sun.COM (ndr_alter_context_rsp_hdr_t *)encl_ref->datum; 379*7619SJose.Borrego@Sun.COM struct ndr_reference myref; 380*7619SJose.Borrego@Sun.COM unsigned long offset; 381*7619SJose.Borrego@Sun.COM 382*7619SJose.Borrego@Sun.COM bzero(&myref, sizeof (myref)); 383*7619SJose.Borrego@Sun.COM myref.enclosing = encl_ref; 384*7619SJose.Borrego@Sun.COM myref.stream = encl_ref->stream; 385*7619SJose.Borrego@Sun.COM myref.packed_alignment = 0; 386*7619SJose.Borrego@Sun.COM 387*7619SJose.Borrego@Sun.COM /* do all members in order */ 388*7619SJose.Borrego@Sun.COM NDR_MEMBER(_ndr_common_header, common_hdr, 0UL); 389*7619SJose.Borrego@Sun.COM NDR_MEMBER(_ushort, max_xmit_frag, 16UL); 390*7619SJose.Borrego@Sun.COM NDR_MEMBER(_ushort, max_recv_frag, 18UL); 391*7619SJose.Borrego@Sun.COM NDR_MEMBER(_ulong, assoc_group_id, 20UL); 392*7619SJose.Borrego@Sun.COM 393*7619SJose.Borrego@Sun.COM offset = 24UL; /* offset of sec_addr */ 394*7619SJose.Borrego@Sun.COM 395*7619SJose.Borrego@Sun.COM switch (mlnds->m_op) { 396*7619SJose.Borrego@Sun.COM case NDR_M_OP_MARSHALL: 397*7619SJose.Borrego@Sun.COM val->sec_addr.length = 0; 398*7619SJose.Borrego@Sun.COM break; 399*7619SJose.Borrego@Sun.COM 400*7619SJose.Borrego@Sun.COM case NDR_M_OP_UNMARSHALL: 401*7619SJose.Borrego@Sun.COM break; 402*7619SJose.Borrego@Sun.COM 403*7619SJose.Borrego@Sun.COM default: 404*7619SJose.Borrego@Sun.COM NDR_SET_ERROR(encl_ref, NDR_ERR_M_OP_INVALID); 405*7619SJose.Borrego@Sun.COM return (0); 406*7619SJose.Borrego@Sun.COM } 407*7619SJose.Borrego@Sun.COM 408*7619SJose.Borrego@Sun.COM NDR_MEMBER(_ushort, sec_addr.length, offset); 409*7619SJose.Borrego@Sun.COM NDR_MEMBER_ARR_WITH_DIMENSION(_uchar, sec_addr.port_spec, 410*7619SJose.Borrego@Sun.COM offset+2UL, val->sec_addr.length); 411*7619SJose.Borrego@Sun.COM 412*7619SJose.Borrego@Sun.COM offset += 2; /* sizeof (sec_addr.length) */ 413*7619SJose.Borrego@Sun.COM offset += (4 - offset) & 3; 414*7619SJose.Borrego@Sun.COM 415*7619SJose.Borrego@Sun.COM NDR_MEMBER(_mlrpc_p_result_list, p_result_list, offset); 416*7619SJose.Borrego@Sun.COM return (1); 417*7619SJose.Borrego@Sun.COM } 418*7619SJose.Borrego@Sun.COM 419*7619SJose.Borrego@Sun.COM /* 420*7619SJose.Borrego@Sun.COM * Assume a single presentation context element in the result list. 421*7619SJose.Borrego@Sun.COM */ 422*7619SJose.Borrego@Sun.COM unsigned 423*7619SJose.Borrego@Sun.COM mlrpc_alter_context_rsp_hdr_size(void) 424*7619SJose.Borrego@Sun.COM { 425*7619SJose.Borrego@Sun.COM unsigned offset; 426*7619SJose.Borrego@Sun.COM 427*7619SJose.Borrego@Sun.COM offset = 24UL; /* offset of sec_addr */ 428*7619SJose.Borrego@Sun.COM offset += 2; /* sizeof (sec_addr.length) */ 429*7619SJose.Borrego@Sun.COM offset += (4 - offset) & 3; 430*7619SJose.Borrego@Sun.COM offset += sizeof (mlrpc_p_result_list_t); 431*7619SJose.Borrego@Sun.COM return (offset); 432*7619SJose.Borrego@Sun.COM } 433