From 60819dbb04d65038e871e7d0b47cd91c6a6603dc Mon Sep 17 00:00:00 2001 From: Test_User Date: Wed, 24 Jul 2024 06:26:14 -0400 Subject: sockaddr is verysane™ MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- networks/gnutls.c | 10 +++++----- networks/gnutls_buffered.c | 10 +++++----- networks/openssl.c | 10 +++++----- networks/openssl_buffered.c | 10 +++++----- networks/plaintext.c | 10 +++++----- networks/plaintext_buffered.c | 10 +++++----- server_network.c | 21 ++++++++++++++++----- 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 +#include #include #include #include @@ -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 } -- cgit v1.2.3