http://gimel.esc.cam.ac.uk/james/rpld/src/rpld-1.3.tar.gz
[rpld.git] / ana.c
1 #include <stdio.h>
2 #include <strings.h>
3
4 static char *rcsid = "$Id: ana.c,v 1.2 1999/09/13 12:37:06 root Exp $";
5
6 /* 
7  * $Log: ana.c,v $
8  * Revision 1.2  1999/09/13 12:37:06  root
9  * #
10  *
11  * Revision 1.1  1999/09/13 12:36:18  root
12  * #
13  *
14  * Revision 1.4  1999/09/02 09:59:02  root
15  * #
16  *
17  * Revision 1.3  1999/09/02 09:58:02  root
18  * #
19  *
20  */
21
22
23 unsigned char pbuf[4096];
24 int plen;
25 char buf[1024];
26
27 get_packet ()
28 {
29   char *ptr, *pptr;
30
31   plen = 0;
32
33   while (!feof (stdin) && *buf == '\t')
34     {
35       fgets (buf, sizeof (buf) - 1, stdin);
36     }
37   while (!feof (stdin) && *buf != '\t')
38     {
39       buf[strlen (buf) - 1] = 0;
40       puts (buf);
41       fgets (buf, sizeof (buf) - 1, stdin);
42     }
43   if (feof (stdin))
44     return;
45
46   sscanf (buf, "%x", &plen);
47
48   pptr = pbuf;
49
50
51   while (!feof (stdin) && *buf == '\t')
52     {
53       ptr = buf;
54
55       while (!isxdigit (*ptr))
56         ptr++;
57       while (*ptr)
58         {
59           char hex[3];
60
61           bcopy (ptr, hex, 3);
62           hex[2] = 0;
63           ptr++;
64           ptr++;
65
66           sscanf (hex, "%x", pptr);
67           pptr++;
68
69           while (*ptr && !isxdigit (*ptr))
70             ptr++;
71         }
72
73
74       fgets (buf, sizeof (buf) - 1, stdin);
75     }
76
77 }
78
79 int
80 pull_short (unsigned char *c)
81 {
82   int ret;
83   ret = *c;
84   c++;
85   ret <<= 8;
86   ret += *c;
87   return (ret);
88 }
89 unsigned int
90 pull_long (unsigned char *c)
91 {
92   unsigned int ret;
93
94   ret = *c;
95   c++;
96   ret <<= 8;
97   ret += *c;
98   c++;
99   ret <<= 8;
100   ret += *c;
101   c++;
102   ret <<= 8;
103   ret += *c;
104
105   return (ret);
106 }
107
108 dump_hex (unsigned char *pp, int pl)
109 {
110   while (pl--)
111     {
112       printf (" %02x", *(pp++));
113     }
114 }
115
116 dump_hexa (unsigned char *pp, int pl)
117 {
118   while (pl--)
119     {
120       int j = *pp;
121       if ((j < ' ') || (j > 126))
122         j = '.';
123       printf (" %02x%c", *pp, j);
124       pp++;
125     }
126 }
127
128 ana_token (int s, unsigned char *pp, int pl)
129 {
130   int i;
131   printf ("    Token 0x%04x:", s);
132   switch (s)
133     {
134     case 0x4003:
135       printf (" The mighty zero: %d\n", pull_long (pp));
136       return;
137     case 0x4006:
138       printf (" My MAC addr: %02x:%02x:%02x:%02x:%02x:%02x\n",
139               pp[0], pp[1], pp[2], pp[3], pp[4], pp[5]);
140       return;
141     case 0x4007:
142       printf (" My SAP addr: %02x\n", pp[0]);
143       return;
144     case 0x4009:
145       printf (" Frame len: %d\n", pull_short (pp));
146       return;
147     case 0x400b:
148       printf (" The small zero: %d\n", *pp);
149       return;
150     case 0x400c:
151       printf (" Your MAC addr: %02x:%02x:%02x:%02x:%02x:%02x\n",
152               pp[0], pp[1], pp[2], pp[3], pp[4], pp[5]);
153       return;
154     case 0x4011:
155       printf (" Block number: %d\n", pull_long (pp));
156       return;
157     case 0x4018:
158       printf (" data block: (ommitted %d bytes of guff)\n", pl);
159       return;
160     case 0xc005:
161       printf (" IDENT: ");
162       dump_hexa (pp, pl);
163       printf ("\n");
164       return;
165     case 0xc014:
166       printf (" addr block: Load @ 0x%08x, Run @ 0x%08x, Flags: 0x%02x",
167               pull_long (pp), pull_long (pp + 4), pp[8]);
168       switch (pp[8])
169         {
170         case 0x20:
171           printf (" (More to come)");
172           break;
173         case 0xc0:
174           printf (" (All done, execute)");
175           break;
176         default:
177           printf (" ?");
178         }
179
180       printf ("\n");
181       return;
182     default:
183       printf (" ?: ");
184       dump_hex (pp, pl);
185       printf ("\n");
186
187     }
188
189 }
190
191 int
192 ana_frag (unsigned char *pp, int pl)
193 {
194   int s;
195
196   while (pl > 0)
197     {
198
199       s = pull_short (pp);
200
201       if (s & 0xc000)
202         {
203           ana_token (s, pp + 2, pl - 2);
204           return;
205         }
206       else
207         {
208           ana_frag (pp + 2, s - 2);
209           pp += s;
210           pl -= s;
211         }
212
213     }
214
215 }
216
217
218
219
220 main ()
221 {
222   int i, s;
223   char *pptr;
224   *buf = '\t';
225
226   while (!feof (stdin))
227     {
228       get_packet ();
229
230       pptr = pbuf;
231       pptr += 2;                /*Length */
232       plen -= 2;
233
234       printf ("  Pack Type:");
235       switch (pull_short (pptr))
236         {
237         case 0x1:
238           printf (" FIND:");
239           break;
240         case 0x2:
241           printf (" FOUND:");
242           break;
243         case 0x10:
244           printf (" SEND.FILE.REQUEST:");
245           break;
246         case 0x20:
247           printf (" FILE.DATA.RESPONSE:");
248           break;
249         default:
250           printf (" 0x%04x ?:", pull_short (pptr));
251         }
252       printf (" Length=%d\n", plen);
253       pptr += 2;
254       plen -= 2;
255
256       s = ana_frag (pptr, plen);
257
258
259       printf ("\n\n");
260     }
261
262   exit (0);
263
264 }