1/* 2 * Copyright (c) 2010 Apple Inc. All rights reserved. 3 * 4 * @APPLE_LICENSE_HEADER_START@ 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. Neither the name of Apple Inc. ("Apple") nor the names of its 16 * contributors may be used to endorse or promote products derived from 17 * this software without specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 20 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 21 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 22 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 23 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 26 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 28 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 * 30 * Portions of this software have been released under the following terms: 31 * 32 * (c) Copyright 1989-1993 OPEN SOFTWARE FOUNDATION, INC. 33 * (c) Copyright 1989-1993 HEWLETT-PACKARD COMPANY 34 * (c) Copyright 1989-1993 DIGITAL EQUIPMENT CORPORATION 35 * 36 * To anyone who acknowledges that this file is provided "AS IS" 37 * without any express or implied warranty: 38 * permission to use, copy, modify, and distribute this file for any 39 * purpose is hereby granted without fee, provided that the above 40 * copyright notices and this notice appears in all source code copies, 41 * and that none of the names of Open Software Foundation, Inc., Hewlett- 42 * Packard Company or Digital Equipment Corporation be used 43 * in advertising or publicity pertaining to distribution of the software 44 * without specific, written prior permission. Neither Open Software 45 * Foundation, Inc., Hewlett-Packard Company nor Digital 46 * Equipment Corporation makes any representations about the suitability 47 * of this software for any purpose. 48 * 49 * Copyright (c) 2007, Novell, Inc. All rights reserved. 50 * Redistribution and use in source and binary forms, with or without 51 * modification, are permitted provided that the following conditions 52 * are met: 53 * 54 * 1. Redistributions of source code must retain the above copyright 55 * notice, this list of conditions and the following disclaimer. 56 * 2. Redistributions in binary form must reproduce the above copyright 57 * notice, this list of conditions and the following disclaimer in the 58 * documentation and/or other materials provided with the distribution. 59 * 3. Neither the name of Novell Inc. nor the names of its contributors 60 * may be used to endorse or promote products derived from this 61 * this software without specific prior written permission. 62 * 63 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY 64 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 65 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 66 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY 67 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 68 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 69 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 70 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 71 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 72 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 73 * 74 * @APPLE_LICENSE_HEADER_END@ 75 */ 76 77/* 78** 79** NAME: 80** 81** sscmasrv.c 82** 83** FACILITY: 84** 85** IDL Stub Runtime Support 86** 87** ABSTRACT: 88** 89** CMA machinery used by IDL server stub 90** 91** VERSION: DCE 1.0 92** 93*/ 94#if HAVE_CONFIG_H 95#include <config.h> 96#endif 97 98/* The ordering of the following 3 includes should NOT be changed! */ 99#include <dce/rpc.h> 100#include <dce/stubbase.h> 101#include <lsysdep.h> 102 103#ifdef MIA 104#include <dce/idlddefs.h> 105#endif 106 107#ifdef PERFMON 108#include <dce/idl_log.h> 109#endif 110/******************************************************************************/ 111/* */ 112/* Set up CMA machinery required by server and client */ 113/* */ 114/******************************************************************************/ 115 116ndr_boolean rpc_ss_server_is_set_up = ndr_false; 117 118void rpc_ss_init_server_once( 119 void 120) 121{ 122 123#ifdef PERFMON 124 RPC_SS_INIT_SERVER_ONCE_N; 125#endif 126 127 RPC_SS_THREADS_INIT; 128 rpc_ss_init_client_once(); 129 rpc_ss_init_allocate_once(); 130 rpc_ss_server_is_set_up = ndr_true; 131 132#ifdef PERFMON 133 RPC_SS_INIT_SERVER_ONCE_X; 134#endif 135 136} 137 138/******************************************************************************/ 139/* */ 140/* Map an exception into a fault code and send a fault packet */ 141/* Old version - no user exceptions */ 142/* */ 143/******************************************************************************/ 144void rpc_ss_send_server_exception 145( 146 rpc_call_handle_t h, 147 dcethread_exc *e 148) 149{ 150 ndr_ulong_int mapped_code; 151 ndr_ulong_int fault_buff; 152 rpc_mp_t mp; 153 rpc_iovector_t iovec; 154 error_status_t st; 155 156#ifdef PERFMON 157 RPC_SS_SEND_SERVER_EXCEPTION_N; 158#endif 159 160 iovec.num_elt = 1; 161 iovec.elt[0].buff_dealloc = NULL; 162 iovec.elt[0].flags = rpc_c_iovector_elt_reused; 163 iovec.elt[0].buff_addr = (byte_p_t)&fault_buff; 164 iovec.elt[0].buff_len = 4; 165 iovec.elt[0].data_addr = (byte_p_t)&fault_buff; 166 iovec.elt[0].data_len = 4; 167 168 if ( RPC_SS_EXC_MATCHES( e, &rpc_x_invalid_tag ) ) 169 mapped_code = nca_s_fault_invalid_tag; 170 else if ( RPC_SS_EXC_MATCHES( e, &rpc_x_invalid_bound ) ) 171 mapped_code = nca_s_fault_invalid_bound; 172 else if ( RPC_SS_EXC_MATCHES( e, &RPC_SS_THREADS_X_CANCELLED ) ) 173 mapped_code = nca_s_fault_cancel; 174 else if ( RPC_SS_EXC_MATCHES( e, &dcethread_fltdiv_e ) ) 175 mapped_code = nca_s_fault_fp_div_zero; 176 else if ( RPC_SS_EXC_MATCHES( e, &dcethread_fltovf_e ) ) 177 mapped_code = nca_s_fault_fp_overflow; 178 else if ( RPC_SS_EXC_MATCHES( e, &dcethread_aritherr_e ) ) 179 mapped_code = nca_s_fault_fp_error; 180 else if ( RPC_SS_EXC_MATCHES( e, &dcethread_fltund_e ) ) 181 mapped_code = nca_s_fault_fp_underflow; 182 else if ( RPC_SS_EXC_MATCHES( e, &dcethread_illaddr_e ) ) 183 mapped_code = nca_s_fault_addr_error; 184 else if ( RPC_SS_EXC_MATCHES( e, &dcethread_illinstr_e ) ) 185 mapped_code = nca_s_fault_ill_inst; 186 else if ( RPC_SS_EXC_MATCHES( e, &dcethread_intdiv_e ) ) 187 mapped_code = nca_s_fault_int_div_by_zero; 188 else if ( RPC_SS_EXC_MATCHES( e, &dcethread_intovf_e ) ) 189 mapped_code = nca_s_fault_int_overflow; 190 else if ( RPC_SS_EXC_MATCHES( e, &rpc_x_no_memory ) ) 191 mapped_code = nca_s_fault_remote_no_memory; 192 else if ( RPC_SS_EXC_MATCHES( e, &rpc_x_ss_context_mismatch ) ) 193 mapped_code = nca_s_fault_context_mismatch; 194 else if ( RPC_SS_EXC_MATCHES( e, &rpc_x_ss_pipe_empty ) ) 195 mapped_code = nca_s_fault_pipe_empty; 196 else if ( RPC_SS_EXC_MATCHES( e, &rpc_x_ss_pipe_closed ) ) 197 mapped_code = nca_s_fault_pipe_closed; 198 else if ( RPC_SS_EXC_MATCHES( e, &rpc_x_ss_pipe_order ) ) 199 mapped_code = nca_s_fault_pipe_order; 200 else if ( RPC_SS_EXC_MATCHES( e, &rpc_x_ss_pipe_discipline_error ) ) 201 mapped_code = nca_s_fault_pipe_discipline; 202 else if ( RPC_SS_EXC_MATCHES( e, &rpc_x_ss_pipe_comm_error ) ) 203 mapped_code = nca_s_fault_pipe_comm_error; 204 else if ( RPC_SS_EXC_MATCHES( e, &rpc_x_ss_pipe_memory ) ) 205 mapped_code = nca_s_fault_pipe_memory; 206 else if ( RPC_SS_EXC_MATCHES( e, &rpc_x_ss_remote_comm_failure ) ) 207 mapped_code = nca_s_fault_remote_comm_failure; 208 else 209 mapped_code = nca_s_fault_unspec; 210 211 rpc_init_mp(mp, &fault_buff); 212 rpc_marshall_ulong_int(mp, mapped_code); 213 rpc_call_transmit_fault( h, &iovec, &st ); 214 215#ifdef PERFMON 216 RPC_SS_SEND_SERVER_EXCEPTION_X; 217#endif 218 219} 220 221/******************************************************************************/ 222/* */ 223/* Map an exception into a fault code and send a fault packet */ 224/* New version - user exceptions */ 225/* */ 226/******************************************************************************/ 227void rpc_ss_send_server_exception_2 228( 229 rpc_call_handle_t h, 230 dcethread_exc *e, 231 idl_long_int num_user_exceptions, 232 dcethread_exc *user_exception_pointers[], 233 IDL_msp_t IDL_msp ATTRIBUTE_UNUSED 234) 235{ 236 ndr_ulong_int mapped_code; 237 ndr_ulong_int fault_buff[2]; 238 rpc_iovector_t iovec; 239 error_status_t st; 240 ndr_ulong_int i; 241 rpc_mp_t mp; 242 243 for (i=0; i< (unsigned32)num_user_exceptions; i++) 244 { 245 if (RPC_SS_EXC_MATCHES(e, user_exception_pointers[i])) 246 { 247 mapped_code = nca_s_fault_user_defined; 248 rpc_init_mp(mp, fault_buff); 249 rpc_marshall_ulong_int(mp, mapped_code); 250 rpc_advance_mp(mp, 4); 251 rpc_marshall_ulong_int(mp, i); 252 iovec.num_elt = 1; 253 iovec.elt[0].buff_dealloc = NULL; 254 iovec.elt[0].flags = rpc_c_iovector_elt_reused; 255 iovec.elt[0].buff_addr = (byte_p_t)fault_buff; 256 iovec.elt[0].buff_len = 8; 257 iovec.elt[0].data_addr = (byte_p_t)fault_buff; 258 iovec.elt[0].data_len = 8; 259 rpc_call_transmit_fault( h, &iovec, &st ); 260 return; 261 } 262 } 263 264 /* Exception did not match any user defined exception. 265 Call the old (system exception) code */ 266 rpc_ss_send_server_exception( h, e ); 267} 268