|
|
301a214 |
commit a6f07ba49319bbb62772a99cc3267fe8409a39d4
|
|
|
301a214 |
Author: wouter <wouter@be551aaa-1e26-0410-a405-d3ace91eadb9>
|
|
|
301a214 |
Date: Fri Apr 23 06:48:49 2010 +0000
|
|
|
301a214 |
|
|
|
301a214 |
- Squelch log message: sendto failed permission denied for
|
|
|
301a214 |
255.255.255.255, it is visible in VERB_DETAIL (verbosity 2).
|
|
|
301a214 |
|
|
|
301a214 |
diff --git a/util/net_help.c b/util/net_help.c
|
|
|
301a214 |
index 182f39d..7b2a3f4 100644
|
|
|
301a214 |
--- a/util/net_help.c
|
|
|
301a214 |
+++ b/util/net_help.c
|
|
|
301a214 |
@@ -494,6 +494,14 @@ addr_is_ip4mapped(struct sockaddr_storage* addr, socklen_t addrlen)
|
|
|
301a214 |
return (memcmp(s, map_prefix, 12) == 0);
|
|
|
301a214 |
}
|
|
|
301a214 |
|
|
|
301a214 |
+int addr_is_broadcast(struct sockaddr_storage* addr, socklen_t addrlen)
|
|
|
301a214 |
+{
|
|
|
301a214 |
+ int af = (int)((struct sockaddr_in*)addr)->sin_family;
|
|
|
301a214 |
+ void* sinaddr = &((struct sockaddr_in*)addr)->sin_addr;
|
|
|
301a214 |
+ return af == AF_INET && addrlen>=(socklen_t)sizeof(struct sockaddr_in)
|
|
|
301a214 |
+ && memcmp(sinaddr, "\377\377\377\377", 4) == 0;
|
|
|
301a214 |
+}
|
|
|
301a214 |
+
|
|
|
301a214 |
void sock_list_insert(struct sock_list** list, struct sockaddr_storage* addr,
|
|
|
301a214 |
socklen_t len, struct regional* region)
|
|
|
301a214 |
{
|
|
|
301a214 |
diff --git a/util/net_help.h b/util/net_help.h
|
|
|
301a214 |
index 9ac96eb..8afa84b 100644
|
|
|
301a214 |
--- a/util/net_help.h
|
|
|
301a214 |
+++ b/util/net_help.h
|
|
|
301a214 |
@@ -280,6 +280,14 @@ void addr_to_str(struct sockaddr_storage* addr, socklen_t addrlen,
|
|
|
301a214 |
int addr_is_ip4mapped(struct sockaddr_storage* addr, socklen_t addrlen);
|
|
|
301a214 |
|
|
|
301a214 |
/**
|
|
|
301a214 |
+ * See if sockaddr is 255.255.255.255.
|
|
|
301a214 |
+ * @param addr: address
|
|
|
301a214 |
+ * @param addrlen: length of address
|
|
|
301a214 |
+ * @return true if so
|
|
|
301a214 |
+ */
|
|
|
301a214 |
+int addr_is_broadcast(struct sockaddr_storage* addr, socklen_t addrlen);
|
|
|
301a214 |
+
|
|
|
301a214 |
+/**
|
|
|
301a214 |
* Insert new socket list item. If fails logs error.
|
|
|
301a214 |
* @param list: pointer to pointer to first item.
|
|
|
301a214 |
* @param addr: address or NULL if 'cache'.
|
|
|
301a214 |
diff --git a/util/netevent.c b/util/netevent.c
|
|
|
301a214 |
index 4b6a0a3..3f3c6ce 100644
|
|
|
301a214 |
--- a/util/netevent.c
|
|
|
301a214 |
+++ b/util/netevent.c
|
|
|
301a214 |
@@ -301,6 +301,12 @@ comm_point_send_udp_msg(struct comm_point *c, ldns_buffer* packet,
|
|
|
301a214 |
(struct sockaddr_storage*)addr, addrlen) &&
|
|
|
301a214 |
verbosity < VERB_DETAIL)
|
|
|
301a214 |
return 0;
|
|
|
301a214 |
+ /* SO_BROADCAST sockopt can give access to 255.255.255.255,
|
|
|
301a214 |
+ * but a dns cache does not need it. */
|
|
|
301a214 |
+ if(errno == EACCES && addr_is_broadcast(
|
|
|
301a214 |
+ (struct sockaddr_storage*)addr, addrlen) &&
|
|
|
301a214 |
+ verbosity < VERB_DETAIL)
|
|
|
301a214 |
+ return 0;
|
|
|
301a214 |
#ifndef USE_WINSOCK
|
|
|
301a214 |
verbose(VERB_OPS, "sendto failed: %s", strerror(errno));
|
|
|
301a214 |
#else
|