ucspi-ssl  0.99e
TLS encryption for IPv6 communication
dns_rcip.c
Go to the documentation of this file.
1 #include "taia.h"
2 #include "openreadclose.h"
3 #include "byte.h"
4 #include "ip4.h"
5 #include "ip6.h"
6 #include "env.h"
7 #include "dns.h"
8 
9 static stralloc data = {0};
10 
11 static int init(char ip[256])
12 {
13  int i;
14  int j;
15  int iplen = 0;
16  char *x;
17 
18  x = env_get("DNSCACHEIP");
19  if (x)
20  while (iplen <= 60) {
21  if (*x == '.')
22  ++x;
23  else {
24  i = ip6_scan(x,ip + iplen);
25  if (!i) break;
26  x += i;
27  iplen += 16;
28  }
29  }
30 
31  if (!iplen) {
32  i = openreadclose("/etc/resolv.conf",&data,64);
33  if (i == -1) return -1;
34  if (i) {
35  if (!stralloc_append(&data,"\n")) return -1;
36  i = 0;
37  for (j = 0;j < data.len;++j)
38  if (data.s[j] == '\n') {
39  if (byte_equal("nameserver ",11,data.s + i) || byte_equal("nameserver\t",11,data.s + i)) {
40  i += 10;
41  while ((data.s[i] == ' ') || (data.s[i] == '\t'))
42  ++i;
43  if (iplen <= 60)
44  if (ip6_scan(data.s + i,ip + iplen)) {
45  iplen += 16;
46  }
47  }
48  i = j + 1;
49  }
50  }
51  }
52 
53  if (!iplen) {
54  byte_copy(ip,16,"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1");
55  iplen = 16;
56  }
57  byte_zero(ip + iplen,256 - iplen);
58  return 0;
59 }
60 
61 static int ok = 0;
62 static unsigned int uses;
63 static struct taia deadline;
64 static char ip[256]; /* defined if ok */
65 
66 int dns_resolvconfip(char s[256])
67 {
68  struct taia now;
69 
70  taia_now(&now);
71  if (taia_less(&deadline,&now)) ok = 0;
72  if (!uses) ok = 0;
73 
74  if (!ok) {
75  if (init(ip) == -1) return -1;
76  taia_uint(&deadline,600);
77  taia_add(&deadline,&now,&deadline);
78  uses = 10000;
79  ok = 1;
80  }
81 
82  --uses;
83  byte_copy(s,256,ip);
84  return 0;
85 }
Definition: taia.h:8
void byte_copy(void *, unsigned int, const void *)
int openreadclose(const char *fn, stralloc *sa, unsigned int bufsize)
Definition: openreadclose.c:8
int dns_resolvconfip(char s[256])
Definition: dns_rcip.c:66
int stralloc_append(stralloc *, const char *)
int taia_now(struct taia *)
Definition: taia_now.c:8
int taia_less(const struct taia *, const struct taia *)
Definition: taia_less.c:7
unsigned int ip6_scan(const char *src, char *ip)
void taia_add(struct taia *, const struct taia *, const struct taia *)
Definition: taia_add.c:7
void byte_zero(void *, unsigned int)
void taia_uint(struct taia *, unsigned int)
Definition: taia_uint.c:7
char * env_get(const char *s)
Definition: env.c:6
#define byte_equal(s, n, t)
Definition: byte.h:13