From a6dc0743b47b909f75c7e434a6b44e6872e6c3b6 Mon Sep 17 00:00:00 2001 From: "W.C.A. Wijngaards" Date: Mon, 31 Aug 2020 08:41:34 +0200 Subject: [PATCH] - Merge PR #293: Add missing prototype. Also refactor to use the new shorthand function to clean up the code. --- daemon/remote.c | 12 +-- dnstap/dtstream.c | 6 +- dnstap/unbound-dnstap-socket.c | 15 +--- doc/Changelog | 4 + services/listen_dnsport.c | 131 ++++++--------------------------- services/listen_dnsport.h | 2 - services/outside_network.c | 9 +-- smallapp/unbound-control.c | 6 +- testcode/delayer.c | 37 ++-------- testcode/perf.c | 6 +- testcode/streamtcp.c | 6 +- util/net_help.c | 28 +++++++ util/net_help.h | 6 ++ util/netevent.c | 12 +-- 14 files changed, 83 insertions(+), 197 deletions(-) diff --git a/daemon/remote.c b/daemon/remote.c index aa263d074..94bc2c57e 100644 --- a/daemon/remote.c +++ b/daemon/remote.c @@ -348,11 +348,7 @@ add_open(const char* ip, int nr, struct listen_port** list, int noproto_is_err, /* alloc */ n = (struct listen_port*)calloc(1, sizeof(*n)); if(!n) { -#ifndef USE_WINSOCK - close(fd); -#else - closesocket(fd); -#endif + sock_close(fd); log_err("out of memory"); return 0; } @@ -461,11 +457,7 @@ int remote_accept_callback(struct comm_point* c, void* arg, int err, if(rc->active >= rc->max_active) { log_warn("drop incoming remote control: too many connections"); close_exit: -#ifndef USE_WINSOCK - close(newfd); -#else - closesocket(newfd); -#endif + sock_close(newfd); return 0; } diff --git a/dnstap/dtstream.c b/dnstap/dtstream.c index 63d517cb8..26eac063a 100644 --- a/dnstap/dtstream.c +++ b/dnstap/dtstream.c @@ -588,11 +588,7 @@ static void dtio_del_output_event(struct dt_io_thread* dtio) /** close dtio socket and set it to -1 */ static void dtio_close_fd(struct dt_io_thread* dtio) { -#ifndef USE_WINSOCK - close(dtio->fd); -#else - closesocket(dtio->fd); -#endif + sock_close(dtio->fd); dtio->fd = -1; } diff --git a/dnstap/unbound-dnstap-socket.c b/dnstap/unbound-dnstap-socket.c index 44a0eda95..80a117617 100644 --- a/dnstap/unbound-dnstap-socket.c +++ b/dnstap/unbound-dnstap-socket.c @@ -292,12 +292,11 @@ static int make_tcp_accept(char* ip) #ifndef USE_WINSOCK log_err("setsockopt(.. SO_REUSEADDR ..) failed: %s", strerror(errno)); - close(s); #else log_err("setsockopt(.. SO_REUSEADDR ..) failed: %s", wsa_strerror(WSAGetLastError())); - closesocket(s); #endif + sock_close(s); return -1; } #endif /* SO_REUSEADDR */ @@ -305,30 +304,24 @@ static int make_tcp_accept(char* ip) #ifndef USE_WINSOCK log_err_addr("can't bind socket", strerror(errno), &addr, len); - close(s); #else log_err_addr("can't bind socket", wsa_strerror(WSAGetLastError()), &addr, len); - closesocket(s); #endif + sock_close(s); return -1; } if(!fd_set_nonblock(s)) { -#ifndef USE_WINSOCK - close(s); -#else - closesocket(s); -#endif + sock_close(s); return -1; } if(listen(s, LISTEN_BACKLOG) == -1) { #ifndef USE_WINSOCK log_err("can't listen: %s", strerror(errno)); - close(s); #else log_err("can't listen: %s", wsa_strerror(WSAGetLastError())); - closesocket(s); #endif + sock_close(s); return -1; } return s; diff --git a/doc/Changelog b/doc/Changelog index 10ab6efae..a7a95464a 100644 --- a/doc/Changelog +++ b/doc/Changelog @@ -1,3 +1,7 @@ +31 August 2020: Wouter + - Merge PR #293: Add missing prototype. Also refactor to use the new + shorthand function to clean up the code. + 27 August 2020: Wouter - Similar to NSD PR#113, implement that interface names can be used, eg. something like interface: eth0 is resolved at server start and diff --git a/services/listen_dnsport.c b/services/listen_dnsport.c index 51fe39e0f..e749147e5 100644 --- a/services/listen_dnsport.c +++ b/services/listen_dnsport.c @@ -356,13 +356,12 @@ create_udp_sock(int family, int socktype, struct sockaddr* addr, # ifndef USE_WINSOCK log_err("setsockopt(..., SO_RCVBUFFORCE, " "...) failed: %s", strerror(errno)); - close(s); # else log_err("setsockopt(..., SO_RCVBUFFORCE, " "...) failed: %s", wsa_strerror(WSAGetLastError())); - closesocket(s); # endif + sock_close(s); *noproto = 0; *inuse = 0; return -1; @@ -373,13 +372,12 @@ create_udp_sock(int family, int socktype, struct sockaddr* addr, # ifndef USE_WINSOCK log_err("setsockopt(..., SO_RCVBUF, " "...) failed: %s", strerror(errno)); - close(s); # else log_err("setsockopt(..., SO_RCVBUF, " "...) failed: %s", wsa_strerror(WSAGetLastError())); - closesocket(s); # endif + sock_close(s); *noproto = 0; *inuse = 0; return -1; @@ -415,13 +413,12 @@ create_udp_sock(int family, int socktype, struct sockaddr* addr, # ifndef USE_WINSOCK log_err("setsockopt(..., SO_SNDBUFFORCE, " "...) failed: %s", strerror(errno)); - close(s); # else log_err("setsockopt(..., SO_SNDBUFFORCE, " "...) failed: %s", wsa_strerror(WSAGetLastError())); - closesocket(s); # endif + sock_close(s); *noproto = 0; *inuse = 0; return -1; @@ -432,13 +429,12 @@ create_udp_sock(int family, int socktype, struct sockaddr* addr, # ifndef USE_WINSOCK log_err("setsockopt(..., SO_SNDBUF, " "...) failed: %s", strerror(errno)); - close(s); # else log_err("setsockopt(..., SO_SNDBUF, " "...) failed: %s", wsa_strerror(WSAGetLastError())); - closesocket(s); # endif + sock_close(s); *noproto = 0; *inuse = 0; return -1; @@ -471,13 +467,12 @@ create_udp_sock(int family, int socktype, struct sockaddr* addr, #ifndef USE_WINSOCK log_err("setsockopt(..., IPV6_V6ONLY" ", ...) failed: %s", strerror(errno)); - close(s); #else log_err("setsockopt(..., IPV6_V6ONLY" ", ...) failed: %s", wsa_strerror(WSAGetLastError())); - closesocket(s); #endif + sock_close(s); *noproto = 0; *inuse = 0; return -1; @@ -498,13 +493,12 @@ create_udp_sock(int family, int socktype, struct sockaddr* addr, # ifndef USE_WINSOCK log_err("setsockopt(..., IPV6_USE_MIN_MTU, " "...) failed: %s", strerror(errno)); - close(s); # else log_err("setsockopt(..., IPV6_USE_MIN_MTU, " "...) failed: %s", wsa_strerror(WSAGetLastError())); - closesocket(s); # endif + sock_close(s); *noproto = 0; *inuse = 0; return -1; @@ -520,12 +514,11 @@ create_udp_sock(int family, int socktype, struct sockaddr* addr, # ifndef USE_WINSOCK log_err("setsockopt(..., IPV6_MTU, ...) failed: %s", strerror(errno)); - close(s); # else log_err("setsockopt(..., IPV6_MTU, ...) failed: %s", wsa_strerror(WSAGetLastError())); - closesocket(s); # endif + sock_close(s); *noproto = 0; *inuse = 0; return -1; @@ -549,12 +542,7 @@ create_udp_sock(int family, int socktype, struct sockaddr* addr, if (errno != EINVAL) { log_err("setsockopt(..., IP_MTU_DISCOVER, IP_PMTUDISC_OMIT...) failed: %s", strerror(errno)); - -# ifndef USE_WINSOCK - close(s); -# else - closesocket(s); -# endif + sock_close(s); *noproto = 0; *inuse = 0; return -1; @@ -571,11 +559,7 @@ create_udp_sock(int family, int socktype, struct sockaddr* addr, &action, (socklen_t)sizeof(action)) < 0) { log_err("setsockopt(..., IP_MTU_DISCOVER, IP_PMTUDISC_DONT...) failed: %s", strerror(errno)); -# ifndef USE_WINSOCK - close(s); -# else - closesocket(s); -# endif + sock_close(s); *noproto = 0; *inuse = 0; return -1; @@ -587,11 +571,7 @@ create_udp_sock(int family, int socktype, struct sockaddr* addr, &off, (socklen_t)sizeof(off)) < 0) { log_err("setsockopt(..., IP_DONTFRAG, ...) failed: %s", strerror(errno)); -# ifndef USE_WINSOCK - close(s); -# else - closesocket(s); -# endif + sock_close(s); *noproto = 0; *inuse = 0; return -1; @@ -621,7 +601,6 @@ create_udp_sock(int family, int socktype, struct sockaddr* addr, (struct sockaddr_storage*)addr, addrlen); } #endif /* EADDRINUSE */ - close(s); #else /* USE_WINSOCK */ if(WSAGetLastError() != WSAEADDRINUSE && WSAGetLastError() != WSAEADDRNOTAVAIL && @@ -630,18 +609,14 @@ create_udp_sock(int family, int socktype, struct sockaddr* addr, wsa_strerror(WSAGetLastError()), (struct sockaddr_storage*)addr, addrlen); } - closesocket(s); #endif /* USE_WINSOCK */ + sock_close(s); return -1; } if(!fd_set_nonblock(s)) { *noproto = 0; *inuse = 0; -#ifndef USE_WINSOCK - close(s); -#else - closesocket(s); -#endif + sock_close(s); return -1; } return s; @@ -727,12 +702,11 @@ create_tcp_accept_sock(struct addrinfo *addr, int v6only, int* noproto, #ifndef USE_WINSOCK log_err("setsockopt(.. SO_REUSEADDR ..) failed: %s", strerror(errno)); - close(s); #else log_err("setsockopt(.. SO_REUSEADDR ..) failed: %s", wsa_strerror(WSAGetLastError())); - closesocket(s); #endif + sock_close(s); return -1; } #endif /* SO_REUSEADDR */ @@ -770,12 +744,11 @@ create_tcp_accept_sock(struct addrinfo *addr, int v6only, int* noproto, #ifndef USE_WINSOCK log_err("setsockopt(..., IPV6_V6ONLY, ...) failed: %s", strerror(errno)); - close(s); #else log_err("setsockopt(..., IPV6_V6ONLY, ...) failed: %s", wsa_strerror(WSAGetLastError())); - closesocket(s); #endif + sock_close(s); return -1; } } @@ -822,32 +795,26 @@ create_tcp_accept_sock(struct addrinfo *addr, int v6only, int* noproto, (struct sockaddr_storage*)addr->ai_addr, addr->ai_addrlen); } - close(s); #else log_err_addr("can't bind socket", wsa_strerror(WSAGetLastError()), (struct sockaddr_storage*)addr->ai_addr, addr->ai_addrlen); - closesocket(s); #endif + sock_close(s); return -1; } if(!fd_set_nonblock(s)) { -#ifndef USE_WINSOCK - close(s); -#else - closesocket(s); -#endif + sock_close(s); return -1; } if(listen(s, TCP_BACKLOG) == -1) { #ifndef USE_WINSOCK log_err("can't listen: %s", strerror(errno)); - close(s); #else log_err("can't listen: %s", wsa_strerror(WSAGetLastError())); - closesocket(s); #endif + sock_close(s); return -1; } #ifdef USE_TCP_FASTOPEN @@ -902,34 +869,6 @@ set_ip_dscp(int socket, int addrfamily, int dscp) return NULL; } -# ifndef USE_WINSOCK -char* -sock_strerror(int errn) -{ - return strerror(errn); -} - -void -sock_close(int socket) -{ - close(socket); -} - -# else -char* -sock_strerror(int ATTR_UNUSED(errn)) -{ - return wsa_strerror(WSAGetLastError()); -} - -void -sock_close(int socket) -{ - closesocket(socket); -} - -# endif /* USE_WINSOCK */ - int create_local_accept_sock(const char *path, int* noproto, int use_systemd) { @@ -990,11 +929,7 @@ create_local_accept_sock(const char *path, int* noproto, int use_systemd) return s; err: -#ifndef USE_WINSOCK - close(s); -#else - closesocket(s); -#endif + sock_close(s); return -1; #ifdef HAVE_SYSTEMD @@ -1245,20 +1180,12 @@ ports_create_if(const char* ifname, int do_auto, int do_udp, int do_tcp, } /* getting source addr packet info is highly non-portable */ if(!set_recvpktinfo(s, hints->ai_family)) { -#ifndef USE_WINSOCK - close(s); -#else - closesocket(s); -#endif + sock_close(s); return 0; } if(!port_insert(list, s, is_dnscrypt?listen_type_udpancil_dnscrypt:listen_type_udpancil)) { -#ifndef USE_WINSOCK - close(s); -#else - closesocket(s); -#endif + sock_close(s); return 0; } } else if(do_udp) { @@ -1274,11 +1201,7 @@ ports_create_if(const char* ifname, int do_auto, int do_udp, int do_tcp, } if(!port_insert(list, s, is_dnscrypt?listen_type_udp_dnscrypt:listen_type_udp)) { -#ifndef USE_WINSOCK - close(s); -#else - closesocket(s); -#endif + sock_close(s); return 0; } } @@ -1298,11 +1221,7 @@ ports_create_if(const char* ifname, int do_auto, int do_udp, int do_tcp, verbose(VERB_ALGO, "setup TCP for SSL service"); if(!port_insert(list, s, is_ssl?listen_type_ssl: (is_dnscrypt?listen_type_tcp_dnscrypt:listen_type_tcp))) { -#ifndef USE_WINSOCK - close(s); -#else - closesocket(s); -#endif + sock_close(s); return 0; } } @@ -1700,11 +1619,7 @@ void listening_ports_free(struct listen_port* list) while(list) { nx = list->next; if(list->fd != -1) { -#ifndef USE_WINSOCK - close(list->fd); -#else - closesocket(list->fd); -#endif + sock_close(list->fd); } free(list); list = nx; diff --git a/services/listen_dnsport.h b/services/listen_dnsport.h index d33a5395f..c7daa9e75 100644 --- a/services/listen_dnsport.h +++ b/services/listen_dnsport.h @@ -383,7 +383,5 @@ int tcp_req_info_handle_read_close(struct tcp_req_info* req); size_t tcp_req_info_get_stream_buffer_size(void); char* set_ip_dscp(int socket, int addrfamily, int ds); -char* sock_strerror(int errn); -void sock_close(int socket); #endif /* LISTEN_DNSPORT_H */ diff --git a/services/outside_network.c b/services/outside_network.c index 67eca05ed..ba07444df 100644 --- a/services/outside_network.c +++ b/services/outside_network.c @@ -166,11 +166,7 @@ pick_outgoing_tcp(struct waiting_tcp* w, int s) if(num == 0) { log_err("no TCP outgoing interfaces of family"); log_addr(VERB_OPS, "for addr", &w->addr, w->addrlen); -#ifndef USE_WINSOCK - close(s); -#else - closesocket(s); -#endif + sock_close(s); return 0; } #ifdef INET6 @@ -191,12 +187,11 @@ pick_outgoing_tcp(struct waiting_tcp* w, int s) if(bind(s, (struct sockaddr*)&pi->addr, pi->addrlen) != 0) { #ifndef USE_WINSOCK log_err("outgoing tcp: bind: %s", strerror(errno)); - close(s); #else log_err("outgoing tcp: bind: %s", wsa_strerror(WSAGetLastError())); - closesocket(s); #endif + sock_close(s); return 0; } log_addr(VERB_ALGO, "tcp bound to src", &pi->addr, pi->addrlen); diff --git a/smallapp/unbound-control.c b/smallapp/unbound-control.c index 4662c7cb6..5936679e6 100644 --- a/smallapp/unbound-control.c +++ b/smallapp/unbound-control.c @@ -824,11 +824,7 @@ go(const char* cfgfile, char* svr, int quiet, int argc, char* argv[]) ret = go_cmd(ssl, fd, quiet, argc, argv); if(ssl) SSL_free(ssl); -#ifndef USE_WINSOCK - close(fd); -#else - closesocket(fd); -#endif + sock_close(fd); if(ctx) SSL_CTX_free(ctx); config_delete(cfg); return ret; diff --git a/testcode/delayer.c b/testcode/delayer.c index ebf883926..6562f80e6 100644 --- a/testcode/delayer.c +++ b/testcode/delayer.c @@ -550,15 +550,9 @@ tcp_proxy_delete(struct tcp_proxy* p) free(s); s = sn; } -#ifndef USE_WINSOCK - close(p->client_s); + sock_close(p->client_s); if(p->server_s != -1) - close(p->server_s); -#else - closesocket(p->client_s); - if(p->server_s != -1) - closesocket(p->server_s); -#endif + sock_close(p->server_s); free(p); } @@ -607,16 +601,14 @@ service_tcp_listen(int s, fd_set* rorig, int* max, struct tcp_proxy** proxies, #ifndef USE_WINSOCK if(errno != EINPROGRESS) { log_err("tcp connect: %s", strerror(errno)); - close(p->server_s); - close(p->client_s); #else if(WSAGetLastError() != WSAEWOULDBLOCK && WSAGetLastError() != WSAEINPROGRESS) { log_err("tcp connect: %s", wsa_strerror(WSAGetLastError())); - closesocket(p->server_s); - closesocket(p->client_s); #endif + sock_close(p->server_s); + sock_close(p->client_s); free(p); return; } @@ -769,11 +761,7 @@ service_tcp_relay(struct tcp_proxy** tcp_proxies, struct timeval* now, log_addr(1, "read tcp answer", &p->addr, p->addr_len); if(!tcp_relay_read(p->server_s, &p->answerlist, &p->answerlast, now, delay, pkt)) { -#ifndef USE_WINSOCK - close(p->server_s); -#else - closesocket(p->server_s); -#endif + sock_close(p->server_s); FD_CLR(FD_SET_T p->server_s, worig); FD_CLR(FD_SET_T p->server_s, rorig); p->server_s = -1; @@ -901,11 +889,7 @@ proxy_list_clear(struct proxy* p) "%u returned\n", i++, from, port, (int)p->numreuse+1, (unsigned)p->numwait, (unsigned)p->numsent, (unsigned)p->numreturn); -#ifndef USE_WINSOCK - close(p->s); -#else - closesocket(p->s); -#endif + sock_close(p->s); free(p); p = np; } @@ -1109,13 +1093,8 @@ service(const char* bind_str, int bindport, const char* serv_str, /* cleanup */ verbose(1, "cleanup"); -#ifndef USE_WINSOCK - close(s); - close(listen_s); -#else - closesocket(s); - closesocket(listen_s); -#endif + sock_close(s); + sock_close(listen_s); sldns_buffer_free(pkt); ring_delete(ring); } diff --git a/testcode/perf.c b/testcode/perf.c index 5b170ca57..aef69045f 100644 --- a/testcode/perf.c +++ b/testcode/perf.c @@ -260,11 +260,7 @@ perffree(struct perfinfo* info) if(!info) return; if(info->io) { for(i=0; iio_num; i++) { -#ifndef USE_WINSOCK - close(info->io[i].fd); -#else - closesocket(info->io[i].fd); -#endif + sock_close(info->io[i].fd); } free(info->io); } diff --git a/testcode/streamtcp.c b/testcode/streamtcp.c index c49159d33..ffdddbe9d 100644 --- a/testcode/streamtcp.c +++ b/testcode/streamtcp.c @@ -388,11 +388,7 @@ send_em(const char* svr, int udp, int usessl, int noanswer, int onarrival, SSL_free(ssl); SSL_CTX_free(ctx); } -#ifndef USE_WINSOCK - close(fd); -#else - closesocket(fd); -#endif + sock_close(fd); sldns_buffer_free(buf); printf("orderly exit\n"); } diff --git a/util/net_help.c b/util/net_help.c index 4d985b66d..b51e0372e 100644 --- a/util/net_help.c +++ b/util/net_help.c @@ -1562,3 +1562,31 @@ listen_sslctx_delete_ticket_keys(void) free(ticket_keys); ticket_keys = NULL; } + +# ifndef USE_WINSOCK +char* +sock_strerror(int errn) +{ + return strerror(errn); +} + +void +sock_close(int socket) +{ + close(socket); +} + +# else +char* +sock_strerror(int ATTR_UNUSED(errn)) +{ + return wsa_strerror(WSAGetLastError()); +} + +void +sock_close(int socket) +{ + closesocket(socket); +} + +# endif /* USE_WINSOCK */ diff --git a/util/net_help.h b/util/net_help.h index 29943ada0..45b607a43 100644 --- a/util/net_help.h +++ b/util/net_help.h @@ -496,4 +496,10 @@ void listen_sslctx_delete_ticket_keys(void); */ int netblockdnametoaddr(uint8_t* dname, size_t dnamelen, struct sockaddr_storage* addr, socklen_t* addrlen, int* net, int* af); + +/** Return strerror or wsastrerror for socket error printout */ +char* sock_strerror(int errn); +/** close the socket with close, or wsa closesocket */ +void sock_close(int socket); + #endif /* NET_HELP_H */ diff --git a/util/netevent.c b/util/netevent.c index 3e7a433e5..6172adb1f 100644 --- a/util/netevent.c +++ b/util/netevent.c @@ -3087,11 +3087,7 @@ comm_point_close(struct comm_point* c) ub_winsock_tcp_wouldblock(c->ev->ev, UB_EV_WRITE); } verbose(VERB_ALGO, "close fd %d", c->fd); -#ifndef USE_WINSOCK - close(c->fd); -#else - closesocket(c->fd); -#endif + sock_close(c->fd); } c->fd = -1; } @@ -3232,11 +3228,7 @@ comm_point_start_listening(struct comm_point* c, int newfd, int msec) } if(newfd != -1) { if(c->fd != -1) { -#ifndef USE_WINSOCK - close(c->fd); -#else - closesocket(c->fd); -#endif + sock_close(c->fd); } c->fd = newfd; ub_event_set_fd(c->ev->ev, c->fd);