diff options
Diffstat (limited to 'ntpdate/ntpdate.c')
-rw-r--r-- | ntpdate/ntpdate.c | 498 |
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; |