djbdnscurve6 45
djbdnscurve6
Loading...
Searching...
No Matches
clientloc.c
Go to the documentation of this file.
1#include <sys/types.h>
2#include <unistd.h>
3#include "open.h"
4#include "byte.h"
5#include "cdbread.h"
6#include "ip.h"
7
8int find_clientloc(char clientloc[2],const char ip[16])
9{
10 int i, r, fd;
11 char key[64 + 3];
12 static struct cdb c;
13 static stralloc ipstring = {0};
14
15 fd = open_read("data.cdb");
16 if (fd == -1) return 0;
17 cdb_init(&c,fd);
18
19 byte_zero(clientloc,2);
20 key[0] = 0;
21 key[1] = '%';
22 if (byte_equal(ip,12,V4mappedprefix)) {
23 ip4_bytestring(&ipstring,ip + 12,32);
24 byte_copy(key + 2,32,ipstring.s);
25 for (i = 0; i < 32; i++) {
26 r = cdb_find(&c,key,34 - i);
27 if (r == -1) return 0;
28 if (r > 0) break;
29 }
30 if (!r) r = cdb_find(&c,key,2);
31 if (r && (cdb_datalen(&c) == 2))
32 if (cdb_read(&c,clientloc,2,cdb_datapos(&c)) == -1) return 0;
33 } else {
34 ip6_bytestring(&ipstring,ip,64);
35 byte_copy(key + 2,64,ipstring.s);
36 for (i = 0; i < 64; i++) {
37 r = cdb_find(&c,key,66 - i);
38 if (r == -1) return 0;
39 if (r > 0) break;
40 }
41 if (!r) r = cdb_find(&c,key,2);
42 if (r && (cdb_datalen(&c) == 2))
43 if (cdb_read(&c,clientloc,2,cdb_datapos(&c)) == -1) return 0;
44 }
45
46 cdb_free(&c);
47 close(fd);
48 return r;
49}
int fd
Definition: axfr-get.c:103
char clientloc[2]
Definition: axfrdns.c:127
char ip[16]
Definition: axfrdns.c:125
int find_clientloc(char clientloc[2], const char ip[16])
Definition: clientloc.c:8
void c(const char *home, const char *subdir, const char *file, int uid, int gid, int mode)
struct cdb_make cdb
Definition: rbldns-data.c:36