Looks like you daylight time is broken on Arch Linux and Ubuntu 20.04. -1 is error by mktime.
Why do you think it is related here? Fix you daylight time setting in your system and open a bug report in the relevant packages/systems. Erez From: Lars Munch <l...@segv.dk> Sent: Tuesday, 20 April 2021 22:24 To: Michael Galassi <mich...@galassi.us> Cc: linuxptp-devel@lists.sourceforge.net Subject: Re: [Linuxptp-devel] [PATCH] Fix uninitialized variable in nmea_scan_rmc 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<mailto: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<mailto: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<mailto: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<mailto: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<mailto:Linuxptp-devel@lists.sourceforge.net> https://lists.sourceforge.net/lists/listinfo/linuxptp-devel<https://eur01.safelinks.protection.outlook.com/?url=https%3A%2F%2Flists.sourceforge.net%2Flists%2Flistinfo%2Flinuxptp-devel&data=04%7C01%7Cerez.geva.ext%40siemens.com%7Cde9347c617d04ae9efce08d9043a60db%7C38ae3bcd95794fd4addab42e1495d55a%7C1%7C0%7C637545471634930017%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000&sdata=TZg3VXyc2Y0CUpCUOWt3bY5%2Fr8l5VdbXmfErnxXz5EA%3D&reserved=0>
_______________________________________________ Linuxptp-devel mailing list Linuxptp-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linuxptp-devel