libc: rename getaddrinfo backend to libc, add support for getnameinfo and res_query
authorPavel Šimerda <psimerda@redhat.com>
Sun, 16 Nov 2014 15:21:07 +0000 (16:21 +0100)
committerPavel Šimerda <psimerda@redhat.com>
Sun, 16 Nov 2014 17:27:39 +0000 (18:27 +0100)
Makefile.am
backends/libc.c [moved from backends/getaddrinfo.c with 53% similarity]

index 494d1cbb2156beaa0fecc62a55feaff5dd133267..4223162b82e539c1d9c623776962ac0654301c18 100644 (file)
@@ -84,7 +84,7 @@ lib_LTLIBRARIES += \
        libnetresolve-backend-hostname.la \
        libnetresolve-backend-aresdns.la \
        libnetresolve-backend-ubdns.la \
-       libnetresolve-backend-getaddrinfo.la \
+       libnetresolve-backend-libc.la \
        libnetresolve-backend-asyncns.la \
        libnetresolve-backend-nss.la \
        libnetresolve-backend-exec.la
@@ -100,7 +100,8 @@ libnetresolve_backend_aresdns_la_LDFLAGS = $(AM_LDFLAGS) $(ARES_LIBS)
 libnetresolve_backend_ubdns_la_SOURCES = backends/dns.c
 libnetresolve_backend_ubdns_la_LDFLAGS = $(AM_LDFLAGS) $(UNBOUND_LIBS) -lldns
 libnetresolve_backend_ubdns_la_CPPFLAGS = $(AM_CPPFLAGS) -DUSE_UNBOUND=1
-libnetresolve_backend_getaddrinfo_la_SOURCES = backends/getaddrinfo.c
+libnetresolve_backend_libc_la_SOURCES = backends/libc.c
+libnetresolve_backend_libc_la_LDFLAGS = $(AM_LDFLAGS) -lresolv
 libnetresolve_backend_asyncns_la_SOURCES = backends/asyncns.c
 libnetresolve_backend_asyncns_la_LDFLAGS = -lasyncns
 libnetresolve_backend_nss_la_SOURCES = backends/nss.c
similarity index 53%
rename from backends/getaddrinfo.c
rename to backends/libc.c
index f69e5be0394b231da05695256cb91d303b2756bc..ef9455930d4d25b292a75560a82c2faeab8a4505 100644 (file)
@@ -22,6 +22,9 @@
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 #include <netresolve-backend.h>
+#include <resolv.h>
+
+#define SIZE 16 * 1024
 
 void
 setup_forward(netresolve_query_t query, char **settings)
@@ -39,3 +42,65 @@ setup_forward(netresolve_query_t query, char **settings)
 
        netresolve_backend_apply_addrinfo(query, status, result, 0);
 }
+
+void
+setup_reverse(netresolve_query_t query, char **settings)
+{
+       int flags = 0;
+       union {
+               struct sockaddr sa;
+               struct sockaddr_in sa4;
+               struct sockaddr_in6 sa6;
+       } sa = { { 0 } };
+       int status;
+       char nodename[SIZE], servname[SIZE];
+
+       sa.sa.sa_family = netresolve_backend_get_family(query);
+
+       switch (sa.sa.sa_family) {
+       case AF_INET:
+               memcpy(&sa.sa4.sin_addr, netresolve_backend_get_address(query), sizeof sa.sa4.sin_addr);
+               sa.sa4.sin_port = netresolve_backend_get_port(query);
+               status = getnameinfo(&sa.sa, sizeof sa.sa4, nodename, sizeof nodename, servname, sizeof servname, flags);
+               break;
+       case AF_INET6:
+               memcpy(&sa.sa6.sin6_addr, netresolve_backend_get_address(query), sizeof sa.sa6.sin6_addr);
+               sa.sa6.sin6_port = netresolve_backend_get_port(query);
+               status = getnameinfo(&sa.sa, sizeof sa.sa4, nodename, sizeof nodename, servname, sizeof servname, flags);
+               break;
+       default:
+               status = EAI_FAMILY;
+               break;
+       }
+
+       if (status) {
+               netresolve_backend_failed(query);
+               return;
+       }
+
+       netresolve_backend_add_name_info(query, nodename, servname);
+       netresolve_backend_finished(query);
+}
+
+void
+setup_dns(netresolve_query_t query, char **settings)
+{
+       const char *dname = netresolve_backend_get_nodename(query);
+       bool search = netresolve_backend_get_dns_search(query);
+       int cls;
+       int type;
+       uint8_t answer[SIZE];
+       size_t length;
+
+       netresolve_backend_get_dns_query(query, &cls, &type);
+
+       length = (search ? res_search : res_query)(dname, cls, type, answer, sizeof answer);
+
+       if (length == -1) {
+               netresolve_backend_failed(query);
+               return;
+       }
+
+       netresolve_backend_set_dns_answer(query, answer, length);
+       netresolve_backend_finished(query);
+}
This page took 0.060721 seconds and 5 git commands to generate.