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** ifspemts.c 82** 83** FACILITY: 84** 85** IDL Compiler Backend 86** 87** ABSTRACT: 88** 89** Routines for the emission of ifspecs, including MIA transfer syntaxes 90** 91** 92*/ 93 94#include <nidl.h> 95#include <ast.h> 96#include <cspell.h> 97#include <command.h> 98#include <ifspec.h> 99#include <bedeck.h> 100#include <dutils.h> 101#include <mtsbacke.h> 102 103/******************************************************************************/ 104/* */ 105/* Return a pointer to the name of the if_spec */ 106/* */ 107/******************************************************************************/ 108static char *BE_ifspec_name 109( 110 AST_interface_n_t *ifp, 111 BE_output_k_t kind 112) 113{ 114 static char retval[100]; 115 116 sprintf(retval, "%s_v%ld_%ld_%c_ifspec", BE_get_name(ifp->name), 117 (ifp->version%65536), (ifp->version/65536), 118 kind == BE_client_stub_k ? 'c' : 's'); 119 120 return retval; 121} 122 123/******************************************************************************/ 124/* */ 125/* Spell the manager epv to the output stream */ 126/* */ 127/******************************************************************************/ 128void CSPELL_manager_epv 129( 130 FILE *fid, 131 AST_interface_n_t *ifp 132) 133{ 134 AST_export_n_t *p_export; 135 boolean first_op = true; 136 137 fprintf( fid, "\nstatic %s_v%ld_%ld_epv_t IDL_manager_epv = {\n", 138 BE_get_name(ifp->name), (ifp->version%65536), (ifp->version/65536) ); 139 140 for( p_export = ifp->exports; p_export != NULL; p_export = p_export->next ) 141 { 142 if (p_export->kind == AST_operation_k) 143 { 144 if ( ! first_op ) fprintf( fid, "," ); 145 spell_name( fid, p_export->thing_p.exported_operation->name ); 146 fprintf( fid, "\n" ); 147 first_op = false; 148 } 149 } 150 151 fprintf( fid,"};\n" ); 152} 153 154/******************************************************************************/ 155/* */ 156/* Spell an interface definition and related material to the output stream */ 157/* */ 158/******************************************************************************/ 159void CSPELL_interface_def 160( 161 FILE *fid, 162 AST_interface_n_t *ifp, 163 BE_output_k_t kind, 164 boolean generate_mepv 165) 166{ 167 boolean first; 168 long i, endpoints; 169 char const *protseq, *portspec; 170 171 if ((endpoints = ifp->number_of_ports) != 0) 172 { 173 first = true; 174 fprintf(fid, 175 "static rpc_endpoint_vector_elt_t IDL_endpoints[%ld] = \n{", 176 endpoints); 177 for (i = 0; i < endpoints; i++) 178 { 179 STRTAB_str_to_string(ifp->protocol[i], &protseq); 180 STRTAB_str_to_string(ifp->endpoints[i], &portspec); 181 if (!first) fprintf(fid, ",\n"); 182 fprintf(fid, 183 "{(unsigned_char_p_t)\"%s\", (unsigned_char_p_t)\"%s\"}", 184 protseq, portspec); 185 first = false; 186 } 187 fprintf(fid, "};\n"); 188 } 189 190 /* Transfer syntaxes */ 191 fprintf( fid, "\nstatic rpc_syntax_id_t IDL_transfer_syntaxes[%d] = {\n{\n", 192 1 ); 193 fprintf(fid, 194"{0x8a885d04u, 0x1ceb, 0x11c9, 0x9f, 0xe8, {0x8, 0x0, 0x2b, 0x10, 0x48, 0x60}},"); 195 fprintf(fid, "\n2}"); 196 fprintf(fid, "};\n"); 197 198 fprintf(fid, "\nstatic rpc_if_rep_t IDL_ifspec = {\n"); 199 fprintf(fid, " 1, /* ifspec rep version */\n"); 200 fprintf(fid, " %d, /* op count */\n", ifp->op_count); 201 fprintf(fid, " %ld, /* if version */\n", ifp->version); 202 fprintf(fid, " {"); 203 fprintf(fid, "0x%8.8lxu, ", ifp->uuid.time_low); 204 fprintf(fid, "0x%4.4x, ", ifp->uuid.time_mid); 205 fprintf(fid, "0x%4.4x, ", ifp->uuid.time_hi_and_version); 206 fprintf(fid, "0x%2.2x, ", ifp->uuid.clock_seq_hi_and_reserved); 207 fprintf(fid, "0x%2.2x, ", ifp->uuid.clock_seq_low); 208 fprintf(fid, "{"); 209 first = true; 210 for (i = 0; i < 6; i++) 211 { 212 if (first) 213 first = false; 214 else 215 fprintf (fid, ", "); 216 fprintf (fid, "0x%x", ifp->uuid.node[i]); 217 } 218 fprintf(fid, "}},\n"); 219 fprintf(fid, " 2, /* stub/rt if version */\n"); 220 fprintf(fid, " {%ld, %s}, /* endpoint vector */\n", endpoints, 221 endpoints ? "IDL_endpoints" : "NULL"); 222 fprintf(fid, " {%d, IDL_transfer_syntaxes} /* syntax vector */\n", 223 1 ); 224 225 if (kind == BE_server_stub_k) 226 { 227 fprintf(fid, ",IDL_epva /* server_epv */\n"); 228 if (generate_mepv) 229 { 230 fprintf(fid,",(rpc_mgr_epv_t)&IDL_manager_epv /* manager epv */\n"); 231 } 232 else 233 { 234 fprintf(fid,",NULL /* manager epv */\n"); 235 } 236 } 237 else 238 { 239 fprintf(fid,",NULL /* server epv */\n"); 240 fprintf(fid,",NULL /* manager epv */\n"); 241 } 242 fprintf(fid, "};\n"); 243 fprintf(fid, 244 "/* global */ rpc_if_handle_t %s = (rpc_if_handle_t)&IDL_ifspec;\n", 245 BE_ifspec_name(ifp, kind)); 246} 247