#include #include #include #include static void print_object_key(int len, char *buf); int main(int argc, char **argv) { CORBA_char *type_id, *host; CORBA_short port; CDR_Codec *codec, *encaps_codec = NULL; CORBA_octet *buffer, *keybuffer, endian, iiop_major, iiop_minor; int i, j; CORBA_unsigned_long len, seq_len, misclen; CORBA_char *str; printf("Tags known:\n"); printf("TAG_INTERNET_IOP: 0x%x\n", IOP_TAG_INTERNET_IOP); printf("TAG_MULTIPLE_COMPONENTS: 0x%x\n", IOP_TAG_MULTIPLE_COMPONENTS); printf("TAG_ORBIT_SPECIFIC: 0x%xl\n\n", IOP_TAG_ORBIT_SPECIFIC); if(argc!=2) { fprintf(stderr, "Usage: %s ior-string\n", argv[0]); exit(-1); } str=argv[1]; if(strncmp(str, "IOR:", 4)) { fprintf(stderr, "Usage: %s ior-string\n", argv[0]); exit(-1); } codec = CDR_codec_init(); len = strlen(str); if((len % 2) || len <= 4) { fprintf(stderr, "Invalid IOR string (not even number of digits, or less than 4 digits)\n"); exit(-1); } codec->buf_len = (len-4)/2; buffer = g_new(CORBA_octet, codec->buf_len); if(!buffer) { fprintf(stderr, "Memory error\n"); exit(-1); } codec->buffer=buffer; codec->readonly = TRUE; for(j = 0, i = 4; i < len; i+=2) { buffer[j++] = HEXOCTET(str[i], str[i+1]); }; CDR_get_octet(codec, &endian); codec->data_endian = endian; CDR_get_string(codec, &type_id); printf("Object ID: %s\n", type_id); CDR_get_seq_begin(codec, &seq_len); printf("Profile count: %d\n", seq_len); printf("\n"); for(i = 0; i < seq_len; i++) { IOP_ProfileId tag; CDR_get_ulong(codec, &tag); switch(tag) { case IOP_TAG_INTERNET_IOP: printf("Profile type: TAG_INTERNET_IOP\n"); CDR_get_ulong(codec, &misclen); encaps_codec = CDR_codec_init(); encaps_codec->buffer = g_new(CORBA_octet, misclen); CDR_buffer_gets(codec, encaps_codec->buffer, misclen); encaps_codec->buf_len = misclen; encaps_codec->readonly = CORBA_TRUE; CDR_get_octet(encaps_codec, &endian); encaps_codec->data_endian = endian; printf("Object endian: %s%s\n", endian?"Little":"Big", endian==encaps_codec->host_endian?"":" (converting)"); CDR_get_octet(encaps_codec, &iiop_major); CDR_get_octet(encaps_codec, &iiop_minor); printf("IIOP version: %d.%d\n", iiop_major, iiop_minor); CDR_get_string(encaps_codec, &host); printf("Host: %s\n", host); CDR_get_ushort(encaps_codec, &port); printf("Port: %d\n", port); CDR_get_seq_begin(encaps_codec, &misclen); keybuffer = g_new(CORBA_octet, misclen); CDR_buffer_gets(encaps_codec, keybuffer, misclen); printf("Object key: \""); print_object_key(misclen, keybuffer); printf("\"\n"); CDR_codec_free(encaps_codec); encaps_codec = NULL; printf("\n"); break; case IOP_TAG_MULTIPLE_COMPONENTS: /* Just skip any multiple_components data, for now */ printf("Skipping TAG_MULTIPLE_COMPONENTS\n"); CDR_get_ulong(codec, &misclen); encaps_codec = CDR_codec_init(); encaps_codec->buf_len = misclen; encaps_codec->buffer = g_new(CORBA_octet, misclen); encaps_codec->readonly = CORBA_TRUE; CDR_buffer_gets(codec, encaps_codec->buffer, misclen); CDR_codec_free(encaps_codec); encaps_codec = NULL; printf("\n"); break; case IOP_TAG_ORBIT_SPECIFIC: printf("Profile type: TAG_ORBIT_SPECIFIC\n"); CDR_get_ulong(codec, &misclen); encaps_codec = CDR_codec_init(); encaps_codec->buffer = g_new(CORBA_octet, misclen); CDR_buffer_gets(codec, encaps_codec->buffer, misclen); encaps_codec->buf_len = misclen; encaps_codec->readonly = CORBA_TRUE; CDR_get_octet(encaps_codec, &endian); encaps_codec->data_endian = endian; printf("Object endian: %s%s\n", endian?"Little":"Big", endian==encaps_codec->host_endian?"":" (converting)"); CDR_get_octet(encaps_codec, &iiop_major); CDR_get_octet(encaps_codec, &iiop_minor); printf("IIOP version: %d.%d\n", iiop_major, iiop_minor); CDR_get_string(encaps_codec, &host); printf("Socket path: %s\n", host); CDR_get_ushort(encaps_codec, &port); printf("IPv6 port: %d\n", port); CDR_get_seq_begin(encaps_codec, &misclen); keybuffer = g_new(CORBA_octet, misclen); CDR_buffer_gets(encaps_codec, keybuffer, misclen); printf("Object key: \""); print_object_key(misclen, keybuffer); printf("\"\n"); CDR_codec_free(encaps_codec); encaps_codec = NULL; printf("\n"); break; default: printf("Skipping unknown tag 0x%x\n", tag); /* Skip it */ CDR_get_ulong(codec, &misclen); encaps_codec = CDR_codec_init(); encaps_codec->buf_len = misclen; encaps_codec->buffer = g_new(CORBA_octet, misclen); encaps_codec->readonly = CORBA_TRUE; CDR_buffer_gets(codec, encaps_codec->buffer, misclen); CDR_codec_free(encaps_codec); encaps_codec = NULL; printf("\n"); break; } } exit(0); } static void print_object_key(int len, char *buf) { int i; for(i = 0; i < len; i++) { if(isprint(buf[i])) printf("%c", buf[i]); else printf("."); } }