])
])
-AC_CONFIG_FILES([Makefile src/Makefile src/IOHandler/Makefile src/IOHandler++/Makefile src/IOHandler_test/Makefile src/IOHandler_test/socket/Makefile src/IOHandler_test/socket++/Makefile src/IOHandler_test/timer/Makefile])
+AC_CONFIG_FILES([Makefile src/Makefile src/IOHandler/Makefile src/IOHandler++/Makefile src/IOHandler_test/Makefile src/IOHandler_test/socket/Makefile src/IOHandler_test/socket++/Makefile src/IOHandler_test/timer/Makefile src/IOHandler_test/resolv/Makefile])
AC_OUTPUT
void *target = (host->h_addrtype == AF_INET ? ((void *) &((struct sockaddr_in *)dnsresult->result.addr.address)->sin_addr) : ((void *) &((struct sockaddr_in6 *)dnsresult->result.addr.address)->sin6_addr));
memcpy(target, *h_addr, host->h_length);
+ dnsresult->result.addr.address->sa_family = host->h_addrtype;
if(host->h_addrtype == AF_INET) {
char str[INET_ADDRSTRLEN];
inet_ntop( AF_INET, &((struct sockaddr_in *)dnsresult->result.addr.address)->sin_addr, str, INET_ADDRSTRLEN );
struct addrinfo hints, *res, *allres;
struct _IODNSQuery *iodns, *next_iodns;
struct IODNSResult *dnsresult;
+ int ret;
iodns_process_queries_start:
IOSYNCHRONIZE(iodns_sync);
for(iodns = iodnsquery_first; iodns; iodns = next_iodns) {
hints.ai_family = PF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags |= AI_CANONNAME;
- int ret;
if (!(ret = getaddrinfo(iodns->request.host, NULL, &hints, &allres))) {
res = allres;
while (res) {
dnsresult = malloc(sizeof(*dnsresult));
dnsresult->type = IODNS_RECORD_A;
dnsresult->result.addr.addresslen = res->ai_addrlen;
- dnsresult->result.addr.address = malloc(dnsresult->result.addr.addresslen);
+ dnsresult->result.addr.address = calloc(dnsresult->result.addr.addresslen, 1);
+ dnsresult->result.addr.address->sa_family = AF_INET;
memcpy(dnsresult->result.addr.address, res->ai_addr, dnsresult->result.addr.addresslen);
dnsresult->next = iodns->result;
iodns->result = dnsresult;
dnsresult->type = IODNS_RECORD_AAAA;
dnsresult->result.addr.addresslen = res->ai_addrlen;
dnsresult->result.addr.address = calloc(dnsresult->result.addr.addresslen, 1);
+ dnsresult->result.addr.address->sa_family = AF_INET6;
memcpy(dnsresult->result.addr.address, res->ai_addr, dnsresult->result.addr.addresslen);
dnsresult->next = iodns->result;
iodns->result = dnsresult;
} else {
iolog_trigger(IOLOG_WARNING, "getaddrinfo returned error code: %d", ret);
}
- }
+ } else if((iodns->type & IODNS_REVERSE)) {
+ char hostname[NI_MAXHOST];
+ if(!(ret = getnameinfo(iodns->request.addr.address, iodns->request.addr.addresslen, hostname, sizeof(hostname), NULL, 0, 0))) {
+ dnsresult = malloc(sizeof(*dnsresult));
+ dnsresult->type = IODNS_RECORD_PTR;
+ dnsresult->result.host = strdup(hostname);
+ dnsresult->next = iodns->result;
+ iodns->result = dnsresult;
+
+ if(iodns->request.addr.address->sa_family == AF_INET) {
+ char str[INET_ADDRSTRLEN];
+ inet_ntop(AF_INET, &((struct sockaddr_in *)iodns->request.addr.address)->sin_addr, str, INET_ADDRSTRLEN);
+ iolog_trigger(IOLOG_DEBUG, "Resolved %s to (PTR): %s", str, hostname);
+ } else {
+ char str[INET6_ADDRSTRLEN];
+ inet_ntop(AF_INET6, &((struct sockaddr_in6 *)iodns->request.addr.address)->sin6_addr, str, INET6_ADDRSTRLEN);
+ iolog_trigger(IOLOG_DEBUG, "Resolved %s to (PTR): %s", str, hostname);
+ }
+
+ querystate = IODNSEVENT_SUCCESS;
+ } else {
+ iolog_trigger(IOLOG_WARNING, "getnameinfo returned error code: %d", ret);
+ }
+
+ }
IOSYNCHRONIZE(iodns_sync);
if(!(iodns->flags & IODNSFLAG_RUNNING)) {
iodns_free_result(iodns->result);
/* public functions */
-struct IODNSQuery *iodns_getaddrinfo(char *hostname, int records, iodns_callback *callback) {
+struct IODNSQuery *iodns_getaddrinfo(char *hostname, int records, iodns_callback *callback, void *arg) {
if(!(records & IODNS_FORWARD) || !hostname || !callback)
return NULL;
query->parent = descriptor;
query->flags |= IODNSFLAG_PARENT_PUBLIC;
descriptor->query = query;
+ descriptor->data = arg;
query->request.host = strdup(hostname);
query->type = (records & IODNS_FORWARD);
return descriptor;
}
-struct IODNSQuery *iodns_getnameinfo(const struct sockaddr *addr, size_t addrlen, iodns_callback *callback) {
+struct IODNSQuery *iodns_getnameinfo(const struct sockaddr *addr, size_t addrlen, iodns_callback *callback, void *arg) {
if(!addr || !callback)
return NULL;
query->parent = descriptor;
query->flags |= IODNSFLAG_PARENT_PUBLIC;
descriptor->query = query;
+ descriptor->data = arg;
query->type = IODNS_RECORD_PTR;
query->request.addr.addresslen = addrlen;
struct IODNSResult *result;
};
-struct IODNSQuery *iodns_getaddrinfo(char *hostname, int records, iodns_callback *callback);
-struct IODNSQuery *iodns_getnameinfo(const struct sockaddr *addr, size_t addrlen, iodns_callback *callback);
+struct IODNSQuery *iodns_getaddrinfo(char *hostname, int records, iodns_callback *callback, void *arg);
+struct IODNSQuery *iodns_getnameinfo(const struct sockaddr *addr, size_t addrlen, iodns_callback *callback, void *arg);
void iodns_abort(struct IODNSQuery *query);
void iodns_free_result(struct IODNSResult *result);
##Process this file with automake to create Makefile.in
ACLOCAL_AMFLAGS = -I m4
-SUBDIRS = socket socket++ timer
+SUBDIRS = socket socket++ timer resolv
--- /dev/null
+.deps
+.libs
+*.o
+*.exe
+iotest
+Makefile
+Makefile.in
--- /dev/null
+##Process this file with automake to create Makefile.in
+ACLOCAL_AMFLAGS = -I m4
+
+noinst_PROGRAMS = iotest
+iotest_LDADD = ../../IOHandler/libiohandler.a
+
+iotest_SOURCES = iotest.c
+
--- /dev/null
+/* main.c - IOMultiplexer
+ * Copyright (C) 2012 Philipp Kreil (pk910)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include "../../IOHandler/IOHandler.h"
+#include "../../IOHandler/IODNSLookup.h"
+#include "../../IOHandler/IOLog.h"
+
+#ifndef WIN32
+#include "arpa/inet.h"
+#endif
+#include "../../IOHandler/compat/inet.h"
+
+#define TEST_DURATION 100
+
+static IODNS_CALLBACK(io_callback);
+static IOLOG_CALLBACK(io_log);
+
+int main(int argc, char *argv[]) {
+ iohandler_init();
+ iolog_register_callback(io_log);
+
+ iodns_getaddrinfo("google.de", (IODNS_RECORD_A | IODNS_RECORD_AAAA), io_callback, "01");
+ iodns_getaddrinfo("pk910.de", IODNS_RECORD_AAAA, io_callback, "02");
+ iodns_getaddrinfo("nonexisting.no-tld", (IODNS_RECORD_A | IODNS_RECORD_AAAA), io_callback, "03");
+ iodns_getaddrinfo("google.com", (IODNS_RECORD_A | IODNS_RECORD_AAAA), io_callback, "04");
+ iodns_getaddrinfo("test.pk910.de", IODNS_RECORD_A, io_callback, "05");
+
+ struct sockaddr_in addr;
+ addr.sin_family = AF_INET;
+ inet_pton(AF_INET, "8.8.8.8", &addr.sin_addr);
+ iodns_getnameinfo((struct sockaddr *)&addr, sizeof(addr), io_callback, "06");
+
+ iohandler_run();
+ return 1;
+}
+
+static IODNS_CALLBACK(io_callback) {
+ struct IODNSQuery *iodns = event->query;
+ char *id = iodns->data;
+ if(event->type == IODNSEVENT_SUCCESS) {
+ printf("Query %s succeeded:\n", id);
+ struct IODNSResult *result;
+ char str[1024];
+ for(result = event->result; result; result = result->next) {
+ switch(result->type) {
+ case IODNS_RECORD_A:
+ inet_ntop(AF_INET, &((struct sockaddr_in *)result->result.addr.address)->sin_addr, str, INET_ADDRSTRLEN);
+ printf(" A: %s\n", str);
+
+ if(!strcmp(id, "05"))
+ iodns_getnameinfo(result->result.addr.address, result->result.addr.addresslen, io_callback, "07");
+ break;
+ case IODNS_RECORD_AAAA:
+ inet_ntop(AF_INET6, &((struct sockaddr_in6 *)result->result.addr.address)->sin6_addr, str, INET6_ADDRSTRLEN);
+ printf(" AAAA: %s\n", str);
+
+ if(!strcmp(id, "05"))
+ iodns_getnameinfo(result->result.addr.address, result->result.addr.addresslen, io_callback, "07");
+ break;
+ case IODNS_RECORD_PTR:
+ printf(" PTR: %s\n", result->result.host);
+ break;
+ }
+ }
+ iodns_free_result(event->result);
+ } else
+ printf("Query %s failed.\n", id);
+}
+
+static IOLOG_CALLBACK(io_log) {
+ //printf("%s", line);
+}