ndrmi.h   [plain text]


/*
 * Copyright (c) 2010 Apple Inc. All rights reserved.
 *
 * @APPLE_LICENSE_HEADER_START@
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1.  Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 * 2.  Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 * 3.  Neither the name of Apple Inc. ("Apple") nor the names of its
 *     contributors may be used to endorse or promote products derived from
 *     this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * Portions of this software have been released under the following terms:
 *
 * (c) Copyright 1989-1993 OPEN SOFTWARE FOUNDATION, INC.
 * (c) Copyright 1989-1993 HEWLETT-PACKARD COMPANY
 * (c) Copyright 1989-1993 DIGITAL EQUIPMENT CORPORATION
 *
 * To anyone who acknowledges that this file is provided "AS IS"
 * without any express or implied warranty:
 * permission to use, copy, modify, and distribute this file for any
 * purpose is hereby granted without fee, provided that the above
 * copyright notices and this notice appears in all source code copies,
 * and that none of the names of Open Software Foundation, Inc., Hewlett-
 * Packard Company or Digital Equipment Corporation be used
 * in advertising or publicity pertaining to distribution of the software
 * without specific, written prior permission.  Neither Open Software
 * Foundation, Inc., Hewlett-Packard Company nor Digital
 * Equipment Corporation makes any representations about the suitability
 * of this software for any purpose.
 *
 * Copyright (c) 2007, Novell, Inc. All rights reserved.
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1.  Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 * 2.  Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 * 3.  Neither the name of Novell Inc. nor the names of its contributors
 *     may be used to endorse or promote products derived from this
 *     this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * @APPLE_LICENSE_HEADER_END@
 */

/*
**
**      ndrmi.h
**
**  FACILITY:
**
**      Interface Definition Language (IDL) Compiler
**
**  ABSTRACT:
**
**      Header file for macros and procedures shared between ndrmi*.c modules
**
*/

/*  Marshalling strategy
 *
 *  All marshalling is done into buffers, except when an array is encountered
 *  that is sufficiently large to justify the "point at array optimization"
 *  A standard size iovector is used. When all its elements point at buffers
 *  or, by the optimization, arrays, it is despatched by an rpc_call_transmit.
 *  At the end of marshalling there is usually a further transmit, to send the
 *  data not already sent. On the server side, if there is no unsent data,
 *  there is no rpc_call_transmit. On the client side, if there is no unsent
 *  data there is still a transceive, to turn the line round.
 *
 *  The following state block fields affect marshalling
 *  IDL_buff_addr       address of the current buffer
 *  IDL_data_addr       address of first byte in buffer to be transmitted
 *  IDL_mp_start_offset determines the position of the start of data in the
 *                      current buffer relative to the first (0 mod 8) address
 *                      in the buffer. This will be 0 unless marshalling the
 *                      buffer follows a "marshall array by pointing"
 *  IDL_mp              Address in buffer at which next data item can be placed
 *  IDL_left_in_buff    Number of bytes in current buffer still available for
 *                      marshalling.
 */

/******************************************************************************/
/*                                                                            */
/*  Check whether there is enough space in the current buffer, if one exists  */
/*  If no buffer, create one                                                  */
/*  If buffer is full, perform closure/despatch and start a new buffer        */
/*                                                                            */
/******************************************************************************/
#define rpc_ss_ndr_marsh_check_buffer( datum_size, IDL_msp ) \
{ \
    if (datum_size > IDL_msp->IDL_left_in_buff) \
    { \
        if (IDL_msp->IDL_buff_addr != NULL) \
        { \
            rpc_ss_attach_buff_to_iovec( IDL_msp ); \
            rpc_ss_xmit_iovec_if_necess( idl_false, IDL_msp ); \
            IDL_msp->IDL_mp_start_offset = 0; \
        } \
        rpc_ss_ndr_marsh_init_buffer( IDL_msp ); \
    } \
}

/******************************************************************************/
/*                                                                            */
/* Marshall a scalar                                                          */
/*                                                                            */
/******************************************************************************/

#define IDL_MARSH_1_BYTE_SCALAR( marshalling_macro, type, param_addr ) \
{ \
    rpc_ss_ndr_marsh_check_buffer( 1, IDL_msp ); \
    marshalling_macro(IDL_msp->IDL_mp, *(type *)(param_addr)); \
    IDL_msp->IDL_mp += 1; \
    IDL_msp->IDL_left_in_buff -= 1; \
}

#define IDL_MARSH_BOOLEAN( param_addr ) \
{ \
        IDL_MARSH_1_BYTE_SCALAR( rpc_marshall_boolean, idl_boolean, param_addr ); \
}

