diff options
Diffstat (limited to '')
-rw-r--r-- | src/server/addr.c | 31 | ||||
-rw-r--r-- | src/server/resolver.c | 2 |
2 files changed, 28 insertions, 5 deletions
diff --git a/src/server/addr.c b/src/server/addr.c index c83b216..494b694 100644 --- a/src/server/addr.c +++ b/src/server/addr.c @@ -1,3 +1,4 @@ +#include <errno.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> @@ -159,8 +160,30 @@ int32_t write_udp_socket(UdpSocket* socket, void* buffer, uint16_t len, SocketAd ); } +static int get_socket_error(int fd) { + int err = 1; + socklen_t len = sizeof err; + if (-1 == getsockopt(fd, SOL_SOCKET, SO_ERROR, (char *)&err, &len)) + return 0; + if (err) + errno = err; + return err; +} + +static int close_socket(int fd) { + if (fd >= 0) { + get_socket_error(fd); // first clear any errors, which can cause close to fail + if (shutdown(fd, SHUT_RDWR) < 0) // secondly, terminate the 'reliable' delivery + if (errno != ENOTCONN && errno != EINVAL) // SGI causes EINVAL + perror("shutdown"); + if (close(fd) < 0) // finally call close() + perror("close"); + } + return 0; +} + int32_t close_udp_socket(UdpSocket* socket) { - return close(socket->sockfd); + return close_socket(socket->sockfd); } int32_t create_tcp_socket(AddrType type, TcpSocket* sock) { @@ -204,7 +227,7 @@ int32_t accept_tcp_socket(TcpSocket* socket, TcpStream* stream) { } int32_t close_tcp_socket(TcpSocket* socket) { - return close(socket->sockfd); + return close_socket(socket->sockfd); } int32_t connect_tcp_stream(SocketAddr* servaddr, TcpStream* stream) { @@ -222,7 +245,7 @@ int32_t connect_tcp_stream(SocketAddr* servaddr, TcpStream* stream) { } int32_t read_tcp_stream(TcpStream* stream, void* buffer, uint16_t len) { - return recv(stream->streamfd, buffer, len, 0); + return recv(stream->streamfd, buffer, len, MSG_WAITALL); } int32_t write_tcp_stream(TcpStream* stream, void* buffer, uint16_t len) { @@ -230,5 +253,5 @@ int32_t write_tcp_stream(TcpStream* stream, void* buffer, uint16_t len) { } int32_t close_tcp_stream(TcpStream* stream) { - return close(stream->streamfd); + return close_socket(stream->streamfd); } diff --git a/src/server/resolver.c b/src/server/resolver.c index c9e5246..67149bc 100644 --- a/src/server/resolver.c +++ b/src/server/resolver.c @@ -45,7 +45,7 @@ static bool lookup( static bool search(Question* question, Packet* result, BindingType type, const RecordMap* map) { IpAddr addr; - uint8_t ip[4] = {1, 1, 1, 1}; + uint8_t ip[4] = {9,9,9,9}; create_ip_addr(ip, &addr); uint16_t port = 53; |