From c44d8b51ffb5a413f8bbdbd9991bbc573853e397 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henryk=20Pl=C3=B6tz?= Date: Fri, 3 Oct 2014 20:04:14 +0200 Subject: Apply patch djbdns-1.05-test27.diff.bz2 Source was http://www.fefe.de/dns/djbdns-1.05-test27.diff.bz2, SHA1 f0380ec1866f49c0bcf6369a923ac0a4a5095da8 --- clientloc.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 clientloc.c (limited to 'clientloc.c') diff --git a/clientloc.c b/clientloc.c new file mode 100644 index 0000000..99fc04d --- /dev/null +++ b/clientloc.c @@ -0,0 +1,46 @@ +#include "open.h" +#include "byte.h" +#include "cdb.h" +#include "ip6.h" + +int find_client_loc(char loc[2],const char ip[16]) +{ + int r, fd; + char key[32+3]; + static struct cdb c; + + fd = open_read("data.cdb"); + if (fd == -1) return 0; + cdb_init(&c,fd); + + byte_zero(loc,2); + key[0] = 0; + key[1] = '%'; + if (byte_equal(ip,12,V4mappedprefix)) { + key[2] = 'f'; + byte_copy(key + 3,4,ip+12); + r = cdb_find(&c,key,7); + if (!r) r = cdb_find(&c,key,6); + if (!r) r = cdb_find(&c,key,5); + if (!r) r = cdb_find(&c,key,4); + if (!r) r = cdb_find(&c,key,3); + if (r == -1) return 0; + if (r && (cdb_datalen(&c) == 2)) + if (cdb_read(&c,loc,2,cdb_datapos(&c)) == -1) return 0; + } else { + unsigned int n; + key[2] = 's'; + ip6_fmt_flat(key+3,ip); + for (n=19; n>3; --n) { + r = cdb_find(&c,key,n); + if (r) break; + } + if (r == -1) return 0; + if (r && (cdb_datalen(&c) == 2)) + if (cdb_read(&c,loc,2,cdb_datapos(&c)) == -1) return 0; + } + + cdb_free(&c); + close(fd); + return r; +} -- cgit v1.2.3