aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTest_User <hax@andrewyu.org>2024-07-24 06:26:14 -0400
committerTest_User <hax@andrewyu.org>2024-07-24 06:26:14 -0400
commit60819dbb04d65038e871e7d0b47cd91c6a6603dc (patch)
tree020748b88ed0268d6b0b1920840e6bd577b86069
parent0bde62d4883de6e42047f86eedb08a1f21507383 (diff)
downloadhaxircd-60819dbb04d65038e871e7d0b47cd91c6a6603dc.tar.gz
haxircd-60819dbb04d65038e871e7d0b47cd91c6a6603dc.zip
sockaddr is verysane™
-rw-r--r--networks/gnutls.c10
-rw-r--r--networks/gnutls_buffered.c10
-rw-r--r--networks/openssl.c10
-rw-r--r--networks/openssl_buffered.c10
-rw-r--r--networks/plaintext.c10
-rw-r--r--networks/plaintext_buffered.c10
-rw-r--r--server_network.c21
7 files changed, 46 insertions, 35 deletions
diff --git a/networks/gnutls.c b/networks/gnutls.c
index d84ae05..bbabadf 100644
--- a/networks/gnutls.c
+++ b/networks/gnutls.c
@@ -209,10 +209,10 @@ int gnutls_connect(void **handle, struct string address, struct string port, str
mutex_init(&(gnutls_handle->mutex));
- struct sockaddr sockaddr;
+ struct sockaddr_storage sockaddr;
socklen_t sockaddr_len;
int family;
- if (resolve(address, port, &sockaddr, &sockaddr_len, &family) != 0)
+ if (resolve(address, port, (struct sockaddr*)&sockaddr, &sockaddr_len, &family) != 0)
goto gnutls_connect_destroy_mutex;
int fd = socket(family, SOCK_STREAM, IPPROTO_TCP);
@@ -224,7 +224,7 @@ int gnutls_connect(void **handle, struct string address, struct string port, str
int res;
do {
- res = connect(fd, &sockaddr, sockaddr_len);
+ res = connect(fd, (struct sockaddr*)&sockaddr, sockaddr_len);
} while (res < 0 && errno == EINTR);
if (res < 0)
goto gnutls_connect_close;
@@ -313,12 +313,12 @@ int gnutls_accept(int listen_fd, void **handle, struct string *addr) {
if (!GNUTLS_CERT_PATH || !GNUTLS_KEY_PATH)
return -1;
- struct sockaddr address;
+ struct sockaddr_storage address;
socklen_t address_len = sizeof(address);
int con_fd;
do {
- con_fd = accept(listen_fd, &address, &address_len);
+ con_fd = accept(listen_fd, (struct sockaddr*)&address, &address_len);
} while (con_fd == -1 && (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK || errno == ENETDOWN || errno == EPROTO || errno == ENOPROTOOPT || errno == EHOSTDOWN || errno == ENONET || errno == EHOSTUNREACH || errno == EOPNOTSUPP || errno == ENETUNREACH));
if (con_fd == -1)
diff --git a/networks/gnutls_buffered.c b/networks/gnutls_buffered.c
index 2c23801..e1e0b2f 100644
--- a/networks/gnutls_buffered.c
+++ b/networks/gnutls_buffered.c
@@ -209,10 +209,10 @@ int gnutls_buffered_connect(void **handle, struct string address, struct string
mutex_init(&(gnutls_handle->mutex));
- struct sockaddr sockaddr;
+ struct sockaddr_storage sockaddr;
socklen_t sockaddr_len;
int family;
- if (resolve(address, port, &sockaddr, &sockaddr_len, &family) != 0)
+ if (resolve(address, port, (struct sockaddr*)&sockaddr, &sockaddr_len, &family) != 0)
goto gnutls_connect_destroy_mutex;
int fd = socket(family, SOCK_STREAM, IPPROTO_TCP);
@@ -224,7 +224,7 @@ int gnutls_buffered_connect(void **handle, struct string address, struct string
int res;
do {
- res = connect(fd, &sockaddr, sockaddr_len);
+ res = connect(fd, (struct sockaddr*)&sockaddr, sockaddr_len);
} while (res < 0 && errno == EINTR);
if (res < 0)
goto gnutls_connect_close;
@@ -313,12 +313,12 @@ int gnutls_buffered_accept(int listen_fd, void **handle, struct string *addr) {
if (!GNUTLS_CERT_PATH || !GNUTLS_KEY_PATH)
return -1;
- struct sockaddr address;
+ struct sockaddr_storage address;
socklen_t address_len = sizeof(address);
int con_fd;
do {
- con_fd = accept(listen_fd, &address, &address_len);
+ con_fd = accept(listen_fd, (struct sockaddr*)&address, &address_len);
} while (con_fd == -1 && (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK || errno == ENETDOWN || errno == EPROTO || errno == ENOPROTOOPT || errno == EHOSTDOWN || errno == ENONET || errno == EHOSTUNREACH || errno == EOPNOTSUPP || errno == ENETUNREACH));
if (con_fd == -1)
diff --git a/networks/openssl.c b/networks/openssl.c
index 570d3e5..db3790a 100644
--- a/networks/openssl.c
+++ b/networks/openssl.c
@@ -202,10 +202,10 @@ size_t openssl_recv(void *handle, char *data, size_t len, char *err) {
}
int openssl_connect(void **handle, struct string address, struct string port, struct string *addr_out) {
- struct sockaddr sockaddr;
+ struct sockaddr_storage sockaddr;
socklen_t sockaddr_len;
int family;
- if (resolve(address, port, &sockaddr, &sockaddr_len, &family) != 0)
+ if (resolve(address, port, (struct sockaddr*)&sockaddr, &sockaddr_len, &family) != 0)
return -1;
int fd = socket(family, SOCK_STREAM, IPPROTO_TCP);
@@ -223,7 +223,7 @@ int openssl_connect(void **handle, struct string address, struct string port, st
int res;
do {
- res = connect(fd, &sockaddr, sockaddr_len);
+ res = connect(fd, (struct sockaddr*)&sockaddr, sockaddr_len);
} while (res < 0 && errno == EINTR);
if (res < 0)
goto openssl_connect_close;
@@ -312,12 +312,12 @@ int openssl_accept(int listen_fd, void **handle, struct string *addr) {
if (!OPENSSL_CERT_PATH || !OPENSSL_KEY_PATH)
return -1;
- struct sockaddr address;
+ struct sockaddr_storage address;
socklen_t address_len = sizeof(address);
int con_fd;
do {
- con_fd = accept(listen_fd, &address, &address_len);
+ con_fd = accept(listen_fd, (struct sockaddr*)&address, &address_len);
} while (con_fd == -1 && (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK || errno == ENETDOWN || errno == EPROTO || errno == ENOPROTOOPT || errno == EHOSTDOWN || errno == ENONET || errno == EHOSTUNREACH || errno == EOPNOTSUPP || errno == ENETUNREACH));
if (con_fd == -1)
diff --git a/networks/openssl_buffered.c b/networks/openssl_buffered.c
index 5c1d0c9..7021c87 100644
--- a/networks/openssl_buffered.c
+++ b/networks/openssl_buffered.c
@@ -319,10 +319,10 @@ size_t openssl_buffered_recv(void *handle, char *data, size_t len, char *err) {
}
int openssl_buffered_connect(void **handle, struct string address, struct string port, struct string *addr_out) {
- struct sockaddr sockaddr;
+ struct sockaddr_storage sockaddr;
socklen_t sockaddr_len;
int family;
- if (resolve(address, port, &sockaddr, &sockaddr_len, &family) != 0)
+ if (resolve(address, port, (struct sockaddr*)&sockaddr, &sockaddr_len, &family) != 0)
return -1;
int fd = socket(family, SOCK_STREAM, IPPROTO_TCP);
@@ -340,7 +340,7 @@ int openssl_buffered_connect(void **handle, struct string address, struct string
int res;
do {
- res = connect(fd, &sockaddr, sockaddr_len);
+ res = connect(fd, (struct sockaddr*)&sockaddr, sockaddr_len);
} while (res < 0 && errno == EINTR);
if (res < 0)
goto openssl_connect_close;
@@ -446,12 +446,12 @@ int openssl_buffered_accept(int listen_fd, void **handle, struct string *addr) {
if (!OPENSSL_CERT_PATH || !OPENSSL_KEY_PATH)
return -1;
- struct sockaddr address;
+ struct sockaddr_storage address;
socklen_t address_len = sizeof(address);
int con_fd;
do {
- con_fd = accept(listen_fd, &address, &address_len);
+ con_fd = accept(listen_fd, (struct sockaddr*)&address, &address_len);
} while (con_fd == -1 && (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK || errno == ENETDOWN || errno == EPROTO || errno == ENOPROTOOPT || errno == EHOSTDOWN || errno == ENONET || errno == EHOSTUNREACH || errno == EOPNOTSUPP || errno == ENETUNREACH));
if (con_fd == -1)
diff --git a/networks/plaintext.c b/networks/plaintext.c
index b3554ab..e274c08 100644
--- a/networks/plaintext.c
+++ b/networks/plaintext.c
@@ -88,10 +88,10 @@ size_t plaintext_recv(void *fd, char *data, size_t len, char *err) {
}
int plaintext_connect(void **handle, struct string address, struct string port, struct string *addr_out) {
- struct sockaddr sockaddr;
+ struct sockaddr_storage sockaddr;
socklen_t sockaddr_len;
int family;
- if (resolve(address, port, &sockaddr, &sockaddr_len, &family) != 0)
+ if (resolve(address, port, (struct sockaddr*)&sockaddr, &sockaddr_len, &family) != 0)
return -1;
int fd = socket(family, SOCK_STREAM, IPPROTO_TCP);
@@ -109,7 +109,7 @@ int plaintext_connect(void **handle, struct string address, struct string port,
int res;
do {
- res = connect(fd, &sockaddr, sockaddr_len);
+ res = connect(fd, (struct sockaddr*)&sockaddr, sockaddr_len);
} while (res < 0 && errno == EINTR);
if (res < 0) {
close(fd);
@@ -136,12 +136,12 @@ int plaintext_connect(void **handle, struct string address, struct string port,
}
int plaintext_accept(int listen_fd, void **handle, struct string *addr) {
- struct sockaddr address;
+ struct sockaddr_storage address;
socklen_t address_len = sizeof(address);
int con_fd;
do {
- con_fd = accept(listen_fd, &address, &address_len);
+ con_fd = accept(listen_fd, (struct sockaddr*)&address, &address_len);
} while (con_fd == -1 && (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK || errno == ENETDOWN || errno == EPROTO || errno == ENOPROTOOPT || errno == EHOSTDOWN || errno == ENONET || errno == EHOSTUNREACH || errno == EOPNOTSUPP || errno == ENETUNREACH));
if (con_fd == -1)
diff --git a/networks/plaintext_buffered.c b/networks/plaintext_buffered.c
index d56ff27..fcec415 100644
--- a/networks/plaintext_buffered.c
+++ b/networks/plaintext_buffered.c
@@ -221,10 +221,10 @@ size_t plaintext_buffered_recv(void *handle, char *data, size_t len, char *err)
}
int plaintext_buffered_connect(void **handle, struct string address, struct string port, struct string *addr_out) {
- struct sockaddr sockaddr;
+ struct sockaddr_storage sockaddr;
socklen_t sockaddr_len;
int family;
- if (resolve(address, port, &sockaddr, &sockaddr_len, &family) != 0)
+ if (resolve(address, port, (struct sockaddr*)&sockaddr, &sockaddr_len, &family) != 0)
return -1;
int fd = socket(family, SOCK_STREAM, IPPROTO_TCP);
@@ -242,7 +242,7 @@ int plaintext_buffered_connect(void **handle, struct string address, struct stri
int res;
do {
- res = connect(fd, &sockaddr, sockaddr_len);
+ res = connect(fd, (struct sockaddr*)&sockaddr, sockaddr_len);
} while (res < 0 && errno == EINTR);
if (res < 0)
goto plaintext_buffered_connect_close;
@@ -295,12 +295,12 @@ int plaintext_buffered_connect(void **handle, struct string address, struct stri
}
int plaintext_buffered_accept(int listen_fd, void **handle, struct string *addr) {
- struct sockaddr address;
+ struct sockaddr_storage address;
socklen_t address_len = sizeof(address);
int con_fd;
do {
- con_fd = accept(listen_fd, &address, &address_len);
+ con_fd = accept(listen_fd, (struct sockaddr*)&address, &address_len);
} while (con_fd == -1 && (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK || errno == ENETDOWN || errno == EPROTO || errno == ENOPROTOOPT || errno == EHOSTDOWN || errno == ENONET || errno == EHOSTUNREACH || errno == EOPNOTSUPP || errno == ENETUNREACH));
if (con_fd == -1)
diff --git a/server_network.c b/server_network.c
index 0f22db2..cbe00a1 100644
--- a/server_network.c
+++ b/server_network.c
@@ -27,6 +27,7 @@
// OTHER DEALINGS IN THE SOFTWARE.
#include <arpa/inet.h>
+#include <netdb.h>
#include <pthread.h>
#include <stdlib.h>
#include <string.h>
@@ -171,19 +172,29 @@ void * server_accept_thread(void *type) {
}
{
- struct sockaddr sockaddr = {
- .sa_family = family,
+ struct sockaddr_storage sockaddr = {
+ .ss_family = family,
};
if (family == AF_INET) {
((struct sockaddr_in *)&sockaddr)->sin_port = htons(SERVER_PORTS[net][protocol]);
- inet_pton(AF_INET, "0.0.0.0", &(((struct sockaddr_in *)&sockaddr)->sin_addr));
#ifdef USE_IPv6
} else if (family == AF_INET6) {
- ((struct sockaddr_in6 *)&sockaddr)->sin6_port = htons(SERVER_PORTS[net][protocol]);
- inet_pton(AF_INET6, "::", &(((struct sockaddr_in6 *)&sockaddr)->sin6_addr));
int one = 1;
setsockopt(listen_fd, SOL_IPV6, IPV6_V6ONLY, &one, sizeof(one));
+ struct addrinfo hints = {
+ .ai_family = family,
+ .ai_socktype = SOCK_STREAM,
+ .ai_protocol = IPPROTO_TCP,
+ .ai_flags = AI_PASSIVE | AI_NUMERICSERV,
+ };
+ struct addrinfo *res;
+ int success = getaddrinfo(NULL, "0", &hints, &res);
+ if (success != 0)
+ return 0;
+ memcpy(&sockaddr, res->ai_addr, res->ai_addrlen);
+ freeaddrinfo(res);
+ ((struct sockaddr_in6 *)&sockaddr)->sin6_port = htons(SERVER_PORTS[net][protocol]);
#endif
}