Reduce log noise when an interface goes missing during
reconfiguration. It is a crude patch requiring quality control
but it demonstrates the concept.

Index: services/listen_dnsport.c
===================================================================
--- a/services/listen_dnsport.c
+++ b/services/listen_dnsport.c
@@ -600,6 +600,7 @@ int
 create_tcp_accept_sock(struct addrinfo *addr, int v6only, int* noproto,
        int* reuseport, int transparent, int mss, int freebind, int use_systemd)
 {
+       static time_t bindlogtime = 0;
        int s;
#if defined(SO_REUSEADDR) || defined(SO_REUSEPORT) || defined(IPV6_V6ONLY) || defined(IP_TRANSPARENT) || defined(IP_BINDANY) || defined(IP_FREEBIND) || defined(SO_BINDANY)
        int on = 1;
@@ -762,10 +763,11 @@ create_tcp_accept_sock(struct addrinfo *addr, int v6only, int* noproto,
                /* detect freebsd jail with no ipv6 permission */
                if(addr->ai_family==AF_INET6 && errno==EINVAL)
                        *noproto = 1;
-               else {
+               else if (difftime(time(NULL), bindlogtime) > 300.0F) {
+                       bindlogtime = time(NULL);
                        log_err_addr("can't bind socket", strerror(errno),
                                (struct sockaddr_storage*)addr->ai_addr,
                                addr->ai_addrlen);
                }
                close(s);
 #else
Index: util/netevent.c
===================================================================
--- a/util/netevent.c
+++ b/util/netevent.c
@@ -331,8 +331,9 @@ int tcp_connect_errno_needs_log(struct sockaddr* addr, socklen_t addrlen)
 /* send a UDP reply */
 int
 comm_point_send_udp_msg(struct comm_point *c, sldns_buffer* packet,
-       struct sockaddr* addr, socklen_t addrlen)
+       struct sockaddr* addr, socklen_t addrlen)
 {
+       static time_t sendlogtime = 0;
        ssize_t sent;
        log_assert(c->fd != -1);
 #ifdef UNBOUND_DEBUG
@@ -371,17 +372,20 @@ comm_point_send_udp_msg(struct comm_point *c, sldns_buffer* packet,
        if(sent == -1) {
                if(!udp_send_errno_needs_log(addr, addrlen))
                        return 0;
+               if (difftime(time(NULL), sendlogtime) > 300.0F) {
+                       sendlogtime = time(NULL);
 #ifndef USE_WINSOCK
-               verbose(VERB_OPS, "sendto failed: %s", strerror(errno));
+                       verbose(VERB_OPS, "sendto failed: %s", strerror(errno));
 #else
-               verbose(VERB_OPS, "sendto failed: %s",
-                       wsa_strerror(WSAGetLastError()));
+                       verbose(VERB_OPS, "sendto failed: %s",
+                               wsa_strerror(WSAGetLastError()));
 #endif
-               log_addr(VERB_OPS, "remote address is",
-                       (struct sockaddr_storage*)addr, addrlen);
+                       log_addr(VERB_OPS, "remote address is",
+                               (struct sockaddr_storage*)addr, addrlen);
+               }
                return 0;
        } else if((size_t)sent != sldns_buffer_remaining(packet)) {
-               log_err("sent %d in place of %d bytes",
+               log_err("sent %d in place of %d bytes",
                        (int)sent, (int)sldns_buffer_remaining(packet));
                return 0;
        }

Reply via email to