1 /* Internal declarations for sys/timex.h.
2    Copyright (C) 2014-2022 Free Software Foundation, Inc.
3    This file is part of the GNU C Library.
4 
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9 
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
14 
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, see
17    <https://www.gnu.org/licenses/>.  */
18 
19 #ifndef	_INCLUDE_SYS_TIMEX_H
20 #define	_INCLUDE_SYS_TIMEX_H	1
21 
22 #include_next <sys/timex.h>
23 
24 # ifndef _ISOMAC
25 
26 extern int __adjtimex (struct timex *__ntx) __nonnull ((1));
libc_hidden_proto(__adjtimex)27 libc_hidden_proto (__adjtimex)
28 
29 #  include <time.h>
30 #  include <struct___timeval64.h>
31 /* Local definition of 64 bit time supporting timex struct */
32 #  if __TIMESIZE == 64
33 #   define __timex64 timex
34 #   define __clock_adjtime64 __clock_adjtime
35 #   define ___adjtimex64 ___adjtimex
36 #   define __ntptimeval64 ntptimeval
37 #   define __ntp_gettime64 __ntp_gettime
38 #   define __ntp_gettimex64 __ntp_gettimex
39 #  else
40 
41 struct __timex64
42 {
43   unsigned int modes;          /* mode selector */
44   int :32;                     /* pad */
45   long long int offset;            /* time offset (usec) */
46   long long int freq;              /* frequency offset (scaled ppm) */
47   long long int maxerror;          /* maximum error (usec) */
48   long long int esterror;          /* estimated error (usec) */
49   int status;                  /* clock command/status */
50   int :32;                     /* pad */
51   long long int constant;          /* pll time constant */
52   long long int precision;         /* clock precision (usec) (read only) */
53   long long int tolerance;         /* clock frequency tolerance (ppm) (ro) */
54   struct __timeval64 time;     /* (read only, except for ADJ_SETOFFSET) */
55   long long int tick;              /* (modified) usecs between clock ticks */
56   long long int ppsfreq;           /* pps frequency (scaled ppm) (ro) */
57   long long int jitter;            /* pps jitter (us) (ro) */
58   int shift;                   /* interval duration (s) (shift) (ro) */
59   int :32;                     /* pad */
60   long long int stabil;            /* pps stability (scaled ppm) (ro) */
61   long long int jitcnt;            /* jitter limit exceeded (ro) */
62   long long int calcnt;            /* calibration intervals (ro) */
63   long long int errcnt;            /* calibration errors (ro) */
64   long long int stbcnt;            /* stability limit exceeded (ro) */
65 
66   int tai;                     /* TAI offset (ro) */
67 
68   int  :32;
69   int  :32;
70   int  :32;
71   int  :32;
72   int  :32;
73   int  :32;
74   int  :32;
75   int  :32;
76   int  :32;
77   int  :32;
78   int  :32;
79 };
80 extern int __clock_adjtime64 (const clockid_t clock_id, struct __timex64 *tx64) __nonnull((2));
81 libc_hidden_proto (__clock_adjtime64);
82 extern int ___adjtimex64 (struct __timex64 *tx64) __nonnull ((1));
83 libc_hidden_proto (___adjtimex64)
84 
85 struct __ntptimeval64
86 {
87   struct __timeval64 time;	/* current time (ro) */
88   long int maxerror;	/* maximum error (us) (ro) */
89   long int esterror;	/* estimated error (us) (ro) */
90   long int tai;		/* TAI offset (ro) */
91 
92   long int __glibc_reserved1;
93   long int __glibc_reserved2;
94   long int __glibc_reserved3;
95   long int __glibc_reserved4;
96 };
97 extern int __ntp_gettime64 (struct __ntptimeval64 *ntv) __nonnull ((1));
98 libc_hidden_proto (__ntp_gettime64)
99 extern int __ntp_gettimex64 (struct __ntptimeval64 *ntv) __nonnull ((1));
100 libc_hidden_proto (__ntp_gettimex64)
101 
102 #  endif
103 
104 /* Convert a known valid struct timex into a struct __timex64.  */
105 static inline struct __timex64
106 valid_timex_to_timex64 (const struct timex tx)
107 {
108   struct __timex64 tx64;
109 
110   tx64.modes = tx.modes;
111   tx64.offset = tx.offset;
112   tx64.freq = tx.freq;
113   tx64.maxerror = tx.maxerror;
114   tx64.esterror = tx.esterror;
115   tx64.status = tx.status;
116   tx64.constant = tx.constant;
117   tx64.precision = tx.precision;
118   tx64.tolerance = tx.tolerance;
119   tx64.time = valid_timeval_to_timeval64 (tx.time);
120   tx64.tick = tx.tick;
121   tx64.ppsfreq = tx.ppsfreq;
122   tx64.jitter = tx.jitter;
123   tx64.shift = tx.shift;
124   tx64.stabil = tx.stabil;
125   tx64.jitcnt = tx.jitcnt;
126   tx64.calcnt = tx.calcnt;
127   tx64.errcnt = tx.errcnt;
128   tx64.stbcnt = tx.stbcnt;
129   tx64.tai = tx.tai;
130 
131   return tx64;
132 }
133 
134 /* Convert a known valid struct __timex64 into a struct timex.  */
135 static inline struct timex
valid_timex64_to_timex(const struct __timex64 tx64)136 valid_timex64_to_timex (const struct __timex64 tx64)
137 {
138   struct timex tx;
139 
140   tx.modes = tx64.modes;
141   tx.offset = tx64.offset;
142   tx.freq = tx64.freq;
143   tx.maxerror = tx64.maxerror;
144   tx.esterror = tx64.esterror;
145   tx.status = tx64.status;
146   tx.constant = tx64.constant;
147   tx.precision = tx64.precision;
148   tx.tolerance = tx64.tolerance;
149   tx.time = valid_timeval64_to_timeval (tx64.time);
150   tx.tick = tx64.tick;
151   tx.ppsfreq = tx64.ppsfreq;
152   tx.jitter = tx64.jitter;
153   tx.shift = tx64.shift;
154   tx.stabil = tx64.stabil;
155   tx.jitcnt = tx64.jitcnt;
156   tx.calcnt = tx64.calcnt;
157   tx.errcnt = tx64.errcnt;
158   tx.stbcnt = tx64.stbcnt;
159   tx.tai = tx64.tai;
160 
161   return tx;
162 }
163 
164 /* Convert a known valid struct ntptimeval into a struct __ntptimeval64.  */
165 static inline struct __ntptimeval64
valid_ntptimeval_to_ntptimeval64(const struct ntptimeval ntv)166 valid_ntptimeval_to_ntptimeval64 (const struct ntptimeval ntv)
167 {
168   struct __ntptimeval64 ntv64;
169 
170   ntv64.time = valid_timeval_to_timeval64 (ntv.time);
171   ntv64.maxerror = ntv.maxerror;
172   ntv64.esterror = ntv.esterror;
173   ntv64.tai = ntv.tai;
174   ntv64.__glibc_reserved1 = 0;
175   ntv64.__glibc_reserved2 = 0;
176   ntv64.__glibc_reserved3 = 0;
177   ntv64.__glibc_reserved4 = 0;
178 
179   return ntv64;
180 }
181 
182 /* Convert a known valid struct __ntptimeval64 into a struct ntptimeval.  */
183 static inline struct ntptimeval
valid_ntptimeval64_to_ntptimeval(const struct __ntptimeval64 ntp64)184 valid_ntptimeval64_to_ntptimeval (const struct __ntptimeval64 ntp64)
185 {
186   struct ntptimeval ntp;
187 
188   ntp.time = valid_timeval64_to_timeval (ntp64.time);
189   ntp.maxerror = ntp64.maxerror;
190   ntp.esterror = ntp64.esterror;
191   ntp.tai = ntp64.tai;
192   ntp.__glibc_reserved1 = 0;
193   ntp.__glibc_reserved2 = 0;
194   ntp.__glibc_reserved3 = 0;
195   ntp.__glibc_reserved4 = 0;
196 
197   return ntp;
198 }
199 # endif /* _ISOMAC */
200 #endif /* sys/timex.h */
201