From 996fae3ac9dfa718244dac6eb0597d26c037c0a9 Mon Sep 17 00:00:00 2001 From: desteemy <38365841+desteemy@users.noreply.github.com> Date: Tue, 18 Mar 2025 09:51:52 +0100 Subject: [PATCH] WIN32 compatibility for setsockopt() in modbus-tcp.c UNIX systems require const void *, while Windows const char *. Previous version without type casting did not build on Windows. --- src/modbus-tcp.c | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/src/modbus-tcp.c b/src/modbus-tcp.c index 8e5e37cd..cbac096c 100644 --- a/src/modbus-tcp.c +++ b/src/modbus-tcp.c @@ -236,7 +236,11 @@ static int _modbus_tcp_set_ipv4_options(int s) /* Set the TCP no delay flag */ /* SOL_TCP = IPPROTO_TCP */ option = 1; - rc = setsockopt(s, IPPROTO_TCP, TCP_NODELAY, &option, sizeof(int)); +#ifdef _WIN32 + rc = setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (const char *)&option, sizeof(int)); +#else + rc = setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (const void *)&option, sizeof(int)); +#endif if (rc == -1) { return -1; } @@ -264,7 +268,11 @@ static int _modbus_tcp_set_ipv4_options(int s) **/ /* Set the IP low delay option */ option = IPTOS_LOWDELAY; - rc = setsockopt(s, IPPROTO_IP, IP_TOS, &option, sizeof(int)); +#ifdef _WIN32 + rc = setsockopt(s, IPPROTO_IP, IP_TOS, (const char *)&option, sizeof(int)); +#else + rc = setsockopt(s, IPPROTO_IP, IP_TOS, (const void *)&option, sizeof(int)); +#endif if (rc == -1) { return -1; } @@ -563,7 +571,11 @@ int modbus_tcp_listen(modbus_t *ctx, int nb_connection) } enable = 1; - if (setsockopt(new_s, SOL_SOCKET, SO_REUSEADDR, &enable, sizeof(enable)) == -1) { +#ifdef _WIN32 + if (setsockopt(new_s, SOL_SOCKET, SO_REUSEADDR, (const char *)&enable, sizeof(enable)) == -1) { +#else + if (setsockopt(new_s, SOL_SOCKET, SO_REUSEADDR, (const void *)&enable, sizeof(enable)) == -1) { +#endif close(new_s); return -1; } @@ -680,7 +692,11 @@ int modbus_tcp_pi_listen(modbus_t *ctx, int nb_connection) continue; } else { int enable = 1; - rc = setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &enable, sizeof(enable)); +#ifdef _WIN32 + rc = setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (const char *)&enable, sizeof(enable)); +#else + rc = setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (const void *)&enable, sizeof(enable)); +#endif if (rc != 0) { close(s); if (ctx->debug) {