#define IDL_MARSH_BYTE( param_addr ) \
    IDL_MARSH_1_BYTE_SCALAR( rpc_marshall_byte, idl_byte, param_addr )

#define IDL_MARSH_CHAR( param_addr ) \
    IDL_MARSH_1_BYTE_SCALAR( rpc_marshall_char, idl_char, param_addr )

#define IDL_MARSH_ALIGNED_SCALAR( marshalling_macro, size, type, param_addr ) \
{ \
    IDL_MARSH_ALIGN_MP( IDL_msp, size ); \
    rpc_ss_ndr_marsh_check_buffer( size, IDL_msp ); \
    marshalling_macro(IDL_msp->IDL_mp, *(type *)(param_addr)); \
    IDL_msp->IDL_mp += size; \
    IDL_msp->IDL_left_in_buff -= size; \
}

#define IDL_MARSH_DOUBLE( param_addr ) \
    IDL_MARSH_ALIGNED_SCALAR( rpc_marshall_long_float, 8, idl_long_float, param_addr )

#define IDL_MARSH_ENUM( param_addr ) \
    IDL_MARSH_ALIGNED_SCALAR( rpc_marshall_enum, 2, int, param_addr )

#define IDL_MARSH_FLOAT( param_addr ) \
    IDL_MARSH_ALIGNED_SCALAR( rpc_marshall_short_float, 4, idl_short_float, param_addr )

#define IDL_MARSH_SMALL( param_addr ) \
{ \
        IDL_MARSH_1_BYTE_SCALAR( rpc_marshall_small_int, idl_small_int, param_addr ); \
}

#define IDL_MARSH_SHORT( param_addr ) \
    IDL_MARSH_ALIGNED_SCALAR( rpc_marshall_short_int, 2, idl_short_int, param_addr )

#define IDL_MARSH_LONG( param_addr ) \
    IDL_MARSH_ALIGNED_SCALAR( rpc_marshall_long_int, 4, idl_long_int, param_addr )

#define IDL_MARSH_HYPER( param_addr ) \
    IDL_MARSH_ALIGNED_SCALAR( rpc_marshall_hyper_int, 8, idl_hyper_int, param_addr )

#define IDL_MARSH_USMALL( param_addr ) \
{ \
        IDL_MARSH_1_BYTE_SCALAR( rpc_marshall_usmall_int, idl_usmall_int, param_addr ); \
}

#define IDL_MARSH_USHORT( param_addr ) \
{ \
        IDL_MARSH_ALIGNED_SCALAR( rpc_marshall_ushort_int, 2, idl_ushort_int, param_addr ); \
}

#define IDL_MARSH_ULONG( param_addr ) \
    IDL_MARSH_ALIGNED_SCALAR( rpc_marshall_ulong_int, 4, idl_ulong_int, param_addr )

#define IDL_MARSH_UHYPER( param_addr ) \
    IDL_MARSH_ALIGNED_SCALAR( rpc_marshall_uhyper_int, 8, idl_uhyper_int, param_addr )

#define IDL_MARSH_V1_ENUM( param_addr ) \
    IDL_MARSH_ALIGNED_SCALAR( rpc_marshall_v1_enum, 4, int, param_addr )

#ifdef IDL_ENABLE_STATUS_MAPPING
#define IDL_MARSH_ERROR_STATUS( param_addr ) \
{ \
    IDL_MARSH_ALIGN_MP( IDL_msp, 4 ); \
    rpc_ss_ndr_marsh_check_buffer( 4, IDL_msp ); \
    rpc_marshall_ulong_int(IDL_msp->IDL_mp, *(idl_ulong_int *)(param_addr)); \
    rpc_ss_map_local_to_dce_status((error_status_t *)(IDL_msp->IDL_mp)); \
    IDL_msp->IDL_mp += 4; \
    IDL_msp->IDL_left_in_buff -= 4; \
}
#else
#define IDL_MARSH_ERROR_STATUS( param_addr ) \
{ \
    IDL_MARSH_ALIGN_MP( IDL_msp, 4 ); \
    rpc_ss_ndr_marsh_check_buffer( 4, IDL_msp ); \
    rpc_marshall_ulong_int(IDL_msp->IDL_mp, *(idl_ulong_int *)(param_addr)); \
    IDL_msp->IDL_mp += 4; \
    IDL_msp->IDL_left_in_buff -= 4; \
}
#endif

/* For marshalling interpreter internal variables, which are always C format */
#define IDL_MARSH_CUSHORT( param_addr ) \
    IDL_MARSH_ALIGNED_SCALAR( rpc_marshall_ushort_int, 2, idl_ushort_int, param_addr )

#define IDL_MARSH_CUSMALL( param_addr ) \
    IDL_MARSH_1_BYTE_SCALAR( rpc_marshall_usmall_int, idl_usmall_int, param_addr )

/* Function prototypes */

void rpc_ss_attach_buff_to_iovec
(
    IDL_msp_t IDL_msp
);

void rpc_ss_conf_struct_cs_bounds
(
    idl_byte *defn_vec_ptr,
    IDL_cs_shadow_elt_t *cs_shadow,
    IDL_bound_pair_t *bounds_list,
    IDL_msp_t IDL_msp
);

void rpc_ss_discard_allocate_ref
(
    idl_byte **p_type_vec_ptr
);

void rpc_ss_ndr_m_dfc_arr_ptees
(
    idl_ulong_int defn_index,
    rpc_void_p_t array_addr,
    rpc_void_p_t struct_addr,
    idl_ulong_int *struct_offset_vec_ptr,
    idl_ulong_int flags,
    IDL_msp_t IDL_msp
);

void rpc_ss_ndr_m_dvo_arr_ptees
(
    idl_ulong_int defn_index,
    rpc_void_p_t array_addr,
    rpc_void_p_t struct_addr,
    idl_ulong_int *struct_offset_vec_ptr,
    idl_ulong_int flags,
    IDL_msp_t IDL_msp
);

void rpc_ss_ndr_m_enc_union_or_ptees
(
    rpc_void_p_t param_addr,
    idl_ulong_int defn_index,
    idl_boolean pointees,
    IDL_msp_t IDL_msp
);

void rpc_ss_ndr_m_fix_or_conf_arr
(
    rpc_void_p_t array_addr,
    idl_ulong_int dimensionality,
    IDL_bound_pair_t *bounds_list,
    idl_byte *defn_vec_ptr,
    idl_ulong_int flags,
    IDL_msp_t IDL_msp
);

void rpc_ss_ndr_m_fixed_cs_array
(
    rpc_void_p_t array_addr,
    idl_byte **p_defn_vec_ptr,
    IDL_msp_t IDL_msp
);

void rpc_ss_ndr_m_n_e_union_or_ptees
(
    rpc_void_p_t param_addr,
    idl_ulong_int switch_index,
    idl_ulong_int defn_index,
    rpc_void_p_t struct_addr,
    idl_ulong_int *struct_offset_vec_ptr,
    idl_boolean pointees,
    IDL_msp_t IDL_msp
);

void rpc_ss_ndr_m_param_cs_shadow
(
    idl_byte *type_vec_ptr,
    idl_ulong_int param_index,
    idl_ulong_int shadow_length,
    IDL_cs_shadow_elt_t **p_cs_shadow,
    IDL_msp_t IDL_msp
);

void rpc_ss_ndr_m_rlse_cs_shadow
(
    IDL_cs_shadow_elt_t *cs_shadow,
    idl_ulong_int shadow_length,
    IDL_msp_t IDL_msp
);

void rpc_ss_ndr_m_struct_cs_shadow
(
    rpc_void_p_t struct_addr,
    idl_byte struct_type,
    idl_ulong_int shadow_length,
    idl_ulong_int offset_index,
    idl_byte *defn_vec_ptr,
    IDL_cs_shadow_elt_t **p_cs_shadow,
    IDL_msp_t IDL_msp
);

void rpc_ss_ndr_m_struct_pointees
(
    idl_byte struct_type,
    idl_ulong_int defn_index,
    rpc_void_p_t struct_addr,
    IDL_msp_t IDL_msp
);

void rpc_ss_ndr_m_var_or_open_arr
(
    rpc_void_p_t array_addr,
    idl_ulong_int *Z_values,
    idl_ulong_int dimensionality,
    IDL_bound_pair_t *range_list,
    idl_byte *defn_vec_ptr,
    idl_ulong_int flags,
    IDL_msp_t IDL_msp
);

void rpc_ss_ndr_marsh_by_copying
(
    idl_ulong_int element_count,
    idl_ulong_int element_size,
    rpc_void_p_t array_addr,
    IDL_msp_t IDL_msp
);

void rpc_ss_ndr_marsh_by_looping
(
    idl_ulong_int element_count,
    idl_byte base_type,
    rpc_void_p_t array_addr,
    idl_ulong_int element_size,
    idl_ulong_int element_defn_index,
    IDL_msp_t IDL_msp
);

