1d0e51869Samw /* 2d0e51869Samw * CDDL HEADER START 3d0e51869Samw * 4d0e51869Samw * The contents of this file are subject to the terms of the 5d0e51869Samw * Common Development and Distribution License (the "License"). 6d0e51869Samw * You may not use this file except in compliance with the License. 7d0e51869Samw * 8d0e51869Samw * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9d0e51869Samw * or http://www.opensolaris.org/os/licensing. 10d0e51869Samw * See the License for the specific language governing permissions 11d0e51869Samw * and limitations under the License. 12d0e51869Samw * 13d0e51869Samw * When distributing Covered Code, include this CDDL HEADER in each 14d0e51869Samw * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15d0e51869Samw * If applicable, add the following below this CDDL HEADER, with the 16d0e51869Samw * fields enclosed by brackets "[]" replaced with your own identifying 17d0e51869Samw * information: Portions Copyright [yyyy] [name of copyright owner] 18d0e51869Samw * 19d0e51869Samw * CDDL HEADER END 20d0e51869Samw */ 21d0e51869Samw 22d0e51869Samw /* 23*a0b6e447SAlan Wright * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 24d0e51869Samw * Use is subject to license terms. 25d0e51869Samw */ 26d0e51869Samw 27d0e51869Samw #include <string.h> 28d0e51869Samw #include "ndrgen.h" 29d0e51869Samw #include "y.tab.h" 30d0e51869Samw 31d0e51869Samw 32d0e51869Samw static void generate_struct(ndr_typeinfo_t *); 33d0e51869Samw static void generate_params(ndr_typeinfo_t *); 34d0e51869Samw static void generate_union(ndr_typeinfo_t *); 35d0e51869Samw static void generate_arg(ndr_node_t *); 36d0e51869Samw static void generate_member_macro(char *, char *, ndr_member_t *, 37d0e51869Samw ndr_typeinfo_t *); 38d0e51869Samw static void generate_member_macro_with_arg(char *, char *, ndr_member_t *, 39d0e51869Samw ndr_typeinfo_t *, ndr_node_t *); 40d0e51869Samw static void generate_prototypes(ndr_typeinfo_t *, char *); 41d0e51869Samw static void generate_member_prototypes(ndr_typeinfo_t *, ndr_member_t *, 42d0e51869Samw char *); 43d0e51869Samw static void generate_member(ndr_typeinfo_t *, ndr_member_t *); 44d0e51869Samw static void generate_aggregate_common_begin(ndr_typeinfo_t *); 45d0e51869Samw static void generate_aggregate_common_finish(ndr_typeinfo_t *); 46d0e51869Samw static void generate_typeinfo_packing(ndr_typeinfo_t *); 47d0e51869Samw static void generate_typeinfo_typeinfo(ndr_typeinfo_t *, int, char *); 48d0e51869Samw 49d0e51869Samw 50d0e51869Samw void 51d0e51869Samw generate(void) 52d0e51869Samw { 53d0e51869Samw ndr_typeinfo_t *ti; 54d0e51869Samw char fname_type[NDLBUFSZ]; 55d0e51869Samw 56d0e51869Samw (void) printf("\n"); 57d0e51869Samw 58d0e51869Samw for (ti = typeinfo_list; ti; ti = ti->next) { 59d0e51869Samw if (ti->is_extern || ti->advice.a_extern) { 60d0e51869Samw type_extern_suffix(ti, fname_type, NDLBUFSZ); 61d0e51869Samw (void) printf( 62d0e51869Samw "extern struct ndr_typeinfo ndt_%s;\n", 63d0e51869Samw fname_type); 64d0e51869Samw continue; 65d0e51869Samw } 66d0e51869Samw 67d0e51869Samw switch (ti->type_op) { 68d0e51869Samw case STRUCT_KW: 69d0e51869Samw if (ti->advice.a_operation) 70d0e51869Samw generate_params(ti); 71d0e51869Samw else 72d0e51869Samw generate_struct(ti); 73d0e51869Samw break; 74d0e51869Samw 75d0e51869Samw case UNION_KW: 76d0e51869Samw generate_union(ti); 77d0e51869Samw break; 78d0e51869Samw 79d0e51869Samw case TYPEDEF_KW: 80d0e51869Samw /* silently skip */ 81d0e51869Samw continue; 82d0e51869Samw 83d0e51869Samw case STRING_KW: 84d0e51869Samw case STAR: 85d0e51869Samw case LB: 86d0e51869Samw case BASIC_TYPE: 87d0e51869Samw if (!ti->is_referenced) { 88d0e51869Samw type_extern_suffix(ti, fname_type, NDLBUFSZ); 89d0e51869Samw (void) printf("extern ndt_%s\n", fname_type); 90d0e51869Samw type_null_decl(ti, fname_type, NDLBUFSZ); 91d0e51869Samw (void) printf("/* %s */\n", fname_type); 92d0e51869Samw } 93d0e51869Samw break; 94d0e51869Samw 95d0e51869Samw default: 96d0e51869Samw continue; 97d0e51869Samw } 98d0e51869Samw } 99d0e51869Samw } 100d0e51869Samw 101d0e51869Samw static void 102d0e51869Samw generate_struct(ndr_typeinfo_t *ti) 103d0e51869Samw { 104d0e51869Samw int i; 105d0e51869Samw ndr_member_t *mem; 106d0e51869Samw 107d0e51869Samw if (ti->advice.a_no_reorder) { 108d0e51869Samw /* just use generate_params(), which can safely do this */ 109d0e51869Samw generate_params(ti); 110d0e51869Samw return; 111d0e51869Samw } 112d0e51869Samw 113d0e51869Samw generate_aggregate_common_begin(ti); 114d0e51869Samw 115d0e51869Samw (void) printf(" /* do all basic elements first */\n"); 116d0e51869Samw for (i = 0; i < ti->n_member; i++) { 117d0e51869Samw mem = &ti->member[i]; 118d0e51869Samw if (mem->type->type_op != BASIC_TYPE) 119d0e51869Samw continue; 120d0e51869Samw 121d0e51869Samw generate_member(ti, mem); 122d0e51869Samw } 123d0e51869Samw 124d0e51869Samw (void) printf("\n"); 125d0e51869Samw (void) printf(" /* do all constructed elements w/o pointers */\n"); 126d0e51869Samw for (i = 0; i < ti->n_member; i++) { 127d0e51869Samw mem = &ti->member[i]; 128d0e51869Samw if (mem->type->type_op == BASIC_TYPE) 129d0e51869Samw continue; 130d0e51869Samw 131d0e51869Samw if (mem->type->has_pointers) 132d0e51869Samw continue; 133d0e51869Samw 134d0e51869Samw generate_member(ti, mem); 135d0e51869Samw } 136d0e51869Samw 137d0e51869Samw (void) printf("\n"); 138d0e51869Samw (void) printf(" /* do members with pointers in order */\n"); 139d0e51869Samw for (i = 0; i < ti->n_member; i++) { 140d0e51869Samw mem = &ti->member[i]; 141d0e51869Samw if (mem->type->type_op == BASIC_TYPE) 142d0e51869Samw continue; 143d0e51869Samw 144d0e51869Samw if (!mem->type->has_pointers) 145d0e51869Samw continue; 146d0e51869Samw 147d0e51869Samw generate_member(ti, mem); 148d0e51869Samw } 149d0e51869Samw 150d0e51869Samw generate_aggregate_common_finish(ti); 151d0e51869Samw } 152d0e51869Samw 153d0e51869Samw static void 154d0e51869Samw generate_params(ndr_typeinfo_t *ti) 155d0e51869Samw { 156d0e51869Samw int i; 157d0e51869Samw ndr_member_t *mem; 158d0e51869Samw 159d0e51869Samw generate_aggregate_common_begin(ti); 160d0e51869Samw 161d0e51869Samw (void) printf(" /* do all members in order */\n"); 162d0e51869Samw for (i = 0; i < ti->n_member; i++) { 163d0e51869Samw mem = &ti->member[i]; 164d0e51869Samw 165d0e51869Samw generate_member(ti, mem); 166d0e51869Samw } 167d0e51869Samw 168d0e51869Samw generate_aggregate_common_finish(ti); 169d0e51869Samw } 170d0e51869Samw 171d0e51869Samw static void 172d0e51869Samw generate_union(ndr_typeinfo_t *ti) 173d0e51869Samw { 174d0e51869Samw int i; 175d0e51869Samw ndr_member_t *mem; 176d0e51869Samw int have_default = 0; 177d0e51869Samw ndr_node_t *np; 178d0e51869Samw 179d0e51869Samw generate_aggregate_common_begin(ti); 180d0e51869Samw 181d0e51869Samw (void) printf(" switch (encl_ref->switch_is) {\n"); 182d0e51869Samw 183d0e51869Samw for (i = 0; i < ti->n_member; i++) { 184d0e51869Samw mem = &ti->member[i]; 185d0e51869Samw 186d0e51869Samw if ((np = mem->advice.a_case) != 0) { 187d0e51869Samw (void) printf(" case "); 188d0e51869Samw print_node(np->n_a_arg); 189d0e51869Samw (void) printf(":\n"); 190d0e51869Samw } else if ((np = mem->advice.a_default) != 0) { 191d0e51869Samw (void) printf(" default:\n"); 192d0e51869Samw if (have_default++) { 193d0e51869Samw compile_error("multiple defaults"); 194d0e51869Samw } 195d0e51869Samw } else { 196d0e51869Samw compile_error("syntax error"); 197d0e51869Samw } 198d0e51869Samw 199d0e51869Samw generate_member(ti, mem); 200d0e51869Samw (void) printf(" break;\n\n"); 201d0e51869Samw } 202d0e51869Samw 203d0e51869Samw if (!have_default) { 204d0e51869Samw (void) printf(" default:\n"); 205d0e51869Samw (void) printf(" NDR_SET_ERROR(encl_ref, " 206d0e51869Samw "NDR_ERR_SWITCH_VALUE_INVALID);\n"); 207d0e51869Samw (void) printf(" return 0;\n"); 208d0e51869Samw (void) printf(" break;\n"); 209d0e51869Samw } 210d0e51869Samw 211d0e51869Samw (void) printf(" }\n"); 212d0e51869Samw (void) printf("\n"); 213d0e51869Samw 214d0e51869Samw generate_aggregate_common_finish(ti); 215d0e51869Samw } 216d0e51869Samw 217d0e51869Samw static void 218d0e51869Samw generate_arg(ndr_node_t *np) 219d0e51869Samw { 220*a0b6e447SAlan Wright ndr_node_t *arg = np; 221*a0b6e447SAlan Wright 222*a0b6e447SAlan Wright if (np == NULL) { 223*a0b6e447SAlan Wright compile_error("invalid node pointer <null>"); 224*a0b6e447SAlan Wright return; 225d0e51869Samw } 226d0e51869Samw 227*a0b6e447SAlan Wright if (np->label != IDENTIFIER && np->label != INTEGER) 228*a0b6e447SAlan Wright arg = np->n_a_arg; 229*a0b6e447SAlan Wright 230*a0b6e447SAlan Wright switch (np->label) { 231*a0b6e447SAlan Wright case SIZE_IS_KW: 232*a0b6e447SAlan Wright case LENGTH_IS_KW: 233*a0b6e447SAlan Wright case SWITCH_IS_KW: 234*a0b6e447SAlan Wright (void) printf("val->"); 235*a0b6e447SAlan Wright print_field_attr(np); 236*a0b6e447SAlan Wright break; 237*a0b6e447SAlan Wright default: 238*a0b6e447SAlan Wright if (arg->label == IDENTIFIER) 239*a0b6e447SAlan Wright (void) printf("val->%s", arg->n_sym->name); 240d0e51869Samw else 241*a0b6e447SAlan Wright print_node(arg); 242*a0b6e447SAlan Wright break; 243*a0b6e447SAlan Wright } 244d0e51869Samw } 245d0e51869Samw 246d0e51869Samw static void 247d0e51869Samw generate_member_macro(char *memkind, char *macro, ndr_member_t *mem, 248d0e51869Samw ndr_typeinfo_t *ti) 249d0e51869Samw { 250d0e51869Samw char fname_type[NDLBUFSZ]; 251d0e51869Samw 252d0e51869Samw if (!macro) 253d0e51869Samw macro = ""; 254d0e51869Samw if (!ti) 255d0e51869Samw ti = mem->type; 256d0e51869Samw 257d0e51869Samw type_extern_suffix(ti, fname_type, NDLBUFSZ); 258d0e51869Samw 259d0e51869Samw if (memkind) { 260d0e51869Samw (void) printf(" NDR_%sMEMBER%s (%s, %s);\n", 261d0e51869Samw memkind, macro, fname_type, mem->name); 262d0e51869Samw } else { 263d0e51869Samw (void) printf(" NDR_MEMBER%s (%s, %s, %uUL);\n", 264d0e51869Samw macro, fname_type, mem->name, mem->pdu_offset); 265d0e51869Samw } 266d0e51869Samw } 267d0e51869Samw 268d0e51869Samw static void 269d0e51869Samw generate_member_macro_with_arg(char *memkind, char *macro, 270d0e51869Samw ndr_member_t *mem, ndr_typeinfo_t *ti, ndr_node_t *np) 271d0e51869Samw { 272d0e51869Samw char fname_type[NDLBUFSZ]; 273d0e51869Samw 274d0e51869Samw if (!macro) 275d0e51869Samw macro = "_WITH_ARG"; 276d0e51869Samw if (!ti) 277d0e51869Samw ti = mem->type; 278d0e51869Samw 279d0e51869Samw type_extern_suffix(ti, fname_type, NDLBUFSZ); 280d0e51869Samw 281d0e51869Samw if (memkind) { 282d0e51869Samw (void) printf(" NDR_%sMEMBER%s (%s, %s,\n", 283d0e51869Samw memkind, macro, fname_type, mem->name); 284d0e51869Samw } else { 285d0e51869Samw (void) printf(" NDR_MEMBER%s (%s, %s, %uUL,\n", 286d0e51869Samw macro, fname_type, mem->name, mem->pdu_offset); 287d0e51869Samw } 288d0e51869Samw 289d0e51869Samw (void) printf("\t\t"); 290d0e51869Samw generate_arg(np); 291d0e51869Samw (void) printf(");\n"); 292d0e51869Samw } 293d0e51869Samw 294d0e51869Samw static void 295d0e51869Samw generate_prototypes(ndr_typeinfo_t *ti, char *fname_type) 296d0e51869Samw { 297d0e51869Samw ndr_member_t *mem; 298d0e51869Samw int i; 299d0e51869Samw 300d0e51869Samw if (ti->type_op == STRUCT_KW && ti->advice.a_operation) { 301d0e51869Samw for (i = 0; i < ti->n_member; i++) { 302d0e51869Samw mem = &ti->member[i]; 303d0e51869Samw 304d0e51869Samw generate_member_prototypes(ti, mem, fname_type); 305d0e51869Samw } 306d0e51869Samw } 307d0e51869Samw } 308d0e51869Samw 309d0e51869Samw static void 310d0e51869Samw generate_member_prototypes(ndr_typeinfo_t *ti, 311d0e51869Samw ndr_member_t *mem, char *fname_type) 312d0e51869Samw { 313d0e51869Samw char val_buf[NDLBUFSZ]; 314d0e51869Samw ndr_typeinfo_t ptr; 315d0e51869Samw 316d0e51869Samw if (mem->type->type_op == UNION_KW) { 317d0e51869Samw if (!mem->advice.a_in && mem->advice.a_out) { 318d0e51869Samw ptr.type_op = STAR; 319d0e51869Samw ptr.type_down = ti; 320d0e51869Samw type_name_decl(&ptr, val_buf, NDLBUFSZ, "val"); 321d0e51869Samw 322d0e51869Samw (void) printf("\nextern void fixup%s(%s);\n", 323d0e51869Samw fname_type, val_buf); 324d0e51869Samw } 325d0e51869Samw } 326d0e51869Samw } 327d0e51869Samw 328d0e51869Samw static void 329d0e51869Samw generate_member(ndr_typeinfo_t *ti, ndr_member_t *mem) 330d0e51869Samw { 331d0e51869Samw static char *fixup[] = { 332d0e51869Samw "/*", 333d0e51869Samw " * Cannot use the canned offsets to unmarshall multiple", 334d0e51869Samw " * entry discriminated unions. The service must provide", 335d0e51869Samw " * this function to patch the offsets at runtime.", 336d0e51869Samw " */" 337d0e51869Samw }; 338d0e51869Samw 339d0e51869Samw char fname_type[NDLBUFSZ]; 340d0e51869Samw ndr_node_t *np; 341d0e51869Samw int is_reference = 0; 342d0e51869Samw char *memkind = 0; 343d0e51869Samw int cond_pending = 0; 344d0e51869Samw int i; 345d0e51869Samw 346d0e51869Samw if (ti->advice.a_operation) 347d0e51869Samw memkind = "TOPMOST_"; 348d0e51869Samw else if (ti->advice.a_interface) 349d0e51869Samw memkind = "PARAMS_"; 350d0e51869Samw 351d0e51869Samw if (mem->advice.a_in && !mem->advice.a_out) { 352d0e51869Samw cond_pending = 1; 353d0e51869Samw (void) printf(" if (NDR_DIR_IS_IN) {\n"); 354d0e51869Samw } 355d0e51869Samw 356d0e51869Samw if (!mem->advice.a_in && mem->advice.a_out) { 357d0e51869Samw cond_pending = 1; 358d0e51869Samw (void) printf(" if (NDR_DIR_IS_OUT) {\n"); 359d0e51869Samw } 360d0e51869Samw 361d0e51869Samw type_extern_suffix(ti, fname_type, NDLBUFSZ); 362d0e51869Samw 363d0e51869Samw switch (mem->type->type_op) { 364d0e51869Samw case BASIC_TYPE: 365d0e51869Samw case STRUCT_KW: 366d0e51869Samw generate_member_macro(memkind, 0, mem, 0); 367d0e51869Samw break; 368d0e51869Samw 369d0e51869Samw case UNION_KW: 370d0e51869Samw np = mem->advice.a_switch_is; 371d0e51869Samw 372d0e51869Samw if (!mem->advice.a_in && mem->advice.a_out) { 373d0e51869Samw for (i = 0; i < sizeof (fixup)/sizeof (fixup[0]); ++i) 374d0e51869Samw (void) printf("\t%s\n", fixup[i]); 375d0e51869Samw 376d0e51869Samw (void) printf("\tfixup%s(val);\n", fname_type); 377d0e51869Samw } 378d0e51869Samw 379d0e51869Samw generate_member_macro_with_arg(memkind, 380d0e51869Samw "_WITH_SWITCH_IS", mem, 0, np); 381d0e51869Samw break; 382d0e51869Samw 383d0e51869Samw case STAR: 384d0e51869Samw if (mem->advice.a_reference) 385d0e51869Samw is_reference = 1; 386d0e51869Samw else 387d0e51869Samw is_reference = 0; 388d0e51869Samw 389d0e51869Samw np = mem->advice.a_size_is; 390d0e51869Samw if (np) { 391d0e51869Samw generate_member_macro_with_arg(memkind, 392d0e51869Samw is_reference ? 393d0e51869Samw "_REF_WITH_SIZE_IS" : "_PTR_WITH_SIZE_IS", 394d0e51869Samw mem, mem->type->type_down, np); 395d0e51869Samw break; 396d0e51869Samw } 397d0e51869Samw 398d0e51869Samw np = mem->advice.a_length_is; 399d0e51869Samw if (np) { 400d0e51869Samw generate_member_macro_with_arg(memkind, 401d0e51869Samw is_reference ? 402d0e51869Samw "_REF_WITH_LENGTH_IS" : "_PTR_WITH_LENGTH_IS", 403d0e51869Samw mem, mem->type->type_down, np); 404d0e51869Samw break; 405d0e51869Samw } 406d0e51869Samw 407d0e51869Samw generate_member_macro(memkind, 408d0e51869Samw is_reference ? "_REF" : "_PTR", 409d0e51869Samw mem, mem->type->type_down); 410d0e51869Samw break; 411d0e51869Samw 412d0e51869Samw case LB: 413d0e51869Samw np = mem->advice.a_size_is; 414d0e51869Samw if (np) { 415d0e51869Samw generate_member_macro_with_arg(memkind, 416d0e51869Samw "_ARR_WITH_SIZE_IS", 417d0e51869Samw mem, mem->type->type_down, np); 418d0e51869Samw break; 419d0e51869Samw } 420d0e51869Samw 421d0e51869Samw np = mem->advice.a_length_is; 422d0e51869Samw if (np) { 423d0e51869Samw generate_member_macro_with_arg(memkind, 424d0e51869Samw "_WITH_LENGTH_IS", 425d0e51869Samw mem, mem->type->type_down, np); 426d0e51869Samw break; 427d0e51869Samw } 428d0e51869Samw 429d0e51869Samw generate_member_macro_with_arg(memkind, 430d0e51869Samw "_ARR_WITH_DIMENSION", 431d0e51869Samw mem, mem->type->type_down, mem->type->type_dim); 432d0e51869Samw break; 433d0e51869Samw 434d0e51869Samw default: 435d0e51869Samw generate_member_macro(memkind, "_???", mem, 0); 436d0e51869Samw break; 437d0e51869Samw } 438d0e51869Samw 439d0e51869Samw if (cond_pending) 440d0e51869Samw (void) printf(" }\n"); 441d0e51869Samw } 442d0e51869Samw 443d0e51869Samw static void 444d0e51869Samw generate_aggregate_common_begin(ndr_typeinfo_t *ti) 445d0e51869Samw { 446d0e51869Samw char val_buf[NDLBUFSZ]; 447d0e51869Samw char cast_buf[NDLBUFSZ]; 448d0e51869Samw char fname_type[NDLBUFSZ]; 449d0e51869Samw ndr_typeinfo_t ptr; 450d0e51869Samw 451d0e51869Samw type_extern_suffix(ti, fname_type, NDLBUFSZ); 452d0e51869Samw generate_typeinfo_typeinfo(ti, 0, fname_type); 453d0e51869Samw generate_prototypes(ti, fname_type); 454d0e51869Samw 455d0e51869Samw (void) printf("\n"); 456d0e51869Samw (void) printf("/*\n * "); 457d0e51869Samw show_advice(&ti->advice, 0); 458d0e51869Samw (void) printf(" */\n"); 459d0e51869Samw (void) printf("int\n"); 460d0e51869Samw (void) printf("ndr_%s (struct ndr_reference *encl_ref)\n", 461d0e51869Samw fname_type); 462d0e51869Samw (void) printf("{\n"); 463d0e51869Samw 464d0e51869Samw ptr.type_op = STAR; 465d0e51869Samw ptr.type_down = ti; 466d0e51869Samw 467d0e51869Samw type_name_decl(&ptr, val_buf, NDLBUFSZ, "val"); 468d0e51869Samw type_null_decl(&ptr, cast_buf, NDLBUFSZ); 469d0e51869Samw 470d0e51869Samw (void) printf(" %s = %s encl_ref->datum;\n", val_buf, cast_buf); 471d0e51869Samw 472d0e51869Samw (void) printf(" struct ndr_reference myref;\n"); 473d0e51869Samw (void) printf("\n"); 474d0e51869Samw (void) printf(" (void) bzero(&myref, sizeof (myref));\n"); 475d0e51869Samw (void) printf(" myref.enclosing = encl_ref;\n"); 476d0e51869Samw (void) printf(" myref.stream = encl_ref->stream;\n"); 477d0e51869Samw generate_typeinfo_packing(ti); 478d0e51869Samw (void) printf("\n"); 479d0e51869Samw } 480d0e51869Samw 481d0e51869Samw /* ARGSUSED */ 482d0e51869Samw static void 483d0e51869Samw generate_aggregate_common_finish(ndr_typeinfo_t *ti) 484d0e51869Samw { 485d0e51869Samw (void) printf("\n"); 486d0e51869Samw (void) printf(" return 1;\n"); 487d0e51869Samw (void) printf("}\n"); 488d0e51869Samw } 489d0e51869Samw 490d0e51869Samw /* 491d0e51869Samw * Structures are normally 4-byte (dword) aligned but the align directive 492d0e51869Samw * can be used to pack on a 2-byte (word) boundary. An align value of 493d0e51869Samw * zero is taken to mean use default (dword) alignment. Default packing 494d0e51869Samw * doesn't need to be flagged. 495d0e51869Samw */ 496d0e51869Samw static void 497d0e51869Samw generate_typeinfo_packing(ndr_typeinfo_t *ti) 498d0e51869Samw { 499d0e51869Samw ndr_node_t *np; 500d0e51869Samw unsigned long packing; 501d0e51869Samw 502d0e51869Samw if ((np = ti->advice.a_align) == NULL) 503d0e51869Samw return; 504d0e51869Samw 505d0e51869Samw if ((np = np->n_a_arg) == NULL) 506d0e51869Samw return; 507d0e51869Samw 508d0e51869Samw packing = np->n_int; 509d0e51869Samw if ((packing == 0) || (packing == 4)) { 510d0e51869Samw /* default alignment */ 511d0e51869Samw return; 512d0e51869Samw } 513d0e51869Samw 514d0e51869Samw if (packing != 2) { 515d0e51869Samw fatal_error("invalid align directive: %lu", packing); 516d0e51869Samw /* NOTREACHED */ 517d0e51869Samw } 518d0e51869Samw 519d0e51869Samw (void) printf(" myref.packed_alignment = %lu;\n", packing); 520d0e51869Samw } 521d0e51869Samw 522d0e51869Samw static void 523d0e51869Samw generate_typeinfo_typeinfo(ndr_typeinfo_t *ti, int is_static, char *fname_type) 524d0e51869Samw { 525d0e51869Samw char flags[NDLBUFSZ]; 526d0e51869Samw 527d0e51869Samw *flags = 0; 528d0e51869Samw if (ti->is_conformant) 529d0e51869Samw (void) strlcat(flags, "|NDR_F_CONFORMANT", NDLBUFSZ); 530d0e51869Samw 531d0e51869Samw if (ti->type_op == STRUCT_KW) { 532d0e51869Samw if (ti->advice.a_operation) 533d0e51869Samw (void) strlcat(flags, "|NDR_F_OPERATION", NDLBUFSZ); 534d0e51869Samw else 535d0e51869Samw (void) strlcat(flags, "|NDR_F_STRUCT", NDLBUFSZ); 536d0e51869Samw } 537d0e51869Samw 538d0e51869Samw if (ti->type_op == UNION_KW) { 539d0e51869Samw if (ti->advice.a_interface) 540d0e51869Samw (void) strlcat(flags, "|NDR_F_INTERFACE", NDLBUFSZ); 541d0e51869Samw else 542d0e51869Samw (void) strlcat(flags, "|NDR_F_UNION", NDLBUFSZ); 543d0e51869Samw } 544d0e51869Samw 545d0e51869Samw if (ti->type_op == STRING_KW) 546d0e51869Samw (void) strlcat(flags, "|NDR_F_STRING", NDLBUFSZ); 547d0e51869Samw if (ti->type_op == LB) 548d0e51869Samw (void) strlcat(flags, "|NDR_F_ARRAY", NDLBUFSZ); 549d0e51869Samw if (ti->type_op == STAR) 550d0e51869Samw (void) strlcat(flags, "|NDR_F_POINTER", NDLBUFSZ); 551d0e51869Samw 552d0e51869Samw if (*flags == 0) 553d0e51869Samw (void) strlcpy(flags, "NDR_F_NONE", NDLBUFSZ); 554d0e51869Samw else 555d0e51869Samw (void) strlcpy(flags, flags+1, NDLBUFSZ); 556d0e51869Samw 557d0e51869Samw (void) printf("\n\n\n"); 558d0e51869Samw if (is_static) 559d0e51869Samw (void) printf("static "); 560d0e51869Samw 561d0e51869Samw (void) printf("int ndr_%s (struct ndr_reference *encl_ref);\n", 562d0e51869Samw fname_type); 563d0e51869Samw if (is_static) 564d0e51869Samw (void) printf("static "); 565d0e51869Samw 566d0e51869Samw (void) printf("struct ndr_typeinfo ndt_%s = {\n", fname_type); 567d0e51869Samw (void) printf("\t1, /* NDR version */\n"); 568d0e51869Samw (void) printf("\t%d, /* alignment */\n", ti->alignment); 569d0e51869Samw (void) printf("\t%s, /* flags */\n", flags); 570d0e51869Samw (void) printf("\tndr_%s, /* ndr_func */\n", fname_type); 571d0e51869Samw (void) printf("\t%d, /* pdu_size_fixed_part */\n", 572d0e51869Samw ti->size_fixed_part); 573d0e51869Samw (void) printf("\t%d, /* pdu_size_variable_part */\n", 574d0e51869Samw ti->size_variable_part); 575d0e51869Samw 576d0e51869Samw (void) printf("\t%d, /* c_size_fixed_part */\n", 577d0e51869Samw ti->size_fixed_part); 578d0e51869Samw (void) printf("\t%d, /* c_size_variable_part */\n", 579d0e51869Samw ti->size_variable_part); 580d0e51869Samw (void) printf("};\n\n"); 581d0e51869Samw } 582