chiark / gitweb /
site: transport peers: Formalise interface to transport peers
[secnet.git] / resolver.c
index f60b11282e0bbdc41ba5830414903a3ecb0a3479..15b8e765c88f44a56601152308fa1bfe6ab4297c 100644 (file)
@@ -6,6 +6,8 @@
 #error secnet requires ADNS version 1.0 or above
 #endif
 #include <adns.h>
+#include <arpa/inet.h>
+#include <string.h>
 
 
 struct adns {
@@ -28,14 +30,35 @@ static bool_t resolve_request(void *sst, cstring_t name,
     struct adns *st=sst;
     struct query *q;
     int rv;
+    const int maxlitlen=50;
+
+    ssize_t l=strlen(name);
+    if (name[0]=='[' && l<maxlitlen && l>2 && name[l-1]==']') {
+       char trimmed[maxlitlen+1];
+       memcpy(trimmed,name+1,l-2);
+       trimmed[l-2]=0;
+       struct in_addr ia;
+       if (inet_aton(trimmed,&ia))
+           cb(cst,&ia);
+       else
+           cb(cst,0);
+       return True;
+    }
 
     q=safe_malloc(sizeof *q,"resolve_request");
     q->cst=cst;
     q->answer=cb;
 
     rv=adns_submit(st->ast, name, adns_r_a, 0, q, &q->query);
+    if (rv) {
+        Message(M_WARNING,
+               "resolver: failed to submit lookup for %s: %s",name,
+               adns_strerror(rv));
+       free(q);
+       return False;
+    }
 
-    return rv==0;
+    return True;
 }
 
 static int resolver_beforepoll(void *sst, struct pollfd *fds, int *nfds_io,