]> rtime.felk.cvut.cz Git - orte.git/blob - orte/contrib/decoder/decode_msg.c
Added prerelease of ORTE-0.2 (Real Time Publisher Subscriber communication protocol...
[orte.git] / orte / contrib / decoder / decode_msg.c
1 #include <stdio.h>
2 #include <string.h>
3 #include <ctype.h>
4 #include <stdlib.h>
5 #include <endian.h>
6 #include <byteswap.h>
7 #include <typedefs_defines_rtps.h>
8
9 // global variables
10   FILE *ptr_in, *ptr_out;
11
12
13 /**********************************************************************************/
14 void conv_u32(u_int32_t *x,u_int8_t ef) {
15   #if __BYTE_ORDER == __LITTLE_ENDIAN
16      if(ef) bswap_32(*x);
17   #elif __BYTE_ORDER == __BIG_ENDIAN
18      if(!ef)bswap_32(*x);
19   #endif
20 }
21
22 /**********************************************************************************/
23 void print_obj(void *obj) {
24   fprintf(ptr_out," (");
25   switch (bswap_32(*((u_int32_t*)obj))) {
26     case OID_APP:
27       fprintf(ptr_out,"ManagedApplicaton or Manager");
28       break;
29     case OID_WRITE_APPSELF:
30       fprintf(ptr_out,"Write appself");
31       break;
32     case OID_WRITE_APP:
33       fprintf(ptr_out,"Write app");
34       break;
35     case OID_READ_APP:
36       fprintf(ptr_out,"Read app");
37       break;
38     case OID_WRITE_MGR:
39       fprintf(ptr_out,"Write mgr");
40       break;
41     case OID_READ_MGR:
42       fprintf(ptr_out,"Read mgr");
43       break;
44     case OID_WRITE_PUBL:
45       fprintf(ptr_out,"Write publ");
46       break;
47     case OID_READ_PUBL:
48       fprintf(ptr_out,"Read publ");
49       break;
50     case OID_WRITE_SUBS:
51       fprintf(ptr_out,"Write subs");
52       break;
53     case OID_READ_SUBS:
54       fprintf(ptr_out,"Read subs");
55       break;
56     default:
57       fprintf(ptr_out,"unknown");
58       break;
59   }
60   fprintf(ptr_out,")\n");
61 }                     
62
63 /**********************************************************************************/
64 void print_app(u_int8_t app) {
65   switch (app) {
66     case MANAGEDAPPLICATION:
67       fprintf(ptr_out,"(managed application)\n");
68       break;
69     case MANAGER:
70       fprintf(ptr_out,"(manager)\n");
71       break;
72     default:
73       fprintf(ptr_out,"(unknown class)\n");
74       break;    
75   }
76 }                          
77
78 /**********************************************************************************/
79 void decode_parametr_sequence(u_int8_t *msg) {
80   NtpTime            ts;
81   ProtocolVersion    pv;
82   VendorId           vid;
83   SequenceNumber     sn;
84   u_int8_t      i,j,l;
85   u_int8_t      *k;
86
87   while(*((ParameterId*)msg)!=PID_SENTINEL) {
88     printf("id%d,len%d\n",*((ParameterId*)msg),*((ParameterLength*)(msg+2)));
89     if ((*((ParameterLength*)(msg+2)))==0) break;
90     switch(*(ParameterId*)msg) {
91       case PID_PAD:
92         fprintf(ptr_out,"     PID_PAD                              :\n");
93         break;
94       case PID_EXPIRATION_TIME:
95         ts=*((NtpTime*)(msg+4));
96         fprintf(ptr_out,"     PID_EXPIRATION_TIME                  : %u,%u\n",
97                         ts.seconds,ts.fraction);
98         break;
99       case PID_PERSISTENCE:
100         ts=*((NtpTime*)(msg+4));
101         fprintf(ptr_out,"     PID_PERSISTENCE                      : %u,%u\n",
102                         ts.seconds,ts.fraction);
103         break;
104       case PID_MINIMUM_SEPARATION:
105         ts=*((NtpTime*)(msg+4));
106         fprintf(ptr_out,"     PID_MINIMUM_SEPARATION               : %u,%u\n",
107                         ts.seconds,ts.fraction);
108         break;
109       case PID_TOPIC:
110         fprintf(ptr_out,"     PID_TOPIC                            :\n");
111         k=msg+4;
112         //len of message is also in message (first ulong)
113         l=(*(u_int32_t*)(msg+4))+4;
114         while(l!=0) {
115           if (l>8) j=8;
116           else j=l;
117           l-=j; 
118           fprintf(ptr_out,"                    : ");
119           for(i=0;i<j;i++,k++) fprintf(ptr_out,"%02X ",k[0]);
120           if (l==0) {
121             for(i=j;i<8;i++) fprintf(ptr_out,"   ");
122           } 
123           k-=j;
124           for(i=0;i<j;i++,k++) fprintf(ptr_out,"%c",k[0]);
125           fprintf(ptr_out,"\n");
126         } 
127         break;
128       case PID_STRENGTH:
129         fprintf(ptr_out,"     PID_STRENGTH                         : %u\n",
130                         *(u_int32_t*)(msg+4));
131         break;
132       case PID_TYPE_NAME:
133         fprintf(ptr_out,"     PID_TYPE_NAME                        :\n");
134         k=msg+4;
135         //len of message is also in message (first ulong)
136         l=(*(u_int32_t*)(msg+4))+4;
137         while(l!=0) {
138           if (l>8) j=8;
139           else j=l;
140           l-=j; 
141           fprintf(ptr_out,"                    : ");
142           for(i=0;i<j;i++,k++) fprintf(ptr_out,"%02X ",k[0]);
143           if (l==0) {
144             for(i=j;i<8;i++) fprintf(ptr_out,"   ");
145           } 
146           k-=j;
147           for(i=0;i<j;i++,k++) fprintf(ptr_out,"%c",k[0]);
148           fprintf(ptr_out,"\n");
149         } 
150         break;
151       case PID_TYPE_CHECKSUM:
152         fprintf(ptr_out,"     PID_TYPE_CHECKSUM                    : %u\n",
153                         *(TypeChecksum*)(msg+4));
154         break;
155       case RTPS_PID_TYPE2_NAME:
156         fprintf(ptr_out,"     RTPS_PID_TYPE2_NAME                  :\n");
157         break;
158       case RTPS_PID_TYPE2_CHECKSUM:
159         fprintf(ptr_out,"     RTPS_PID_TYPE2_CHECKSUM              :\n");
160         break;
161       case PID_MATATRAFFIC_MULTICAST_IPADDRESS:
162         fprintf(ptr_out,"     PID_MATATRAFFIC_MULTICAST_IPADDRESS  : %u.%u.%u.%u\n",
163                         msg[7],msg[6],msg[5],msg[4]);
164         break;
165       case PID_APP_IPADDRESS:
166         fprintf(ptr_out,"     PID_APP_IPADDRESS                    : %u.%u.%u.%u\n",
167                         msg[7],msg[6],msg[5],msg[4]);
168         break;
169       case PID_METATRAFFIC_UNICAST_PORT:
170         fprintf(ptr_out,"     PID_METATRAFFIC_UNICAST_PORT         : %u\n",
171                         *(Port*)(msg+4));
172         break;
173       case PID_USERDATA_UNICAST_PORT:
174         fprintf(ptr_out,"     PID_USERDATA_UNICAST_PORT            : %u\n",
175                         *(Port*)(msg+4));
176         break;
177       case PID_EXPECTS_ACK:
178         fprintf(ptr_out,"     PID_EXPECTS_ACK                      : %u\n",
179                         *(u_int32_t*)(msg+4));
180         break;
181       case PID_USERDATA_MULTICAST_IPADDRESS:
182         fprintf(ptr_out,"     PID_USERDATA_MULTICAST_IPADDRESS     : %u.%u.%u.%u\n",
183                         msg[7],msg[6],msg[5],msg[4]);
184         break;
185       case PID_MANAGER_KEY:
186         fprintf(ptr_out,"     PID_MANAGER_KEY                      : 0x%02x%02x%02x%02x (%u.%u.%u.%u)\n",
187                         msg[7],msg[6],msg[5],msg[4],msg[7],msg[6],msg[5],msg[4]);
188         break;
189       case PID_SEND_QUEUE_SIZE:
190         fprintf(ptr_out,"     PID_SEND_QUEUE_SIZE                  : %u\n",
191                         *(u_int32_t*)(msg+4));
192         break;
193       case PID_PROTOCOL_VERSION:
194         pv=*((ProtocolVersion*)(msg+4));
195         fprintf(ptr_out,"     PID_PROTOCOL_VERSION                 : %u.%u\n",
196                 pv.major,pv.minor);
197         break;
198       case PID_VENDOR_ID:
199         vid=*((VendorId*)(msg+4));
200         fprintf(ptr_out,"     PID_VENDOR_ID                        : %u.%u\n",
201                 vid.major,vid.minor);
202         break;
203       case PID_VARGAPPS_SEQUENCE_NUMBER_LAST:
204         sn=*((SequenceNumber*)(msg+4));
205         fprintf(ptr_out,"     PID_VARGAPPS_SEQUENCE_NUMBER_LAST    : %u\n",sn.low);
206         break;
207       case PID_RECV_QUEUE_SIZE:
208         fprintf(ptr_out,"     PID_RECV_QUEUE_SIZE                  : %u\n",
209                         *(u_int32_t*)(msg+4));
210         break;
211       case PID_RELIABILITY_OFFERED:
212         fprintf(ptr_out,"     PID_RELIABILITY_OFFERED              : %u\n",
213                         *(u_int32_t*)(msg+4));
214         break;
215       case PID_RELIABILITY_REQUESTED:
216         fprintf(ptr_out,"     PID_RELIABILITY_REQUESTED            : %u\n",
217                         *(u_int32_t*)(msg+4));
218         break;
219       default:
220         fprintf(ptr_out,"     unknow paramerId                 : %d len : %d\n",
221                 *((ParameterId*)msg),*((ParameterLength*)(msg+2)));
222         break;      
223     }
224     msg+=(*((ParameterLength*)(msg+2)))+4;                      /* next message */
225   }
226   msg+=(*((ParameterLength*)(msg+2)))+4;                        /* message end*/
227 }
228
229
230 /**********************************************************************************/
231 int decode_header(u_int8_t *msg, unsigned len, MessageInterpret *mi) {
232   if (len<16) return -1;                          /* message is to small */
233   if (msg[0]!='R') return -2;                     /* header is invalid */
234   if (msg[1]!='T') return -2;                     /* header is invalid */
235   if (msg[2]!='P') return -2;                     /* header is invalid */
236   if (msg[3]!='S') return -2;                     /* header is invalid */
237   mi->sourceVersion=*((ProtocolVersion*)(msg+4)); /* ProtocolVersion */
238   mi->sourceVendorId=*((VendorId*)(msg+6));       /* Vendor Id */
239   mi->sourceHostId=*((HostId*)(msg+8));           /* Host Id */
240   mi->sourceAppId=*((AppId*)(msg+12));            /* App Id */
241   mi->haveTimestamp=0;                            /* false */
242   return 0;
243 }
244
245 /**********************************************************************************/
246 int decode_submessage(u_int8_t *msg, int ptr, MessageInterpret *mi) {
247   IPAddress          ipa;
248   Port               port;
249   ObjectId           roid,woid,oid;
250   SequenceNumber     fsn,lsn,wsn;
251   u_int8_t      i,j,l;
252   u_int8_t      *k;
253   HostId             hid;
254   AppId              aid;
255   int                ptr_off;
256
257   switch ((SubmessageId)msg[ptr]) {
258     case PAD:
259       fprintf(ptr_out,"   PAD\n");
260       break;
261     case VAR:
262       fprintf(ptr_out,"   VAR\n");
263       fprintf(ptr_out,"     h-bit          : %d\n",(msg[ptr+1] & 8) ? 1:0);
264       fprintf(ptr_out,"     alive-bit      : %d\n",(msg[ptr+1] & 4) ? 1:0);
265       fprintf(ptr_out,"     p-bit          : %d\n",(msg[ptr+1] & 2) ? 1:0);
266       roid=*((ObjectId*)(msg+ptr+4));
267       fprintf(ptr_out,"     ObjectId       : %d.%d.%d.%02x",
268                         *(u_int8_t*)&roid,*(((u_int8_t*)&roid)+1),*(((u_int8_t*)&roid)+2),*(((u_int8_t*)&roid)+3));
269       print_obj(&roid);               
270       woid=*((ObjectId*)(msg+ptr+8));
271       fprintf(ptr_out,"     ObjectId       : %d.%d.%d.%02x",
272                         *(u_int8_t*)&woid,*(((u_int8_t*)&woid)+1),*(((u_int8_t*)&woid)+2),*(((u_int8_t*)&woid)+3));
273       print_obj(&woid);               
274       if (msg[ptr+1] & 8) {
275         hid=*((HostId*)(msg+ptr+12));                   /* hostId */
276         aid=*((AppId*)(msg+ptr+16));                   /* appId */
277         fprintf(ptr_out,"     HostId         : %d.%d.%d.%d\n",
278                         *(u_int8_t*)&hid,*(((u_int8_t*)&hid)+1),*(((u_int8_t*)&hid)+2),*(((u_int8_t*)&hid)+3));
279         fprintf(ptr_out,"     AppId          : %d.%d.%d.%d ",
280                         *(u_int8_t*)&aid,*(((u_int8_t*)&aid)+1),*(((u_int8_t*)&aid)+2),*(((u_int8_t*)&aid)+3));
281         print_app(*(((u_int8_t*)&aid)+3));
282         ptr_off=8;
283       } else ptr_off=0;
284       oid=*((ObjectId*)(msg+ptr+12+ptr_off));
285       fprintf(ptr_out,"     ObjectId       : %d.%d.%d.%02x",
286                         *(u_int8_t*)&oid,*(((u_int8_t*)&oid)+1),*(((u_int8_t*)&oid)+2),*(((u_int8_t*)&oid)+3));
287       print_obj(&oid);                
288       wsn=*((SequenceNumber*)(msg+ptr+16+ptr_off));
289       fprintf(ptr_out,"     sequenceNumber : %u\n",wsn.low);                  
290       if (msg[ptr+1] & 2) {
291         decode_parametr_sequence(msg+ptr+24+ptr_off);
292       }
293       break;
294     case ISSUE:
295       fprintf(ptr_out,"   ISSUE\n");
296       roid=*((ObjectId*)(msg+ptr+4));woid=*((ObjectId*)(msg+ptr+8));
297       fsn=*((SequenceNumber*)(msg+ptr+12));
298       fprintf(ptr_out,"     p-bit          : %d\n",(msg[ptr+1] & 2) ? 1:0);
299       fprintf(ptr_out,"     readerObjectId : %d.%d.%d.%02x",
300                       *(u_int8_t*)&roid,*(((u_int8_t*)&roid)+1),*(((u_int8_t*)&roid)+2),*(((u_int8_t*)&roid)+3));
301       print_obj(&roid);               
302       fprintf(ptr_out,"     writeObjectId  : %d.%d.%d.%02x",
303                       *(u_int8_t*)&woid,*(((u_int8_t*)&woid)+1),*(((u_int8_t*)&woid)+2),*(((u_int8_t*)&woid)+3));
304       print_obj(&woid);               
305       fprintf(ptr_out,"     issueSeqNumber : %u\n",fsn.low);                  
306       k=msg+ptr+20;
307       if (msg[ptr+1] & 2) {
308         decode_parametr_sequence(k);          /* after k is set to end of paramseq. */
309       }
310 //      l=(*(unsigned*)(msg+ptr+2))-(k-(msg+ptr+20)+16);
311       //len of message is also in message (first ulong), internaly defined by RTI !!! 
312       l=(*(u_int32_t*)k)+4;
313       while(l!=0) {
314         if (l>8) j=8;
315         else j=l;
316         l-=j; 
317         fprintf(ptr_out,"                    : ");
318         for(i=0;i<j;i++,k++) fprintf(ptr_out,"%02X ",k[0]);
319         if (l==0) {
320           for(i=j;i<8;i++) fprintf(ptr_out,"   ");
321         } 
322         k-=j;
323         for(i=0;i<j;i++,k++) fprintf(ptr_out,"%c",k[0]);
324         fprintf(ptr_out,"\n");
325       } 
326       break;
327     case ACK:
328       fprintf(ptr_out,"   ACK\n");
329       roid=*((ObjectId*)(msg+ptr+4));woid=*((ObjectId*)(msg+ptr+8));
330       fprintf(ptr_out,"     final-bit      : %d\n",(msg[ptr+1] & 2) ? 1:0);
331       fprintf(ptr_out,"     readerObjectId : %d.%d.%d.%02x",
332                       *(u_int8_t*)&roid,*(((u_int8_t*)&roid)+1),*(((u_int8_t*)&roid)+2),*(((u_int8_t*)&roid)+3));
333       print_obj(&roid);               
334       fprintf(ptr_out,"     writeObjectId  : %d.%d.%d.%02x",
335                       *(u_int8_t*)&woid,*(((u_int8_t*)&woid)+1),*(((u_int8_t*)&woid)+2),*(((u_int8_t*)&woid)+3));
336       print_obj(&woid);               
337       fprintf(ptr_out,"     bitmap         : %u/%u:",*((u_int32_t*)(msg+ptr+16)),
338                       *((u_int32_t*)(msg+ptr+20)));
339       for(i=0;i<msg[ptr+20]/8;) {
340         for(j=128;j!=0;j>>=1) fprintf(ptr_out,"%d",(msg[ptr+24+i] & j) ? 1:0);
341         fprintf(ptr_out," ");
342         if ((!(++i % 4)) && (i<msg[ptr+20]/8)) 
343           fprintf(ptr_out,"\n                          :");
344       }
345       fprintf(ptr_out,"\n");                  
346       break;
347     case HEARTBEAT:
348       fprintf(ptr_out,"   HEARTBEAT\n");
349       roid=*((ObjectId*)(msg+ptr+4));woid=*((ObjectId*)(msg+ptr+8));
350       fsn=*((SequenceNumber*)(msg+ptr+12));lsn=*((SequenceNumber*)(msg+ptr+20));
351       fprintf(ptr_out,"     final-bit      : %d\n",(msg[ptr+1] & 2) ? 1:0);
352       fprintf(ptr_out,"     readerObjectId : %d.%d.%d.%02x",
353                       *(u_int8_t*)&roid,*(((u_int8_t*)&roid)+1),*(((u_int8_t*)&roid)+2),*(((u_int8_t*)&roid)+3));
354       print_obj(&roid);               
355       fprintf(ptr_out,"     writeObjectId  : %d.%d.%d.%02x",
356                       *(u_int8_t*)&woid,*(((u_int8_t*)&woid)+1),*(((u_int8_t*)&woid)+2),*(((u_int8_t*)&woid)+3));
357       print_obj(&woid);               
358       fprintf(ptr_out,"     firstSeqNumber : %u\n",fsn.low);                  
359       fprintf(ptr_out,"     lastSeqNumber  : %u\n",lsn.low);                  
360       break;
361     case GAP:
362       fprintf(ptr_out,"   GAP\n");
363       roid=*((ObjectId*)(msg+ptr+4));woid=*((ObjectId*)(msg+ptr+8));
364       fsn=*((SequenceNumber*)(msg+ptr+12));
365       lsn=*((SequenceNumber*)(msg+ptr+20));
366       fprintf(ptr_out,"     readerObjectId : %d.%d.%d.%02x",
367                       *(u_int8_t*)&roid,*(((u_int8_t*)&roid)+1),*(((u_int8_t*)&roid)+2),*(((u_int8_t*)&roid)+3));
368       print_obj(&roid);               
369       fprintf(ptr_out,"     writeObjectId  : %d.%d.%d.%02x",
370                       *(u_int8_t*)&woid,*(((u_int8_t*)&woid)+1),*(((u_int8_t*)&woid)+2),*(((u_int8_t*)&woid)+3));
371       print_obj(&woid);               
372       fprintf(ptr_out,"     firstSeqNumber : %u\n",fsn.low);                  
373       fprintf(ptr_out,"     bitmap         : %u/%u:",lsn.low,
374                       *((u_int32_t*)(msg+ptr+28)));
375       for(i=0;i<(*((u_int32_t*)(msg+ptr+28)));i++) {
376         l=((*(((u_int32_t*)(msg+ptr+32))+i/32)) & (1<<(31-i%32))) ? 1:0;
377         fprintf(ptr_out,"%d",l);
378       }
379       fprintf(ptr_out,"\n");                  
380       break;
381     case INFO_TS:
382       fprintf(ptr_out,"   INFO_TS\n");
383       fprintf(ptr_out,"     i-bit          : %d\n",(msg[ptr+1] & 2) ? 1:0);
384       if (!(msg[ptr+1]&2)) {
385         mi->timestamp=*((NtpTime*)(msg+ptr+4));
386         fprintf(ptr_out,"     ntpTimeStamp   : %u,%u\n",
387                         mi->timestamp.seconds,mi->timestamp.fraction);
388       } 
389       break;
390     case INFO_SRC:
391       fprintf(ptr_out,"   INFO_SRC\n");
392       break;
393     case INFO_REPLY:
394       fprintf(ptr_out,"   INFO_REPLY\n");
395       ipa=*((u_int32_t*)(msg+ptr+4));                  /* unicastReplyIPAddress */
396       port=*((u_int32_t*)(msg+ptr+8));                 /* unicastReplyPort */
397       fprintf(ptr_out,"     unicastReplyIPAddress   : %d.%d.%d.%d\n",
398                       *(u_int8_t*)&ipa,*(((u_int8_t*)&ipa)+1),*(((u_int8_t*)&ipa)+2),*(((u_int8_t*)&ipa)+3));
399       fprintf(ptr_out,"     unicastReplyPort        : %u\n",port);
400       if (ipa!=IPADDRESS_INVALID) {
401         mi->unicastReplyIPAddress=ipa;
402       }
403       mi->unicastReplyPort=port; 
404       if ((msg[ptr+1] & 0x02) !=0) {
405         ipa=*((u_int32_t*)(msg+ptr+12));               /* multicastReplyIPAddress */
406         port=*((u_int32_t*)(msg+ptr+16));              /* multicastReplyPort */
407         fprintf(ptr_out,"     multicastReplyIPAddress : %d.%d.%d.%d\n",
408                       *(u_int8_t*)&ipa,*(((u_int8_t*)&ipa)+1),*(((u_int8_t*)&ipa)+2),*(((u_int8_t*)&ipa)+3));
409         fprintf(ptr_out,"     multicastReplyPort      : %u\n",port);
410         mi->multicastReplyIPAddress=ipa;
411         mi->multicastReplyPort=port; 
412       } else {
413         mi->multicastReplyIPAddress=IPADDRESS_INVALID;
414         mi->multicastReplyPort     =PORT_INVALID; 
415       }
416       break;
417     case INFO_DST:
418       fprintf(ptr_out,"   INFO_DST\n");
419       hid=*((HostId*)(msg+ptr+4));                   /* hostId */
420       aid=*((AppId*)(msg+ptr+8));                   /* appId */
421       fprintf(ptr_out,"     HostId                  : %d.%d.%d.%d\n",
422                         *(u_int8_t*)&hid,*(((u_int8_t*)&hid)+1),*(((u_int8_t*)&hid)+2),*(((u_int8_t*)&hid)+3));
423       fprintf(ptr_out,"     AppId                   : %d.%d.%d.%d ",
424                         *(u_int8_t*)&aid,*(((u_int8_t*)&aid)+1),*(((u_int8_t*)&aid)+2),*(((u_int8_t*)&aid)+3));
425       print_app(*(((u_int8_t*)&aid)+3));
426       break;                
427     default:
428       fprintf(ptr_out,"   undefined submessage code\n");
429       break;  
430   }  
431   return 0;
432 }
433
434
435 /**********************************************************************************/
436 int main(int argc, char * argv[]) {
437   u_int8_t rtps_msg[16384],rtps_msg_c[3]={0,0,0};
438   unsigned rtps_msg_ptr=0,rtps_msg_len,rtps_submsg_cnt,submsg_len;
439   int err,c,no_lchar=1;
440   MessageInterpret mi;
441   
442   printf("-------------------------------------------------------------------------------\n");
443   printf("             RTPS messages decoder                OCERA project                \n");
444   printf("                                                                               \n");
445   printf("-------------------------------------------------------------------------------\n");
446   if (argc != 3) {
447     printf(" syntax :    decode_msg 'filename to decode' 'output file'\n\n");
448     return 0;
449   }
450   printf(" decode file    : %s\n output file    : %s\n\n",argv[1],argv[2]);
451   ptr_in = fopen(argv[1],"r");                            /* open input file */
452   if (ferror(ptr_in)) {
453     printf(" unable to open %s\n",argv[1]);
454   }
455   ptr_out = fopen(argv[2],"w");                           /* create output file */
456   if (ferror(ptr_out)) {
457     printf(" unable to create %s\n",argv[2]);
458   }
459   while ((c = fgetc(ptr_in)) !=EOF) {                     /* read one character */
460     if (((no_lchar==1) && (!isdigit(c))) || (no_lchar==0)) { /* outside RTPS line */
461       if (rtps_msg_ptr) {                                 /* proc. data read data ? */
462         rtps_msg[rtps_msg_ptr]=0;                         /* end of rtps data */
463         rtps_msg_len=rtps_msg_ptr;rtps_msg_ptr=0;
464         printf(" message length : %d\n",rtps_msg_len);
465         /* decoded message - msg stored in rtps_msg, length msg in rtps_msg_len */
466         if ((err=decode_header(rtps_msg,rtps_msg_len,&mi))==0) {
467           fprintf(ptr_out,"message length      : %d\n",rtps_msg_len);
468           fprintf(ptr_out," Header\n");
469           fprintf(ptr_out,"   protocol version : %d.%d \
470                          \n   vendorId         : %d.%d \
471                          \n   hostId           : %d.%d.%d.%d \
472                          \n   appId            : %d.%d.%d.%d ",
473                            mi.sourceVersion.major,mi.sourceVersion.minor,mi.sourceVendorId.major,
474                            mi.sourceVendorId.minor,*(u_char*)&mi.sourceHostId,*(((u_char*)&mi.sourceHostId)+1),
475                            *(((u_char*)&mi.sourceHostId)+2),*(((u_char*)&mi.sourceHostId)+3),*(((u_char*)&mi.sourceAppId)),
476                            *(((u_char*)&mi.sourceAppId)+1),*(((u_char*)&mi.sourceAppId)+2),*(((u_char*)&mi.sourceAppId)+3));
477           print_app(*(((u_char*)&mi.sourceAppId)+3));
478           rtps_msg_ptr=16;rtps_submsg_cnt=1;
479           do {
480             fprintf(ptr_out," Submessage : %d",rtps_submsg_cnt++);
481             if ((rtps_msg_ptr+3)<=rtps_msg_len) {  /* len. submessage header is OK */
482               submsg_len=rtps_msg[rtps_msg_ptr+2]+rtps_msg[rtps_msg_ptr+3]*0x100;
483               fprintf(ptr_out," len : %d\n",submsg_len+4);
484               if ((submsg_len+rtps_msg_ptr+3)<=rtps_msg_len) {
485                 /* decode submessage */
486                 decode_submessage(rtps_msg,rtps_msg_ptr,&mi);
487                 rtps_msg_ptr+=submsg_len+4;
488               } else rtps_msg_ptr=rtps_msg_len;    /* submessage is too small */        
489             } else {
490               rtps_msg_ptr=rtps_msg_len;           /* submessage is too small */
491               fprintf(ptr_out,"\n");
492             }  
493           } while (rtps_msg_ptr<rtps_msg_len);
494         } else {
495           fprintf(ptr_out,"invalid header - error code : %d\n",err);
496         }
497         rtps_msg_ptr=0;
498       }
499       no_lchar=0;
500       if (c=='\n') no_lchar=1;
501       fputc(c,ptr_out);                                   /* copy to output file */
502     }  
503     if (no_lchar>1) {                                     /* reading RTPS message*/
504       no_lchar++;
505       if (c=='\n') no_lchar=1;
506       else {
507         if ((no_lchar>5) && (no_lchar<57)) {              /* converted data from */ 
508           if ((rtps_msg_c[0]!=0) && (isxdigit(c))) {      /* position 6 to 56    */
509             rtps_msg_c[1]=(u_int8_t)c;
510             rtps_msg[rtps_msg_ptr++]=(u_int8_t)strtol(rtps_msg_c,NULL,16);
511             rtps_msg_c[0]=0;
512           } else {
513             if ((rtps_msg_c[0]==0) && (isxdigit(c))) rtps_msg_c[0]=(u_int8_t)c;
514           }
515         }
516       }
517     }
518     if ((no_lchar==1) && (isxdigit(c))) no_lchar++;        /* is begin RTPS line ? */
519   }
520   fclose(ptr_in);
521   fclose(ptr_out);
522   return 0;
523 }