commit d8d278dd8d48b349ec7b9f193dc4d53ae6625589
parent d5702562a9a9383960af7fea19984b826bc41079
Author: Evgeny Grin (Karlson2k) <k2k@drgrin.dev>
Date: Sat, 27 Dec 2025 18:32:44 +0100
upgraded_net.c: improved portability
Diffstat:
1 file changed, 34 insertions(+), 15 deletions(-)
diff --git a/src/mhd2/upgraded_net.c b/src/mhd2/upgraded_net.c
@@ -86,7 +86,8 @@ mhd_sleep (uint_fast32_t millisec)
#if defined(_WIN32)
Sleep (millisec);
#elif defined(HAVE_NANOSLEEP)
- struct timespec slp = {millisec / 1000, (millisec % 1000) * 1000000};
+ struct timespec slp = { (time_t) (millisec / 1000),
+ (long) ((millisec % 1000) * 1000000l)};
struct timespec rmn;
int num_retries = 0;
while (0 != nanosleep (&slp, &rmn))
@@ -252,19 +253,28 @@ MHD_upgraded_recv (struct MHD_UpgradedHandle *MHD_RESTRICT urh,
int wait_err;
struct timeval tmvl;
-# ifdef MHD_SOCKETS_KIND_POSIX
+# ifdef HAVE_TIME_T
tmvl.tv_sec = (time_t) (max_wait_millisec / 1000);
-# else /* MHD_SOCKETS_KIND_WINSOCK */
+# else /* ! HAVE_TIME_T */
tmvl.tv_sec = (long) (max_wait_millisec / 1000);
-# endif /* MHD_SOCKETS_KIND_WINSOCK */
+# endif /* ! HAVE_TIME_T */
if ((max_wait_millisec / 1000 != (uint_fast64_t) tmvl.tv_sec) ||
- (0 > tmvl.tv_sec))
+ ((0 >= tmvl.tv_sec) && (0 != tmvl.tv_sec))) /* Avoid signed/unsigned warnings */
{
- tmvl.tv_sec = mhd_TIMEVAL_TV_SEC_MAX;
+ /* Do not bother figuring out the real maximum 'time_t' value.
+ '0x7FFFFFFF' is large enough to be already unrealistic and should
+ fit most of signed or unsigned time_t types. */
+ tmvl.tv_sec = 0x7FFFFFFF;
tmvl.tv_usec = 0;
}
else
- tmvl.tv_usec = (int) (max_wait_millisec % 1000);
+ {
+# ifdef HAVE_SUSECONDS_T
+ tmvl.tv_usec = (suseconds_t) ((max_wait_millisec % 1000) * 1000);
+# else /* ! HAVE_SUSECONDS_T */
+ tmvl.tv_usec = (long) ((max_wait_millisec % 1000) * 1000);
+# endif /* ! HAVE_SUSECONDS_T */
+ }
FD_ZERO (&rfds);
FD_SET (socket_fd, &rfds);
@@ -495,20 +505,29 @@ MHD_upgraded_send (struct MHD_UpgradedHandle *MHD_RESTRICT urh,
}
else
{
-# ifdef MHD_SOCKETS_KIND_POSIX
- tmvl.tv_sec = (time_t) (wait_left / 1000);
-# else /* MHD_SOCKETS_KIND_WINSOCK */
- tmvl.tv_sec = (long) (wait_left / 1000);
-# endif /* MHD_SOCKETS_KIND_WINSOCK */
+# ifdef HAVE_TIME_T
+ tmvl.tv_sec = (time_t) (max_wait_millisec / 1000);
+# else /* ! HAVE_TIME_T */
+ tmvl.tv_sec = (long) (max_wait_millisec / 1000);
+# endif /* ! HAVE_TIME_T */
if ((max_wait_millisec / 1000 != (uint_fast64_t) tmvl.tv_sec) ||
- (0 > tmvl.tv_sec))
+ ((0 >= tmvl.tv_sec) && (0 != tmvl.tv_sec))) /* Avoid signed/unsigned warnings */
{
- tmvl.tv_sec = mhd_TIMEVAL_TV_SEC_MAX;
+ /* Do not bother figuring out the real maximum 'time_t' value.
+ '0x7FFFFFFF' is large enough to be already unrealistic and should
+ fit most of signed or unsigned time_t types. */
+ tmvl.tv_sec = 0x7FFFFFFF;
tmvl.tv_usec = 0;
max_wait = true;
}
else
- tmvl.tv_usec = (int) (max_wait_millisec % 1000);
+ {
+# ifdef HAVE_SUSECONDS_T
+ tmvl.tv_usec = (suseconds_t) ((max_wait_millisec % 1000) * 1000);
+# else /* ! HAVE_SUSECONDS_T */
+ tmvl.tv_usec = (long) ((max_wait_millisec % 1000) * 1000);
+# endif /* ! HAVE_SUSECONDS_T */
+ }
}
FD_ZERO (&wfds);
FD_SET (socket_fd, &wfds);