summaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
Diffstat (limited to 'src/server')
-rw-r--r--src/server/addr.c31
-rw-r--r--src/server/resolver.c2
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;