From 032504d6f99d7e984e8b5fdd6e4610d24a3839eb Mon Sep 17 00:00:00 2001 From: Michael Elkins Date: Fri, 6 Aug 2010 17:08:34 -0700 Subject: [PATCH] detect availablity of 'long long' cast time_t to 'long long' prior to bitshifting since it can be a float value according to POSIX.1-2008 closes #3439 --- configure.ac | 1 + init.c | 5 ++++- protos.h | 9 +++++++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 88383b3e1..5a8c7f0ec 100644 --- a/configure.ac +++ b/configure.ac @@ -109,6 +109,7 @@ AH_BOTTOM([/* fseeko portability defines */ #endif ]) MUTT_C99_INTTYPES +AC_TYPE_LONG_LONG_INT ac_aux_path_sendmail=/usr/sbin:/usr/lib AC_PATH_PROG(SENDMAIL, sendmail, /usr/sbin/sendmail, $PATH:$ac_aux_path_sendmail) diff --git a/init.c b/init.c index 23512bb0b..656fe1456 100644 --- a/init.c +++ b/init.c @@ -2868,8 +2868,11 @@ static void mutt_srandom (void) /* POSIX.1-2008 states that seed is 'unsigned' without specifying its width. * Use as many of the lower order bits from the current time of day as the seed. * If the upper bound is truncated, that is fine. + * + * tv_sec is integral of type integer or float. Cast to 'long long' before + * bitshift in case it is a float. */ - seed = (tv.tv_sec << 20) | tv.tv_usec; + seed = ((LONGLONG) tv.tv_sec << 20) | tv.tv_usec; srandom(seed); } diff --git a/protos.h b/protos.h index fe00ea84d..140dfc351 100644 --- a/protos.h +++ b/protos.h @@ -410,6 +410,15 @@ void mutt_pattern_free (pattern_t **pat); * Prototypes for broken systems */ +#ifdef HAVE_LONG_LONG_INT +#ifdef LONGLONG +#error LONGLONG is already defined +#endif +#define LONGLONG long long +#else +#define LONGLONG long +#endif + #ifdef HAVE_SRAND48 #define LRAND lrand48 #define SRAND srand48 -- 2.40.0