mirror of /home/gitosis/repositories/libowfat.git
Mirror of :pserver:cvs@cvs.fefe.de:/cvs libowfat
https://www.fefe.de/libowfat/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
1.6 KiB
85 lines
1.6 KiB
#include <stdlib.h> |
|
#include "taia.h" |
|
#include "openreadclose.h" |
|
#include "byte.h" |
|
#include "ip4.h" |
|
#include "ip6.h" |
|
#include "dns.h" |
|
|
|
static stralloc data = {0}; |
|
|
|
static int init(char ip[256]) |
|
{ |
|
int i; |
|
int j; |
|
int iplen = 0; |
|
char *x; |
|
|
|
x = getenv("DNSCACHEIP"); |
|
if (x) |
|
while (iplen <= 60) { |
|
if (*x == '.') |
|
++x; |
|
else { |
|
i = scan_ip6(x,ip + iplen); |
|
if (!i) break; |
|
x += i; |
|
iplen += 16; |
|
} |
|
} |
|
|
|
if (!iplen) { |
|
i = openreadclose("/etc/resolv.conf",&data,64); |
|
if (i == -1) return -1; |
|
if (i) { |
|
if (!stralloc_append(&data,"\n")) return -1; |
|
i = 0; |
|
for (j = 0;j < data.len;++j) |
|
if (data.s[j] == '\n') { |
|
if (byte_equal("nameserver ",11,data.s + i) || byte_equal("nameserver\t",11,data.s + i)) { |
|
i += 10; |
|
while ((data.s[i] == ' ') || (data.s[i] == '\t')) |
|
++i; |
|
if (iplen <= 60) |
|
if (scan_ip6(data.s + i,ip + iplen)) { |
|
iplen += 16; |
|
} |
|
} |
|
i = j + 1; |
|
} |
|
} |
|
} |
|
|
|
if (!iplen) { |
|
byte_copy(ip,16,"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1"); |
|
iplen = 16; |
|
} |
|
byte_zero(ip + iplen,256 - iplen); |
|
return 0; |
|
} |
|
|
|
static int ok = 0; |
|
static unsigned int uses; |
|
static struct taia deadline; |
|
static char ip[256]; /* defined if ok */ |
|
|
|
int dns_resolvconfip(char s[256]) |
|
{ |
|
struct taia now; |
|
|
|
taia_now(&now); |
|
if (taia_less(&deadline,&now)) ok = 0; |
|
if (!uses) ok = 0; |
|
|
|
if (!ok) { |
|
if (init(ip) == -1) return -1; |
|
taia_uint(&deadline,600); |
|
taia_add(&deadline,&now,&deadline); |
|
uses = 10000; |
|
ok = 1; |
|
} |
|
|
|
--uses; |
|
byte_copy(s,256,ip); |
|
return 0; |
|
}
|
|
|