djbdnscurve6 45
djbdnscurve6
Loading...
Searching...
No Matches
response.c
Go to the documentation of this file.
1#include "dns.h"
2#include "byte.h"
3#include "uint_t.h"
4#include "response.h"
5
6char response[65535];
7unsigned int response_len = 0; /* <= 65535 */
8unsigned int max_response_len;
9unsigned int do_dnssec = 0;
10static unsigned int tctarget;
11
12#define NAMES 100
13static char name[NAMES][128];
14static unsigned int name_ptr[NAMES]; /* each < 16384 */
15static unsigned int name_num;
16
17int response_addbytes(const char *buf,unsigned int len)
18{
19 if (len > 65535 - response_len) return 0;
20 byte_copy(response + response_len,len,buf);
22 return 1;
23}
24
25int response_addname(const char *d)
26{
27 unsigned int dlen;
28 unsigned int i;
29 char buf[2];
30
32
33 while (*d) {
34 for (i = 0; i < name_num; ++i)
35 if (dns_domain_equal(d,name[i])) {
36 uint16_pack_big(buf,49152 + name_ptr[i]);
37 return response_addbytes(buf,2);
38 }
39 if ((dlen <= 128) && (response_len < 16384))
40 if (name_num < NAMES) {
41 byte_copy(name[name_num],dlen,d);
42 name_ptr[name_num] = response_len;
43 ++name_num;
44 }
45 i = (unsigned char) *d;
46 ++i;
47 if (!response_addbytes(d,i)) return 0;
48 d += i;
49 dlen -= i;
50 }
51 return response_addbytes(d,1);
52}
53
54int response_query(const char *q,const char qtype[2],const char qclass[2])
55{
56 response_len = 0;
57 name_num = 0;
58 if (!response_addbytes("\0\0\201\200\0\1\0\0\0\0\0\0",12)) return 0;
59 if (!response_addname(q)) return 0;
60 if (!response_addbytes(qtype,2)) return 0;
61 if (!response_addbytes(qclass,2)) return 0;
62 tctarget = response_len;
63 return 1;
64}
65
66static unsigned int dpos;
67
68static int flaghidettl = 0;
69
71{
72 flaghidettl = 1;
73}
74
75int response_rstart(const char *d,const char type[2],uint32 ttl)
76{
77 char ttlstr[4];
78 if (!response_addname(d)) return 0;
79 if (!response_addbytes(type,2)) return 0;
80 if (!response_addbytes(DNS_C_IN,2)) return 0;
81 if (flaghidettl) ttl = 0;
82 uint32_pack_big(ttlstr,ttl);
83 if (!response_addbytes(ttlstr,4)) return 0;
84 if (!response_addbytes("\0\0",2)) return 0;
86 return 1;
87}
88
90{
91 uint16_pack_big(response + dpos - 2,response_len - dpos);
92 if (!++response[x + 1]) ++response[x];
93}
94
95int response_cname(const char *c,const char *d,uint32 ttl)
96{
97 if (!response_rstart(c,DNS_T_CNAME,ttl)) return 0;
98 if (!response_addname(d)) return 0;
100 return 1;
101}
102
104{
105 response[3] |= 3;
106 response[2] |= 4;
107}
108
110{
111 response[3] |= 2;
112}
113
114void response_id(const char id[2])
115{
116 byte_copy(response,2,id);
117}
118
119void response_tc(void)
120{
121 response[2] |= 2;
122 response_len = tctarget;
123}
uint16 len
Definition: axfrdns.c:319
char buf[MSGSIZE]
Definition: axfrdns.c:318
uint32 dpos
Definition: axfrdns.c:132
uint32 dlen
Definition: axfrdns.c:131
#define DNS_C_IN
Definition: dns.h:53
#define DNS_T_CNAME
Definition: dns.h:58
int dns_domain_equal(const char *dn1, const char *dn2)
Definition: dns_domain.c:39
unsigned int dns_domain_length(const char *dn)
Definition: dns_domain.c:6
struct line * x
char name[DNS_NAME6_DOMAIN]
Definition: dnsfilter.c:52
char type[2]
Definition: dnsq.c:56
void c(const char *home, const char *subdir, const char *file, int uid, int gid, int mode)
void d(const char *home, const char *subdir, int uid, int gid, int mode)
int response_addbytes(const char *buf, unsigned int len)
Definition: response.c:17
#define NAMES
Definition: response.c:12
void response_hidettl(void)
Definition: response.c:70
int response_addname(const char *d)
Definition: response.c:25
void response_id(const char id[2])
Definition: response.c:114
char response[65535]
Definition: response.c:6
void response_tc(void)
Definition: response.c:119
unsigned int max_response_len
Definition: response.c:8
unsigned int response_len
Definition: response.c:7
int response_cname(const char *c, const char *d, uint32 ttl)
Definition: response.c:95
void response_rfinish(int x)
Definition: response.c:89
int response_query(const char *q, const char qtype[2], const char qclass[2])
Definition: response.c:54
void response_nxdomain(void)
Definition: response.c:103
unsigned int do_dnssec
Definition: response.c:9
void response_servfail(void)
Definition: response.c:109
int response_rstart(const char *d, const char type[2], uint32 ttl)
Definition: response.c:75
#define RESPONSE_ANSWER
Definition: response.h:23