1 /* 2 * ntp_types.h - defines how int32 and u_int32 are treated. 3 * 4 * New style: Make sure C99 fixed width integer types are available: 5 * intN_t and uintN_t 6 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 9 * as int and u_int. 10 * For 32 bit systems, define them as long and u_long 11 */ 12 #ifndef NTP_TYPES_H 13 #define NTP_TYPES_H 14 15 #include <sys/types.h> 16 #if defined(HAVE_INTTYPES_H) 17 # include <inttypes.h> 18 #endif 19 #if defined(HAVE_STDINT_H) 20 # include <stdint.h> 21 #endif 22 23 /* Bug 2813 */ 24 #ifdef HAVE_LIMITS_H 25 # include <limits.h> 26 #endif 27 28 #include "ntp_machine.h" 29 30 31 #ifndef TRUE 32 # define TRUE 1 33 #endif 34 #ifndef FALSE 35 # define FALSE 0 36 #endif 37 38 #ifdef HAVE_STDBOOL_H 39 # include <stdbool.h> 40 #else 41 typedef int bool; /* Can't use enum TRUE/FALSE because of above */ 42 #endif 43 44 45 /* 46 * This is another naming conflict. 47 * On NetBSD for MAC the macro "mac" is defined as 1 48 * this is fun for us as a packet structure contains an 49 * optional "mac" member - severe confusion results 8-) 50 * As we hopefully do not have to rely on that macro we 51 * just undefine that. 52 */ 53 #ifdef mac 54 #undef mac 55 #endif 56 57 /* 58 * used to quiet compiler warnings 59 */ 60 #ifndef UNUSED_ARG 61 #define UNUSED_ARG(arg) ((void)(arg)) 62 #endif 63 #ifndef UNUSED_LOCAL 64 #define UNUSED_LOCAL(arg) ((void)(arg)) 65 #endif 66 67 /* 68 * COUNTOF(array) - size of array in elements 69 */ 70 #define COUNTOF(arr) (sizeof(arr) / sizeof((arr)[0])) 71 72 /* 73 * VMS DECC (v4.1), {u_char,u_short,u_long} are only in SOCKET.H, 74 * and u_int isn't defined anywhere 75 */ 76 #if defined(VMS) 77 #include <socket.h> 78 typedef unsigned int u_int; 79 #endif /* VMS */ 80 81 #ifdef HAVE_UINT32_T 82 # ifndef HAVE_INT32 83 typedef int32_t int32; 84 # endif 85 # ifndef HAVE_U_INT32 86 typedef uint32_t u_int32; 87 # if defined(UINT32_MAX) && !defined(U_INT32_MAX) 88 # define U_INT32_MAX UINT32_MAX 89 # endif 90 # endif 91 #elif (SIZEOF_INT == 4) 92 # if !defined(HAVE_INT32) && !defined(int32) 93 typedef int int32; 94 # ifndef INT32_MIN 95 # define INT32_MIN INT_MIN 96 # endif 97 # ifndef INT32_MAX 98 # define INT32_MAX INT_MAX 99 # endif 100 # endif 101 # if !defined(HAVE_U_INT32) && !defined(u_int32) 102 typedef unsigned u_int32; 103 # if defined(UINT_MAX) && !defined(U_INT32_MAX) 104 # define U_INT32_MAX UINT_MAX 105 # endif 106 # endif 107 #else /* SIZEOF_INT != 4 */ 108 # if (SIZEOF_LONG == 4) 109 # if !defined(HAVE_INT32) && !defined(int32) 110 typedef long int32; 111 # ifndef INT32_MIN 112 # define INT32_MIN LONG_MIN 113 # endif 114 # ifndef INT32_MAX 115 # define INT32_MAX LONG_MAX 116 # endif 117 # endif 118 # if !defined(HAVE_U_INT32) && !defined(u_int32) 119 typedef unsigned long u_int32; 120 # if defined(ULONG_MAX) && !defined(U_INT32_MAX) 121 # define U_INT32_MAX ULONG_MAX 122 # endif 123 # endif 124 # else /* SIZEOF_LONG != 4 */ 125 # include "Bletch: what's 32 bits on this machine?" 126 # endif 127 #endif /* !HAVE_UINT32_T && SIZEOF_INT != 4 */ 128 129 #ifndef U_INT32_MAX 130 # define U_INT32_MAX 0xffffffff 131 #endif 132 133 134 /* 135 * Ugly dance to find out if we have 64bit integer type. 136 */ 137 #if !defined(HAVE_INT64) 138 139 /* assume best for now, fix if frustrated later. */ 140 # define HAVE_INT64 141 # define HAVE_U_INT64 142 143 /* now check the cascade. Feel free to add things. */ 144 # ifdef INT64_MAX 145 146 typedef int64_t int64; 147 typedef uint64_t u_int64; 148 149 # elif SIZEOF_LONG == 8 150 151 typedef long int64; 152 typedef unsigned long u_int64; 153 154 # elif SIZEOF_LONG_LONG == 8 155 156 typedef long long int64; 157 typedef unsigned long long u_int64; 158 159 # else 160 161 /* no 64bit scalar, give it up. */ 162 # undef HAVE_INT64 163 # undef HAVE_U_INT64 164 165 # endif 166 167 #endif 168 169 /* 170 * and here the trouble starts: We need a representation with more than 171 * 32 bits. If a scalar of that size is not available, we need a struct 172 * that holds the value in split representation. 173 * 174 * To ease the usage a bit, we alwys use a union that is in processor 175 * byte order and might or might not contain a 64-bit scalar. 176 */ 177 178 #if SIZEOF_SHORT != 2 179 # error short is not 2 bytes -- what is 16 bit integer on this target? 180 #endif 181 182 typedef union { 183 # ifdef WORDS_BIGENDIAN 184 struct { 185 int16_t hh; uint16_t hl; uint16_t lh; uint16_t ll; 186 } w_s; 187 struct { 188 uint16_t hh; uint16_t hl; uint16_t lh; uint16_t ll; 189 } W_s; 190 struct { 191 int32 hi; u_int32 lo; 192 } d_s; 193 struct { 194 u_int32 hi; u_int32 lo; 195 } D_s; 196 # else 197 struct { 198 uint16_t ll; uint16_t lh; uint16_t hl; int16_t hh; 199 } w_s; 200 struct { 201 uint16_t ll; uint16_t lh; uint16_t hl; uint16_t hh; 202 } W_s; 203 struct { 204 u_int32 lo; int32 hi; 205 } d_s; 206 struct { 207 u_int32 lo; u_int32 hi; 208 } D_s; 209 # endif 210 211 # ifdef HAVE_INT64 212 int64 q_s; /* signed quad scalar */ 213 u_int64 Q_s; /* unsigned quad scalar */ 214 # endif 215 } vint64; /* variant int 64 */ 216 217 218 typedef uint8_t ntp_u_int8_t; 219 typedef uint16_t ntp_u_int16_t; 220 typedef uint32_t ntp_u_int32_t; 221 222 typedef struct ntp_uint64_t { u_int32 val[2]; } ntp_uint64_t; 223 224 typedef uint16_t associd_t; /* association ID */ 225 #define ASSOCID_MAX USHRT_MAX 226 typedef u_int32 keyid_t; /* cryptographic key ID */ 227 #define KEYID_T_MAX (0xffffffff) 228 229 typedef u_int32 tstamp_t; /* NTP seconds timestamp */ 230 231 /* 232 * Cloning malloc()'s behavior of always returning pointers suitably 233 * aligned for the strictest alignment requirement of any type is not 234 * easy to do portably, as the maximum alignment required is not 235 * exposed. Use the size of a union of the types known to represent the 236 * strictest alignment on some platform. 237 */ 238 typedef union max_alignment_tag { 239 double d; 240 } max_alignment; 241 242 #define MAXALIGN sizeof(max_alignment) 243 #define ALIGN_UNITS(sz) (((sz) + MAXALIGN - 1) / MAXALIGN) 244 #define ALIGNED_SIZE(sz) (MAXALIGN * ALIGN_UNITS(sz)) 245 #define INC_ALIGNED_PTR(b, m) ((void *)aligned_ptr((void *)(b), m)) 246 247 static inline 248 max_alignment * 249 aligned_ptr( 250 max_alignment * base, 251 size_t minsize 252 ) 253 { 254 return base + ALIGN_UNITS((minsize < 1) ? 1 : minsize); 255 } 256 257 /* 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 262 * within NTP. 263 */ 264 #ifndef SYS_WINNT 265 #define sock_timeval timeval 266 #endif 267 268 /* 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 275 * refclock_open(). 276 * Similarly, the termios emulation in the Windows code needs to know 277 * about serial ports being closed, while the Posix systems do not. 278 */ 279 #ifndef SYS_WINNT 280 # define tty_open(f, a, m) open(f, a, m) 281 # define closeserial(fd) close(fd) 282 # define closesocket(fd) close(fd) 283 typedef int SOCKET; 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()) 289 #endif 290 291 292 293 #endif /* NTP_TYPES_H */ 294