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