errno filtering better: sendto and sendmsg filtered in the same way. Also

ENETDOWN and ENETUNREACH for tcp (already had EHOSTDOWN and EHOSTUNREACH).


git-svn-id: file:///svn/unbound/trunk@2343 be551aaa-1e26-0410-a405-d3ace91eadb9
This commit is contained in:
Wouter Wijngaards 2010-11-15 14:00:20 +00:00
parent 95da05c4bc
commit e430e8cef8
2 changed files with 52 additions and 33 deletions

View file

@ -1,5 +1,5 @@
15 November 2010: Wouter 15 November 2010: Wouter
- silence 'tcp connect: broken pipe' at low verbosity. - silence 'tcp connect: broken pipe' and 'net down' at low verbosity.
- iana portlist updated. - iana portlist updated.
9 November 2010: Wouter 9 November 2010: Wouter

View file

@ -266,22 +266,10 @@ struct event_base* comm_base_internal(struct comm_base* b)
return b->eb->base; return b->eb->base;
} }
/* send a UDP reply */ /** see if errno for udp has to be logged or not uses globals */
int static int
comm_point_send_udp_msg(struct comm_point *c, ldns_buffer* packet, udp_send_errno_needs_log(struct sockaddr* addr, socklen_t addrlen)
struct sockaddr* addr, socklen_t addrlen)
{ {
ssize_t sent;
log_assert(c->fd != -1);
#ifdef UNBOUND_DEBUG
if(ldns_buffer_remaining(packet) == 0)
log_err("error: send empty UDP packet");
#endif
log_assert(addr && addrlen > 0);
sent = sendto(c->fd, (void*)ldns_buffer_begin(packet),
ldns_buffer_remaining(packet), 0,
addr, addrlen);
if(sent == -1) {
/* do not log transient errors (unless high verbosity) */ /* do not log transient errors (unless high verbosity) */
#if defined(ENETUNREACH) || defined(EHOSTDOWN) || defined(EHOSTUNREACH) || defined(ENETDOWN) #if defined(ENETUNREACH) || defined(EHOSTDOWN) || defined(EHOSTUNREACH) || defined(ENETDOWN)
switch(errno) { switch(errno) {
@ -315,6 +303,27 @@ comm_point_send_udp_msg(struct comm_point *c, ldns_buffer* packet,
(struct sockaddr_storage*)addr, addrlen) && (struct sockaddr_storage*)addr, addrlen) &&
verbosity < VERB_DETAIL) verbosity < VERB_DETAIL)
return 0; return 0;
return 1;
}
/* send a UDP reply */
int
comm_point_send_udp_msg(struct comm_point *c, ldns_buffer* packet,
struct sockaddr* addr, socklen_t addrlen)
{
ssize_t sent;
log_assert(c->fd != -1);
#ifdef UNBOUND_DEBUG
if(ldns_buffer_remaining(packet) == 0)
log_err("error: send empty UDP packet");
#endif
log_assert(addr && addrlen > 0);
sent = sendto(c->fd, (void*)ldns_buffer_begin(packet),
ldns_buffer_remaining(packet), 0,
addr, addrlen);
if(sent == -1) {
if(!udp_send_errno_needs_log(addr, addrlen))
return 0;
#ifndef USE_WINSOCK #ifndef USE_WINSOCK
verbose(VERB_OPS, "sendto failed: %s", strerror(errno)); verbose(VERB_OPS, "sendto failed: %s", strerror(errno));
#else #else
@ -451,6 +460,8 @@ comm_point_send_udp_msg_if(struct comm_point *c, ldns_buffer* packet,
p_ancil("send_udp over interface", r); p_ancil("send_udp over interface", r);
sent = sendmsg(c->fd, &msg, 0); sent = sendmsg(c->fd, &msg, 0);
if(sent == -1) { if(sent == -1) {
if(!udp_send_errno_needs_log(addr, addrlen))
return 0;
verbose(VERB_OPS, "sendmsg failed: %s", strerror(errno)); verbose(VERB_OPS, "sendmsg failed: %s", strerror(errno));
log_addr(VERB_OPS, "remote address is", log_addr(VERB_OPS, "remote address is",
(struct sockaddr_storage*)addr, addrlen); (struct sockaddr_storage*)addr, addrlen);
@ -884,6 +895,14 @@ comm_point_tcp_handle_write(int fd, struct comm_point* c)
else if(error == ECONNREFUSED && verbosity < 2) else if(error == ECONNREFUSED && verbosity < 2)
return 0; /* silence 'connection refused' */ return 0; /* silence 'connection refused' */
#endif #endif
#ifdef ENETUNREACH
else if(error == ENETUNREACH && verbosity < 2)
return 0; /* silence 'network unreachable' */
#endif
#ifdef ENETDOWN
else if(error == ENETDOWN && verbosity < 2)
return 0; /* silence 'network is down' */
#endif
#ifdef EHOSTUNREACH #ifdef EHOSTUNREACH
else if(error == EHOSTUNREACH && verbosity < 2) else if(error == EHOSTUNREACH && verbosity < 2)
return 0; /* silence 'no route to host' */ return 0; /* silence 'no route to host' */