Преглед изворни кода

* Make dns return a bd::Array of answers instead of a char**

Bryan Drewery пре 16 година
родитељ
комит
02c2abcc6f
9 измењених фајлова са 93 додато и 114 уклоњено
  1. 44 76
      src/adns.c
  2. 4 1
      src/adns.h
  3. 14 12
      src/botnet.c
  4. 5 4
      src/cmds.c
  5. 6 4
      src/dcc.c
  6. 9 8
      src/mod/irc.mod/chan.c
  7. 1 1
      src/mod/irc.mod/irc.h
  8. 1 0
      src/mod/server.mod/server.c
  9. 9 8
      src/mod/server.mod/servmsg.c

+ 44 - 76
src/adns.c

@@ -33,16 +33,12 @@
 #include <netinet/in.h>
 #include <sys/socket.h>
 #include <arpa/inet.h>
-
-typedef struct {
-	char **list;
-	time_t ttl;
-	int len;
-} dns_answer_t;
+#include <bdlib/src/Array.h>
+#include <bdlib/src/String.h>
 
 typedef struct dns_query {
 	struct dns_query *next;
-	dns_answer_t answer;
+	bd::Array<bd::String>* answer;
 	dns_callback_t callback;
 	void *client_data;
 	time_t expiretime;
@@ -52,6 +48,7 @@ typedef struct dns_query {
 //	int timer_id;
 	int answers;
 	int remaining;
+        int lowest_ttl;
 } dns_query_t;
 
 /* RFC1035
@@ -142,7 +139,7 @@ typedef struct {
 } dns_host_t;
 
 typedef struct {
-	dns_answer_t answer;
+	bd::Array<bd::String>* answer;
 	char *query;
 	time_t expiretime;
 } dns_cache_t;
@@ -280,28 +277,8 @@ static void async_timeout(void *client_data)
 }
 */
 
-static void answer_init(dns_answer_t *answer)
-{
-	memset(answer, 0, sizeof(*answer));
-}
-
 char s1_7[3] = "",s2_3[3] = "",s2_2[3] = "";
 
-static void answer_add(dns_answer_t *answer, const char *what)
-{
-	answer->list = (char **) my_realloc(answer->list, sizeof(*answer->list) * (answer->len+2));
-	answer->list[answer->len] = strdup(what);
-	answer->len++;
-	answer->list[answer->len] = NULL;
-}
-
-static void answer_free(dns_answer_t *answer)
-{
-	int i;
-	for (i = 0; i < answer->len; i++) free(answer->list[i]);
-	if (answer->list) free(answer->list);
-}
-
 static dns_query_t *alloc_query(void *client_data, dns_callback_t callback, const char *query)
 {
 	dns_query_t *q = (dns_query_t *) my_calloc(1, sizeof(*q));
@@ -309,6 +286,8 @@ static dns_query_t *alloc_query(void *client_data, dns_callback_t callback, cons
 	q->id = randint(65534);
 	q->query = strdup(query);
 	q->answers = 0;
+        q->answer = new bd::Array<bd::String>;
+        q->lowest_ttl = 0;
 	q->callback = callback;
 	q->client_data = client_data;
 	q->expiretime = now + async_lookup_timeout;
@@ -472,35 +451,31 @@ int egg_dns_lookup(const char *host, interval_t timeout, dns_callback_t callback
 
 	if (is_dotted_ip(host)) {
 		/* If it's already an ip, we're done. */
-		dns_answer_t answer;
+                bd::Array<bd::String> answer;
 		sdprintf("egg_dns_lookup(%s, %d): Already an ip.", host, timeout);
 
-		answer_init(&answer);
-		answer_add(&answer, host);
-		callback(-1, client_data, host, answer.list);
-		answer_free(&answer);
+                answer << host;
+		callback(-1, client_data, host, answer);
 		return(-1);
 	}
 
 	/* Ok, now see if it's in our host cache. */
 	for (i = 0; i < nhosts; i++) {
 		if (!strcasecmp(host, hosts[i].host)) {
-			dns_answer_t answer;
+			bd::Array<bd::String> answer;
 
 			sdprintf("egg_dns_lookup(%s, %d): Found in hosts -> %s", host, timeout, hosts[i].ip);
-			answer_init(&answer);
-			answer_add(&answer, hosts[i].ip);
-			callback(-1, client_data, host, answer.list);
-			answer_free(&answer);
+                        answer << hosts[i].ip;
+			callback(-1, client_data, host, answer);
 			return(-1);
 		}
 	}
 
 	cache_id = cache_find(host);
 	if (cache_id >= 0) {
-		shuffleArray(cache[cache_id].answer.list, cache[cache_id].answer.len);
-		sdprintf("egg_dns_lookup(%s, %d): Found in cache -> %s", host, timeout, cache[cache_id].answer.list[0]);
-		callback(-1, client_data, host, cache[cache_id].answer.list);
+//		cache[cache_id].answer->shuffle();
+		sdprintf("egg_dns_lookup(%s, %d): Found in cache -> %s", host, timeout, cache[cache_id].answer->join(',').c_str());
+		callback(-1, client_data, host, *(cache[cache_id].answer));
 		return(-1);
 	}
 
@@ -542,22 +517,20 @@ int egg_dns_reverse(const char *ip, interval_t timeout, dns_callback_t callback,
 	/* Ok, see if we have it in our host cache. */
 	for (i = 0; i < nhosts; i++) {
 		if (!strcasecmp(hosts[i].ip, ip)) {
-			dns_answer_t answer;
+			bd::Array<bd::String> answer;
 
 			sdprintf("egg_dns_reverse(%s, %d): Found in hosts -> %s", ip, timeout, hosts[i].host);
-			answer_init(&answer);
-			answer_add(&answer, hosts[i].host);
-			callback(-1, client_data, ip, answer.list);
-			answer_free(&answer);
+			answer << hosts[i].host;
+			callback(-1, client_data, ip, answer);
 			return(-1);
 		}
 	}
 
 	cache_id = cache_find(ip);
         if (cache_id >= 0) {
-		shuffleArray(cache[cache_id].answer.list, cache[cache_id].answer.len);
-		sdprintf("egg_dns_reverse(%s, %d): Found in cache -> %s", ip, timeout, cache[cache_id].answer.list[0]);
-		callback(-1, client_data, ip, cache[cache_id].answer.list);
+//		cache[cache_id].answer->shuffle();
+		sdprintf("egg_dns_reverse(%s, %d): Found in cache -> %s", ip, timeout, cache[cache_id].answer->join(',').c_str());
+		callback(-1, client_data, ip, *(cache[cache_id].answer));
 		return(-1);
 	}
 
@@ -692,7 +665,7 @@ static int cache_expired(int id)
 
 static void cache_del(int id)
 {
-	answer_free(&cache[id].answer);
+	delete cache[id].answer;
 	free(cache[id].query);
 	cache[id].expiretime = 0;
 
@@ -704,17 +677,14 @@ static void cache_del(int id)
 	cache = (dns_cache_t *) my_realloc(cache, (ncache+1)*sizeof(*cache));
 }
 
-static void cache_add(const char *query, dns_answer_t *answer)
+static void cache_add(const char *query, bd::Array<bd::String> answer, int ttl)
 {
-	int i;
-
 	cache = (dns_cache_t *) my_realloc(cache, (ncache+1)*sizeof(*cache));
 	bzero(&cache[ncache], sizeof(cache[ncache]));
 	cache[ncache].query = strdup(query);
-	answer_init(&cache[ncache].answer);
-        for (i = 0; i < answer->len; i++)
-		answer_add(&cache[ncache].answer, answer->list[i]);
-	cache[ncache].expiretime = now + answer->ttl;
+        cache[ncache].answer = new bd::Array<bd::String>;
+        *(cache[ncache].answer) = answer;
+	cache[ncache].expiretime = now + ttl;
 	ncache++;
 }
 
@@ -860,13 +830,13 @@ int egg_dns_cancel(int id, int issue_callback)
 	else query_head = q->next;
 	sdprintf("Cancelling query: %s", q->query);
 	if (issue_callback) {
-		if (q->answer.len > 0) {
-			cache_add(q->query, &q->answer);
+		if (q->answer->size() > 0) {
+			cache_add(q->query, *(q->answer), q->lowest_ttl);
 
-			q->callback(q->id, q->client_data, q->query, q->answer.list);
-			answer_free(&q->answer);
+			q->callback(q->id, q->client_data, q->query, *(q->answer));
 		} else {
-			q->callback(q->id, q->client_data, q->query, NULL);
+			bd::Array<bd::String> empty;
+			q->callback(q->id, q->client_data, q->query, empty);
 		}
 	}
 	if (q->ip)
@@ -1032,20 +1002,20 @@ static int parse_reply(char *response, size_t nbytes, const char* server_ip)
 		reply.rdlength = ntohs(reply.rdlength);
 		reply.ttl = ntohl(reply.ttl);
 		/* Save the lowest ttl */
-		if (reply.ttl && ((!q->answer.ttl) || (q->answer.ttl > reply.ttl))) q->answer.ttl = reply.ttl;
+		if (reply.ttl && ((!q->lowest_ttl) || (q->lowest_ttl >  reply.ttl))) q->lowest_ttl = reply.ttl;
 
 //		print_reply(reply);
 
 		switch (reply.type) {
 		case DNS_A:
 			inet_ntop(AF_INET, ptr, result, 512);
-			answer_add(&q->answer, result);
+			*(q->answer) << result;
 			sdprintf("Reply(%d): %s. \t %d \t IN A \t %s", header.id, q->query, reply.ttl, result);
 			break;
 		case DNS_AAAA:
 #ifdef USE_IPV6
 			inet_ntop(AF_INET6, ptr, result, 512);
-			answer_add(&q->answer, result);
+			*(q->answer) << result;
 			sdprintf("Reply(%d): %s. \t %d \t IN AAAA \t %s", header.id, q->query, reply.ttl, result);
 #endif /* USE_IPV6 */
 			break;
@@ -1053,7 +1023,7 @@ static int parse_reply(char *response, size_t nbytes, const char* server_ip)
 			r = my_dn_expand((const unsigned char *) response, eop, ptr, result, sizeof(result));
 
 			if (r != -1 && result[0]) {
-				answer_add(&q->answer, result);
+				*(q->answer) << result;
 				sdprintf("Reply(%d): %s. \t %d \t IN PTR \t %s", header.id, q->query, reply.ttl, result);
 			}
 			break;
@@ -1078,13 +1048,13 @@ callback:
 	if (prev) prev->next = q->next;
 	else query_head = q->next;
 
-        if (q->answer.len > 0) {
-		cache_add(q->query, &q->answer);
+        if (q->answer->size() > 0) {
+		cache_add(q->query, *(q->answer), q->lowest_ttl);
 
-		q->callback(q->id, q->client_data, q->query, q->answer.list);
-		answer_free(&q->answer);
+		q->callback(q->id, q->client_data, q->query, *(q->answer));
         } else {
-		q->callback(q->id, q->client_data, q->query, NULL);
+		bd::Array<bd::String> empty;
+		q->callback(q->id, q->client_data, q->query, empty);
         }
 
 	free(q->query);
@@ -1099,21 +1069,19 @@ callback:
 void tell_dnsdebug(int idx)
 {
 	dns_query_t *q = NULL;
-	int i, n = 0;
 
 	dprintf(idx, "NS: %s\n", dns_ip);
 
-
 	for (q = query_head; q; q = q->next)
 		dprintf(idx, "DNS (%d) (%ds): %s\n", q->id, (int) (q->expiretime - now), q->query);
 
 //	for (i = 0; i < nhosts; i++)
 //           dprintf(idx, "HOST #%d: %s/%s\n", i, hosts[i].host, hosts[i].ip);
 
-	for (i = 0; i < ncache; i++) {
+	for (int i = 0; i < ncache; i++) {
 		dprintf(idx, "cache(%d) %s expires in %ds\n", i, cache[i].query, (int) (cache[i].expiretime - now));
-    		for (n = 0; n < cache[i].answer.len; n++)
-			dprintf(idx, "%d: %s\n", n, cache[i].answer.list[n]);
+		for (size_t n = 0; n < cache[i].answer->size(); n++)
+			dprintf(idx, "%d: %s\n", n, cache[i].answer->join(',').c_str());
 	}
 }
 

+ 4 - 1
src/adns.h

@@ -40,7 +40,10 @@ TXT             16 text strings
 
 #define DNS_PORT 53
 
-typedef void (*dns_callback_t)(int, void *client_data, const char *query, char **result);
+#include <bdlib/src/String.h>
+#include <bdlib/src/Array.h>
+
+typedef void (*dns_callback_t)(int, void *client_data, const char *query, bd::Array<bd::String> answers);
 
 int egg_dns_init(void);
 //int egg_dns_shutdown(void);

+ 14 - 12
src/botnet.c

@@ -47,6 +47,8 @@
 #include "botmsg.h"
 #include "tandem.h"
 #include "core_binds.h"
+#include <bdlib/src/String.h>
+#include <bdlib/src/Array.h>
 
 tand_t			*tandbot = NULL;		/* Keep track of tandem bots on the
 							   botnet */
@@ -945,7 +947,7 @@ int botunlink(int idx, const char *nick, const char *reason)
   return 0;
 }
 
-static void botlink_dns_callback(int, void *, const char *, char **);
+static void botlink_dns_callback(int, void *, const char *, bd::Array<bd::String>);
 
 /* Link to another bot
  */
@@ -1021,7 +1023,7 @@ int botlink(char *linker, int idx, char *nick)
   return 0;
 }
 
-static void botlink_dns_callback(int id, void *client_data, const char *host, char **ips)
+static void botlink_dns_callback(int id, void *client_data, const char *host, bd::Array<bd::String> ips)
 {
   long data = (long) client_data;
   int i = (int) data;
@@ -1037,12 +1039,12 @@ static void botlink_dns_callback(int id, void *client_data, const char *host, ch
     linker = strdup(dcc[i].u.dns->cptr);
   }
 
-  if (!ips) {
+  if (!ips.size()) {
     lostdcc(i);
     return;
   }
 
-  dcc[i].addr = inet_addr(ips[0]);
+  dcc[i].addr = inet_addr(bd::String(ips[0]).c_str());
 
   changeover_dcc(i, &DCC_FORK_BOT, sizeof(struct bot_info));
   dcc[i].timeval = now;
@@ -1055,7 +1057,7 @@ static void botlink_dns_callback(int id, void *client_data, const char *host, ch
 
   dcc[i].u.bot->port = dcc[i].port;             /* Remember where i started */
 #ifdef USE_IPV6
-  dcc[i].sock = getsock(SOCK_STRONGCONN, is_dotted_ip(ips[0]));
+  dcc[i].sock = getsock(SOCK_STRONGCONN, is_dotted_ip(bd::String(ips[0]).c_str()));
 #else
   dcc[i].sock = getsock(SOCK_STRONGCONN);
 #endif /* USE_IPV6 */
@@ -1063,7 +1065,7 @@ static void botlink_dns_callback(int id, void *client_data, const char *host, ch
 //  if (dcc[i].sock > 0)
 //    identd_open();                      /* will be closed when an ident is replied. */
 
-  if (dcc[i].sock < 0 || open_telnet_raw(dcc[i].sock, ips[0], dcc[i].port, 0, 1) < 0)
+  if (dcc[i].sock < 0 || open_telnet_raw(dcc[i].sock, bd::String(ips[0]).c_str(), dcc[i].port, 0, 1) < 0)
     failed_link(i);
   else { /* let's attempt to initiate SSL before ANYTHING else... */
     dcc[i].ssl = 0;
@@ -1106,7 +1108,7 @@ static void failed_tandem_relay(int idx)
   return;
 }
 
-static void tandem_relay_dns_callback(int, void *, const char *, char **);
+static void tandem_relay_dns_callback(int, void *, const char *, bd::Array<bd::String>);
 
 /* Relay to another tandembot
  */
@@ -1170,7 +1172,7 @@ void tandem_relay(int idx, char *nick, register int i)
   /* wait for async reply */
 }
 
-static void tandem_relay_dns_callback(int id, void *client_data, const char *host, char **ips)
+static void tandem_relay_dns_callback(int id, void *client_data, const char *host, bd::Array<bd::String> ips)
 {
   //64bit hacks
   long data = (long) client_data;
@@ -1188,7 +1190,7 @@ static void tandem_relay_dns_callback(int id, void *client_data, const char *hos
     return;
   }
 
-  if (!ips) {
+  if (!ips.size()) {
     struct chat_info *ci = dcc[idx].u.relay->chat;
 
     dprintf(idx, "Could not relay to %s.\n", dcc[i].nick);
@@ -1201,7 +1203,7 @@ static void tandem_relay_dns_callback(int id, void *client_data, const char *hos
   }
 
 #ifdef USE_IPV6
-  int af = is_dotted_ip(ips[0]);
+  int af = is_dotted_ip(bd::String(ips[0]).c_str());
 
   dcc[i].sock = getsock(SOCK_STRONGCONN | SOCK_VIRTUAL, af);
 #else
@@ -1217,7 +1219,7 @@ static void tandem_relay_dns_callback(int id, void *client_data, const char *hos
 
   changeover_dcc(i, &DCC_FORK_RELAY, sizeof(struct relay_info));
 
-  dcc[i].addr = inet_addr(ips[0]);
+  dcc[i].addr = inet_addr(bd::String(ips[0]).c_str());
 
   dcc[i].u.relay->chat = (struct chat_info *) my_calloc(1, sizeof(struct chat_info));
   dcc[i].u.relay->sock = dcc[idx].sock;
@@ -1234,7 +1236,7 @@ static void tandem_relay_dns_callback(int id, void *client_data, const char *hos
   dcc[i].u.relay->chat->current_lines = 0;
   dcc[i].timeval = now;
 
-  if (open_telnet_raw(dcc[i].sock, ips[0], dcc[i].port, 0) < 0) 
+  if (open_telnet_raw(dcc[i].sock, bd::String(ips[0]).c_str(), dcc[i].port, 0) < 0)
     failed_tandem_relay(i);
 }
 

+ 5 - 4
src/cmds.c

@@ -65,6 +65,7 @@
 #include "src/mod/share.mod/share.h"
 #include <bdlib/src/String.h>
 #include <bdlib/src/Stream.h>
+#include <bdlib/src/Array.h>
 
 #include <ctype.h>
 #include <stdlib.h>
@@ -4052,7 +4053,7 @@ static void cmd_crontab(int idx, char *par) {
 }
 #endif /* !CYGWIN_HACKS */
 
-static void my_dns_callback(int id, void *client_data, const char *host, char **ips)
+static void my_dns_callback(int id, void *client_data, const char *host, bd::Array<bd::String> ips)
 {
   //64bit hacks
   long data = (long) client_data;
@@ -4061,9 +4062,9 @@ static void my_dns_callback(int id, void *client_data, const char *host, char **
   if (!valid_idx(idx))
     return;
 
-  if (ips)
-    for (int i = 0; ips[i]; i++)
-      dprintf(idx, "Resolved %s using (%s) to: %s\n", host, dns_ip, ips[i]);
+  if (ips.size())
+    for (size_t i = 0; i < ips.size(); ++i)
+      dprintf(idx, "Resolved %s using (%s) to: %s\n", host, dns_ip, bd::String(ips[i]).c_str());
   else
     dprintf(idx, "Failed to lookup via (%s): %s\n", dns_ip, host);
 

+ 6 - 4
src/dcc.c

@@ -60,6 +60,8 @@
 #include "tandem.h"
 #include "core_binds.h"
 #include "src/mod/console.mod/console.h"
+#include <bdlib/src/String.h>
+#include <bdlib/src/Array.h>
 
 
 struct cmd_pass *cmdpass = NULL;
@@ -1360,7 +1362,7 @@ detect_telnet_flood(char *floodhost)
   return 0;
 }
 
-static void dcc_telnet_dns_callback(int, void *, const char *, char **);
+static void dcc_telnet_dns_callback(int, void *, const char *, bd::Array<bd::String>);
 
 static void
 dcc_telnet(int idx, char *buf, int ii)
@@ -1441,7 +1443,7 @@ dcc_telnet(int idx, char *buf, int ii)
     dcc[i].dns_id = dns_id;
 }
 
-static void dcc_telnet_dns_callback(int id, void *client_data, const char *ip, char **hosts)
+static void dcc_telnet_dns_callback(int id, void *client_data, const char *ip, bd::Array<bd::String> hosts)
 {
   // 64bit hacks
   long data = (long) client_data;
@@ -1456,7 +1458,7 @@ static void dcc_telnet_dns_callback(int id, void *client_data, const char *ip, c
   if (valid_idx(i))
     idx = dcc[i].u.dns->ibuf;
 
-  strlcpy(dcc[i].host, hosts ? hosts[0] : ip, UHOSTLEN);
+  strlcpy(dcc[i].host, hosts.size() ? bd::String(hosts[0]).c_str() : ip, UHOSTLEN);
 
   simple_snprintf(s2, sizeof(s2), "-telnet!telnet@%s", dcc[i].host);
 
@@ -1491,7 +1493,7 @@ static void dcc_telnet_dns_callback(int id, void *client_data, const char *ip, c
   if (!dcc[i].user)
     dcc[i].user = get_user_by_host(s2);		/* check for matching -telnet!telnet@host */
   
-  if (hosts)
+  if (hosts.size())
     putlog(LOG_MISC, "*", "Telnet connection: %s[%s]/%d", dcc[i].host, ip, dcc[i].port);
   else
     putlog(LOG_MISC, "*", "Telnet connection: %s/%d", dcc[i].host, dcc[i].port);

+ 9 - 8
src/mod/irc.mod/chan.c

@@ -30,6 +30,7 @@
  */
 
 #include <bdlib/src/String.h>
+#include <bdlib/src/Array.h>
 
 static time_t last_ctcp = (time_t) 0L;
 static int    count_ctcp = 0;
@@ -43,11 +44,11 @@ typedef struct resolvstruct {
   bd::String* server;
 } resolv_member;
 
-static void resolv_member_callback(int id, void *client_data, const char *host, char **ips)
+static void resolv_member_callback(int id, void *client_data, const char *host, bd::Array<bd::String> ips)
 {
   resolv_member *r = (resolv_member *) client_data;
 
-  if (!r || !r->chan || !r->host || !ips || !ips[0]) {
+  if (!r || !r->chan || !r->host || !ips.size()) {
     if (r) {
       if (r->host) free(r->host);
       free(r);
@@ -65,7 +66,7 @@ static void resolv_member_callback(int id, void *client_data, const char *host,
       pe = strchr(m->userhost, '@');
       if (pe && !strcmp(pe + 1, r->host)) {
         strlcpy(user, m->userhost, pe - m->userhost + 1);
-        simple_snprintf(m->userip, sizeof(m->userip), "%s@%s", user, ips[0]);
+        simple_snprintf(m->userip, sizeof(m->userip), "%s@%s", user, bd::String(ips[0]).c_str());
         if (!m->user) {
           simple_snprintf(s, sizeof(s), "%s!%s", m->nick, m->userip);
           m->user = get_user_by_host(s);
@@ -81,7 +82,7 @@ static void resolv_member_callback(int id, void *client_data, const char *host,
   }
 
   if (!matched_user && channel_rbl(r->chan))
-    resolve_to_rbl(r->chan, ips[0]);
+    resolve_to_rbl(r->chan, bd::String(ips[0]).c_str());
 
   free(r->host);
   free(r);
@@ -100,11 +101,11 @@ void resolve_to_member(struct chanset_t *chan, char *nick, char *host)
 }
 
 /* RBL */
-static void resolve_rbl_callback(int id, void *client_data, const char *host, char **ips)
+static void resolve_rbl_callback(int id, void *client_data, const char *host, bd::Array<bd::String> ips)
 {
   resolv_member *r = (resolv_member *) client_data;
 
-  if (!r || !r->chan || !r->host || !ips || (ips && !ips[0])) {
+  if (!r || !r->chan || !r->host || !ips.size()) {
     if (r && r->chan && r->host) {
       // Lookup from the next RBL
       resolve_to_rbl(r->chan, r->host, r);
@@ -112,7 +113,7 @@ static void resolve_rbl_callback(int id, void *client_data, const char *host, ch
     return;
   }
 
-  sdprintf("RBL match for %s:%s: %s", r->chan->dname, r->host, ips[0]);
+  sdprintf("RBL match for %s:%s: %s", r->chan->dname, r->host, bd::String(ips[0]).c_str());
 
   char s1[UHOSTLEN] = "";
   simple_snprintf(s1, sizeof(s1), "*!*@%s", r->host);
@@ -148,7 +149,7 @@ static void resolve_rbl_callback(int id, void *client_data, const char *host, ch
 }
 
 
-void resolve_to_rbl(struct chanset_t *chan, char *host, resolv_member *r)
+void resolve_to_rbl(struct chanset_t *chan, const char *host, resolv_member *r)
 {
   if (!r) {
     r = (resolv_member *) my_calloc(1, sizeof(resolv_member));

+ 1 - 1
src/mod/irc.mod/irc.h

@@ -102,7 +102,7 @@ static void send_chan_who(int queue, struct chanset_t* chan);
 void resolve_to_member(struct chanset_t *chan, char *nick, char *host);
 
 typedef struct resolvstruct resolv_member;
-void resolve_to_rbl(struct chanset_t *chan, char *host, struct resolvstruct *r = NULL);
+void resolve_to_rbl(struct chanset_t *chan, const char *host, struct resolvstruct *r = NULL);
 static void do_mask(struct chanset_t *chan, masklist *m, char *mask, char Mode);
 
 #endif /* MAKING_IRC */

+ 1 - 0
src/mod/server.mod/server.c

@@ -48,6 +48,7 @@
 #include "src/mod/irc.mod/irc.h"
 #include <bdlib/src/Stream.h>
 #include <bdlib/src/String.h>
+#include <bdlib/src/Array.h>
 #include "server.h"
 #include <stdarg.h>
 

+ 9 - 8
src/mod/server.mod/servmsg.c

@@ -1623,7 +1623,7 @@ static cmd_t my_raw_binds[] =
   {NULL,	NULL,	NULL,				NULL, 0}
 };
 
-static void server_dns_callback(int, void *, const char *, char **);
+static void server_dns_callback(int, void *, const char *, bd::Array<bd::String>);
 
 /* Hook up to a server
  */
@@ -1695,7 +1695,7 @@ static void connect_server(void)
   }
 }
 
-static void server_dns_callback(int id, void *client_data, const char *host, char **ips)
+static void server_dns_callback(int id, void *client_data, const char *host, bd::Array<bd::String> ips)
 {
   //64bit hacks
   long data = (long) client_data;
@@ -1706,7 +1706,7 @@ static void server_dns_callback(int id, void *client_data, const char *host, cha
   if (!valid_dns_id(idx, id))
     return;
 
-  if (!ips) {
+  if (!ips.size()) {
     putlog(LOG_SERV, "*", "Failed connect to %s (DNS lookup failed)", host);
     trying_server = 0;
     lostdcc(idx);
@@ -1721,10 +1721,10 @@ static void server_dns_callback(int id, void *client_data, const char *host, cha
    */
 #ifdef USE_IPV6
   if (conf.bot->net.v6) {
-    int i = 0;
-    for (i = 0; ips[i]; i++) {
-      if (is_dotted_ip(ips[i]) == AF_INET6) {
-        ip = ips[i];
+    size_t i = 0;
+    for (i = 0; i < ips.size(); ++i) {
+      if (is_dotted_ip(bd::String(ips[i]).c_str()) == AF_INET6) {
+        ip = strdup(bd::String(ips[i]).c_str());
         break;
       }
     }
@@ -1736,7 +1736,7 @@ static void server_dns_callback(int id, void *client_data, const char *host, cha
     }
   } else
 #endif /* USE_IPV6 */
-    ip = ips[0];
+    ip = strdup(bd::String(ips[0]).c_str());
 
   get_addr(ip, &addr);
  
@@ -1782,4 +1782,5 @@ static void server_dns_callback(int id, void *client_data, const char *host, cha
     dprintf(DP_MODE, "USER %s localhost %s :%s\n", botuser, dcc[idx].host, replace_vars(botrealname));
     /* Wait for async result now */
   }
+  free(ip);
 }