void rpc_ss_ndr_marsh_by_pointing
(
    idl_ulong_int element_count,
    idl_ulong_int element_size,
    rpc_void_p_t array_addr,
    IDL_msp_t IDL_msp
);

void rpc_ss_ndr_marsh_context
(
    idl_byte context_type,
    rpc_void_p_t param_addr,
    IDL_msp_t IDL_msp
);

void rpc_ss_ndr_marsh_cs_array
(
    rpc_void_p_t array_addr,
    IDL_cs_shadow_elt_t *cs_shadow,
    idl_ulong_int shadow_index,
    idl_boolean in_struct,
    idl_byte **p_defn_vec_ptr,
    IDL_msp_t IDL_msp
);

void rpc_ss_ndr_marsh_cs_char
(
    rpc_void_p_t char_addr,
    idl_ulong_int cs_type_defn_index,
    IDL_msp_t IDL_msp
);

void rpc_ss_ndr_marsh_deletes
(
    IDL_msp_t IDL_msp
);

void rpc_ss_ndr_marsh_fixed_arr
(
    idl_ulong_int defn_index,
    rpc_void_p_t array_addr,
    idl_ulong_int flags,
    IDL_msp_t IDL_msp
);

void rpc_ss_ndr_marsh_open_arr
(
    idl_ulong_int defn_index,
    rpc_void_p_t array_addr,
    idl_ulong_int flags,
    IDL_msp_t IDL_msp
);

void rpc_ss_ndr_marsh_pipe
(
    idl_ulong_int defn_index,
    rpc_void_p_t param_addr,
    IDL_msp_t IDL_msp
);

void rpc_ss_ndr_marsh_pointee
(
    idl_byte *defn_vec_ptr,
    rpc_void_p_t pointee_addr,
    idl_boolean register_node,
    IDL_pointee_desc_t *p_pointee_desc,
    IDL_msp_t IDL_msp
);

void rpc_ss_ndr_marsh_scalar
(
    idl_byte type_byte,
    rpc_void_p_t param_addr,
    IDL_msp_t IDL_msp
);

void rpc_ss_ndr_marsh_bounded_scalar
(
    IDL_bound_pair_t *range_bounds,
    idl_byte type_byte,
    rpc_void_p_t param_addr,
    IDL_msp_t IDL_msp
);

void rpc_ss_ndr_marsh_interface
(
    idl_ulong_int defn_index,
    void 	  *param_addr,
    IDL_msp_t     IDL_msp
);

void rpc_ss_ndr_marsh_dyn_interface
(
    idl_ulong_int rtn_index,
    void 	  *param_addr,
    idl_uuid_t	  *piid,
    IDL_msp_t     IDL_msp
);

void rpc_ss_ndr_marsh_struct
(
    idl_byte struct_type,
    idl_ulong_int defn_index,
    rpc_void_p_t struct_addr,
    IDL_msp_t IDL_msp
);

void rpc_ss_ndr_marsh_v1_string
(
    rpc_void_p_t param_addr,
    idl_ulong_int flags,
    IDL_msp_t IDL_msp
);

void rpc_ss_ndr_marsh_varying_arr
(
    idl_ulong_int defn_index,
    rpc_void_p_t array_addr,
    rpc_void_p_t struct_addr,
    idl_ulong_int *struct_offset_vec_ptr,
    idl_ulong_int flags,
    IDL_msp_t IDL_msp
);

void rpc_ss_ndr_marsh_xmit_as
(
    idl_ulong_int defn_index,
    rpc_void_p_t param_addr,
    IDL_msp_t IDL_msp
);

void rpc_ss_ndr_marsh_Z_values
(
    idl_ulong_int dimensionality,
    idl_ulong_int *Z_values,
    IDL_msp_t IDL_msp
);

void rpc_ss_pointee_desc_from_data
(
    idl_byte *defn_vec_ptr,
    rpc_void_p_t array_addr,
    rpc_void_p_t struct_addr,
    idl_ulong_int *struct_offset_vec_ptr,
    IDL_pointee_desc_t *p_pointee_desc,
    IDL_msp_t IDL_msp
);

#define rpc_ss_rlse_data_pointee_desc( p_pointee_desc, IDL_msp ) \
    if ((p_pointee_desc)->dimensionality > 0) \
    { \
        rpc_ss_mem_item_free(&IDL_msp->IDL_mem_handle, \
                                      (byte_p_t)((p_pointee_desc)->Z_values)); \
    }

void rpc_ss_xmit_iovec_if_necess
(
    idl_boolean attached_pointed_at,
    IDL_msp_t IDL_msp
);