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