aboutsummaryrefslogtreecommitdiff
path: root/ntpdate/ntpdate.c
diff options
context:
space:
mode:
Diffstat (limited to 'ntpdate/ntpdate.c')
-rw-r--r--ntpdate/ntpdate.c498
1 files changed, 211 insertions, 287 deletions
diff --git a/ntpdate/ntpdate.c b/ntpdate/ntpdate.c
index a0a90cebfb1d..7686b41a1b29 100644
--- a/ntpdate/ntpdate.c
+++ b/ntpdate/ntpdate.c
@@ -20,9 +20,9 @@
#include "ntp_syslog.h"
#include "ntp_select.h"
#include "ntp_stdlib.h"
+#include "ntp_assert.h"
+#include <ssl_applink.c>
-/* Don't include ISC's version of IPv6 variables and structures */
-#define ISC_IPV6_H 1
#include "isc/net.h"
#include "isc/result.h"
#include "isc/sockaddr.h"
@@ -37,19 +37,15 @@
#ifdef HAVE_POLL_H
# include <poll.h>
#endif
-#ifndef SYS_WINNT
-# ifdef HAVE_SYS_SIGNAL_H
-# include <sys/signal.h>
-# else
-# include <signal.h>
-# endif
-# ifdef HAVE_SYS_IOCTL_H
-# include <sys/ioctl.h>
-# endif
-#endif /* SYS_WINNT */
+#ifdef HAVE_SYS_SIGNAL_H
+# include <sys/signal.h>
+#endif
+#ifdef HAVE_SYS_IOCTL_H
+# include <sys/ioctl.h>
+#endif
#ifdef HAVE_SYS_RESOURCE_H
# include <sys/resource.h>
-#endif /* HAVE_SYS_RESOURCE_H */
+#endif
#include <arpa/inet.h>
@@ -63,9 +59,9 @@ struct timeval timeout = {0,0};
#elif defined(SYS_WINNT)
/*
* Windows does not abort a select select call if SIGALRM goes off
- * so a 200 ms timeout is needed
+ * so a 200 ms timeout is needed (TIMER_HZ is 5).
*/
-struct timeval timeout = {0,1000000/TIMER_HZ};
+struct sock_timeval timeout = {0,1000000/TIMER_HZ};
#else
struct timeval timeout = {60,0};
#endif
@@ -77,9 +73,6 @@ struct timeval timeout = {60,0};
#include "recvbuff.h"
#ifdef SYS_WINNT
-#define EPROTONOSUPPORT WSAEPROTONOSUPPORT
-#define EAFNOSUPPORT WSAEAFNOSUPPORT
-#define EPFNOSUPPORT WSAEPFNOSUPPORT
#define TARGET_RESOLUTION 1 /* Try for 1-millisecond accuracy
on Windows NT timers. */
#pragma comment(lib, "winmm")
@@ -96,7 +89,7 @@ UINT wTimerRes;
# define NTPDATE_PRIO (100)
#endif
-#if defined(HAVE_TIMER_SETTIME) || defined (HAVE_TIMER_CREATE)
+#ifdef HAVE_TIMER_CREATE
/* POSIX TIMERS - vxWorks doesn't have itimer - casey */
static timer_t ntpdate_timerid;
#endif
@@ -127,9 +120,9 @@ volatile int debug = 0;
*/
int ai_fam_templ;
-int nbsock; /* the number of sockets used */
+int nbsock; /* the number of sockets used */
SOCKET fd[MAX_AF];
-int fd_family[MAX_AF]; /* to remember the socket family */
+int fd_family[MAX_AF]; /* to remember the socket family */
#ifdef HAVE_POLL_H
struct pollfd fdmask[MAX_AF];
#else
@@ -211,35 +204,34 @@ int verbose = 0;
int always_step = 0;
int never_step = 0;
-int ntpdatemain P((int, char **));
-
-static void transmit P((struct server *));
-static void receive P((struct recvbuf *));
-static void server_data P((struct server *, s_fp, l_fp *, u_fp));
-static void clock_filter P((struct server *));
-static struct server *clock_select P((void));
-static int clock_adjust P((void));
-static void addserver P((char *));
-static struct server *findserver P((struct sockaddr_storage *));
-void timer P((void));
-static void init_alarm P((void));
+int ntpdatemain (int, char **);
+
+static void transmit (struct server *);
+static void receive (struct recvbuf *);
+static void server_data (struct server *, s_fp, l_fp *, u_fp);
+static void clock_filter (struct server *);
+static struct server *clock_select (void);
+static int clock_adjust (void);
+static void addserver (char *);
+static struct server *findserver (sockaddr_u *);
+ void timer (void);
+static void init_alarm (void);
#ifndef SYS_WINNT
-static RETSIGTYPE alarming P((int));
+static RETSIGTYPE alarming (int);
#endif /* SYS_WINNT */
-static void init_io P((void));
-static void sendpkt P((struct sockaddr_storage *, struct pkt *, int));
-void input_handler P((void));
+static void init_io (void);
+static void sendpkt (sockaddr_u *, struct pkt *, int);
+void input_handler (void);
-static int l_adj_systime P((l_fp *));
-static int l_step_systime P((l_fp *));
+static int l_adj_systime (l_fp *);
+static int l_step_systime (l_fp *);
-static void printserver P((struct server *, FILE *));
+static void printserver (struct server *, FILE *);
#ifdef SYS_WINNT
int on = 1;
WORD wVersionRequested;
WSADATA wsaData;
-HANDLE TimerThreadHandle = NULL;
#endif /* SYS_WINNT */
#ifdef NO_MAIN_ALLOWED
@@ -299,7 +291,7 @@ void clear_globals()
#endif
#ifdef HAVE_NETINFO
-static ni_namelist *getnetinfoservers P((void));
+static ni_namelist *getnetinfoservers (void);
#endif
/*
@@ -335,31 +327,23 @@ ntpdatemain (
ni_namelist *netinfoservers;
#endif
#ifdef SYS_WINNT
- HANDLE process_handle;
-
- wVersionRequested = MAKEWORD(1,1);
- if (WSAStartup(wVersionRequested, &wsaData)) {
- netsyslog(LOG_ERR, "No useable winsock.dll: %m");
- exit(1);
- }
-
key_file = key_file_storage;
if (!ExpandEnvironmentStrings(KEYFILE, key_file, MAX_PATH))
- {
msyslog(LOG_ERR, "ExpandEnvironmentStrings(KEYFILE) failed: %m\n");
- }
+
+ ssl_applink();
#endif /* SYS_WINNT */
#ifdef NO_MAIN_ALLOWED
clear_globals();
#endif
+ init_lib(); /* sets up ipv4_works, ipv6_works */
- /* Check to see if we have IPv6. Otherwise force the -4 flag */
- if (isc_net_probeipv6() != ISC_R_SUCCESS) {
+ /* Check to see if we have IPv6. Otherwise default to IPv4 */
+ if (!ipv6_works)
ai_fam_templ = AF_INET;
- }
errflg = 0;
progname = argv[0];
@@ -436,8 +420,7 @@ ntpdatemain (
} else {
sys_timeout = ((LFPTOFP(&tmp) * TIMER_HZ)
+ 0x8000) >> 16;
- if (sys_timeout == 0)
- sys_timeout = 1;
+ sys_timeout = max(sys_timeout, MINTIMEOUT);
}
break;
case 'v':
@@ -463,12 +446,7 @@ ntpdatemain (
if (debug || simple_query) {
#ifdef HAVE_SETVBUF
static char buf[BUFSIZ];
-#ifdef SYS_WINNT
- /* Win32 does not implement line buffering */
- setvbuf(stdout, NULL, _IONBF, BUFSIZ);
-#else
setvbuf(stdout, buf, _IOLBF, BUFSIZ);
-#endif /* SYS_WINNT */
#else
setlinebuf(stdout);
#endif
@@ -561,13 +539,6 @@ ntpdatemain (
#if defined(HAVE_BSD_NICE)
(void) setpriority(PRIO_PROCESS, 0, NTPDATE_PRIO);
#endif
-#ifdef SYS_WINNT
- process_handle = GetCurrentProcess();
- if (!SetPriorityClass(process_handle, (DWORD) REALTIME_PRIORITY_CLASS)) {
- msyslog(LOG_ERR, "SetPriorityClass failed: %m");
- }
-#endif /* SYS_WINNT */
-
initializing = 0;
@@ -608,7 +579,7 @@ ntpdatemain (
#else
if (WSAGetLastError() != WSAEINTR)
#endif
- netsyslog(LOG_ERR,
+ msyslog(LOG_ERR,
#ifdef HAVE_POLL_H
"poll() error: %m"
#else
@@ -617,7 +588,7 @@ ntpdatemain (
);
} else if (errno != 0) {
#ifndef SYS_VXWORKS
- netsyslog(LOG_DEBUG,
+ msyslog(LOG_DEBUG,
#ifdef HAVE_POLL_H
"poll(): nfound = %d, error: %m",
#else
@@ -687,7 +658,7 @@ transmit(
struct pkt xpkt;
if (debug)
- printf("transmit(%s)\n", stoa(&(server->srcadr)));
+ printf("transmit(%s)\n", stoa(&server->srcadr));
if (server->filter_nextpt < server->xmtcnt) {
l_fp ts;
@@ -719,7 +690,7 @@ transmit(
xpkt.ppoll = NTP_MINPOLL;
xpkt.precision = NTPDATE_PRECISION;
xpkt.rootdelay = htonl(NTPDATE_DISTANCE);
- xpkt.rootdispersion = htonl(NTPDATE_DISP);
+ xpkt.rootdisp = htonl(NTPDATE_DISP);
xpkt.refid = htonl(NTPDATE_REFID);
L_CLR(&xpkt.reftime);
L_CLR(&xpkt.org);
@@ -738,18 +709,18 @@ transmit(
L_ADDUF(&server->xmt, sys_authdelay);
HTONL_FP(&server->xmt, &xpkt.xmt);
len = authencrypt(sys_authkey, (u_int32 *)&xpkt, LEN_PKT_NOMAC);
- sendpkt(&(server->srcadr), &xpkt, (int)(LEN_PKT_NOMAC + len));
+ sendpkt(&server->srcadr, &xpkt, (int)(LEN_PKT_NOMAC + len));
if (debug > 1)
printf("transmit auth to %s\n",
- stoa(&(server->srcadr)));
+ stoa(&server->srcadr));
} else {
get_systime(&(server->xmt));
HTONL_FP(&server->xmt, &xpkt.xmt);
- sendpkt(&(server->srcadr), &xpkt, LEN_PKT_NOMAC);
+ sendpkt(&server->srcadr, &xpkt, LEN_PKT_NOMAC);
if (debug > 1)
- printf("transmit to %s\n", stoa(&(server->srcadr)));
+ printf("transmit to %s\n", stoa(&server->srcadr));
}
/*
@@ -858,13 +829,26 @@ receive(
server->trust |= 1;
/*
+ * Check for a KoD (rate limiting) response, cease and decist.
+ */
+ if (LEAP_NOTINSYNC == PKT_LEAP(rpkt->li_vn_mode) &&
+ STRATUM_PKT_UNSPEC == rpkt->stratum &&
+ !memcmp("RATE", &rpkt->refid, 4)) {
+ msyslog(LOG_ERR, "%s rate limit response from server.\n",
+ stoa(&rbufp->recv_srcadr));
+ server->event_time = 0;
+ complete_servers++;
+ return;
+ }
+
+ /*
* Looks good. Record info from the packet.
*/
server->leap = PKT_LEAP(rpkt->li_vn_mode);
server->stratum = PKT_TO_STRATUM(rpkt->stratum);
server->precision = rpkt->precision;
server->rootdelay = ntohl(rpkt->rootdelay);
- server->rootdispersion = ntohl(rpkt->rootdispersion);
+ server->rootdisp = ntohl(rpkt->rootdisp);
server->refid = rpkt->refid;
NTOHL_FP(&rpkt->reftime, &server->reftime);
NTOHL_FP(&rpkt->rec, &rec);
@@ -875,7 +859,7 @@ receive(
* again.
*/
if (L_ISZERO(&rec) || !L_ISHIS(&server->org, &rec)) {
- transmit(server);
+ server->event_time = current_time + sys_timeout;
return;
}
@@ -924,10 +908,21 @@ receive(
}
/*
- * Shift this data in, then transmit again.
+ * Shift this data in, then schedule another transmit.
*/
server_data(server, (s_fp) di, &ci, 0);
- transmit(server);
+
+ if ((int)server->filter_nextpt >= sys_samples) {
+ /*
+ * Got all the data we need. Mark this guy
+ * completed and return.
+ */
+ server->event_time = 0;
+ complete_servers++;
+ return;
+ }
+
+ server->event_time = current_time + sys_timeout;
}
@@ -1035,12 +1030,14 @@ clock_filter(
static struct server *
clock_select(void)
{
- register struct server *server;
- register int i;
- register int nlist;
- register s_fp d;
- register int j;
- register int n;
+ struct server *server;
+ u_int nlist;
+ s_fp d;
+ u_int count;
+ u_int i;
+ u_int j;
+ u_int k;
+ int n;
s_fp local_threshold;
struct server *server_list[NTP_MAXCLOCK];
u_fp server_badness[NTP_MAXCLOCK];
@@ -1136,12 +1133,14 @@ clock_select(void)
* Got the five-or-less best. Cut the list where the number of
* strata exceeds two.
*/
- j = 0;
+ count = 0;
for (i = 1; i < nlist; i++)
- if (server_list[i]->stratum > server_list[i-1]->stratum)
- if (++j == 2) {
- nlist = i;
- break;
+ if (server_list[i]->stratum > server_list[i-1]->stratum) {
+ count++;
+ if (2 == count) {
+ nlist = i;
+ break;
+ }
}
/*
@@ -1151,9 +1150,9 @@ clock_select(void)
* detection.
*/
- if (nlist == 0)
- sys_server = 0;
- else if (nlist == 1) {
+ if (0 == nlist)
+ sys_server = NULL;
+ else if (1 == nlist) {
sys_server = server_list[0];
} else {
/*
@@ -1162,12 +1161,13 @@ clock_select(void)
*/
for (i = 0; i < nlist-1; i++)
for (j = i+1; j < nlist; j++) {
- if (server_list[i]->stratum
- < server_list[j]->stratum)
- break; /* already sorted by stratum */
- if (server_list[i]->delay
- < server_list[j]->delay)
- continue;
+ if (server_list[i]->stratum <
+ server_list[j]->stratum)
+ /* already sorted by stratum */
+ break;
+ if (server_list[i]->delay <
+ server_list[j]->delay)
+ continue;
server = server_list[i];
server_list[i] = server_list[j];
server_list[j] = server;
@@ -1183,14 +1183,14 @@ clock_select(void)
* Now drop samples until we're down to one.
*/
while (nlist > 1) {
- for (n = 0; n < nlist; n++) {
- server_badness[n] = 0;
+ for (k = 0; k < nlist; k++) {
+ server_badness[k] = 0;
for (j = 0; j < nlist; j++) {
- if (j == n) /* with self? */
+ if (j == k) /* with self? */
continue;
- d = server_list[j]->soffset
- - server_list[n]->soffset;
- if (d < 0) /* absolute value */
+ d = server_list[j]->soffset -
+ server_list[k]->soffset;
+ if (d < 0) /* abs value */
d = -d;
/*
* XXX This code *knows* that
@@ -1198,7 +1198,7 @@ clock_select(void)
*/
for (i = 0; i < j; i++)
d = (d>>1) + (d>>2);
- server_badness[n] += d;
+ server_badness[k] += d;
}
}
@@ -1289,7 +1289,7 @@ clock_adjust(void)
lfptoa(&server->offset, 6));
}
} else {
-#if !defined SYS_WINNT && !defined SYS_CYGWIN32
+#ifndef SYS_WINNT
if (simple_query || l_adj_systime(&server->offset)) {
msyslog(LOG_NOTICE, "adjust time server %s offset %s sec",
stoa(&server->srcadr),
@@ -1318,16 +1318,16 @@ clock_adjust(void)
* (non-blocking).
*/
static int
-is_reachable (struct sockaddr_storage *dst)
+is_reachable (sockaddr_u *dst)
{
SOCKET sockfd;
- sockfd = socket(dst->ss_family, SOCK_DGRAM, 0);
+ sockfd = socket(AF(dst), SOCK_DGRAM, 0);
if (sockfd == -1) {
return 0;
}
- if(connect(sockfd, (struct sockaddr *)dst, SOCKLEN(dst))) {
+ if (connect(sockfd, &dst->sa, SOCKLEN(dst))) {
closesocket(sockfd);
return 0;
}
@@ -1356,10 +1356,12 @@ addserver(
int error;
/* Service name */
char service[5];
- strcpy(service, "ntp");
+ sockaddr_u addr;
+
+ strncpy(service, "ntp", sizeof(service));
/* Get host address. Looking for UDP datagram connection. */
- memset(&hints, 0, sizeof(hints));
+ ZERO(hints);
hints.ai_family = ai_fam_templ;
hints.ai_socktype = SOCK_DGRAM;
@@ -1375,28 +1377,35 @@ addserver(
/* Name server is unusable. Exit after failing on the
first server, in order to shorten the timeout caused
by waiting for resolution of several servers */
- fprintf(stderr, "Name server cannot be used, exiting");
- msyslog(LOG_ERR, "name server cannot be used, reason: %s\n", gai_strerror(error));
+ fprintf(stderr, "Exiting, name server cannot be used: %s (%d)",
+ gai_strerror(error), error);
+ msyslog(LOG_ERR, "name server cannot be used: %s (%d)\n",
+ gai_strerror(error), error);
exit(1);
}
- fprintf(stderr, "Error : %s\n", gai_strerror(error));
- msyslog(LOG_ERR, "can't find host %s\n", serv);
+ fprintf(stderr, "Error resolving %s: %s (%d)\n", serv,
+ gai_strerror(error), error);
+ msyslog(LOG_ERR, "Can't find host %s: %s (%d)\n", serv,
+ gai_strerror(error), error);
return;
}
#ifdef DEBUG
- else if (debug) {
- fprintf(stderr, "host found : %s\n", stohost((struct sockaddr_storage*)addrResult->ai_addr));
+ if (debug) {
+ ZERO(addr);
+ INSIST(addrResult->ai_addrlen <= sizeof(addr));
+ memcpy(&addr, addrResult->ai_addr, addrResult->ai_addrlen);
+ fprintf(stderr, "host found : %s\n", stohost(&addr));
}
#endif
/* We must get all returned server in case the first one fails */
for (ptr = addrResult; ptr != NULL; ptr = ptr->ai_next) {
- if (is_reachable ((struct sockaddr_storage *)ptr->ai_addr)) {
- server = (struct server *)emalloc(sizeof(struct server));
- memset((char *)server, 0, sizeof(struct server));
-
- memset(&(server->srcadr), 0, sizeof(struct sockaddr_storage));
- memcpy(&(server->srcadr), ptr->ai_addr, ptr->ai_addrlen);
+ ZERO(addr);
+ INSIST(ptr->ai_addrlen <= sizeof(addr));
+ memcpy(&addr, ptr->ai_addr, ptr->ai_addrlen);
+ if (is_reachable(&addr)) {
+ server = emalloc_zero(sizeof(*server));
+ memcpy(&server->srcadr, ptr->ai_addr, ptr->ai_addrlen);
server->event_time = ++sys_numservers;
if (sys_servers == NULL)
sys_servers = server;
@@ -1404,7 +1413,8 @@ addserver(
struct server *sp;
for (sp = sys_servers; sp->next_server != NULL;
- sp = sp->next_server) ;
+ sp = sp->next_server)
+ /* empty */;
sp->next_server = server;
}
}
@@ -1420,40 +1430,23 @@ addserver(
*/
static struct server *
findserver(
- struct sockaddr_storage *addr
+ sockaddr_u *addr
)
{
struct server *server;
struct server *mc_server;
- isc_sockaddr_t laddr;
- isc_sockaddr_t saddr;
-
- if(addr->ss_family == AF_INET) {
- isc_sockaddr_fromin( &laddr, &((struct sockaddr_in*)addr)->sin_addr, 0);
- }
- else {
- isc_sockaddr_fromin6(&laddr, &((struct sockaddr_in6*)addr)->sin6_addr, 0);
- }
-
mc_server = NULL;
- if (htons(((struct sockaddr_in*)addr)->sin_port) != NTP_PORT)
+ if (SRCPORT(addr) != NTP_PORT)
return 0;
for (server = sys_servers; server != NULL;
server = server->next_server) {
-
- if(server->srcadr.ss_family == AF_INET) {
- isc_sockaddr_fromin(&saddr, &((struct sockaddr_in*)&server->srcadr)->sin_addr, 0);
- }
- else {
- isc_sockaddr_fromin6(&saddr, &((struct sockaddr_in6*)&server->srcadr)->sin6_addr, 0);
- }
- if (isc_sockaddr_eqaddr(&laddr, &saddr) == ISC_TRUE)
+ if (SOCK_EQ(addr, &server->srcadr))
return server;
- if(addr->ss_family == server->srcadr.ss_family) {
- if (isc_sockaddr_ismulticast(&saddr) == ISC_TRUE)
+ if (AF(addr) == AF(&server->srcadr)) {
+ if (IS_MCAST(&server->srcadr))
mc_server = server;
}
}
@@ -1467,15 +1460,15 @@ findserver(
complete_servers++;
}
- server = (struct server *)emalloc(sizeof(struct server));
- memset((char *)server, 0, sizeof(struct server));
+ server = emalloc_zero(sizeof(*server));
- memcpy(&server->srcadr, addr, sizeof(struct sockaddr_storage));
+ server->srcadr = *addr;
server->event_time = ++sys_numservers;
for (sp = sys_servers; sp->next_server != NULL;
- sp = sp->next_server) ;
+ sp = sp->next_server)
+ /* empty */;
sp->next_server = server;
transmit(server);
}
@@ -1526,16 +1519,16 @@ alarming(
{
alarm_flag++;
}
-#else
+#else /* SYS_WINNT follows */
void CALLBACK
alarming(UINT uTimerID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2)
{
+ UNUSED_ARG(uTimerID); UNUSED_ARG(uMsg); UNUSED_ARG(dwUser);
+ UNUSED_ARG(dw1); UNUSED_ARG(dw2);
+
alarm_flag++;
}
-#endif /* SYS_WINNT */
-
-#ifdef SYS_WINNT
static void
callTimeEndPeriod(void)
{
@@ -1552,16 +1545,14 @@ static void
init_alarm(void)
{
#ifndef SYS_WINNT
-# ifndef HAVE_TIMER_SETTIME
- struct itimerval itimer;
+# ifdef HAVE_TIMER_CREATE
+ struct itimerspec its;
# else
- struct itimerspec ntpdate_itimer;
+ struct itimerval itv;
# endif
-#else
+#else /* SYS_WINNT follows */
TIMECAPS tc;
UINT wTimerID;
-# endif /* SYS_WINNT */
-#if defined SYS_CYGWIN32 || defined SYS_WINNT
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
DWORD dwUser = 0;
@@ -1570,7 +1561,7 @@ init_alarm(void)
alarm_flag = 0;
#ifndef SYS_WINNT
-# if defined(HAVE_TIMER_CREATE) && defined(HAVE_TIMER_SETTIME)
+# ifdef HAVE_TIMER_CREATE
alarm_flag = 0;
/* this code was put in as setitimer() is non existant this us the
* POSIX "equivalents" setup - casey
@@ -1592,44 +1583,26 @@ init_alarm(void)
* Set up the alarm interrupt. The first comes 1/(2*TIMER_HZ)
* seconds from now and they continue on every 1/TIMER_HZ seconds.
*/
- (void) signal_no_reset(SIGALRM, alarming);
- ntpdate_itimer.it_interval.tv_sec = ntpdate_itimer.it_value.tv_sec = 0;
- ntpdate_itimer.it_interval.tv_nsec = 1000000000/TIMER_HZ;
- ntpdate_itimer.it_value.tv_nsec = 1000000000/(TIMER_HZ<<1);
- timer_settime(ntpdate_timerid, 0 /* !TIMER_ABSTIME */, &ntpdate_itimer, NULL);
-# else
+ signal_no_reset(SIGALRM, alarming);
+ its.it_interval.tv_sec = 0;
+ its.it_value.tv_sec = 0;
+ its.it_interval.tv_nsec = 1000000000/TIMER_HZ;
+ its.it_value.tv_nsec = 1000000000/(TIMER_HZ<<1);
+ timer_settime(ntpdate_timerid, 0 /* !TIMER_ABSTIME */, &its, NULL);
+# else /* !HAVE_TIMER_CREATE follows */
/*
* Set up the alarm interrupt. The first comes 1/(2*TIMER_HZ)
* seconds from now and they continue on every 1/TIMER_HZ seconds.
*/
- (void) signal_no_reset(SIGALRM, alarming);
- itimer.it_interval.tv_sec = itimer.it_value.tv_sec = 0;
- itimer.it_interval.tv_usec = 1000000/TIMER_HZ;
- itimer.it_value.tv_usec = 1000000/(TIMER_HZ<<1);
-
- setitimer(ITIMER_REAL, &itimer, (struct itimerval *)0);
-# endif
-#if defined SYS_CYGWIN32
- /*
- * Get privileges needed for fiddling with the clock
- */
-
- /* get the current process token handle */
- if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) {
- msyslog(LOG_ERR, "OpenProcessToken failed: %m");
- exit(1);
- }
- /* get the LUID for system-time privilege. */
- LookupPrivilegeValue(NULL, SE_SYSTEMTIME_NAME, &tkp.Privileges[0].Luid);
- tkp.PrivilegeCount = 1; /* one privilege to set */
- tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
- /* get set-time privilege for this process. */
- AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES) NULL, 0);
- /* cannot test return value of AdjustTokenPrivileges. */
- if (GetLastError() != ERROR_SUCCESS)
- msyslog(LOG_ERR, "AdjustTokenPrivileges failed: %m");
-#endif
-#else /* SYS_WINNT */
+ signal_no_reset(SIGALRM, alarming);
+ itv.it_interval.tv_sec = 0;
+ itv.it_value.tv_sec = 0;
+ itv.it_interval.tv_usec = 1000000/TIMER_HZ;
+ itv.it_value.tv_usec = 1000000/(TIMER_HZ<<1);
+
+ setitimer(ITIMER_REAL, &itv, NULL);
+# endif /* !HAVE_TIMER_CREATE */
+#else /* SYS_WINNT follows */
_tzset();
/*
@@ -1707,7 +1680,9 @@ init_io(void)
{
struct addrinfo *res, *ressave;
struct addrinfo hints;
+ sockaddr_u addr;
char service[5];
+ int rc;
int optval = 1;
int check_ntp_port_in_use = !debug && !simple_query && !unpriv_port;
@@ -1720,25 +1695,25 @@ init_io(void)
* Open the socket
*/
- strcpy(service, "ntp");
+ strncpy(service, "ntp", sizeof(service));
/*
* Init hints addrinfo structure
*/
- memset(&hints, 0, sizeof(hints));
+ ZERO(hints);
hints.ai_family = ai_fam_templ;
hints.ai_flags = AI_PASSIVE;
hints.ai_socktype = SOCK_DGRAM;
- if(getaddrinfo(NULL, service, &hints, &res) != 0) {
- msyslog(LOG_ERR, "getaddrinfo() failed: %m");
- exit(1);
- /*NOTREACHED*/
+ if (getaddrinfo(NULL, service, &hints, &res) != 0) {
+ msyslog(LOG_ERR, "getaddrinfo() failed: %m");
+ exit(1);
+ /*NOTREACHED*/
}
#ifdef SYS_WINNT
if (check_ntp_port_in_use && ntp_port_inuse(AF_INET, NTP_PORT)){
- netsyslog(LOG_ERR, "the NTP socket is in use, exiting: %m");
+ msyslog(LOG_ERR, "the NTP socket is in use, exiting: %m");
exit(1);
}
#endif
@@ -1762,13 +1737,13 @@ init_io(void)
err == WSAEPFNOSUPPORT)
#endif
continue;
- netsyslog(LOG_ERR, "socket() failed: %m");
+ msyslog(LOG_ERR, "socket() failed: %m");
exit(1);
/*NOTREACHED*/
}
/* set socket to reuse address */
if (setsockopt(fd[nbsock], SOL_SOCKET, SO_REUSEADDR, (void*) &optval, sizeof(optval)) < 0) {
- netsyslog(LOG_ERR, "setsockopt() SO_REUSEADDR failed: %m");
+ msyslog(LOG_ERR, "setsockopt() SO_REUSEADDR failed: %m");
exit(1);
/*NOTREACHED*/
}
@@ -1776,7 +1751,7 @@ init_io(void)
/* Restricts AF_INET6 socket to IPv6 communications (see RFC 2553bis-03) */
if (res->ai_family == AF_INET6)
if (setsockopt(fd[nbsock], IPPROTO_IPV6, IPV6_V6ONLY, (void*) &optval, sizeof(optval)) < 0) {
- netsyslog(LOG_ERR, "setsockopt() IPV6_V6ONLY failed: %m");
+ msyslog(LOG_ERR, "setsockopt() IPV6_V6ONLY failed: %m");
exit(1);
/*NOTREACHED*/
}
@@ -1789,15 +1764,15 @@ init_io(void)
* bind the socket to the NTP port
*/
if (check_ntp_port_in_use) {
- if (bind(fd[nbsock], res->ai_addr, SOCKLEN(res->ai_addr)) < 0) {
-#ifndef SYS_WINNT
- if (errno == EADDRINUSE)
-#else
- if (WSAGetLastError() == WSAEADDRINUSE)
-#endif /* SYS_WINNT */
- netsyslog(LOG_ERR, "the NTP socket is in use, exiting");
+ ZERO(addr);
+ INSIST(res->ai_addrlen <= sizeof(addr));
+ memcpy(&addr, res->ai_addr, res->ai_addrlen);
+ rc = bind(fd[nbsock], &addr.sa, SOCKLEN(&addr));
+ if (rc < 0) {
+ if (EADDRINUSE == socket_errno())
+ msyslog(LOG_ERR, "the NTP socket is in use, exiting");
else
- netsyslog(LOG_ERR, "bind() fails: %m");
+ msyslog(LOG_ERR, "bind() fails: %m");
exit(1);
}
}
@@ -1818,24 +1793,24 @@ init_io(void)
#ifndef SYS_WINNT
# ifdef SYS_VXWORKS
{
- int on = TRUE;
+ int on = TRUE;
- if (ioctl(fd[nbsock],FIONBIO, &on) == ERROR) {
- netsyslog(LOG_ERR, "ioctl(FIONBIO) fails: %m");
- exit(1);
- }
+ if (ioctl(fd[nbsock],FIONBIO, &on) == ERROR) {
+ msyslog(LOG_ERR, "ioctl(FIONBIO) fails: %m");
+ exit(1);
+ }
}
# else /* not SYS_VXWORKS */
# if defined(O_NONBLOCK)
if (fcntl(fd[nbsock], F_SETFL, O_NONBLOCK) < 0) {
- netsyslog(LOG_ERR, "fcntl(FNDELAY|FASYNC) fails: %m");
+ msyslog(LOG_ERR, "fcntl(FNDELAY|FASYNC) fails: %m");
exit(1);
/*NOTREACHED*/
}
# else /* not O_NONBLOCK */
# if defined(FNDELAY)
if (fcntl(fd[nbsock], F_SETFL, FNDELAY) < 0) {
- netsyslog(LOG_ERR, "fcntl(FNDELAY|FASYNC) fails: %m");
+ msyslog(LOG_ERR, "fcntl(FNDELAY|FASYNC) fails: %m");
exit(1);
/*NOTREACHED*/
}
@@ -1846,7 +1821,7 @@ init_io(void)
# endif /* SYS_VXWORKS */
#else /* SYS_WINNT */
if (ioctlsocket(fd[nbsock], FIONBIO, (u_long *) &on) == SOCKET_ERROR) {
- netsyslog(LOG_ERR, "ioctlsocket(FIONBIO) fails: %m");
+ msyslog(LOG_ERR, "ioctlsocket(FIONBIO) fails: %m");
exit(1);
}
#endif /* SYS_WINNT */
@@ -1860,7 +1835,7 @@ init_io(void)
*/
static void
sendpkt(
- struct sockaddr_storage *dest,
+ sockaddr_u *dest,
struct pkt *pkt,
int len
)
@@ -1875,14 +1850,14 @@ sendpkt(
/* Find a local family compatible socket to send ntp packet to ntp server */
for(i = 0; (i < MAX_AF); i++) {
- if(dest->ss_family == fd_family[i]) {
+ if(AF(dest) == fd_family[i]) {
sock = fd[i];
break;
}
}
- if ( sock == INVALID_SOCKET ) {
- netsyslog(LOG_ERR, "cannot find family compatible socket to send ntp packet");
+ if (INVALID_SOCKET == sock) {
+ msyslog(LOG_ERR, "cannot find family compatible socket to send ntp packet");
exit(1);
/*NOTREACHED*/
}
@@ -1890,14 +1865,14 @@ sendpkt(
cc = sendto(sock, (char *)pkt, len, 0, (struct sockaddr *)dest,
SOCKLEN(dest));
- if (cc == SOCKET_ERROR) {
+ if (SOCKET_ERROR == cc) {
#ifndef SYS_WINNT
if (errno != EWOULDBLOCK && errno != ENOBUFS)
#else
err = WSAGetLastError();
if (err != WSAEWOULDBLOCK && err != WSAENOBUFS)
#endif /* SYS_WINNT */
- netsyslog(LOG_ERR, "sendto(%s): %m", stohost(dest));
+ msyslog(LOG_ERR, "sendto(%s): %m", stohost(dest));
}
}
@@ -1910,8 +1885,8 @@ input_handler(void)
{
register int n;
register struct recvbuf *rb;
- struct timeval tvzero;
- int fromlen;
+ struct sock_timeval tvzero;
+ GETSOCKNAME_SOCKLEN_TYPE fromlen;
l_fp ts;
int i;
#ifdef HAVE_POLL_H
@@ -1967,7 +1942,7 @@ input_handler(void)
return;
else if (n == -1) {
if (errno != EINTR)
- netsyslog(LOG_ERR,
+ msyslog(LOG_ERR,
#ifdef HAVE_POLL_H
"poll() error: %m"
#else
@@ -2002,7 +1977,7 @@ input_handler(void)
rb = get_free_recv_buffer();
- fromlen = sizeof(struct sockaddr_storage);
+ fromlen = sizeof(rb->recv_srcadr);
rb->recv_length = recvfrom(fdc, (char *)&rb->recv_pkt,
sizeof(rb->recv_pkt), 0,
(struct sockaddr *)&rb->recv_srcadr, &fromlen);
@@ -2150,7 +2125,7 @@ printserver(
{
register int i;
char junk[5];
- char *str;
+ const char *str;
if (!debug) {
(void) fprintf(fp, "server %s, stratum %d, offset %s, delay %s\n",
@@ -2213,57 +2188,6 @@ printserver(
lfptoa(&pp->offset, 6));
}
-#if !defined(HAVE_VSPRINTF)
-int
-vsprintf(
- char *str,
- const char *fmt,
- va_list ap
- )
-{
- FILE f;
- int len;
-
- f._flag = _IOWRT+_IOSTRG;
- f._ptr = str;
- f._cnt = 32767;
- len = _doprnt(fmt, ap, &f);
- *f._ptr = 0;
- return (len);
-}
-#endif
-
-#if 0
-/* override function in library since SA_RESTART makes ALL syscalls restart */
-#ifdef SA_RESTART
-void
-signal_no_reset(
- int sig,
- void (*func)()
- )
-{
- int n;
- struct sigaction vec;
-
- vec.sa_handler = func;
- sigemptyset(&vec.sa_mask);
- vec.sa_flags = 0;
-
- while (1)
- {
- n = sigaction(sig, &vec, NULL);
- if (n == -1 && errno == EINTR)
- continue;
- break;
- }
- if (n == -1)
- {
- perror("sigaction");
- exit(1);
- }
-}
-#endif
-#endif
#ifdef HAVE_NETINFO
static ni_namelist *
@@ -2272,7 +2196,7 @@ getnetinfoservers(void)
ni_status status;
void *domain;
ni_id confdir;
- ni_namelist *namelist = (ni_namelist*)malloc(sizeof(ni_namelist));
+ ni_namelist *namelist = emalloc(sizeof(ni_namelist));
/* Find a time server in NetInfo */
if ((status = ni_open(NULL, ".", &domain)) != NI_OK) return NULL;