Forum OpenACS Development: Re: localtime_s

5: Re: localtime_s (response to 2)
Posted by Maurizio Martignano on
Dear Gustaf,
first of all sorry if I continue this discussion where I started it. Next similar issue will be published on Naviserver developer list. Anyhow I had to change your fix into this:
errNum = _localtime32_s(&tlsPtr->ltbuf, clock);
if (sizeof(clock) == 4) {
errNum = _localtime32_s(&tlsPtr->ltbuf, clock);
} else {
errNum = _localtime64_s(&tlsPtr->ltbuf, clock);
Why? Because the parameter const time_t *clock comes/goes from/to the "sec" field of variables of type Ns_Time, that is:
typedef struct Ns_Time {
long sec;
long usec;
} Ns_Time;
So, basically, we are mixing up "long" with "time_t". But these two types do not have the same size in Windows 64, where, we have:
sizeof(long) = 4.
sizeof(time_t) = 8.
sizeof(__time32_t) = 4.
while on Linux 64, we have:
sizeof(long) = 8.
sizeof(time_t) = 8.
I hope this clarifies the issue,