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