xref: /freebsd/contrib/ntp/libntp/machines.c (revision c0b746e5e8d9479f05b3749cbf1f73b8928719bd)
1c0b746e5SOllivier Robert /* machines.c - provide special support for peculiar architectures
2c0b746e5SOllivier Robert  *
3c0b746e5SOllivier Robert  * Real bummers unite !
4c0b746e5SOllivier Robert  *
5c0b746e5SOllivier Robert  */
6c0b746e5SOllivier Robert 
7c0b746e5SOllivier Robert #ifdef HAVE_CONFIG_H
8c0b746e5SOllivier Robert #include "config.h"
9c0b746e5SOllivier Robert #endif
10c0b746e5SOllivier Robert 
11c0b746e5SOllivier Robert #include "ntp_machine.h"
12c0b746e5SOllivier Robert #include "ntp_syslog.h"
13c0b746e5SOllivier Robert #include "ntp_stdlib.h"
14c0b746e5SOllivier Robert #include "ntp_unixtime.h"
15c0b746e5SOllivier Robert 
16c0b746e5SOllivier Robert #ifdef HAVE_SYS_TIME_H
17c0b746e5SOllivier Robert #include <sys/time.h>
18c0b746e5SOllivier Robert #endif
19c0b746e5SOllivier Robert 
20c0b746e5SOllivier Robert #ifdef HAVE_UNISTD_H
21c0b746e5SOllivier Robert #include <unistd.h>
22c0b746e5SOllivier Robert #endif
23c0b746e5SOllivier Robert 
24c0b746e5SOllivier Robert #ifdef SYS_WINNT
25c0b746e5SOllivier Robert # include <conio.h>
26c0b746e5SOllivier Robert #else
27c0b746e5SOllivier Robert 
28c0b746e5SOllivier Robert #ifdef SYS_VXWORKS
29c0b746e5SOllivier Robert #include "taskLib.h"
30c0b746e5SOllivier Robert #include "sysLib.h"
31c0b746e5SOllivier Robert #include "time.h"
32c0b746e5SOllivier Robert #include "ntp_syslog.h"
33c0b746e5SOllivier Robert 
34c0b746e5SOllivier Robert /*	some translations to the world of vxWorkings -casey */
35c0b746e5SOllivier Robert /* first some netdb type things */
36c0b746e5SOllivier Robert #include "ioLib.h"
37c0b746e5SOllivier Robert #include <socket.h>
38c0b746e5SOllivier Robert int h_errno;
39c0b746e5SOllivier Robert 
40c0b746e5SOllivier Robert struct hostent *gethostbyname(char *name)
41c0b746e5SOllivier Robert 	{
42c0b746e5SOllivier Robert 	struct hostent *host1;
43c0b746e5SOllivier Robert 	h_errno = 0;					/* we are always successful!!! */
44c0b746e5SOllivier Robert 	host1 = (struct hostent *) malloc (sizeof(struct hostent));
45c0b746e5SOllivier Robert 	host1->h_name = name;
46c0b746e5SOllivier Robert 	host1->h_addrtype = AF_INET;
47c0b746e5SOllivier Robert 	host1->h_aliases = name;
48c0b746e5SOllivier Robert 	host1->h_length = 4;
49c0b746e5SOllivier Robert 	host1->h_addr_list[0] = (char *)hostGetByName (name);
50c0b746e5SOllivier Robert 	host1->h_addr_list[1] = NULL;
51c0b746e5SOllivier Robert 	return host1;
52c0b746e5SOllivier Robert 	}
53c0b746e5SOllivier Robert 
54c0b746e5SOllivier Robert struct hostent *gethostbyaddr(char *name, int size, int addr_type)
55c0b746e5SOllivier Robert 	{
56c0b746e5SOllivier Robert 	struct hostent *host1;
57c0b746e5SOllivier Robert 	h_errno = 0;  /* we are always successful!!! */
58c0b746e5SOllivier Robert 	host1 = (struct hostent *) malloc (sizeof(struct hostent));
59c0b746e5SOllivier Robert 	host1->h_name = name;
60c0b746e5SOllivier Robert 	host1->h_addrtype = AF_INET;
61c0b746e5SOllivier Robert 	host1->h_aliases = name;
62c0b746e5SOllivier Robert 	host1->h_length = 4;
63c0b746e5SOllivier Robert 	host1->h_addr_list = NULL;
64c0b746e5SOllivier Robert 	return host1;
65c0b746e5SOllivier Robert 	}
66c0b746e5SOllivier Robert 
67c0b746e5SOllivier Robert struct servent *getservbyname (char *name, char *type)
68c0b746e5SOllivier Robert 	{
69c0b746e5SOllivier Robert 	struct servent *serv1;
70c0b746e5SOllivier Robert 	serv1 = (struct servent *) malloc (sizeof(struct servent));
71c0b746e5SOllivier Robert 	serv1->s_name = "ntp";      /* official service name */
72c0b746e5SOllivier Robert 	serv1->s_aliases = NULL;	/* alias list */
73c0b746e5SOllivier Robert 	serv1->s_port = 123;		/* port # */
74c0b746e5SOllivier Robert 	serv1->s_proto = "udp";     /* protocol to use */
75c0b746e5SOllivier Robert 	return serv1;
76c0b746e5SOllivier Robert 	}
77c0b746e5SOllivier Robert 
78c0b746e5SOllivier Robert /* second
79c0b746e5SOllivier Robert  * vxworks thinks it has insomnia
80c0b746e5SOllivier Robert  * we have to sleep for number of seconds
81c0b746e5SOllivier Robert  */
82c0b746e5SOllivier Robert 
83c0b746e5SOllivier Robert #define CLKRATE 	sysClkRateGet()
84c0b746e5SOllivier Robert 
85c0b746e5SOllivier Robert /* I am not sure how valid the granularity is - it is from G. Eger's port */
86c0b746e5SOllivier Robert #define CLK_GRANULARITY  1		/* Granularity of system clock in usec	*/
87c0b746e5SOllivier Robert 								/* Used to round down # usecs/tick		*/
88c0b746e5SOllivier Robert 								/* On a VCOM-100, PIT gets 8 MHz clk,	*/
89c0b746e5SOllivier Robert 								/*	& it prescales by 32, thus 4 usec	*/
90c0b746e5SOllivier Robert 								/* on mv167, granularity is 1usec anyway*/
91c0b746e5SOllivier Robert 								/* To defeat rounding, set to 1 		*/
92c0b746e5SOllivier Robert #define USECS_PER_SEC		MILLION		/* Microseconds per second	*/
93c0b746e5SOllivier Robert #define TICK (((USECS_PER_SEC / CLKRATE) / CLK_GRANULARITY) * CLK_GRANULARITY)
94c0b746e5SOllivier Robert 
95c0b746e5SOllivier Robert /* emulate unix sleep
96c0b746e5SOllivier Robert  * casey
97c0b746e5SOllivier Robert  */
98c0b746e5SOllivier Robert void sleep(int seconds)
99c0b746e5SOllivier Robert 	{
100c0b746e5SOllivier Robert 	taskDelay(seconds*TICK);
101c0b746e5SOllivier Robert 	}
102c0b746e5SOllivier Robert /* emulate unix alarm
103c0b746e5SOllivier Robert  * that pauses and calls SIGALRM after the seconds are up...
104c0b746e5SOllivier Robert  * so ... taskDelay() fudged for seconds should amount to the same thing.
105c0b746e5SOllivier Robert  * casey
106c0b746e5SOllivier Robert  */
107c0b746e5SOllivier Robert void alarm (int seconds)
108c0b746e5SOllivier Robert 	{
109c0b746e5SOllivier Robert 	sleep(seconds);
110c0b746e5SOllivier Robert 	}
111c0b746e5SOllivier Robert 
112c0b746e5SOllivier Robert #endif /* SYS_VXWORKS */
113c0b746e5SOllivier Robert 
114c0b746e5SOllivier Robert #ifdef SYS_PTX			/* Does PTX still need this? */
115c0b746e5SOllivier Robert /*#include <sys/types.h>	*/
116c0b746e5SOllivier Robert #include <sys/procstats.h>
117c0b746e5SOllivier Robert 
118c0b746e5SOllivier Robert int
119c0b746e5SOllivier Robert gettimeofday(
120c0b746e5SOllivier Robert 	struct timeval *tvp
121c0b746e5SOllivier Robert 	)
122c0b746e5SOllivier Robert {
123c0b746e5SOllivier Robert 	/*
124c0b746e5SOllivier Robert 	 * hi, this is Sequents sneak path to get to a clock
125c0b746e5SOllivier Robert 	 * this is also the most logical syscall for such a function
126c0b746e5SOllivier Robert 	 */
127c0b746e5SOllivier Robert 	return (get_process_stats(tvp, PS_SELF, (struct procstats *) 0,
128c0b746e5SOllivier Robert 				  (struct procstats *) 0));
129c0b746e5SOllivier Robert }
130c0b746e5SOllivier Robert #endif /* SYS_PTX */
131c0b746e5SOllivier Robert 
132c0b746e5SOllivier Robert const char *set_tod_using = "UNKNOWN";
133c0b746e5SOllivier Robert 
134c0b746e5SOllivier Robert int
135c0b746e5SOllivier Robert ntp_set_tod(
136c0b746e5SOllivier Robert 	struct timeval *tvp,
137c0b746e5SOllivier Robert 	void *tzp
138c0b746e5SOllivier Robert 	)
139c0b746e5SOllivier Robert {
140c0b746e5SOllivier Robert 	int rc;
141c0b746e5SOllivier Robert 
142c0b746e5SOllivier Robert #ifdef HAVE_CLOCK_SETTIME
143c0b746e5SOllivier Robert 	{
144c0b746e5SOllivier Robert 		struct timespec ts;
145c0b746e5SOllivier Robert 
146c0b746e5SOllivier Robert 		/* Convert timeval to timespec */
147c0b746e5SOllivier Robert 		ts.tv_sec = tvp->tv_sec;
148c0b746e5SOllivier Robert 		ts.tv_nsec = 1000 *  tvp->tv_usec;
149c0b746e5SOllivier Robert 
150c0b746e5SOllivier Robert 		rc = clock_settime(CLOCK_REALTIME, &ts);
151c0b746e5SOllivier Robert 		if (!rc)
152c0b746e5SOllivier Robert 		{
153c0b746e5SOllivier Robert 			set_tod_using = "clock_settime";
154c0b746e5SOllivier Robert 			return rc;
155c0b746e5SOllivier Robert 		}
156c0b746e5SOllivier Robert 	}
157c0b746e5SOllivier Robert #endif /* HAVE_CLOCK_SETTIME */
158c0b746e5SOllivier Robert #ifdef HAVE_SETTIMEOFDAY
159c0b746e5SOllivier Robert 	{
160c0b746e5SOllivier Robert 		rc = SETTIMEOFDAY(tvp, tzp);
161c0b746e5SOllivier Robert 		if (!rc)
162c0b746e5SOllivier Robert 		{
163c0b746e5SOllivier Robert 			set_tod_using = "settimeofday";
164c0b746e5SOllivier Robert 			return rc;
165c0b746e5SOllivier Robert 		}
166c0b746e5SOllivier Robert 	}
167c0b746e5SOllivier Robert #endif /* HAVE_SETTIMEOFDAY */
168c0b746e5SOllivier Robert #ifdef HAVE_STIME
169c0b746e5SOllivier Robert 	{
170c0b746e5SOllivier Robert 		long tp = tvp->tv_sec;
171c0b746e5SOllivier Robert 
172c0b746e5SOllivier Robert 		rc = stime(&tp); /* lie as bad as SysVR4 */
173c0b746e5SOllivier Robert 		if (!rc)
174c0b746e5SOllivier Robert 		{
175c0b746e5SOllivier Robert 			set_tod_using = "stime";
176c0b746e5SOllivier Robert 			return rc;
177c0b746e5SOllivier Robert 		}
178c0b746e5SOllivier Robert 	}
179c0b746e5SOllivier Robert #endif /* HAVE_STIME */
180c0b746e5SOllivier Robert 	set_tod_using = "Failed!";
181c0b746e5SOllivier Robert 	return -1;
182c0b746e5SOllivier Robert }
183c0b746e5SOllivier Robert 
184c0b746e5SOllivier Robert #endif /* not SYS_WINNT */
185c0b746e5SOllivier Robert 
186c0b746e5SOllivier Robert #if defined (SYS_WINNT) || defined (SYS_VXWORKS)
187c0b746e5SOllivier Robert /* getpass is used in ntpq.c and ntpdc.c */
188c0b746e5SOllivier Robert 
189c0b746e5SOllivier Robert char *
190c0b746e5SOllivier Robert getpass(const char * prompt)
191c0b746e5SOllivier Robert {
192c0b746e5SOllivier Robert 	int c, i;
193c0b746e5SOllivier Robert 	static char password[32];
194c0b746e5SOllivier Robert #ifdef DEBUG
195c0b746e5SOllivier Robert 	fprintf(stderr, "%s", prompt);
196c0b746e5SOllivier Robert 	fflush(stderr);
197c0b746e5SOllivier Robert #endif
198c0b746e5SOllivier Robert 	for (i=0; i<sizeof(password)-1 && ((c=_getch())!='\n'); i++) {
199c0b746e5SOllivier Robert 		password[i] = (char) c;
200c0b746e5SOllivier Robert 	}
201c0b746e5SOllivier Robert 	password[i] = '\0';
202c0b746e5SOllivier Robert 
203c0b746e5SOllivier Robert 	return password;
204c0b746e5SOllivier Robert }
205c0b746e5SOllivier Robert #endif /* SYS_WINNT */
206c0b746e5SOllivier Robert 
207c0b746e5SOllivier Robert #if !defined(HAVE_MEMSET)
208c0b746e5SOllivier Robert void
209c0b746e5SOllivier Robert ntp_memset(
210c0b746e5SOllivier Robert 	char *a,
211c0b746e5SOllivier Robert 	int x,
212c0b746e5SOllivier Robert 	int c
213c0b746e5SOllivier Robert 	)
214c0b746e5SOllivier Robert {
215c0b746e5SOllivier Robert 	while (c-- > 0)
216c0b746e5SOllivier Robert 		*a++ = (char) x;
217c0b746e5SOllivier Robert }
218c0b746e5SOllivier Robert #endif /*POSIX*/
219