✘64-bit time_t on glibc 2.34 and up
Gary E. Miller
gem at rellim.com
Fri Jan 13 01:10:13 UTC 2023
Yo All!
Cross-posted to gpsd-dev and devel at ntpsec.org
Recent glibc (2.34 and up) and recent Linux kernels, allow 64 bit
time_t on 32-bit Linux without much work.
But...
How to get that 2038 compatible time to ntpd and chronyd? That is a
much bigger problem.
Extracted from include/ntpshm.h:
struct shmTime
{
int mode;
volatile int count;
time_t clockTimeStampSec;
int clockTimeStampUSec;
time_t receiveTimeStampSec;
int receiveTimeStampUSec;
int leap; // not leapsecond offset, a notification code
int precision; // log(2) of source jitter
int nsamples; // not used
volatile int valid;
unsigned clockTimeStampNSec; // Unsigned ns timestamps
unsigned receiveTimeStampNSec; // Unsigned ns timestamps
int dummy[8];
};
Note the struct size depends on the size of an int, and the size of time_t.
This is no problem for newer musl on 32-bits. An int is 32-bits and
time_t is 64. Assuming all clients use the same version musl.
This is a problem for glibc on 32 bits. And int is 32-bits, but time_t
is a compile time option (32 or 64 bits).
How does ntpd know what size time_t to use? And thus know the size of
shmTime? How do we know portably, preserving backwards and forwards
compatibility?
In hindsight, maybe shmTime should have started with a 1 char version
field,or magic field. But, no such luck.
Options (for 32-bit only):
1. Do nothing, stick with 32-bit time_t. Fail in 2038.
2. Allow 64-bit time_t and let incompatible ntpd fail.
3. Add run time options to gpsd and ntpd to specify time_t size.
4. gpsd and ntpd always use 64-bit time_t going forward. Admin needs
to mix and match.
5. 1st process to open SHM(0) wins, the other process checks the size
to know the contents.
6. Create a new way to pass time from gpsd to ntpd and chronyd.
Also note, chrony sockets have a similar problem:
#define SOCK_MAGIC 0x534f434b
struct sock_sample {
struct timeval tv;
double offset;
int pulse;
int leap; // notify that a leap second is upcoming
int _pad;
int magic; // must be SOCK_MAGIC
};
Where timeval is:
struct timeval {
time_t tv_sec;
suseconds_t tv_usec;
};
```
Since the sample has a magic value, maybe that can be used to detect versions.
This makes my head hurt...
RGDS
GARY
---------------------------------------------------------------------------
Gary E. Miller Rellim 109 NW Wilmington Ave., Suite E, Bend, OR 97703
gem at rellim.com Tel:+1 541 382 8588
Veritas liberabit vos. -- Quid est veritas?
"If you can't measure it, you can't improve it." - Lord Kelvin
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 851 bytes
Desc: OpenPGP digital signature
URL: <https://lists.ntpsec.org/pipermail/devel/attachments/20230112/5a0ac059/attachment.bin>
More information about the devel
mailing list