Sorry for the noise. In my previous example I had by accident pasted a huge
number into the example. New example:

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int main()
{
    struct tm t;
    time_t now = time((void*)0);
    localtime_r(&now, &t);
    setenv("TZ", "UTC", 1);
    t.tm_isdst = 1;
    printf("%ld\n", mktime(&t));
    t.tm_isdst = 0;
    printf("%ld\n", mktime(&t));
    t.tm_isdst = -1;
    printf("%ld\n", mktime(&t));
}

Gives:
-1
1618956512
1618956512

This is on my up-to-date Arch Linux and Ubuntu 20.04.
On my Ubuntu 18.04 it's fine.


On Tue, Apr 20, 2021 at 5:55 PM Lars Munch <l...@segv.dk> wrote:

> Ok, so mktime is forced to return in time UTC time scale earlier in the
> code:
>
> #include <stdio.h>
> #include <time.h>
> #include <stdlib.h>
>
> int main()
> {
>     struct tm t;
>     time_t now = time((void*)0);
>     localtime_r(&now, &t);
>     setenv("TZ", "UTC", 1);
>     t.tm_isdst = 4000000001;
>     printf("%ld\n", mktime(&t));
>     t.tm_isdst = 0;
>     printf("%ld\n", mktime(&t));
>     t.tm_isdst = -1;
>     printf("%ld\n", mktime(&t));
> }
>
> 1618941220
> 1618941220
> 1618941220
>
> So my problem might come from the fact that I do not have any timezone
> database on my system.
>
>
>
>
> On Tue, Apr 20, 2021 at 5:30 PM Lars Munch <l...@segv.dk> wrote:
>
>> Indeed, any positive random number in tm.tm_isdst will set DST in effect
>> it seems.
>>
>> On my stripped down ARM system with no timezone information, it will
>> simply return -1.
>>
>> On Tue, Apr 20, 2021 at 4:26 PM Michael Galassi <mich...@galassi.us>
>> wrote:
>>
>>> Somewhere lies a bug.  The following code snippet:
>>> #include <stdio.h>
>>> #include <time.h>
>>> int main()
>>> {
>>>     struct tm t;
>>>     time_t now = time((void*)0);
>>>     localtime_r(&now, &t);
>>>     t.tm_isdst = 1;
>>>     printf("%ld\n", mktime(&t));
>>>     t.tm_isdst = 0;
>>>     printf("%ld\n", mktime(&t));
>>>     t.tm_isdst = -1;
>>>     printf("%ld\n", mktime(&t));
>>> }
>>> Yields:
>>> 1618928503
>>> 1618932103
>>> 1618932103
>>> This is true on FreeBSD 13 and Ubuntu 18.04, both fully patched.
>>>
>>> -michael
>>>
>>> On Tue, Apr 20, 2021 at 7:04 AM Richard Cochran <
>>> richardcoch...@gmail.com> wrote:
>>>
>>>> On Tue, Apr 20, 2021 at 11:44:06AM +0200, Lars Munch wrote:
>>>> > tm_isdst needs to be initialized to make sure mktime does not fail
>>>> > or calculates the wrong time.
>>>>
>>>> No, take a look at the mktime(3) man page.  There you will read the
>>>> following.
>>>>
>>>>        The  mktime() function modifies the fields of the tm structure
>>>> as fol‐
>>>>        lows: tm_wday and tm_yday are set to values determined from
>>>> the  con‐
>>>>        tents  of  the  other  fields;  if structure members are outside
>>>> their
>>>>        valid interval, they will be normalized (so that, for example,
>>>> 40  Oc‐
>>>>        tober  is changed into 9 November); tm_isdst is set (regardless
>>>> of its
>>>>        initial value) to a positive value or to 0, respectively, to
>>>> indicate
>>>>        whether DST is or is not in effect at the specified time.
>>>>
>>>> Thanks,
>>>> Richard
>>>>
>>>>
>>>> _______________________________________________
>>>> Linuxptp-devel mailing list
>>>> Linuxptp-devel@lists.sourceforge.net
>>>> https://lists.sourceforge.net/lists/listinfo/linuxptp-devel
>>>>
>>>
_______________________________________________
Linuxptp-devel mailing list
Linuxptp-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxptp-devel

Reply via email to