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