2 * ntp_types.h - defines how int32 and u_int32 are treated.
4 * New style: Make sure C99 fixed width integer types are available:
7 * Old style: defines how int32 and u_int32 are treated.
8 * For 64 bit systems like the DEC Alpha, they have to be defined
10 * For 32 bit systems, define them as long and u_long
15 #include <sys/types.h>
16 #if defined(HAVE_INTTYPES_H)
17 # include <inttypes.h>
18 #elif defined(HAVE_STDINT_H)
27 #include "ntp_machine.h"
38 * This is another naming conflict.
39 * On NetBSD for MAC the macro "mac" is defined as 1
40 * this is fun for us as a packet structure contains an
41 * optional "mac" member - severe confusion results 8-)
42 * As we hopefully do not have to rely on that macro we
50 * used to quiet compiler warnings
53 #define UNUSED_ARG(arg) ((void)(arg))
56 #define UNUSED_LOCAL(arg) ((void)(arg))
60 * COUNTOF(array) - size of array in elements
62 #define COUNTOF(arr) (sizeof(arr) / sizeof((arr)[0]))
65 * VMS DECC (v4.1), {u_char,u_short,u_long} are only in SOCKET.H,
66 * and u_int isn't defined anywhere
70 typedef unsigned int u_int;
75 typedef int32_t int32;
78 typedef uint32_t u_int32;
79 # if defined(UINT32_MAX) && !defined(U_INT32_MAX)
80 # define U_INT32_MAX UINT32_MAX
83 #elif (SIZEOF_INT == 4)
84 # if !defined(HAVE_INT32) && !defined(int32)
87 # define INT32_MIN INT_MIN
90 # define INT32_MAX INT_MAX
93 # if !defined(HAVE_U_INT32) && !defined(u_int32)
94 typedef unsigned u_int32;
95 # if defined(UINT_MAX) && !defined(U_INT32_MAX)
96 # define U_INT32_MAX UINT_MAX
99 #else /* SIZEOF_INT != 4 */
100 # if (SIZEOF_LONG == 4)
101 # if !defined(HAVE_INT32) && !defined(int32)
104 # define INT32_MIN LONG_MIN
107 # define INT32_MAX LONG_MAX
110 # if !defined(HAVE_U_INT32) && !defined(u_int32)
111 typedef unsigned long u_int32;
112 # if defined(ULONG_MAX) && !defined(U_INT32_MAX)
113 # define U_INT32_MAX ULONG_MAX
116 # else /* SIZEOF_LONG != 4 */
117 # include "Bletch: what's 32 bits on this machine?"
119 #endif /* !HAVE_UINT32_T && SIZEOF_INT != 4 */
122 # define U_INT32_MAX 0xffffffff
127 * Ugly dance to find out if we have 64bit integer type.
129 #if !defined(HAVE_INT64)
131 /* assume best for now, fix if frustrated later. */
133 # define HAVE_U_INT64
135 /* now check the cascade. Feel free to add things. */
138 typedef int64_t int64;
139 typedef uint64_t u_int64;
141 # elif SIZEOF_LONG == 8
144 typedef unsigned long u_int64;
146 # elif SIZEOF_LONG_LONG == 8
148 typedef long long int64;
149 typedef unsigned long long u_int64;
153 /* no 64bit scalar, give it up. */
162 * and here the trouble starts: We need a representation with more than
163 * 64 bits. If a scalar of that size is not available, we need a struct
164 * that holds the value in split representation.
166 * To ease the usage a bit, we alwys use a union that is in processor
167 * byte order and might or might not contain a 64bit scalar.
170 #if SIZEOF_SHORT != 2
171 # error short is not 2 bytes -- what is 16 bit integer on this target?
175 # ifdef WORDS_BIGENDIAN
177 int16_t hh; uint16_t hl; uint16_t lh; uint16_t ll;
180 uint16_t hh; uint16_t hl; uint16_t lh; uint16_t ll;
183 int32 hi; u_int32 lo;
186 u_int32 hi; u_int32 lo;
190 uint16_t ll; uint16_t lh; uint16_t hl; int16_t hh;
193 uint16_t ll; uint16_t lh; uint16_t hl; uint16_t hh;
196 u_int32 lo; int32 hi;
199 u_int32 lo; u_int32 hi;
204 int64 q_s; /* signed quad scalar */
205 u_int64 Q_s; /* unsigned quad scalar */
207 } vint64; /* variant int 64 */
210 typedef uint8_t ntp_u_int8_t;
211 typedef uint16_t ntp_u_int16_t;
212 typedef uint32_t ntp_u_int32_t;
214 typedef struct ntp_uint64_t { u_int32 val[2]; } ntp_uint64_t;
216 typedef uint16_t associd_t; /* association ID */
217 #define ASSOCID_MAX USHRT_MAX
218 typedef u_int32 keyid_t; /* cryptographic key ID */
219 #define KEYID_T_MAX (0xffffffff)
220 typedef u_int32 tstamp_t; /* NTP seconds timestamp */
223 * Cloning malloc()'s behavior of always returning pointers suitably
224 * aligned for the strictest alignment requirement of any type is not
225 * easy to do portably, as the maximum alignment required is not
226 * exposed. Use the size of a union of the types known to represent the
227 * strictest alignment on some platform.
229 typedef union max_alignment_tag {
233 #define MAXALIGN sizeof(max_alignment)
234 #define ALIGN_UNITS(sz) (((sz) + MAXALIGN - 1) / MAXALIGN)
235 #define ALIGNED_SIZE(sz) (MAXALIGN * ALIGN_UNITS(sz))
236 #define INC_ALIGNED_PTR(b, m) ((void *)aligned_ptr((void *)(b), m))
241 max_alignment * base,
245 return base + ALIGN_UNITS((minsize < 1) ? 1 : minsize);
249 * Macro to use in otherwise-empty source files to comply with ANSI C
250 * requirement that each translation unit (source file) contain some
251 * declaration. This has commonly been done by declaring an unused
252 * global variable of type int or char. An extern reference to exit()
253 * serves the same purpose without bloat.
255 #define NONEMPTY_TRANSLATION_UNIT extern void exit(int);
258 * On Unix struct sock_timeval is equivalent to struct timeval.
259 * On Windows built with 64-bit time_t, sock_timeval.tv_sec is a long
260 * as required by Windows' socket() interface timeout argument, while
261 * timeval.tv_sec is time_t for the more common use as a UTC time
265 #define sock_timeval timeval
269 * On Unix open() works for tty (serial) devices just fine, while on
270 * Windows refclock serial devices are opened using CreateFile, a lower
271 * level than the CRT-provided descriptors, because the C runtime lacks
272 * tty APIs. For refclocks which wish to use open() as well as or
273 * instead of refclock_open(), tty_open() is equivalent to open() on
274 * Unix and implemented in the Windows port similarly to
276 * Similarly, the termios emulation in the Windows code needs to know
277 * about serial ports being closed, while the Posix systems do not.
280 # define tty_open(f, a, m) open(f, a, m)
281 # define closeserial(fd) close(fd)
282 # define closesocket(fd) close(fd)
284 # define INVALID_SOCKET (-1)
285 # define SOCKET_ERROR (-1)
286 # define socket_errno() (errno)
287 #else /* SYS_WINNT follows */
288 # define socket_errno() (errno = WSAGetLastError())
293 #endif /* NTP_TYPES_H */