1 /* 2 * Collect all machine dependent idiosyncrasies in one place. 3 */ 4 5 #ifndef __ntp_machine 6 #define __ntp_machine 7 8 #ifdef HAVE_CONFIG_H 9 # include <config.h> 10 #endif 11 12 #ifdef TIME_WITH_SYS_TIME 13 # include <sys/time.h> 14 # include <time.h> 15 #else 16 # ifdef HAVE_SYS_TIME_H 17 # include <sys/time.h> 18 # else 19 # include <time.h> 20 # endif 21 #endif 22 23 #include "ntp_proto.h" 24 25 /* 26 27 HEY! CHECK THIS OUT! 28 29 The first half of this file is obsolete, and is only there to help 30 reconcile "what went before" with "current behavior". 31 32 The per-system SYS_* #defins ARE NO LONGER USED, with the temporary 33 exception of SYS_WINNT. 34 35 If you find a hunk of code that is bracketed by a SYS_* macro and you 36 *know* that it is still needed, please let us know. In many cases the 37 code fragment is now handled somewhere else by autoconf choices. 38 39 */ 40 41 /* 42 43 INFO ON NEW KERNEL PLL SYS CALLS 44 45 NTP_SYSCALLS_STD - use the "normal" ones 46 NTP_SYSCALL_GET - SYS_ntp_gettime id 47 NTP_SYSCALL_ADJ - SYS_ntp_adjtime id 48 NTP_SYSCALLS_LIBC - ntp_adjtime() and ntp_gettime() are in libc. 49 50 HOW TO GET IP INTERFACE INFORMATION 51 52 Some UNIX V.4 machines implement a sockets library on top of 53 streams. For these systems, you must use send the SIOCGIFCONF down 54 the stream in an I_STR ioctl. This ususally also implies 55 USE_STREAMS_DEVICE FOR IF_CONFIG. Dell UNIX is a notable exception. 56 57 WHAT DOES IOCTL(SIOCGIFCONF) RETURN IN THE BUFFER 58 59 UNIX V.4 machines implement a sockets library on top of streams. 60 When requesting the IP interface configuration with an ioctl(2) calll, 61 an array of ifreq structures are placed in the provided buffer. Some 62 implementations also place the length of the buffer information in 63 the first integer position of the buffer. 64 65 SIZE_RETURNED_IN_BUFFER - size integer is in the buffer 66 67 WILL IOCTL(SIOCGIFCONF) WORK ON A SOCKET 68 69 Some UNIX V.4 machines do not appear to support ioctl() requests for the 70 IP interface configuration on a socket. They appear to require the use 71 of the streams device instead. 72 73 USE_STREAMS_DEVICE_FOR_IF_CONFIG - use the /dev/ip device for configuration 74 75 MISC 76 77 HAVE_PROTOTYPES - Prototype functions 78 DOSYNCTODR - Resync TODR clock every hour. 79 RETSIGTYPE - Define signal function type. 80 NO_SIGNED_CHAR_DECL - No "signed char" see include/ntp.h 81 LOCK_PROCESS - Have plock. 82 */ 83 84 /* 85 * Set up for prototyping (duplicated from ntp_types.h) 86 */ 87 #ifndef P 88 #if defined(__STDC__) || defined(HAVE_PROTOTYPES) 89 #define P(x) x 90 #else /* not __STDC__ and not HAVE_PROTOTYPES */ 91 #define P(x) () 92 #endif /* not __STDC__ and not HAVE_PROTOTYPES */ 93 #endif /* P */ 94 95 #if !defined(HAVE_NTP_ADJTIME) && defined(HAVE___ADJTIMEX) 96 # define ntp_adjtime __adjtimex 97 #endif 98 99 #if 0 100 101 /* 102 * IRIX 4.X and IRIX 5.x 103 */ 104 #if defined(SYS_IRIX4)||defined(SYS_IRIX5) 105 # define ADJTIME_IS_ACCURATE 106 # define LOCK_PROCESS 107 #endif 108 109 /* 110 * Ultrix 111 * Note: posix version has NTP_POSIX_SOURCE and HAVE_SIGNALED_IO 112 */ 113 #if defined(SYS_ULTRIX) 114 # define S_CHAR_DEFINED 115 # define NTP_SYSCALLS_STD 116 # define HAVE_MODEM_CONTROL 117 #endif 118 119 /* 120 * AUX 121 */ 122 #if defined(SYS_AUX2) || defined(SYS_AUX3) 123 # define NO_SIGNED_CHAR_DECL 124 # define LOCK_PROCESS 125 # define NTP_POSIX_SOURCE 126 /* 127 * This requires that _POSIX_SOURCE be forced on the 128 * compiler command flag. We can't do it here since this 129 * file is included _after_ the system header files and we 130 * need to let _them_ know we're POSIX. We do this in 131 * compilers/aux3.gcc... 132 */ 133 # define LOG_NTP LOG_LOCAL1 134 #endif 135 136 /* 137 * HPUX 138 */ 139 #if defined(SYS_HPUX) 140 # define getdtablesize() sysconf(_SC_OPEN_MAX) 141 # define setlinebuf(f) setvbuf(f, NULL, _IOLBF, 0) 142 # define NO_SIGNED_CHAR_DECL 143 # define LOCK_PROCESS 144 #endif 145 146 /* 147 * BSD/OS 2.0 and above 148 */ 149 #if defined(SYS_BSDI) 150 # define USE_FSETOWNCTTY /* this funny system demands a CTTY for FSETOWN */ 151 #endif 152 153 /* 154 * FreeBSD 2.0 and above 155 */ 156 #ifdef SYS_FREEBSD 157 # define KERNEL_PLL 158 #endif 159 160 /* 161 * Linux 162 */ 163 #if defined(SYS_LINUX) 164 # define ntp_adjtime __adjtimex 165 #endif 166 167 /* 168 * PTX 169 */ 170 #if defined(SYS_PTX) 171 # define LOCK_PROCESS 172 struct timezone { int __0; }; /* unused placebo */ 173 /* 174 * no comment !@! 175 */ 176 typedef unsigned int u_int; 177 # ifndef _NETINET_IN_SYSTM_INCLUDED /* i am about to comment... */ 178 typedef unsigned char u_char; 179 typedef unsigned short u_short; 180 typedef unsigned long u_long; 181 # endif 182 #endif 183 184 /* 185 * UNIX V.4 on and NCR 3000 186 */ 187 #if defined(SYS_SVR4) 188 # define STREAM 189 # define LOCK_PROCESS 190 # define SIZE_RETURNED_IN_BUFFER 191 #endif 192 193 /* 194 * (Univel/Novell) Unixware1 SVR4 on intel x86 processor 195 */ 196 #if defined(SYS_UNIXWARE1) 197 /* #define _POSIX_SOURCE */ 198 # define STREAM 199 # define STREAMS 200 # undef STEP_SLEW /* TWO step */ 201 # define LOCK_PROCESS 202 # define SIZE_RETURNED_IN_BUFFER 203 # include <sys/sockio.h> 204 # include <sys/types.h> 205 # include <netinet/in_systm.h> 206 #endif 207 208 /* 209 * DomainOS 210 */ 211 #if defined(SYS_DOMAINOS) 212 # define NTP_SYSCALLS_STD 213 /* older versions of domain/os don't have class D */ 214 # ifndef IN_CLASSD 215 # define IN_CLASSD(i) (((long)(i) & 0xf0000000) == 0xe0000000) 216 # define IN_CLASSD_NET 0xf0000000 217 # define IN_CLASSD_NSHIFT 28 218 # define IN_CLASSD_HOST 0xfffffff 219 # define IN_MULTICAST(i) IN_CLASSD(i) 220 # endif 221 #endif 222 223 /* 224 * Fujitsu UXP/V 225 */ 226 #if defined(SYS_UXPV) 227 # define LOCK_PROCESS 228 # define SIZE_RETURNED_IN_BUFFER 229 #endif 230 231 232 #endif /* 0 */ 233 234 /* 235 * Define these here for non-Windows NT systems 236 * SOCKET and INVALID_SOCKET are native macros 237 * on Windows NT and since they have different 238 * requirements we use them in the code and 239 * make them macros for everyone else 240 */ 241 #ifndef SYS_WINNT 242 # define SOCKET int 243 # define INVALID_SOCKET -1 244 # define SOCKET_ERROR -1 245 # define closesocket close 246 #endif 247 /* 248 * Windows NT 249 */ 250 #if defined(SYS_WINNT) 251 # if !defined(HAVE_CONFIG_H) || !defined(__config) 252 # include <config.h> 253 # endif /* HAVE_CONFIG_H) */ 254 # include <windows.h> 255 # include <ws2tcpip.h> 256 # include <winsock2.h> 257 258 # define ifreq _INTERFACE_INFO 259 # define ifr_flags iiFlags 260 # define ifr_addr iiAddress.AddressIn 261 # define ifr_broadaddr iiBroadcastAddress.AddressIn 262 # define ifr_mask iiNetmask.AddressIn 263 # define zz_family sin_family 264 265 # define S_IFREG _S_IFREG 266 # define stat _stat 267 # define isascii __isascii 268 # define isatty _isatty 269 # define mktemp _mktemp 270 # define unlink _unlink 271 # define fileno _fileno 272 # define write _write 273 #ifndef close 274 # define close _close 275 #endif 276 # undef interface 277 # include <process.h> 278 #define getpid _getpid 279 /* 280 * Defining registers are not a good idea on Windows 281 * This gets rid of the usage 282 */ 283 #ifndef register 284 # define register 285 #endif 286 typedef char *caddr_t; 287 # define vsnprintf _vsnprintf 288 #endif /* SYS_WINNT */ 289 290 int ntp_set_tod P((struct timeval *tvp, void *tzp)); 291 292 #if defined (SYS_CYGWIN32) 293 #include <windows.h> 294 #define __int64 long long 295 #endif 296 297 /*casey Tue May 27 15:45:25 SAT 1997*/ 298 #ifdef SYS_VXWORKS 299 300 /* casey's new defines */ 301 #define NO_MAIN_ALLOWED 1 302 #define NO_NETDB 1 303 #define NO_RENAME 1 304 305 /* in vxWorks we use FIONBIO, but the others are defined for old systems, so 306 * all hell breaks loose if we leave them defined we define USE_FIONBIO to 307 * undefine O_NONBLOCK FNDELAY O_NDELAY where necessary. 308 */ 309 #define USE_FIONBIO 1 310 /* end my new defines */ 311 312 #define TIMEOFDAY 0x0 /* system wide realtime clock */ 313 #define HAVE_GETCLOCK 1 /* configure does not set this ... */ 314 #define HAVE_NO_NICE 1 /* configure does not set this ... */ 315 #define HAVE_RANDOM 1 /* configure does not set this ... */ 316 #define HAVE_SRANDOM 1 /* configure does not set this ... */ 317 318 #define NODETACH 1 319 320 /* vxWorks specific additions to take care of its 321 * unix (non)complicance 322 */ 323 324 #include "vxWorks.h" 325 #include "ioLib.h" 326 #include "taskLib.h" 327 #include "time.h" 328 329 extern int sysClkRateGet P(()); 330 331 /* usrtime.h 332 * Bob Herlien's excellent time code find it at: 333 * ftp://ftp.atd.ucar.edu/pub/vxworks/vx/usrTime.shar 334 * I would recommend this instead of clock_[g|s]ettime() plus you get 335 * adjtime() too ... casey 336 */ 337 /* 338 extern int gettimeofday P(( struct timeval *tp, struct timezone *tzp )); 339 extern int settimeofday P((struct timeval *, struct timezone *)); 340 extern int adjtime P(( struct timeval *delta, struct timeval *olddelta )); 341 */ 342 343 /* in machines.c */ 344 extern void sleep P((int seconds)); 345 extern void alarm P((int seconds)); 346 /* machines.c */ 347 348 349 /* this is really this */ 350 #define getpid taskIdSelf 351 #define getclock clock_gettime 352 #define fcntl ioctl 353 #define _getch getchar 354 355 /* define this away for vxWorks */ 356 #define openlog(x,y) 357 /* use local defines for these */ 358 #undef min 359 #undef max 360 361 #endif /* SYS_VXWORKS */ 362 363 #ifdef NO_NETDB 364 /* These structures are needed for gethostbyname() etc... */ 365 /* structures used by netdb.h */ 366 struct hostent { 367 char *h_name; /* official name of host */ 368 char **h_aliases; /* alias list */ 369 int h_addrtype; /* host address type */ 370 int h_length; /* length of address */ 371 char **h_addr_list; /* list of addresses from name server */ 372 #define h_addr h_addr_list[0] /* address, for backward compatibility */ 373 }; 374 375 struct servent { 376 char *s_name; /* official service name */ 377 char **s_aliases; /* alias list */ 378 int s_port; /* port # */ 379 char *s_proto; /* protocol to use */ 380 }; 381 extern int h_errno; 382 383 #define TRY_AGAIN 2 384 385 struct hostent *gethostbyname P((char * netnum)); 386 struct hostent *gethostbyaddr P((char * netnum, int size, int addr_type)); 387 /* type is the protocol */ 388 struct servent *getservbyname P((char *name, char *type)); 389 #endif /* NO_NETDB */ 390 391 #ifdef NO_MAIN_ALLOWED 392 /* we have no main routines so lets make a plan */ 393 #define CALL(callname, progname, callmain) \ 394 extern int callmain (int,char**); \ 395 void callname (a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10) \ 396 char *a0; \ 397 char *a1; \ 398 char *a2; \ 399 char *a3; \ 400 char *a4; \ 401 char *a5; \ 402 char *a6; \ 403 char *a7; \ 404 char *a8; \ 405 char *a9; \ 406 char *a10; \ 407 { \ 408 char *x[11]; \ 409 int argc; \ 410 char *argv[] = {progname,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL}; \ 411 int i; \ 412 for (i=0;i<11;i++) \ 413 x[i] = NULL; \ 414 x[0] = a0; \ 415 x[1] = a1; \ 416 x[2] = a2; \ 417 x[3] = a3; \ 418 x[4] = a4; \ 419 x[5] = a5; \ 420 x[6] = a6; \ 421 x[7] = a7; \ 422 x[8] = a8; \ 423 x[9] = a9; \ 424 x[10] = a10; \ 425 argc=1; \ 426 for (i=0; i<11;i++) \ 427 if (x[i]) \ 428 { \ 429 argv[argc++] = x[i]; \ 430 } \ 431 callmain(argc,argv); \ 432 } 433 #endif /* NO_MAIN_ALLOWED */ 434 /*casey Tue May 27 15:45:25 SAT 1997*/ 435 436 /* 437 * Here's where autoconfig starts to take over 438 */ 439 #ifdef HAVE_SYS_STROPTS_H 440 # ifdef HAVE_SYS_STREAM_H 441 # define STREAM 442 # endif 443 #endif 444 445 #ifndef RETSIGTYPE 446 # if defined(NTP_POSIX_SOURCE) 447 # define RETSIGTYPE void 448 # else 449 # define RETSIGTYPE int 450 # endif 451 #endif 452 453 #ifdef NTP_SYSCALLS_STD 454 # ifndef NTP_SYSCALL_GET 455 # define NTP_SYSCALL_GET 235 456 # endif 457 # ifndef NTP_SYSCALL_ADJ 458 # define NTP_SYSCALL_ADJ 236 459 # endif 460 #endif /* NTP_SYSCALLS_STD */ 461 462 #ifdef MPE 463 # include <sys/types.h> 464 # include <netinet/in.h> 465 # include <stdio.h> 466 # include <time.h> 467 468 /* missing functions that are easily renamed */ 469 470 # define _getch getchar 471 472 /* special functions that require MPE-specific wrappers */ 473 474 # define bind __ntp_mpe_bind 475 # define fcntl __ntp_mpe_fcntl 476 477 /* standard macros missing from MPE include files */ 478 479 # define IN_CLASSD(i) ((((long)(i))&0xf0000000)==0xe0000000) 480 # define IN_MULTICAST IN_CLASSD 481 # define ITIMER_REAL 0 482 # define MAXHOSTNAMELEN 64 483 484 /* standard structures missing from MPE include files */ 485 486 struct itimerval { 487 struct timeval it_interval; /* timer interval */ 488 struct timeval it_value; /* current value */ 489 }; 490 491 /* various declarations to make gcc stop complaining */ 492 493 extern int __filbuf(FILE *); 494 extern int __flsbuf(int, FILE *); 495 extern int gethostname(char *, int); 496 extern unsigned long inet_addr(char *); 497 extern char *strdup(const char *); 498 499 /* miscellaneous NTP macros */ 500 501 # define HAVE_NO_NICE 502 #endif /* MPE */ 503 504 #ifdef HAVE_RTPRIO 505 # define HAVE_NO_NICE 506 #else 507 # ifdef HAVE_SETPRIORITY 508 # define HAVE_BSD_NICE 509 # else 510 # ifdef HAVE_NICE 511 # define HAVE_ATT_NICE 512 # endif 513 # endif 514 #endif 515 516 #if !defined(HAVE_ATT_NICE) \ 517 && !defined(HAVE_BSD_NICE) \ 518 && !defined(HAVE_NO_NICE) \ 519 && !defined(SYS_WINNT) 520 #include "ERROR: You must define one of the HAVE_xx_NICE defines!" 521 #endif 522 523 /* 524 * use only one tty model - no use in initialising 525 * a tty in three ways 526 * HAVE_TERMIOS is preferred over HAVE_SYSV_TTYS over HAVE_BSD_TTYS 527 */ 528 529 #ifdef HAVE_TERMIOS_H 530 # define HAVE_TERMIOS 531 #else 532 # ifdef HAVE_TERMIO_H 533 # define HAVE_SYSV_TTYS 534 # else 535 # ifdef HAVE_SGTTY_H 536 # define HAVE_BSD_TTYS 537 # endif 538 # endif 539 #endif 540 541 #ifdef HAVE_TERMIOS 542 # undef HAVE_BSD_TTYS 543 # undef HAVE_SYSV_TTYS 544 #endif 545 546 #ifndef HAVE_TIMEGM 547 extern time_t timegm P((struct tm *)); 548 #endif 549 550 #ifdef HAVE_SYSV_TTYS 551 # undef HAVE_BSD_TTYS 552 #endif 553 554 #if !defined(SYS_WINNT) && !defined(VMS) && !defined(SYS_VXWORKS) 555 # if !defined(HAVE_SYSV_TTYS) \ 556 && !defined(HAVE_BSD_TTYS) \ 557 && !defined(HAVE_TERMIOS) 558 #include "ERROR: no tty type defined!" 559 # endif 560 #endif /* SYS_WINNT || VMS || SYS_VXWORKS*/ 561 562 #ifdef WORDS_BIGENDIAN 563 # define XNTP_BIG_ENDIAN 1 564 #else 565 # define XNTP_LITTLE_ENDIAN 1 566 #endif 567 568 /* 569 * Byte order woes. 570 * This used to be resolved by calling ntohl() and htonl() to swap things 571 * around, but this turned out to be quite costly on Vaxes where those 572 * things are actual functions. The code now straightens out byte 573 * order troubles on its own, with no performance penalty for little 574 * end first machines, but at great expense to cleanliness. 575 */ 576 #if !defined(XNTP_BIG_ENDIAN) && !defined(XNTP_LITTLE_ENDIAN) 577 /* 578 * Pick one or the other. 579 */ 580 BYTE_ORDER_NOT_DEFINED_FOR_AUTHENTICATION 581 #endif 582 583 #if defined(XNTP_BIG_ENDIAN) && defined(XNTP_LITTLE_ENDIAN) 584 /* 585 * Pick one or the other. 586 */ 587 BYTE_ORDER_NOT_DEFINED_FOR_AUTHENTICATION 588 #endif 589 590 #endif /* __ntp_machine */ 591