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 /* 229914Samw@Sun.COM * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 235772Sas200622 * Use is subject to license terms. 245772Sas200622 */ 255772Sas200622 269914Samw@Sun.COM #include <assert.h> 275772Sas200622 #include <strings.h> 285772Sas200622 #include <sys/param.h> 295772Sas200622 305772Sas200622 #include <smbsrv/libsmb.h> 318334SJose.Borrego@Sun.COM #include <smbsrv/libmlrpc.h> 325772Sas200622 335772Sas200622 #ifdef _BIG_ENDIAN 348334SJose.Borrego@Sun.COM static const int ndr_native_byte_order = NDR_REPLAB_INTG_BIG_ENDIAN; 355772Sas200622 #else 368334SJose.Borrego@Sun.COM static const int ndr_native_byte_order = NDR_REPLAB_INTG_LITTLE_ENDIAN; 375772Sas200622 #endif 385772Sas200622 399914Samw@Sun.COM static int ndr_decode_hdr_common(ndr_stream_t *, ndr_common_header_t *); 409914Samw@Sun.COM 419914Samw@Sun.COM static int 429914Samw@Sun.COM ndr_encode_decode_common(ndr_stream_t *nds, unsigned opnum, 438334SJose.Borrego@Sun.COM ndr_typeinfo_t *ti, void *datum) 445772Sas200622 { 459914Samw@Sun.COM int rc; 465772Sas200622 475772Sas200622 /* 485772Sas200622 * Perform the (un)marshalling 495772Sas200622 */ 508334SJose.Borrego@Sun.COM if (ndo_operation(nds, ti, opnum, datum)) 518334SJose.Borrego@Sun.COM return (NDR_DRC_OK); 525772Sas200622 538334SJose.Borrego@Sun.COM switch (nds->error) { 545772Sas200622 case NDR_ERR_MALLOC_FAILED: 558334SJose.Borrego@Sun.COM rc = NDR_DRC_FAULT_OUT_OF_MEMORY; 565772Sas200622 break; 575772Sas200622 585772Sas200622 case NDR_ERR_SWITCH_VALUE_INVALID: 598334SJose.Borrego@Sun.COM rc = NDR_DRC_FAULT_PARAM_0_INVALID; 605772Sas200622 break; 615772Sas200622 625772Sas200622 case NDR_ERR_UNDERFLOW: 638334SJose.Borrego@Sun.COM rc = NDR_DRC_FAULT_RECEIVED_RUNT; 645772Sas200622 break; 655772Sas200622 665772Sas200622 case NDR_ERR_GROW_FAILED: 678334SJose.Borrego@Sun.COM rc = NDR_DRC_FAULT_ENCODE_TOO_BIG; 685772Sas200622 break; 695772Sas200622 705772Sas200622 default: 719914Samw@Sun.COM if (nds->m_op == NDR_M_OP_MARSHALL) 728334SJose.Borrego@Sun.COM rc = NDR_DRC_FAULT_ENCODE_FAILED; 735772Sas200622 else 748334SJose.Borrego@Sun.COM rc = NDR_DRC_FAULT_DECODE_FAILED; 755772Sas200622 break; 765772Sas200622 } 775772Sas200622 785772Sas200622 return (rc); 795772Sas200622 } 805772Sas200622 819914Samw@Sun.COM ndr_buf_t * 829914Samw@Sun.COM ndr_buf_init(ndr_typeinfo_t *ti) 839914Samw@Sun.COM { 849914Samw@Sun.COM ndr_buf_t *nbuf; 859914Samw@Sun.COM 869914Samw@Sun.COM if ((nbuf = calloc(1, sizeof (ndr_buf_t))) == NULL) 879914Samw@Sun.COM return (NULL); 889914Samw@Sun.COM 899914Samw@Sun.COM if ((nbuf->nb_heap = ndr_heap_create()) == NULL) { 909914Samw@Sun.COM free(nbuf); 919914Samw@Sun.COM return (NULL); 929914Samw@Sun.COM } 939914Samw@Sun.COM 949914Samw@Sun.COM nbuf->nb_ti = ti; 959914Samw@Sun.COM nbuf->nb_magic = NDR_BUF_MAGIC; 969914Samw@Sun.COM return (nbuf); 979914Samw@Sun.COM } 989914Samw@Sun.COM 999914Samw@Sun.COM void 1009914Samw@Sun.COM ndr_buf_fini(ndr_buf_t *nbuf) 1019914Samw@Sun.COM { 1029914Samw@Sun.COM assert(nbuf->nb_magic == NDR_BUF_MAGIC); 1039914Samw@Sun.COM 1049914Samw@Sun.COM nds_destruct(&nbuf->nb_nds); 1059914Samw@Sun.COM ndr_heap_destroy(nbuf->nb_heap); 1069914Samw@Sun.COM nbuf->nb_magic = 0; 1079914Samw@Sun.COM free(nbuf); 1089914Samw@Sun.COM } 1099914Samw@Sun.COM 1109914Samw@Sun.COM /* 1119914Samw@Sun.COM * Decode an NDR encoded buffer. The buffer is expected to contain 1129914Samw@Sun.COM * a single fragment packet with a valid PDU header followed by NDR 1139914Samw@Sun.COM * encoded data. The structure to which result points should be 1149914Samw@Sun.COM * of the appropriate type to hold the decoded output. For example: 1159914Samw@Sun.COM * 1169914Samw@Sun.COM * pac_info_t info; 1179914Samw@Sun.COM * 1189914Samw@Sun.COM * if ((nbuf = ndr_buf_init(&TYPEINFO(ndr_pac)) != NULL) { 1199914Samw@Sun.COM * rc = ndr_decode_buf(nbuf, opnum, data, datalen, &info); 1209914Samw@Sun.COM * ... 1219914Samw@Sun.COM * ndr_buf_fini(nbuf); 1229914Samw@Sun.COM * } 1239914Samw@Sun.COM */ 1249914Samw@Sun.COM int 1259914Samw@Sun.COM ndr_buf_decode(ndr_buf_t *nbuf, unsigned opnum, const char *data, 1269914Samw@Sun.COM size_t datalen, void *result) 1279914Samw@Sun.COM { 1289914Samw@Sun.COM ndr_common_header_t hdr; 1299914Samw@Sun.COM unsigned pdu_size_hint; 1309914Samw@Sun.COM int rc; 1319914Samw@Sun.COM 1329914Samw@Sun.COM assert(nbuf->nb_magic == NDR_BUF_MAGIC); 1339914Samw@Sun.COM assert(nbuf->nb_heap != NULL); 1349914Samw@Sun.COM assert(nbuf->nb_ti != NULL); 1359914Samw@Sun.COM 1369914Samw@Sun.COM if (datalen < NDR_PDU_SIZE_HINT_DEFAULT) 1379914Samw@Sun.COM pdu_size_hint = NDR_PDU_SIZE_HINT_DEFAULT; 1389914Samw@Sun.COM else 1399914Samw@Sun.COM pdu_size_hint = datalen; 1409914Samw@Sun.COM 1419914Samw@Sun.COM nds_initialize(&nbuf->nb_nds, pdu_size_hint, NDR_MODE_BUF_DECODE, 1429914Samw@Sun.COM nbuf->nb_heap); 1439914Samw@Sun.COM bcopy(data, nbuf->nb_nds.pdu_base_addr, datalen); 1449914Samw@Sun.COM 1459914Samw@Sun.COM rc = ndr_decode_hdr_common(&nbuf->nb_nds, &hdr); 1469914Samw@Sun.COM if (NDR_DRC_IS_FAULT(rc)) 1479914Samw@Sun.COM return (rc); 1489914Samw@Sun.COM 1499914Samw@Sun.COM if (!NDR_IS_SINGLE_FRAG(hdr.pfc_flags)) 1509914Samw@Sun.COM return (rc); 1519914Samw@Sun.COM 1529914Samw@Sun.COM rc = ndr_encode_decode_common(&nbuf->nb_nds, opnum, nbuf->nb_ti, 1539914Samw@Sun.COM result); 1549914Samw@Sun.COM return (rc); 1559914Samw@Sun.COM } 1569914Samw@Sun.COM 1579914Samw@Sun.COM /* 1589914Samw@Sun.COM * Use the receive stream to unmarshall data (NDR_MODE_CALL_RECV). 1599914Samw@Sun.COM */ 1605772Sas200622 int 1618334SJose.Borrego@Sun.COM ndr_decode_call(ndr_xa_t *mxa, void *params) 1625772Sas200622 { 1639914Samw@Sun.COM ndr_stream_t *nds = &mxa->recv_nds; 1649914Samw@Sun.COM int rc; 1655772Sas200622 1669914Samw@Sun.COM if (!NDR_MODE_MATCH(nds, NDR_MODE_CALL_RECV)) 1679914Samw@Sun.COM return (NDR_DRC_FAULT_MODE_MISMATCH); 1689914Samw@Sun.COM 1699914Samw@Sun.COM rc = ndr_encode_decode_common(nds, mxa->opnum, 1709914Samw@Sun.COM mxa->binding->service->interface_ti, params); 1715772Sas200622 1728334SJose.Borrego@Sun.COM return (rc + NDR_PTYPE_REQUEST); 1735772Sas200622 } 1745772Sas200622 1759914Samw@Sun.COM /* 1769914Samw@Sun.COM * Use the send stream to marshall data (NDR_MODE_RETURN_SEND). 1779914Samw@Sun.COM */ 1785772Sas200622 int 1798334SJose.Borrego@Sun.COM ndr_encode_return(ndr_xa_t *mxa, void *params) 1805772Sas200622 { 1819914Samw@Sun.COM ndr_stream_t *nds = &mxa->send_nds; 1829914Samw@Sun.COM int rc; 1835772Sas200622 1849914Samw@Sun.COM if (!NDR_MODE_MATCH(nds, NDR_MODE_RETURN_SEND)) 1859914Samw@Sun.COM return (NDR_DRC_FAULT_MODE_MISMATCH); 1869914Samw@Sun.COM 1879914Samw@Sun.COM rc = ndr_encode_decode_common(nds, mxa->opnum, 1889914Samw@Sun.COM mxa->binding->service->interface_ti, params); 1895772Sas200622 1908334SJose.Borrego@Sun.COM return (rc + NDR_PTYPE_RESPONSE); 1915772Sas200622 } 1925772Sas200622 1939914Samw@Sun.COM /* 1949914Samw@Sun.COM * Use the send stream to marshall data (NDR_MODE_CALL_SEND). 1959914Samw@Sun.COM */ 1965772Sas200622 int 1978334SJose.Borrego@Sun.COM ndr_encode_call(ndr_xa_t *mxa, void *params) 1985772Sas200622 { 1999914Samw@Sun.COM ndr_stream_t *nds = &mxa->send_nds; 2009914Samw@Sun.COM int rc; 2015772Sas200622 2029914Samw@Sun.COM if (!NDR_MODE_MATCH(nds, NDR_MODE_CALL_SEND)) 2039914Samw@Sun.COM return (NDR_DRC_FAULT_MODE_MISMATCH); 2049914Samw@Sun.COM 2059914Samw@Sun.COM rc = ndr_encode_decode_common(nds, mxa->opnum, 2069914Samw@Sun.COM mxa->binding->service->interface_ti, params); 2075772Sas200622 2088334SJose.Borrego@Sun.COM return (rc + NDR_PTYPE_REQUEST); 2095772Sas200622 } 2105772Sas200622 2119914Samw@Sun.COM /* 2129914Samw@Sun.COM * Use the receive stream to unmarshall data (NDR_MODE_RETURN_RECV). 2139914Samw@Sun.COM */ 2145772Sas200622 int 2158334SJose.Borrego@Sun.COM ndr_decode_return(ndr_xa_t *mxa, void *params) 2165772Sas200622 { 2179914Samw@Sun.COM ndr_stream_t *nds = &mxa->recv_nds; 2189914Samw@Sun.COM int rc; 2195772Sas200622 2209914Samw@Sun.COM if (!NDR_MODE_MATCH(nds, NDR_MODE_RETURN_RECV)) 2219914Samw@Sun.COM return (NDR_DRC_FAULT_MODE_MISMATCH); 2229914Samw@Sun.COM 2239914Samw@Sun.COM rc = ndr_encode_decode_common(nds, mxa->opnum, 2249914Samw@Sun.COM mxa->binding->service->interface_ti, params); 2255772Sas200622 2268334SJose.Borrego@Sun.COM return (rc + NDR_PTYPE_RESPONSE); 2275772Sas200622 } 2285772Sas200622 2295772Sas200622 int 2308334SJose.Borrego@Sun.COM ndr_decode_pdu_hdr(ndr_xa_t *mxa) 2315772Sas200622 { 2328334SJose.Borrego@Sun.COM ndr_common_header_t *hdr = &mxa->recv_hdr.common_hdr; 2338334SJose.Borrego@Sun.COM ndr_stream_t *nds = &mxa->recv_nds; 2349914Samw@Sun.COM int rc; 2359914Samw@Sun.COM 2369914Samw@Sun.COM rc = ndr_decode_hdr_common(nds, hdr); 2379914Samw@Sun.COM if (NDR_DRC_IS_FAULT(rc)) 2389914Samw@Sun.COM return (rc); 2399914Samw@Sun.COM 2409914Samw@Sun.COM /* 2419914Samw@Sun.COM * Verify the protocol version. 2429914Samw@Sun.COM */ 2439914Samw@Sun.COM if ((hdr->rpc_vers != 5) || (hdr->rpc_vers_minor != 0)) 2449914Samw@Sun.COM return (NDR_DRC_PTYPE_RPCHDR(NDR_DRC_FAULT_DECODE_FAILED)); 2459914Samw@Sun.COM 2469914Samw@Sun.COM mxa->ptype = hdr->ptype; 2479914Samw@Sun.COM return (NDR_DRC_OK); 2489914Samw@Sun.COM } 2499914Samw@Sun.COM 2509914Samw@Sun.COM static int 2519914Samw@Sun.COM ndr_decode_hdr_common(ndr_stream_t *nds, ndr_common_header_t *hdr) 2529914Samw@Sun.COM { 2535772Sas200622 int ptype; 2545772Sas200622 int rc; 2555772Sas200622 int charset; 2565772Sas200622 int byte_order; 2575772Sas200622 2588334SJose.Borrego@Sun.COM if (nds->m_op != NDR_M_OP_UNMARSHALL) 2598334SJose.Borrego@Sun.COM return (NDR_DRC_PTYPE_RPCHDR(NDR_DRC_FAULT_MODE_MISMATCH)); 2605772Sas200622 2615772Sas200622 /* 2625772Sas200622 * All PDU headers are at least this big 2635772Sas200622 */ 2648334SJose.Borrego@Sun.COM rc = NDS_GROW_PDU(nds, sizeof (ndr_common_header_t), 0); 2655772Sas200622 if (!rc) 2668334SJose.Borrego@Sun.COM return (NDR_DRC_PTYPE_RPCHDR(NDR_DRC_FAULT_RECEIVED_RUNT)); 2675772Sas200622 2685772Sas200622 /* 2695772Sas200622 * Peek at the first eight bytes to figure out what we're doing. 2705772Sas200622 */ 2718334SJose.Borrego@Sun.COM rc = NDS_GET_PDU(nds, 0, 8, (char *)hdr, 0, 0); 2725772Sas200622 if (!rc) 2738334SJose.Borrego@Sun.COM return (NDR_DRC_PTYPE_RPCHDR(NDR_DRC_FAULT_DECODE_FAILED)); 2745772Sas200622 2755772Sas200622 /* 2765772Sas200622 * Check for ASCII as the character set. This is an ASCII 2775772Sas200622 * versus EBCDIC option and has nothing to do with Unicode. 2785772Sas200622 */ 2798334SJose.Borrego@Sun.COM charset = hdr->packed_drep.intg_char_rep & NDR_REPLAB_CHAR_MASK; 2808334SJose.Borrego@Sun.COM if (charset != NDR_REPLAB_CHAR_ASCII) 2818334SJose.Borrego@Sun.COM return (NDR_DRC_PTYPE_RPCHDR(NDR_DRC_FAULT_DECODE_FAILED)); 2825772Sas200622 2835772Sas200622 /* 2845772Sas200622 * Set the byte swap flag if the PDU byte-order 2855772Sas200622 * is different from the local byte-order. 2865772Sas200622 */ 2878334SJose.Borrego@Sun.COM byte_order = hdr->packed_drep.intg_char_rep & NDR_REPLAB_INTG_MASK; 2888334SJose.Borrego@Sun.COM nds->swap = (byte_order != ndr_native_byte_order) ? 1 : 0; 2895772Sas200622 2905772Sas200622 ptype = hdr->ptype; 2918334SJose.Borrego@Sun.COM if (ptype == NDR_PTYPE_REQUEST && 2928334SJose.Borrego@Sun.COM (hdr->pfc_flags & NDR_PFC_OBJECT_UUID) != 0) { 2938334SJose.Borrego@Sun.COM ptype = NDR_PTYPE_REQUEST_WITH; /* fake for sizing */ 2945772Sas200622 } 2955772Sas200622 2969914Samw@Sun.COM rc = ndr_encode_decode_common(nds, ptype, &TYPEINFO(ndr_hdr), hdr); 2975772Sas200622 2988334SJose.Borrego@Sun.COM return (NDR_DRC_PTYPE_RPCHDR(rc)); 2995772Sas200622 } 3005772Sas200622 3015772Sas200622 /* 3028334SJose.Borrego@Sun.COM * Decode an RPC fragment header. Use ndr_decode_pdu_hdr() to process 3035772Sas200622 * the first fragment header then this function to process additional 3045772Sas200622 * fragment headers. 3055772Sas200622 */ 3065772Sas200622 void 3078334SJose.Borrego@Sun.COM ndr_decode_frag_hdr(ndr_stream_t *nds, ndr_common_header_t *hdr) 3085772Sas200622 { 3097619SJose.Borrego@Sun.COM ndr_common_header_t *tmp; 3105772Sas200622 uint8_t *pdu; 3115772Sas200622 int byte_order; 3125772Sas200622 3138334SJose.Borrego@Sun.COM pdu = (uint8_t *)nds->pdu_base_offset + nds->pdu_scan_offset; 3148334SJose.Borrego@Sun.COM bcopy(pdu, hdr, NDR_RSP_HDR_SIZE); 3155772Sas200622 3165772Sas200622 /* 3175772Sas200622 * Swap non-byte fields if the PDU byte-order 3185772Sas200622 * is different from the local byte-order. 3195772Sas200622 */ 3208334SJose.Borrego@Sun.COM byte_order = hdr->packed_drep.intg_char_rep & NDR_REPLAB_INTG_MASK; 3215772Sas200622 3228334SJose.Borrego@Sun.COM if (byte_order != ndr_native_byte_order) { 3235772Sas200622 /*LINTED E_BAD_PTR_CAST_ALIGN*/ 3247619SJose.Borrego@Sun.COM tmp = (ndr_common_header_t *)pdu; 3255772Sas200622 3268334SJose.Borrego@Sun.COM nds_bswap(&tmp->frag_length, &hdr->frag_length, 3275772Sas200622 sizeof (WORD)); 3288334SJose.Borrego@Sun.COM nds_bswap(&tmp->auth_length, &hdr->auth_length, 3295772Sas200622 sizeof (WORD)); 3308334SJose.Borrego@Sun.COM nds_bswap(&tmp->call_id, &hdr->call_id, sizeof (DWORD)); 3315772Sas200622 } 3325772Sas200622 } 3335772Sas200622 334*10475Samw@Sun.COM void 335*10475Samw@Sun.COM ndr_show_hdr(ndr_common_header_t *hdr) 336*10475Samw@Sun.COM { 337*10475Samw@Sun.COM char *fragtype; 338*10475Samw@Sun.COM 339*10475Samw@Sun.COM if (hdr == NULL) { 340*10475Samw@Sun.COM ndo_printf(NULL, NULL, "ndr hdr: <null>"); 341*10475Samw@Sun.COM return; 342*10475Samw@Sun.COM } 343*10475Samw@Sun.COM 344*10475Samw@Sun.COM if (NDR_IS_SINGLE_FRAG(hdr->pfc_flags)) 345*10475Samw@Sun.COM fragtype = "single"; 346*10475Samw@Sun.COM else if (NDR_IS_FIRST_FRAG(hdr->pfc_flags)) 347*10475Samw@Sun.COM fragtype = "first"; 348*10475Samw@Sun.COM else if (NDR_IS_LAST_FRAG(hdr->pfc_flags)) 349*10475Samw@Sun.COM fragtype = "last"; 350*10475Samw@Sun.COM else 351*10475Samw@Sun.COM fragtype = "intermediate"; 352*10475Samw@Sun.COM 353*10475Samw@Sun.COM ndo_printf(NULL, NULL, 354*10475Samw@Sun.COM "ndr hdr: %d.%d ptype=%d, %s frag (flags=0x%08x) len=%d", 355*10475Samw@Sun.COM hdr->rpc_vers, hdr->rpc_vers_minor, hdr->ptype, 356*10475Samw@Sun.COM fragtype, hdr->pfc_flags, hdr->frag_length); 357*10475Samw@Sun.COM } 358*10475Samw@Sun.COM 3595772Sas200622 int 3608334SJose.Borrego@Sun.COM ndr_encode_pdu_hdr(ndr_xa_t *mxa) 3615772Sas200622 { 3628334SJose.Borrego@Sun.COM ndr_common_header_t *hdr = &mxa->send_hdr.common_hdr; 3638334SJose.Borrego@Sun.COM ndr_stream_t *nds = &mxa->send_nds; 3645772Sas200622 int ptype; 3655772Sas200622 int rc; 3665772Sas200622 3678334SJose.Borrego@Sun.COM if (nds->m_op != NDR_M_OP_MARSHALL) 3688334SJose.Borrego@Sun.COM return (NDR_DRC_PTYPE_RPCHDR(NDR_DRC_FAULT_MODE_MISMATCH)); 3695772Sas200622 3705772Sas200622 ptype = hdr->ptype; 3718334SJose.Borrego@Sun.COM if (ptype == NDR_PTYPE_REQUEST && 3728334SJose.Borrego@Sun.COM (hdr->pfc_flags & NDR_PFC_OBJECT_UUID) != 0) { 3738334SJose.Borrego@Sun.COM ptype = NDR_PTYPE_REQUEST_WITH; /* fake for sizing */ 3745772Sas200622 } 3755772Sas200622 3769914Samw@Sun.COM rc = ndr_encode_decode_common(nds, ptype, &TYPEINFO(ndr_hdr), hdr); 3775772Sas200622 3788334SJose.Borrego@Sun.COM return (NDR_DRC_PTYPE_RPCHDR(rc)); 3795772Sas200622 } 3805772Sas200622 3815772Sas200622 /* 3825772Sas200622 * This is a hand-coded derivative of the automatically generated 3835772Sas200622 * (un)marshalling routine for bind_ack headers. bind_ack headers 3845772Sas200622 * have an interior conformant array, which is inconsistent with 3855772Sas200622 * IDL/NDR rules. 3865772Sas200622 */ 3875772Sas200622 extern struct ndr_typeinfo ndt__uchar; 3885772Sas200622 extern struct ndr_typeinfo ndt__ushort; 3895772Sas200622 extern struct ndr_typeinfo ndt__ulong; 3905772Sas200622 3918334SJose.Borrego@Sun.COM int ndr__ndr_bind_ack_hdr(ndr_ref_t *encl_ref); 3928334SJose.Borrego@Sun.COM ndr_typeinfo_t ndt__ndr_bind_ack_hdr = { 3935772Sas200622 1, /* NDR version */ 3945772Sas200622 3, /* alignment */ 3955772Sas200622 NDR_F_STRUCT, /* flags */ 3968334SJose.Borrego@Sun.COM ndr__ndr_bind_ack_hdr, /* ndr_func */ 3975772Sas200622 68, /* pdu_size_fixed_part */ 3985772Sas200622 0, /* pdu_size_variable_part */ 3995772Sas200622 68, /* c_size_fixed_part */ 4005772Sas200622 0, /* c_size_variable_part */ 4015772Sas200622 }; 4025772Sas200622 4035772Sas200622 /* 4045772Sas200622 * [_no_reorder] 4055772Sas200622 */ 4065772Sas200622 int 4078334SJose.Borrego@Sun.COM ndr__ndr_bind_ack_hdr(ndr_ref_t *encl_ref) 4085772Sas200622 { 4098334SJose.Borrego@Sun.COM ndr_stream_t *nds = encl_ref->stream; 4107619SJose.Borrego@Sun.COM struct ndr_bind_ack_hdr *val = /*LINTED E_BAD_PTR_CAST_ALIGN*/ 4117619SJose.Borrego@Sun.COM (struct ndr_bind_ack_hdr *)encl_ref->datum; 4128334SJose.Borrego@Sun.COM ndr_ref_t myref; 4135772Sas200622 unsigned long offset; 4145772Sas200622 4155772Sas200622 bzero(&myref, sizeof (myref)); 4165772Sas200622 myref.enclosing = encl_ref; 4175772Sas200622 myref.stream = encl_ref->stream; 4185772Sas200622 myref.packed_alignment = 0; 4195772Sas200622 4205772Sas200622 /* do all members in order */ 4217619SJose.Borrego@Sun.COM NDR_MEMBER(_ndr_common_header, common_hdr, 0UL); 4225772Sas200622 NDR_MEMBER(_ushort, max_xmit_frag, 16UL); 4235772Sas200622 NDR_MEMBER(_ushort, max_recv_frag, 18UL); 4245772Sas200622 NDR_MEMBER(_ulong, assoc_group_id, 20UL); 4255772Sas200622 4265772Sas200622 /* port any is the conformant culprit */ 4275772Sas200622 offset = 24UL; 4285772Sas200622 4298334SJose.Borrego@Sun.COM switch (nds->m_op) { 4305772Sas200622 case NDR_M_OP_MARSHALL: 4315772Sas200622 val->sec_addr.length = 4325772Sas200622 strlen((char *)val->sec_addr.port_spec) + 1; 4335772Sas200622 break; 4345772Sas200622 4355772Sas200622 case NDR_M_OP_UNMARSHALL: 4365772Sas200622 break; 4375772Sas200622 4385772Sas200622 default: 4395772Sas200622 NDR_SET_ERROR(encl_ref, NDR_ERR_M_OP_INVALID); 4405772Sas200622 return (0); 4415772Sas200622 } 4425772Sas200622 4435772Sas200622 NDR_MEMBER(_ushort, sec_addr.length, offset); 4445772Sas200622 NDR_MEMBER_ARR_WITH_DIMENSION(_uchar, sec_addr.port_spec, 4455772Sas200622 offset+2UL, val->sec_addr.length); 4465772Sas200622 4475772Sas200622 offset += 2; 4485772Sas200622 offset += val->sec_addr.length; 4498334SJose.Borrego@Sun.COM offset += NDR_ALIGN4(offset); 4505772Sas200622 4518334SJose.Borrego@Sun.COM NDR_MEMBER(_ndr_p_result_list, p_result_list, offset); 4525772Sas200622 return (1); 4535772Sas200622 } 4545772Sas200622 4557619SJose.Borrego@Sun.COM /* 4567619SJose.Borrego@Sun.COM * Assume a single presentation context element in the result list. 4577619SJose.Borrego@Sun.COM */ 4585772Sas200622 unsigned 4598334SJose.Borrego@Sun.COM ndr_bind_ack_hdr_size(ndr_xa_t *mxa) 4605772Sas200622 { 4617619SJose.Borrego@Sun.COM ndr_bind_ack_hdr_t *bahdr = &mxa->send_hdr.bind_ack_hdr; 4625772Sas200622 unsigned offset; 4635772Sas200622 unsigned length; 4645772Sas200622 4655772Sas200622 /* port any is the conformant culprit */ 4665772Sas200622 offset = 24UL; 4675772Sas200622 4685772Sas200622 length = strlen((char *)bahdr->sec_addr.port_spec) + 1; 4695772Sas200622 4705772Sas200622 offset += 2; 4715772Sas200622 offset += length; 4728334SJose.Borrego@Sun.COM offset += NDR_ALIGN4(offset); 4738334SJose.Borrego@Sun.COM offset += sizeof (ndr_p_result_list_t); 4745772Sas200622 return (offset); 4755772Sas200622 } 4767619SJose.Borrego@Sun.COM 4777619SJose.Borrego@Sun.COM /* 4787619SJose.Borrego@Sun.COM * This is a hand-coded derivative of the automatically generated 4797619SJose.Borrego@Sun.COM * (un)marshalling routine for alter_context_rsp headers. 4807619SJose.Borrego@Sun.COM * Alter context response headers have an interior conformant array, 4817619SJose.Borrego@Sun.COM * which is inconsistent with IDL/NDR rules. 4827619SJose.Borrego@Sun.COM */ 4838334SJose.Borrego@Sun.COM int ndr__ndr_alter_context_rsp_hdr(ndr_ref_t *encl_ref); 4848334SJose.Borrego@Sun.COM ndr_typeinfo_t ndt__ndr_alter_context_rsp_hdr = { 4857619SJose.Borrego@Sun.COM 1, /* NDR version */ 4867619SJose.Borrego@Sun.COM 3, /* alignment */ 4877619SJose.Borrego@Sun.COM NDR_F_STRUCT, /* flags */ 4888334SJose.Borrego@Sun.COM ndr__ndr_alter_context_rsp_hdr, /* ndr_func */ 4897619SJose.Borrego@Sun.COM 56, /* pdu_size_fixed_part */ 4907619SJose.Borrego@Sun.COM 0, /* pdu_size_variable_part */ 4917619SJose.Borrego@Sun.COM 56, /* c_size_fixed_part */ 4927619SJose.Borrego@Sun.COM 0, /* c_size_variable_part */ 4937619SJose.Borrego@Sun.COM }; 4947619SJose.Borrego@Sun.COM 4957619SJose.Borrego@Sun.COM /* 4967619SJose.Borrego@Sun.COM * [_no_reorder] 4977619SJose.Borrego@Sun.COM */ 4987619SJose.Borrego@Sun.COM int 4998334SJose.Borrego@Sun.COM ndr__ndr_alter_context_rsp_hdr(ndr_ref_t *encl_ref) 5007619SJose.Borrego@Sun.COM { 5018334SJose.Borrego@Sun.COM ndr_stream_t *nds = encl_ref->stream; 5027619SJose.Borrego@Sun.COM ndr_alter_context_rsp_hdr_t *val = /*LINTED E_BAD_PTR_CAST_ALIGN*/ 5037619SJose.Borrego@Sun.COM (ndr_alter_context_rsp_hdr_t *)encl_ref->datum; 5048334SJose.Borrego@Sun.COM ndr_ref_t myref; 5057619SJose.Borrego@Sun.COM unsigned long offset; 5067619SJose.Borrego@Sun.COM 5077619SJose.Borrego@Sun.COM bzero(&myref, sizeof (myref)); 5087619SJose.Borrego@Sun.COM myref.enclosing = encl_ref; 5097619SJose.Borrego@Sun.COM myref.stream = encl_ref->stream; 5107619SJose.Borrego@Sun.COM myref.packed_alignment = 0; 5117619SJose.Borrego@Sun.COM 5127619SJose.Borrego@Sun.COM /* do all members in order */ 5137619SJose.Borrego@Sun.COM NDR_MEMBER(_ndr_common_header, common_hdr, 0UL); 5147619SJose.Borrego@Sun.COM NDR_MEMBER(_ushort, max_xmit_frag, 16UL); 5157619SJose.Borrego@Sun.COM NDR_MEMBER(_ushort, max_recv_frag, 18UL); 5167619SJose.Borrego@Sun.COM NDR_MEMBER(_ulong, assoc_group_id, 20UL); 5177619SJose.Borrego@Sun.COM 5187619SJose.Borrego@Sun.COM offset = 24UL; /* offset of sec_addr */ 5197619SJose.Borrego@Sun.COM 5208334SJose.Borrego@Sun.COM switch (nds->m_op) { 5217619SJose.Borrego@Sun.COM case NDR_M_OP_MARSHALL: 5227619SJose.Borrego@Sun.COM val->sec_addr.length = 0; 5237619SJose.Borrego@Sun.COM break; 5247619SJose.Borrego@Sun.COM 5257619SJose.Borrego@Sun.COM case NDR_M_OP_UNMARSHALL: 5267619SJose.Borrego@Sun.COM break; 5277619SJose.Borrego@Sun.COM 5287619SJose.Borrego@Sun.COM default: 5297619SJose.Borrego@Sun.COM NDR_SET_ERROR(encl_ref, NDR_ERR_M_OP_INVALID); 5307619SJose.Borrego@Sun.COM return (0); 5317619SJose.Borrego@Sun.COM } 5327619SJose.Borrego@Sun.COM 5337619SJose.Borrego@Sun.COM NDR_MEMBER(_ushort, sec_addr.length, offset); 5347619SJose.Borrego@Sun.COM NDR_MEMBER_ARR_WITH_DIMENSION(_uchar, sec_addr.port_spec, 5357619SJose.Borrego@Sun.COM offset+2UL, val->sec_addr.length); 5367619SJose.Borrego@Sun.COM 5377619SJose.Borrego@Sun.COM offset += 2; /* sizeof (sec_addr.length) */ 5388334SJose.Borrego@Sun.COM offset += NDR_ALIGN4(offset); 5397619SJose.Borrego@Sun.COM 5408334SJose.Borrego@Sun.COM NDR_MEMBER(_ndr_p_result_list, p_result_list, offset); 5417619SJose.Borrego@Sun.COM return (1); 5427619SJose.Borrego@Sun.COM } 5437619SJose.Borrego@Sun.COM 5447619SJose.Borrego@Sun.COM /* 5457619SJose.Borrego@Sun.COM * Assume a single presentation context element in the result list. 5467619SJose.Borrego@Sun.COM */ 5477619SJose.Borrego@Sun.COM unsigned 5488334SJose.Borrego@Sun.COM ndr_alter_context_rsp_hdr_size(void) 5497619SJose.Borrego@Sun.COM { 5507619SJose.Borrego@Sun.COM unsigned offset; 5517619SJose.Borrego@Sun.COM 5527619SJose.Borrego@Sun.COM offset = 24UL; /* offset of sec_addr */ 5537619SJose.Borrego@Sun.COM offset += 2; /* sizeof (sec_addr.length) */ 5548334SJose.Borrego@Sun.COM offset += NDR_ALIGN4(offset); 5558334SJose.Borrego@Sun.COM offset += sizeof (ndr_p_result_list_t); 5567619SJose.Borrego@Sun.COM return (offset); 5577619SJose.Borrego@Sun.COM } 558