libmicrohttpd2

HTTP server C library (MHD 2.x, alpha)
Log | Files | Refs | README | LICENSE

commit 0a6b28ff216b1add5f8cd6b1a6070dadc3fbe19e
parent 06dcd5b4ea98ca5c0566b3b809c470a07d15281b
Author: Evgeny Grin <k2k@drgrin.dev>
Date:   Sat,  3 May 2025 20:48:24 +0300

Improved portability, fixed warnings

Diffstat:
Msrc/mhd2/daemon_start.c | 43++++++++++++++++++++++++++-----------------
Msrc/mhd2/mhd_iovec.h | 3+++
Msrc/mhd2/mhd_itc.h | 7++++---
Msrc/mhd2/mhd_send.c | 27+++++++++++++++------------
Msrc/mhd2/mhd_socket_error_funcs.c | 10+++++-----
Msrc/mhd2/mhd_sockets_funcs.c | 8++++----
Msrc/mhd2/mhd_sockets_macros.h | 16+++++++++++++---
Msrc/mhd2/response_from.c | 5+++--
Msrc/mhd2/sys_sockets_headers.h | 30++++++++++++++++++++++++++----
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 */