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 /* 227619SJose.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> 30*8334SJose.Borrego@Sun.COM #include <smbsrv/libmlrpc.h> 315772Sas200622 325772Sas200622 #ifdef _BIG_ENDIAN 33*8334SJose.Borrego@Sun.COM static const int ndr_native_byte_order = NDR_REPLAB_INTG_BIG_ENDIAN; 345772Sas200622 #else 35*8334SJose.Borrego@Sun.COM static const int ndr_native_byte_order = NDR_REPLAB_INTG_LITTLE_ENDIAN; 365772Sas200622 #endif 375772Sas200622 385772Sas200622 int 39*8334SJose.Borrego@Sun.COM ndr_encode_decode_common(ndr_xa_t *mxa, int mode, unsigned opnum, 40*8334SJose.Borrego@Sun.COM ndr_typeinfo_t *ti, void *datum) 415772Sas200622 { 42*8334SJose.Borrego@Sun.COM ndr_stream_t *nds; 43*8334SJose.Borrego@Sun.COM int m_op = NDR_MODE_TO_M_OP(mode); 44*8334SJose.Borrego@Sun.COM int rc; 455772Sas200622 465772Sas200622 if (m_op == NDR_M_OP_MARSHALL) 47*8334SJose.Borrego@Sun.COM nds = &mxa->send_nds; 485772Sas200622 else 49*8334SJose.Borrego@Sun.COM nds = &mxa->recv_nds; 505772Sas200622 515772Sas200622 /* 52*8334SJose.Borrego@Sun.COM * Make sure that nds is in the correct mode 535772Sas200622 */ 54*8334SJose.Borrego@Sun.COM if (!NDR_MODE_MATCH(nds, mode)) 55*8334SJose.Borrego@Sun.COM return (NDR_DRC_FAULT_MODE_MISMATCH); 565772Sas200622 575772Sas200622 /* 585772Sas200622 * Perform the (un)marshalling 595772Sas200622 */ 60*8334SJose.Borrego@Sun.COM if (ndo_operation(nds, ti, opnum, datum)) 61*8334SJose.Borrego@Sun.COM return (NDR_DRC_OK); 625772Sas200622 63*8334SJose.Borrego@Sun.COM switch (nds->error) { 645772Sas200622 case NDR_ERR_MALLOC_FAILED: 65*8334SJose.Borrego@Sun.COM rc = NDR_DRC_FAULT_OUT_OF_MEMORY; 665772Sas200622 break; 675772Sas200622 685772Sas200622 case NDR_ERR_SWITCH_VALUE_INVALID: 69*8334SJose.Borrego@Sun.COM rc = NDR_DRC_FAULT_PARAM_0_INVALID; 705772Sas200622 break; 715772Sas200622 725772Sas200622 case NDR_ERR_UNDERFLOW: 73*8334SJose.Borrego@Sun.COM rc = NDR_DRC_FAULT_RECEIVED_RUNT; 745772Sas200622 break; 755772Sas200622 765772Sas200622 case NDR_ERR_GROW_FAILED: 77*8334SJose.Borrego@Sun.COM rc = NDR_DRC_FAULT_ENCODE_TOO_BIG; 785772Sas200622 break; 795772Sas200622 805772Sas200622 default: 815772Sas200622 if (m_op == NDR_M_OP_MARSHALL) 82*8334SJose.Borrego@Sun.COM rc = NDR_DRC_FAULT_ENCODE_FAILED; 835772Sas200622 else 84*8334SJose.Borrego@Sun.COM rc = NDR_DRC_FAULT_DECODE_FAILED; 855772Sas200622 break; 865772Sas200622 } 875772Sas200622 885772Sas200622 return (rc); 895772Sas200622 } 905772Sas200622 915772Sas200622 int 92*8334SJose.Borrego@Sun.COM ndr_decode_call(ndr_xa_t *mxa, void *params) 935772Sas200622 { 945772Sas200622 int rc; 955772Sas200622 96*8334SJose.Borrego@Sun.COM rc = ndr_encode_decode_common(mxa, NDR_MODE_CALL_RECV, 975772Sas200622 mxa->opnum, mxa->binding->service->interface_ti, params); 985772Sas200622 99*8334SJose.Borrego@Sun.COM return (rc + NDR_PTYPE_REQUEST); 1005772Sas200622 } 1015772Sas200622 1025772Sas200622 int 103*8334SJose.Borrego@Sun.COM ndr_encode_return(ndr_xa_t *mxa, void *params) 1045772Sas200622 { 1055772Sas200622 int rc; 1065772Sas200622 107*8334SJose.Borrego@Sun.COM rc = ndr_encode_decode_common(mxa, NDR_MODE_RETURN_SEND, 1085772Sas200622 mxa->opnum, mxa->binding->service->interface_ti, params); 1095772Sas200622 110*8334SJose.Borrego@Sun.COM return (rc + NDR_PTYPE_RESPONSE); 1115772Sas200622 } 1125772Sas200622 1135772Sas200622 int 114*8334SJose.Borrego@Sun.COM ndr_encode_call(ndr_xa_t *mxa, void *params) 1155772Sas200622 { 1165772Sas200622 int rc; 1175772Sas200622 118*8334SJose.Borrego@Sun.COM rc = ndr_encode_decode_common(mxa, NDR_MODE_CALL_SEND, 1195772Sas200622 mxa->opnum, mxa->binding->service->interface_ti, params); 1205772Sas200622 121*8334SJose.Borrego@Sun.COM return (rc + NDR_PTYPE_REQUEST); 1225772Sas200622 } 1235772Sas200622 1245772Sas200622 int 125*8334SJose.Borrego@Sun.COM ndr_decode_return(ndr_xa_t *mxa, void *params) 1265772Sas200622 { 1275772Sas200622 int rc; 1285772Sas200622 129*8334SJose.Borrego@Sun.COM rc = ndr_encode_decode_common(mxa, NDR_MODE_RETURN_RECV, 1305772Sas200622 mxa->opnum, mxa->binding->service->interface_ti, params); 1315772Sas200622 132*8334SJose.Borrego@Sun.COM return (rc + NDR_PTYPE_RESPONSE); 1335772Sas200622 } 1345772Sas200622 1355772Sas200622 int 136*8334SJose.Borrego@Sun.COM ndr_decode_pdu_hdr(ndr_xa_t *mxa) 1375772Sas200622 { 138*8334SJose.Borrego@Sun.COM ndr_common_header_t *hdr = &mxa->recv_hdr.common_hdr; 139*8334SJose.Borrego@Sun.COM ndr_stream_t *nds = &mxa->recv_nds; 1405772Sas200622 int ptype; 1415772Sas200622 int rc; 1425772Sas200622 int charset; 1435772Sas200622 int byte_order; 1445772Sas200622 145*8334SJose.Borrego@Sun.COM if (nds->m_op != NDR_M_OP_UNMARSHALL) 146*8334SJose.Borrego@Sun.COM return (NDR_DRC_PTYPE_RPCHDR(NDR_DRC_FAULT_MODE_MISMATCH)); 1475772Sas200622 1485772Sas200622 /* 1495772Sas200622 * All PDU headers are at least this big 1505772Sas200622 */ 151*8334SJose.Borrego@Sun.COM rc = NDS_GROW_PDU(nds, sizeof (ndr_common_header_t), 0); 1525772Sas200622 if (!rc) 153*8334SJose.Borrego@Sun.COM return (NDR_DRC_PTYPE_RPCHDR(NDR_DRC_FAULT_RECEIVED_RUNT)); 1545772Sas200622 1555772Sas200622 /* 1565772Sas200622 * Peek at the first eight bytes to figure out what we're doing. 1575772Sas200622 */ 158*8334SJose.Borrego@Sun.COM rc = NDS_GET_PDU(nds, 0, 8, (char *)hdr, 0, 0); 1595772Sas200622 if (!rc) 160*8334SJose.Borrego@Sun.COM return (NDR_DRC_PTYPE_RPCHDR(NDR_DRC_FAULT_DECODE_FAILED)); 1615772Sas200622 1625772Sas200622 /* 1635772Sas200622 * Verify the protocol version. 1645772Sas200622 */ 1655772Sas200622 if ((hdr->rpc_vers != 5) || (hdr->rpc_vers_minor != 0)) 166*8334SJose.Borrego@Sun.COM return (NDR_DRC_PTYPE_RPCHDR(NDR_DRC_FAULT_DECODE_FAILED)); 1675772Sas200622 1685772Sas200622 /* 1695772Sas200622 * Check for ASCII as the character set. This is an ASCII 1705772Sas200622 * versus EBCDIC option and has nothing to do with Unicode. 1715772Sas200622 */ 172*8334SJose.Borrego@Sun.COM charset = hdr->packed_drep.intg_char_rep & NDR_REPLAB_CHAR_MASK; 173*8334SJose.Borrego@Sun.COM if (charset != NDR_REPLAB_CHAR_ASCII) 174*8334SJose.Borrego@Sun.COM return (NDR_DRC_PTYPE_RPCHDR(NDR_DRC_FAULT_DECODE_FAILED)); 1755772Sas200622 1765772Sas200622 /* 1775772Sas200622 * Set the byte swap flag if the PDU byte-order 1785772Sas200622 * is different from the local byte-order. 1795772Sas200622 */ 180*8334SJose.Borrego@Sun.COM byte_order = hdr->packed_drep.intg_char_rep & NDR_REPLAB_INTG_MASK; 181*8334SJose.Borrego@Sun.COM nds->swap = (byte_order != ndr_native_byte_order) ? 1 : 0; 1825772Sas200622 1835772Sas200622 ptype = hdr->ptype; 184*8334SJose.Borrego@Sun.COM if (ptype == NDR_PTYPE_REQUEST && 185*8334SJose.Borrego@Sun.COM (hdr->pfc_flags & NDR_PFC_OBJECT_UUID) != 0) { 186*8334SJose.Borrego@Sun.COM ptype = NDR_PTYPE_REQUEST_WITH; /* fake for sizing */ 1875772Sas200622 } 1885772Sas200622 1895772Sas200622 mxa->ptype = hdr->ptype; 1905772Sas200622 191*8334SJose.Borrego@Sun.COM rc = ndr_encode_decode_common(mxa, 192*8334SJose.Borrego@Sun.COM NDR_M_OP_AND_DIR_TO_MODE(nds->m_op, nds->dir), 1937619SJose.Borrego@Sun.COM ptype, &TYPEINFO(ndr_hdr), hdr); 1945772Sas200622 195*8334SJose.Borrego@Sun.COM return (NDR_DRC_PTYPE_RPCHDR(rc)); 1965772Sas200622 } 1975772Sas200622 1985772Sas200622 /* 199*8334SJose.Borrego@Sun.COM * Decode an RPC fragment header. Use ndr_decode_pdu_hdr() to process 2005772Sas200622 * the first fragment header then this function to process additional 2015772Sas200622 * fragment headers. 2025772Sas200622 */ 2035772Sas200622 void 204*8334SJose.Borrego@Sun.COM ndr_decode_frag_hdr(ndr_stream_t *nds, ndr_common_header_t *hdr) 2055772Sas200622 { 2067619SJose.Borrego@Sun.COM ndr_common_header_t *tmp; 2075772Sas200622 uint8_t *pdu; 2085772Sas200622 int byte_order; 2095772Sas200622 210*8334SJose.Borrego@Sun.COM pdu = (uint8_t *)nds->pdu_base_offset + nds->pdu_scan_offset; 211*8334SJose.Borrego@Sun.COM bcopy(pdu, hdr, NDR_RSP_HDR_SIZE); 2125772Sas200622 2135772Sas200622 /* 2145772Sas200622 * Swap non-byte fields if the PDU byte-order 2155772Sas200622 * is different from the local byte-order. 2165772Sas200622 */ 217*8334SJose.Borrego@Sun.COM byte_order = hdr->packed_drep.intg_char_rep & NDR_REPLAB_INTG_MASK; 2185772Sas200622 219*8334SJose.Borrego@Sun.COM if (byte_order != ndr_native_byte_order) { 2205772Sas200622 /*LINTED E_BAD_PTR_CAST_ALIGN*/ 2217619SJose.Borrego@Sun.COM tmp = (ndr_common_header_t *)pdu; 2225772Sas200622 223*8334SJose.Borrego@Sun.COM nds_bswap(&tmp->frag_length, &hdr->frag_length, 2245772Sas200622 sizeof (WORD)); 225*8334SJose.Borrego@Sun.COM nds_bswap(&tmp->auth_length, &hdr->auth_length, 2265772Sas200622 sizeof (WORD)); 227*8334SJose.Borrego@Sun.COM nds_bswap(&tmp->call_id, &hdr->call_id, sizeof (DWORD)); 2285772Sas200622 } 2295772Sas200622 } 2305772Sas200622 2315772Sas200622 int 232*8334SJose.Borrego@Sun.COM ndr_encode_pdu_hdr(ndr_xa_t *mxa) 2335772Sas200622 { 234*8334SJose.Borrego@Sun.COM ndr_common_header_t *hdr = &mxa->send_hdr.common_hdr; 235*8334SJose.Borrego@Sun.COM ndr_stream_t *nds = &mxa->send_nds; 2365772Sas200622 int ptype; 2375772Sas200622 int rc; 2385772Sas200622 239*8334SJose.Borrego@Sun.COM if (nds->m_op != NDR_M_OP_MARSHALL) 240*8334SJose.Borrego@Sun.COM return (NDR_DRC_PTYPE_RPCHDR(NDR_DRC_FAULT_MODE_MISMATCH)); 2415772Sas200622 2425772Sas200622 ptype = hdr->ptype; 243*8334SJose.Borrego@Sun.COM if (ptype == NDR_PTYPE_REQUEST && 244*8334SJose.Borrego@Sun.COM (hdr->pfc_flags & NDR_PFC_OBJECT_UUID) != 0) { 245*8334SJose.Borrego@Sun.COM ptype = NDR_PTYPE_REQUEST_WITH; /* fake for sizing */ 2465772Sas200622 } 2475772Sas200622 248*8334SJose.Borrego@Sun.COM rc = ndr_encode_decode_common(mxa, 249*8334SJose.Borrego@Sun.COM NDR_M_OP_AND_DIR_TO_MODE(nds->m_op, nds->dir), 2507619SJose.Borrego@Sun.COM ptype, &TYPEINFO(ndr_hdr), hdr); 2515772Sas200622 252*8334SJose.Borrego@Sun.COM return (NDR_DRC_PTYPE_RPCHDR(rc)); 2535772Sas200622 } 2545772Sas200622 2555772Sas200622 /* 2565772Sas200622 * This is a hand-coded derivative of the automatically generated 2575772Sas200622 * (un)marshalling routine for bind_ack headers. bind_ack headers 2585772Sas200622 * have an interior conformant array, which is inconsistent with 2595772Sas200622 * IDL/NDR rules. 2605772Sas200622 */ 2615772Sas200622 extern struct ndr_typeinfo ndt__uchar; 2625772Sas200622 extern struct ndr_typeinfo ndt__ushort; 2635772Sas200622 extern struct ndr_typeinfo ndt__ulong; 2645772Sas200622 265*8334SJose.Borrego@Sun.COM int ndr__ndr_bind_ack_hdr(ndr_ref_t *encl_ref); 266*8334SJose.Borrego@Sun.COM ndr_typeinfo_t ndt__ndr_bind_ack_hdr = { 2675772Sas200622 1, /* NDR version */ 2685772Sas200622 3, /* alignment */ 2695772Sas200622 NDR_F_STRUCT, /* flags */ 270*8334SJose.Borrego@Sun.COM ndr__ndr_bind_ack_hdr, /* ndr_func */ 2715772Sas200622 68, /* pdu_size_fixed_part */ 2725772Sas200622 0, /* pdu_size_variable_part */ 2735772Sas200622 68, /* c_size_fixed_part */ 2745772Sas200622 0, /* c_size_variable_part */ 2755772Sas200622 }; 2765772Sas200622 2775772Sas200622 /* 2785772Sas200622 * [_no_reorder] 2795772Sas200622 */ 2805772Sas200622 int 281*8334SJose.Borrego@Sun.COM ndr__ndr_bind_ack_hdr(ndr_ref_t *encl_ref) 2825772Sas200622 { 283*8334SJose.Borrego@Sun.COM ndr_stream_t *nds = encl_ref->stream; 2847619SJose.Borrego@Sun.COM struct ndr_bind_ack_hdr *val = /*LINTED E_BAD_PTR_CAST_ALIGN*/ 2857619SJose.Borrego@Sun.COM (struct ndr_bind_ack_hdr *)encl_ref->datum; 286*8334SJose.Borrego@Sun.COM ndr_ref_t myref; 2875772Sas200622 unsigned long offset; 2885772Sas200622 2895772Sas200622 bzero(&myref, sizeof (myref)); 2905772Sas200622 myref.enclosing = encl_ref; 2915772Sas200622 myref.stream = encl_ref->stream; 2925772Sas200622 myref.packed_alignment = 0; 2935772Sas200622 2945772Sas200622 /* do all members in order */ 2957619SJose.Borrego@Sun.COM NDR_MEMBER(_ndr_common_header, common_hdr, 0UL); 2965772Sas200622 NDR_MEMBER(_ushort, max_xmit_frag, 16UL); 2975772Sas200622 NDR_MEMBER(_ushort, max_recv_frag, 18UL); 2985772Sas200622 NDR_MEMBER(_ulong, assoc_group_id, 20UL); 2995772Sas200622 3005772Sas200622 /* port any is the conformant culprit */ 3015772Sas200622 offset = 24UL; 3025772Sas200622 303*8334SJose.Borrego@Sun.COM switch (nds->m_op) { 3045772Sas200622 case NDR_M_OP_MARSHALL: 3055772Sas200622 val->sec_addr.length = 3065772Sas200622 strlen((char *)val->sec_addr.port_spec) + 1; 3075772Sas200622 break; 3085772Sas200622 3095772Sas200622 case NDR_M_OP_UNMARSHALL: 3105772Sas200622 break; 3115772Sas200622 3125772Sas200622 default: 3135772Sas200622 NDR_SET_ERROR(encl_ref, NDR_ERR_M_OP_INVALID); 3145772Sas200622 return (0); 3155772Sas200622 } 3165772Sas200622 3175772Sas200622 NDR_MEMBER(_ushort, sec_addr.length, offset); 3185772Sas200622 NDR_MEMBER_ARR_WITH_DIMENSION(_uchar, sec_addr.port_spec, 3195772Sas200622 offset+2UL, val->sec_addr.length); 3205772Sas200622 3215772Sas200622 offset += 2; 3225772Sas200622 offset += val->sec_addr.length; 323*8334SJose.Borrego@Sun.COM offset += NDR_ALIGN4(offset); 3245772Sas200622 325*8334SJose.Borrego@Sun.COM NDR_MEMBER(_ndr_p_result_list, p_result_list, offset); 3265772Sas200622 return (1); 3275772Sas200622 } 3285772Sas200622 3297619SJose.Borrego@Sun.COM /* 3307619SJose.Borrego@Sun.COM * Assume a single presentation context element in the result list. 3317619SJose.Borrego@Sun.COM */ 3325772Sas200622 unsigned 333*8334SJose.Borrego@Sun.COM ndr_bind_ack_hdr_size(ndr_xa_t *mxa) 3345772Sas200622 { 3357619SJose.Borrego@Sun.COM ndr_bind_ack_hdr_t *bahdr = &mxa->send_hdr.bind_ack_hdr; 3365772Sas200622 unsigned offset; 3375772Sas200622 unsigned length; 3385772Sas200622 3395772Sas200622 /* port any is the conformant culprit */ 3405772Sas200622 offset = 24UL; 3415772Sas200622 3425772Sas200622 length = strlen((char *)bahdr->sec_addr.port_spec) + 1; 3435772Sas200622 3445772Sas200622 offset += 2; 3455772Sas200622 offset += length; 346*8334SJose.Borrego@Sun.COM offset += NDR_ALIGN4(offset); 347*8334SJose.Borrego@Sun.COM offset += sizeof (ndr_p_result_list_t); 3485772Sas200622 return (offset); 3495772Sas200622 } 3507619SJose.Borrego@Sun.COM 3517619SJose.Borrego@Sun.COM /* 3527619SJose.Borrego@Sun.COM * This is a hand-coded derivative of the automatically generated 3537619SJose.Borrego@Sun.COM * (un)marshalling routine for alter_context_rsp headers. 3547619SJose.Borrego@Sun.COM * Alter context response headers have an interior conformant array, 3557619SJose.Borrego@Sun.COM * which is inconsistent with IDL/NDR rules. 3567619SJose.Borrego@Sun.COM */ 357*8334SJose.Borrego@Sun.COM int ndr__ndr_alter_context_rsp_hdr(ndr_ref_t *encl_ref); 358*8334SJose.Borrego@Sun.COM ndr_typeinfo_t ndt__ndr_alter_context_rsp_hdr = { 3597619SJose.Borrego@Sun.COM 1, /* NDR version */ 3607619SJose.Borrego@Sun.COM 3, /* alignment */ 3617619SJose.Borrego@Sun.COM NDR_F_STRUCT, /* flags */ 362*8334SJose.Borrego@Sun.COM ndr__ndr_alter_context_rsp_hdr, /* ndr_func */ 3637619SJose.Borrego@Sun.COM 56, /* pdu_size_fixed_part */ 3647619SJose.Borrego@Sun.COM 0, /* pdu_size_variable_part */ 3657619SJose.Borrego@Sun.COM 56, /* c_size_fixed_part */ 3667619SJose.Borrego@Sun.COM 0, /* c_size_variable_part */ 3677619SJose.Borrego@Sun.COM }; 3687619SJose.Borrego@Sun.COM 3697619SJose.Borrego@Sun.COM /* 3707619SJose.Borrego@Sun.COM * [_no_reorder] 3717619SJose.Borrego@Sun.COM */ 3727619SJose.Borrego@Sun.COM int 373*8334SJose.Borrego@Sun.COM ndr__ndr_alter_context_rsp_hdr(ndr_ref_t *encl_ref) 3747619SJose.Borrego@Sun.COM { 375*8334SJose.Borrego@Sun.COM ndr_stream_t *nds = encl_ref->stream; 3767619SJose.Borrego@Sun.COM ndr_alter_context_rsp_hdr_t *val = /*LINTED E_BAD_PTR_CAST_ALIGN*/ 3777619SJose.Borrego@Sun.COM (ndr_alter_context_rsp_hdr_t *)encl_ref->datum; 378*8334SJose.Borrego@Sun.COM ndr_ref_t myref; 3797619SJose.Borrego@Sun.COM unsigned long offset; 3807619SJose.Borrego@Sun.COM 3817619SJose.Borrego@Sun.COM bzero(&myref, sizeof (myref)); 3827619SJose.Borrego@Sun.COM myref.enclosing = encl_ref; 3837619SJose.Borrego@Sun.COM myref.stream = encl_ref->stream; 3847619SJose.Borrego@Sun.COM myref.packed_alignment = 0; 3857619SJose.Borrego@Sun.COM 3867619SJose.Borrego@Sun.COM /* do all members in order */ 3877619SJose.Borrego@Sun.COM NDR_MEMBER(_ndr_common_header, common_hdr, 0UL); 3887619SJose.Borrego@Sun.COM NDR_MEMBER(_ushort, max_xmit_frag, 16UL); 3897619SJose.Borrego@Sun.COM NDR_MEMBER(_ushort, max_recv_frag, 18UL); 3907619SJose.Borrego@Sun.COM NDR_MEMBER(_ulong, assoc_group_id, 20UL); 3917619SJose.Borrego@Sun.COM 3927619SJose.Borrego@Sun.COM offset = 24UL; /* offset of sec_addr */ 3937619SJose.Borrego@Sun.COM 394*8334SJose.Borrego@Sun.COM switch (nds->m_op) { 3957619SJose.Borrego@Sun.COM case NDR_M_OP_MARSHALL: 3967619SJose.Borrego@Sun.COM val->sec_addr.length = 0; 3977619SJose.Borrego@Sun.COM break; 3987619SJose.Borrego@Sun.COM 3997619SJose.Borrego@Sun.COM case NDR_M_OP_UNMARSHALL: 4007619SJose.Borrego@Sun.COM break; 4017619SJose.Borrego@Sun.COM 4027619SJose.Borrego@Sun.COM default: 4037619SJose.Borrego@Sun.COM NDR_SET_ERROR(encl_ref, NDR_ERR_M_OP_INVALID); 4047619SJose.Borrego@Sun.COM return (0); 4057619SJose.Borrego@Sun.COM } 4067619SJose.Borrego@Sun.COM 4077619SJose.Borrego@Sun.COM NDR_MEMBER(_ushort, sec_addr.length, offset); 4087619SJose.Borrego@Sun.COM NDR_MEMBER_ARR_WITH_DIMENSION(_uchar, sec_addr.port_spec, 4097619SJose.Borrego@Sun.COM offset+2UL, val->sec_addr.length); 4107619SJose.Borrego@Sun.COM 4117619SJose.Borrego@Sun.COM offset += 2; /* sizeof (sec_addr.length) */ 412*8334SJose.Borrego@Sun.COM offset += NDR_ALIGN4(offset); 4137619SJose.Borrego@Sun.COM 414*8334SJose.Borrego@Sun.COM NDR_MEMBER(_ndr_p_result_list, p_result_list, offset); 4157619SJose.Borrego@Sun.COM return (1); 4167619SJose.Borrego@Sun.COM } 4177619SJose.Borrego@Sun.COM 4187619SJose.Borrego@Sun.COM /* 4197619SJose.Borrego@Sun.COM * Assume a single presentation context element in the result list. 4207619SJose.Borrego@Sun.COM */ 4217619SJose.Borrego@Sun.COM unsigned 422*8334SJose.Borrego@Sun.COM ndr_alter_context_rsp_hdr_size(void) 4237619SJose.Borrego@Sun.COM { 4247619SJose.Borrego@Sun.COM unsigned offset; 4257619SJose.Borrego@Sun.COM 4267619SJose.Borrego@Sun.COM offset = 24UL; /* offset of sec_addr */ 4277619SJose.Borrego@Sun.COM offset += 2; /* sizeof (sec_addr.length) */ 428*8334SJose.Borrego@Sun.COM offset += NDR_ALIGN4(offset); 429*8334SJose.Borrego@Sun.COM offset += sizeof (ndr_p_result_list_t); 4307619SJose.Borrego@Sun.COM return (offset); 4317619SJose.Borrego@Sun.COM } 432