commit 0a6b28ff216b1add5f8cd6b1a6070dadc3fbe19e
parent 06dcd5b4ea98ca5c0566b3b809c470a07d15281b
Author: Evgeny Grin <k2k@drgrin.dev>
Date: Sat, 3 May 2025 20:48:24 +0300
Improved portability, fixed warnings
Diffstat:
9 files changed, 99 insertions(+), 50 deletions(-)
diff --git a/src/mhd2/daemon_start.c b/src/mhd2/daemon_start.c
@@ -748,8 +748,9 @@ create_bind_listen_stream_socket (struct MHD_Daemon *restrict d,
(mhd_SKT_IP_V6_WITH_V4_OPT == sk_type));
no_dual_to_set = use_dual ? 0 : 1;
- if (0 != setsockopt (sk, IPPROTO_IPV6, IPV6_V6ONLY,
- (void *) &no_dual_to_set, sizeof (no_dual_to_set)))
+ if (0 != mhd_setsockopt (sk, IPPROTO_IPV6, IPV6_V6ONLY,
+ (void *) &no_dual_to_set,
+ sizeof (no_dual_to_set)))
{
mhd_SCKT_OPT_BOOL no_dual_current;
socklen_t opt_size;
@@ -761,8 +762,8 @@ create_bind_listen_stream_socket (struct MHD_Daemon *restrict d,
/* Some platforms forbid setting this options, but allow
reading. */
- if ((0 != getsockopt (sk, IPPROTO_IPV6, IPV6_V6ONLY,
- (void*) &no_dual_current, &opt_size))
+ if ((0 != mhd_getsockopt (sk, IPPROTO_IPV6, IPV6_V6ONLY,
+ (void*) &no_dual_current, &opt_size))
|| (((socklen_t) sizeof(no_dual_current)) < opt_size))
{
state_unknown = true;
@@ -837,9 +838,9 @@ create_bind_listen_stream_socket (struct MHD_Daemon *restrict d,
#else /* ! __linux__ */
fo_param = 1; /* The parameter is on/off type of setting */
#endif /* ! __linux__ */
- if (0 != setsockopt (sk, IPPROTO_TCP, TCP_FASTOPEN,
- (const void *) &fo_param,
- sizeof (fo_param)))
+ if (0 != mhd_setsockopt (sk, IPPROTO_TCP, TCP_FASTOPEN,
+ (const void *) &fo_param,
+ sizeof (fo_param)))
{
mhd_LOG_MSG (d, MHD_SC_LISTEN_FAST_OPEN_FAILURE, \
"OS refused to enable TCP Fast Open on " \
@@ -866,8 +867,8 @@ create_bind_listen_stream_socket (struct MHD_Daemon *restrict d,
#ifndef MHD_SOCKETS_KIND_WINSOCK
#ifdef HAVE_DCLR_SO_REUSEADDR
mhd_SCKT_OPT_BOOL on_val1 = 1;
- if (0 != setsockopt (sk, SOL_SOCKET, SO_REUSEADDR,
- (const void *) &on_val1, sizeof (on_val1)))
+ if (0 != mhd_setsockopt (sk, SOL_SOCKET, SO_REUSEADDR,
+ (const void *) &on_val1, sizeof (on_val1)))
{
mhd_LOG_MSG (d, MHD_SC_LISTEN_PORT_REUSE_ENABLE_FAILED, \
"OS refused to enable address reuse on " \
@@ -881,14 +882,18 @@ create_bind_listen_stream_socket (struct MHD_Daemon *restrict d,
if (MHD_D_OPTION_BIND_TYPE_NOT_SHARED > d->settings->listen_addr_reuse)
{
#if defined(HAVE_DCLR_SO_REUSEPORT) || defined(MHD_SOCKETS_KIND_WINSOCK)
+ int opt_name;
mhd_SCKT_OPT_BOOL on_val2 = 1;
- if (0 != setsockopt (sk, SOL_SOCKET,
#ifndef MHD_SOCKETS_KIND_WINSOCK
- SO_REUSEPORT,
+ opt_name = SO_REUSEPORT;
#else /* ! MHD_SOCKETS_KIND_WINSOCK */
- SO_REUSEADDR, /* On W32 it is the same as SO_REUSEPORT on other platforms */
+ opt_name = SO_REUSEADDR; /* On W32 it is the same as SO_REUSEPORT on other platforms */
#endif /* ! MHD_SOCKETS_KIND_WINSOCK */
- (const void *) &on_val2, sizeof (on_val2)))
+ if (0 != mhd_setsockopt (sk, \
+ SOL_SOCKET, \
+ opt_name, \
+ (const void *) &on_val2, \
+ sizeof (on_val2)))
{
mhd_LOG_MSG (d, MHD_SC_LISTEN_ADDRESS_REUSE_ENABLE_FAILED, \
"OS refused to enable address sharing " \
@@ -908,14 +913,18 @@ create_bind_listen_stream_socket (struct MHD_Daemon *restrict d,
else if (MHD_D_OPTION_BIND_TYPE_EXCLUSIVE <=
d->settings->listen_addr_reuse)
{
+ int opt_name;
mhd_SCKT_OPT_BOOL on_val = 1;
- if (0 != setsockopt (sk, SOL_SOCKET,
#ifdef SO_EXCLUSIVEADDRUSE
- SO_EXCLUSIVEADDRUSE,
+ opt_name = SO_EXCLUSIVEADDRUSE;
#else
- SO_EXCLBIND,
+ opt_name = SO_EXCLBIND;
#endif
- (const void *) &on_val, sizeof (on_val)))
+ if (0 != mhd_setsockopt (sk, \
+ SOL_SOCKET, \
+ opt_name, \
+ (const void *) &on_val, \
+ sizeof (on_val)))
{
mhd_LOG_MSG (d, MHD_SC_LISTEN_ADDRESS_EXCLUSIVE_ENABLE_FAILED, \
"OS refused to enable exclusive address use " \
diff --git a/src/mhd2/mhd_iovec.h b/src/mhd2/mhd_iovec.h
@@ -62,6 +62,7 @@ struct mhd_w32_iovec
};
typedef struct mhd_w32_iovec mhd_iovec;
#define mhd_IOV_ELMN_MAX_SIZE ULONG_MAX
+#define mhd_IOV_ELMN_PTR_TYPE char *
typedef unsigned long mhd_iov_elmn_size;
#define mhd_IOV_RET_MAX_SIZE LONG_MAX
typedef long mhd_iov_ret_type;
@@ -72,6 +73,7 @@ typedef long mhd_iov_ret_type;
*/
typedef struct iovec mhd_iovec;
#define mhd_IOV_ELMN_MAX_SIZE SIZE_MAX
+#define mhd_IOV_ELMN_PTR_TYPE void *
typedef size_t mhd_iov_elmn_size;
#define mhd_IOV_RET_MAX_SIZE SSIZE_MAX
typedef ssize_t mhd_iov_ret_type;
@@ -82,6 +84,7 @@ typedef ssize_t mhd_iov_ret_type;
*/
typedef struct MHD_IoVec mhd_iovec;
#define mhd_IOV_ELMN_MAX_SIZE SIZE_MAX
+#define mhd_IOV_ELMN_PTR_TYPE void *
typedef size_t mhd_iov_elmn_size;
#define mhd_IOV_RET_MAX_SIZE SSIZE_MAX
typedef ssize_t mhd_iov_ret_type;
diff --git a/src/mhd2/mhd_itc.h b/src/mhd2/mhd_itc.h
@@ -232,6 +232,7 @@ mhd_itc_nonblocking (struct mhd_itc *pitc);
/* **************** ITC implementation by socket pair ********** */
+# include "sys_sockets_headers.h"
# include "mhd_sockets_macros.h"
# if ! defined(mhd_socket_pair_nblk)
# include "mhd_sockets_funcs.h"
@@ -304,9 +305,9 @@ mhd_itc_nonblocking (struct mhd_itc *pitc);
* Clear signaled state on @a itc
* @param itc the itc to clear
*/
-# define mhd_itc_clear(itc) do \
- { long mhd__b; \
- while (0 < recv ((itc).sk[0], (void*) &mhd__b, sizeof(mhd__b), 0)) \
+# define mhd_itc_clear(itc) do \
+ { long mhd__b; \
+ while (0 < mhd_sys_recv ((itc).sk[0], &mhd__b, sizeof(mhd__b))) \
{(void) 0;} } while (0)
/**
diff --git a/src/mhd2/mhd_send.c b/src/mhd2/mhd_send.c
@@ -206,11 +206,11 @@ mhd_connection_set_nodelay_state (struct MHD_Connection *connection,
if (mhd_T_IS_YES (connection->sk.props.is_nonip))
return false;
- if (0 == setsockopt (connection->sk.fd,
- IPPROTO_TCP,
- TCP_NODELAY,
- (const void *) (nodelay_state ? &on_val : &off_val),
- sizeof (off_val)))
+ if (0 == mhd_setsockopt (connection->sk.fd,
+ IPPROTO_TCP,
+ TCP_NODELAY,
+ (const void *) (nodelay_state ? &on_val : &off_val),
+ sizeof (off_val)))
{
connection->sk.state.nodelay = nodelay_state ? mhd_T_YES : mhd_T_NO;
return true;
@@ -249,11 +249,11 @@ mhd_connection_set_cork_state (struct MHD_Connection *connection,
if (mhd_T_IS_YES (connection->sk.props.is_nonip))
return false;
- if (0 == setsockopt (connection->sk.fd,
- IPPROTO_TCP,
- mhd_TCP_CORK_NOPUSH,
- (const void *) (cork_state ? &on_val : &off_val),
- sizeof (off_val)))
+ if (0 == mhd_setsockopt (connection->sk.fd,
+ IPPROTO_TCP,
+ mhd_TCP_CORK_NOPUSH,
+ (const void *) (cork_state ? &on_val : &off_val),
+ sizeof (off_val)))
{
connection->sk.state.corked = cork_state ? mhd_T_YES : mhd_T_NO;
return true;
@@ -1538,7 +1538,9 @@ send_iov_nontls (struct MHD_Connection *restrict connection,
mhd_assert (r_iov->cnt > r_iov->sent);
/* The last iov element has been partially sent */
r_iov->iov[r_iov->sent].iov_base =
- (void *) ((uint8_t *) r_iov->iov[r_iov->sent].iov_base + track_sent);
+ (mhd_IOV_ELMN_PTR_TYPE)
+ (((uint8_t *) r_iov->iov[r_iov->sent].iov_base)
+ + track_sent);
r_iov->iov[r_iov->sent].iov_len -= (mhd_iov_elmn_size) track_sent;
}
}
@@ -1616,7 +1618,8 @@ send_iov_emu (struct MHD_Connection *restrict connection,
/* Incomplete buffer has been sent.
* Adjust buffer of the last element. */
r_iov->iov[r_iov->sent].iov_base =
- (void *) ((uint8_t *) r_iov->iov[r_iov->sent].iov_base + sent_el_size);
+ (mhd_IOV_ELMN_PTR_TYPE)
+ (((uint8_t *) r_iov->iov[r_iov->sent].iov_base) + sent_el_size);
r_iov->iov[r_iov->sent].iov_len -= (mhd_iov_elmn_size) sent_el_size;
break; /* Return the amount of the sent data */
diff --git a/src/mhd2/mhd_socket_error_funcs.c b/src/mhd2/mhd_socket_error_funcs.c
@@ -69,11 +69,11 @@ mhd_socket_error_get_from_socket (MHD_Socket fd)
socklen_t optlen = sizeof (sock_err);
sock_err = 0;
- if ((0 == getsockopt (fd,
- SOL_SOCKET,
- SO_ERROR,
- (void *) &sock_err,
- &optlen))
+ if ((0 == mhd_getsockopt (fd,
+ SOL_SOCKET,
+ SO_ERROR,
+ (void *) &sock_err,
+ &optlen))
&& (sizeof(sock_err) == optlen))
return mhd_socket_error_get_from_sys_err (sock_err);
diff --git a/src/mhd2/mhd_sockets_funcs.c b/src/mhd2/mhd_sockets_funcs.c
@@ -116,8 +116,8 @@ mhd_socket_set_nodelay (MHD_Socket sckt,
value = on ? 1 : 0;
- return 0 == setsockopt (sckt, IPPROTO_TCP, TCP_NODELAY,
- (const void *) &value, sizeof (value));
+ return 0 == mhd_setsockopt (sckt, IPPROTO_TCP, TCP_NODELAY,
+ (const void *) &value, sizeof (value));
#else /* ! TCP_NODELAY */
(void) sckt; (void) on;
return false;
@@ -134,8 +134,8 @@ mhd_socket_set_hard_close (MHD_Socket sckt)
par.l_onoff = 1;
par.l_linger = 0;
- return 0 == setsockopt (sckt, SOL_SOCKET, SO_LINGER,
- (const void *) &par, sizeof (par));
+ return 0 == mhd_setsockopt (sckt, SOL_SOCKET, SO_LINGER,
+ (const void *) &par, sizeof (par));
#else /* ! SOL_SOCKET || ! SO_LINGER */
(void) sckt;
return false;
diff --git a/src/mhd2/mhd_sockets_macros.h b/src/mhd2/mhd_sockets_macros.h
@@ -63,10 +63,15 @@
* @param f the additional flags
* @return ssize_t type value
*/
-#define mhd_sys_send4(s,b,l,f) \
+#ifdef MHD_SOCKETS_KIND_POSIX
+# define mhd_sys_send4(s,b,l,f) \
((ssize_t) send ((s),(const void*) (b),(mhd_SCKT_SEND_SIZE) (l), \
((mhd_MSG_NOSIGNAL) | (f))))
-
+#else
+# define mhd_sys_send4(s,b,l,f) \
+ ((ssize_t) send ((s),(const char*) (b),(mhd_SCKT_SEND_SIZE) (l), \
+ ((mhd_MSG_NOSIGNAL) | (f))))
+#endif
/**
* mhd_sys_send is a simple wrapper for system's send()
@@ -85,8 +90,13 @@
* @param l the length of @a b
* @return ssize_t type value
*/
-#define mhd_sys_recv(s,b,l) \
+#ifdef MHD_SOCKETS_KIND_POSIX
+# define mhd_sys_recv(s,b,l) \
((ssize_t) recv ((s),(void*) (b),(mhd_SCKT_SEND_SIZE) (l), 0))
+#else
+# define mhd_sys_recv(s,b,l) \
+ ((ssize_t) recv ((s),(char*) (b),(mhd_SCKT_SEND_SIZE) (l), 0))
+#endif
/**
* Last socket error
diff --git a/src/mhd2/response_from.c b/src/mhd2/response_from.c
@@ -290,14 +290,15 @@ MHD_response_from_iovec (
#if defined(MHD_SOCKETS_KIND_WINSOCK) && defined(_WIN64)
while (mhd_IOV_ELMN_MAX_SIZE < element_size)
{
- iov_copy[i_cp].iov_base = (char *) mhd_DROP_CONST (buf);
+ iov_copy[i_cp].iov_base =
+ (mhd_IOV_ELMN_PTR_TYPE) mhd_DROP_CONST (buf);
iov_copy[i_cp].iov_len = mhd_IOV_ELMN_MAX_SIZE;
buf += mhd_IOV_ELMN_MAX_SIZE;
element_size -= mhd_IOV_ELMN_MAX_SIZE;
i_cp++;
}
#endif /* MHD_SOCKETS_KIND_WINSOCK && _WIN64 */
- iov_copy[i_cp].iov_base = mhd_DROP_CONST (buf);
+ iov_copy[i_cp].iov_base = (mhd_IOV_ELMN_PTR_TYPE) mhd_DROP_CONST (buf);
iov_copy[i_cp].iov_len = (mhd_iov_elmn_size) element_size;
i_cp++;
}
diff --git a/src/mhd2/sys_sockets_headers.h b/src/mhd2/sys_sockets_headers.h
@@ -158,6 +158,28 @@
#endif /* MHD_SOCKETS_KIND_WINSOCK */
/**
+ * mhd_setsockopt() is a wrapper for system setsockopt()
+ */
+#ifdef MHD_SOCKETS_KIND_POSIX
+# define mhd_setsockopt(sk,l,o_name,po_value,o_len) \
+ setsockopt ((sk),(l),(o_name),(po_value),(o_len))
+#else
+# define mhd_setsockopt(sk,l,o_name,po_value,o_len) \
+ setsockopt ((sk),(l),(o_name),(const char *) (po_value),(o_len))
+#endif
+
+/**
+ * mhd_getsockopt() is a wrapper for system getsockopt()
+ */
+#ifdef MHD_SOCKETS_KIND_POSIX
+# define mhd_getsockopt(sk,l,o_name,po_value,po_len) \
+ getsockopt ((sk),(l),(o_name),(o_value),(po_len))
+#else
+# define mhd_getsockopt(sk,l,o_name,po_value,po_len) \
+ getsockopt ((sk),(l),(o_name),(char *) (po_value),(po_len))
+#endif
+
+/**
* mhd_SCKT_SEND_SIZE is type used to specify size for send() and recv()
* functions
*/
@@ -214,10 +236,10 @@ static const mhd_SCKT_OPT_BOOL mhd_socket_nosig_helper_int_one = 1;
* @param sock socket to manipulate
* @return non-zero if succeeded, zero otherwise
*/
-# define mhd_socket_nosignal(sock) \
- (! setsockopt ((sock),SOL_SOCKET,SO_NOSIGPIPE, \
- &mhd_socket_nosig_helper_int_one, \
- sizeof(mhd_SCKT_OPT_BOOL)))
+# define mhd_socket_nosignal(sock) \
+ (! mhd_setsockopt ((sock),SOL_SOCKET,SO_NOSIGPIPE, \
+ &mhd_socket_nosig_helper_int_one, \
+ sizeof(mhd_SCKT_OPT_BOOL)))
#endif /* SOL_SOCKET && SO_NOSIGPIPE */