chiark / gitweb /
WIP dns packet en/decoding test program
[secnet.git] / dns-bitenc-test.c
1 #define NMYLABELS 3
2 static const char *const mylabels[NMYLABELS]={"z","example","com"};
3 static const char prefix[]="PREFIX ";
4 static const char suffix[]=" SUFFIX";
5 static uint8_t packet[100];
6
7 static struct dnsbitenc enc;
8
9 int main(int argc, const char **argv) {
10     const char **argv_save=
11     memcpy(packet+sizeof(packet)-sizeof(suffix), suffix, sizeof(suffix));
12     dnsbitenc_start(&enc, packet+sizeof(prefix),
13                     sizeof(packet)-sizeof(prefix)-sizeof(suffix));
14     for (;;) {
15         const char *arg = *++argv;
16         if (!strcmp(arg,"b")) {
17             uint32_t val=strtoul(*++argv,0,0);
18             int bits=atoi(*++argv);
19             dnsbitenc_addbits(&enc,val,bits);
20         } else if (!strcmp(arg,"w")) {
21             uint32_t val=strtoul(*++argv,0,0);
22             dnsbitenc_addu32(&enc,val);
23         } else if (!strcmp(arg,"r")) {
24             const char *rest=*++argv;
25             int l=strlen(rest);
26             int nofit=dnsbitenc_restbytes(&enc,rest,l);
27             printf("FIT %.*s|%.*s\n",l-nofit,rest,nofit,rest+l-nofit);
28             break;
29         } else {
30             abort();
31         }
32     }
33     const uint8_t *encoded=dnsbitenc_getresult(&enc);
34     const uint8_t *pktbegin=encoded-sizeof(prefix);
35     memcpy(pktbegin,prefix,sizeof(prefix));
36
37     const uint8_t *pr;
38     for (pr=pktbegin; pr<packet+sizeof(packet); pr++)
39         printf("%02x",*pr);
40     printf("\n");
41
42     uint8_t domainend;
43     int r=dnsbitdec_start(&dec, pktbegin, packet+sizeof(packet),
44                           pktbegin+sizeof(prefix), NMYLABELS,mylabels,
45                           &domainend);
46     if (r) {
47         printf("DEC ERROR %d\n",r);
48         return 0;
49     }
50     argv=argv_save;
51     for (;;) {
52         const char *arg = *++argv;
53         if (!strcmp(arg,"b")) {
54             ++argv;
55             int bits=atoi(*++argv);
56             uint32_t 
57
58             if (nofit)
59                 
60             } else 
61
62         const int c0=*arg++;
63         switch (c0) {
64         case 'b':
65