chiark / gitweb /
WIP DNS bitenc test compiles
[secnet.git] / dns-bitenc-test.c
1 /*
2  * Simple test program
3  */
4
5 #include "dns-transp-common.h"
6
7 #include <stdio.h>
8 #include <inttypes.h>
9
10 #define NMYLABELS 3
11 static const char *const mylabels[NMYLABELS]={"z","example","com"};
12 static const char prefix[]="PREFIX ";
13 static const char suffix[]=" SUFFIX";
14 static uint8_t packet[100];
15
16 static struct dnsdomainenc enc;
17 static struct dnsdomaindec dec;
18
19 int main(int argc, const char **argv) {
20     dnsdomaindec_globalinit();
21
22     const char **argv_save=argv;
23     memcpy(packet+sizeof(packet)-sizeof(suffix), suffix, sizeof(suffix));
24     dnsdomainenc_start(&enc, packet+sizeof(prefix),
25                        sizeof(packet)-sizeof(prefix)-sizeof(suffix),
26                        NMYLABELS,mylabels);
27     for (;;) {
28         const char *arg = *++argv;
29         if (!strcmp(arg,"b")) {
30             int bits=atoi(*++argv);
31             uint32_t val=strtoul(*++argv,0,0);
32             dnsdomainenc_addbits(&enc,val,bits);
33         } else if (!strcmp(arg,"w")) {
34             uint32_t val=strtoul(*++argv,0,0);
35             dnsdomainenc_addu32(&enc,val);
36         } else if (!strcmp(arg,"r")) {
37             const char *rest=*++argv;
38             int l=strlen(rest);
39             int nofit=dnsdomainenc_restbytes(&enc,(const uint8_t*)rest,l);
40             printf("FIT %.*s|%.*s\n",l-nofit,rest,nofit,rest+l-nofit);
41             break;
42         } else {
43             abort();
44         }
45     }
46     uint8_t *encoded=dnsdomainenc_getresult(&enc);
47     uint8_t *pktbegin=encoded-sizeof(prefix);
48     memcpy(pktbegin,prefix,sizeof(prefix));
49
50     const uint8_t *pr;
51     for (pr=pktbegin; pr<packet+sizeof(packet); pr++)
52         printf("%02x",*pr);
53     printf("\n");
54
55     const uint8_t *domainend;
56     int r=dnsdomaindec_start(&dec, pktbegin, packet+sizeof(packet),
57                              pktbegin+sizeof(prefix), NMYLABELS,mylabels,
58                              &domainend);
59     if (r) {
60         printf("DEC ERROR %d\n",r);
61         return 0;
62     }
63     argv=argv_save;
64     for (;;) {
65         const char *arg = *++argv;
66         if (!strcmp(arg,"b")) {
67             int bits=atoi(*++argv);
68             ++argv;
69             uint32_t val=dnsdomaindec_getbits(&dec,bits);
70             printf("b %d 0x%"PRIx32, bits, val);
71         } else if (!strcmp(arg,"w")) {
72             uint32_t val=dnsdomaindec_getu32(&dec);
73             printf("w 0x%"PRIx32, val);
74         } else if (!strcmp(arg,"r")) {
75             uint8_t rbuf[MAX_DOMAIN_BYTES];
76             int l=dnsdomaindec_restbytes(&dec,rbuf);
77             printf("r %.*s",l,rbuf);
78         } else {
79             abort();
80         }
81     }
82 }