aboutsummaryrefslogtreecommitdiff
path: root/walldns.c
blob: 3cdaa7258d3d129d2b3347cbee245308e0b1c059 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include "byte.h"
#include "dns.h"
#include "dd.h"
#include "response.h"

const char *fatal = "walldns: fatal: ";
const char *starting = "starting walldns\n";

void initialize(void)
{
  ;
}

int respond(char *q,char qtype[2])
{
  int flaga;
  int flagptr;
  char ip[4];
  int j;

  flaga = byte_equal(qtype,2,DNS_T_A);
  flagptr = byte_equal(qtype,2,DNS_T_PTR);
  if (byte_equal(qtype,2,DNS_T_ANY)) flaga = flagptr = 1;

  if (flaga || flagptr) {
    if (dd(q,"",ip) == 4) {
      if (flaga) {
        if (!response_rstart(q,DNS_T_A,655360)) return 0;
        if (!response_addbytes(ip,4)) return 0;
        response_rfinish(RESPONSE_ANSWER);
      }
      return 1;
    }
    j = dd(q,"\7in-addr\4arpa",ip);
    if (j >= 0) {
      if (flaga && (j == 4)) {
        if (!response_rstart(q,DNS_T_A,655360)) return 0;
        if (!response_addbytes(ip + 3,1)) return 0;
        if (!response_addbytes(ip + 2,1)) return 0;
        if (!response_addbytes(ip + 1,1)) return 0;
        if (!response_addbytes(ip + 0,1)) return 0;
        response_rfinish(RESPONSE_ANSWER);
      }
      if (flagptr) {
        if (!response_rstart(q,DNS_T_PTR,655360)) return 0;
        if (!response_addname(q)) return 0;
        response_rfinish(RESPONSE_ANSWER);
      }
      return 1;
    }
  }

  response[2] &= ~4;
  response[3] &= ~15;
  response[3] |= 5;
  return 1;
}