[IOMultiplexerV2] Added iodns_print_address: inet_ntop eqivalent function for struct...
[NextIRCd.git] / src / IOHandler / IODNSLookup.c
index 71d014daf45d10270dfa132ef46f6f9984c08402..e6201639fa84af990c2e4fa6cd3b3a5bf376837b 100644 (file)
 #include "IOLog.h"
 #include "IOSockets.h"
 
+#ifdef WIN32
+#ifdef _WIN32_WINNT
+#undef _WIN32_WINNT
+#endif
+#define _WIN32_WINNT 0x501
+#include <winsock2.h>
+#include <windows.h>
+#include <ws2tcpip.h>
+#else
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netinet/ip.h> 
+#include <arpa/inet.h>
+#include <unistd.h>
+#include <fcntl.h>
+#endif
+
 #include <string.h>
 
 struct _IODNSQuery *iodnsquery_first = NULL;
@@ -130,7 +147,7 @@ void iodns_poll() {
 
 /* 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;
        
@@ -149,6 +166,7 @@ struct IODNSQuery *iodns_getaddrinfo(char *hostname, int records, iodns_callback
        query->parent = descriptor;
        query->flags |= IODNSFLAG_PARENT_PUBLIC;
        descriptor->query = query;
+       descriptor->data = arg;
        
        query->request.host = strdup(hostname);
        query->type = (records & IODNS_FORWARD);
@@ -159,7 +177,7 @@ struct IODNSQuery *iodns_getaddrinfo(char *hostname, int records, iodns_callback
        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;
        
@@ -178,6 +196,7 @@ struct IODNSQuery *iodns_getnameinfo(const struct sockaddr *addr, size_t addrlen
        query->parent = descriptor;
        query->flags |= IODNSFLAG_PARENT_PUBLIC;
        descriptor->query = query;
+       descriptor->data = arg;
        
        query->type = IODNS_RECORD_PTR;
        query->request.addr.addresslen = addrlen;
@@ -209,6 +228,23 @@ void iodns_abort(struct IODNSQuery *descriptor) {
        _stop_dnsquery(query);
 }
 
+int iodns_print_address(struct IODNSAddress *address, int ipv6, char *buffer, int length) {
+       int af;
+       void *addr;
+       if(ipv6) {
+               af = AF_INET6;
+               addr = (void *)(&((struct sockaddr_in6 *)address->address)->sin6_addr);
+       } else {
+               af = AF_INET;
+               addr = (void *)(&((struct sockaddr_in *)address->address)->sin_addr);
+       }
+       buffer = inet_ntop(af, addr, buffer, length);
+       if(!buffer)
+               return 0;
+       else
+               return strlen(buffer);
+}
+
 void iodns_free_result(struct IODNSResult *result) {
        struct IODNSResult *next;
        for(;result;result = next) {