Commit eab0987d authored by Claudio Saavedra's avatar Claudio Saavedra

SoupDate: Move from GTimeVal to glibc APIs in soup_date_to_time_t()

GTimeVal is deprecated, so let's stop using it. Also add a test
for soup_date_to_time_t() which was missing.

The fixes in this change use time_t-specific APIs from libc only.
As such, they are not necessarily Y2038-safe depending on the
architecture. time_t is not safe anyway so there's no point in
trying to be. This method will be deprecated in the next release
cycle anyway.
parent 4d830d3f
......@@ -680,7 +680,8 @@ soup_date_to_string (SoupDate *date, SoupDateFormat format)
* soup_date_to_time_t:
* @date: a #SoupDate
*
* Converts @date to a <type>time_t</type>.
* Converts @date to a <type>time_t</type>, assumming it to be in
* UTC.
*
* If @date is not representable as a <type>time_t</type>, it will be
* clamped into range. (In particular, some HTTP cookies have
......@@ -691,31 +692,34 @@ soup_date_to_string (SoupDate *date, SoupDateFormat format)
time_t
soup_date_to_time_t (SoupDate *date)
{
time_t tt;
GTimeVal val;
GDateTime *datetime;
gint64 seconds;
g_return_val_if_fail (date != NULL, 0);
/* FIXME: offset, etc */
if (date->year < 1970)
return 0;
/* If the year is later than 2038, we're guaranteed to
* overflow a 32-bit time_t. (If it's exactly 2038, we'll
* *probably* overflow, but only by a little, and it's easiest
* to test that at the end by seeing if the result has turned
* negative.)
* to just clamp down the value if it's above G_MAXINT32.
*/
if (sizeof (time_t) == 4 && date->year > 2038)
return (time_t)0x7fffffff;
return (time_t)G_MAXINT32;
datetime = g_date_time_new_utc (date->year,
date->month,
date->day,
date->hour,
date->minute,
date->second);
seconds = g_date_time_to_unix (datetime);
soup_date_to_timeval (date, &val);
tt = val.tv_sec;
g_date_time_unref (datetime);
if (sizeof (time_t) == 4 && tt < 0)
return (time_t)0x7fffffff;
return tt;
return (time_t) (sizeof (time_t) == 4 ? MIN(seconds, G_MAXINT32) : seconds);
}
/**
......
......@@ -171,6 +171,8 @@ check_ok_time_t (void)
g_assert_cmpint (date->minute, ==, 9);
g_assert_cmpint (date->second, ==, 7);
g_assert_cmpuint (TIME_T, ==, soup_date_to_time_t (date));
soup_date_free (date);
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment