Deleted Added
full compact
ntpdate.c (106424) ntpdate.c (132451)
1/*
2 * ntpdate - set the time of day by polling one or more NTP servers
3 */
4
5#ifdef HAVE_CONFIG_H
6# include <config.h>
7#endif
8

--- 32 unchanged lines hidden (view full) ---

41# ifdef HAVE_SYS_IOCTL_H
42# include <sys/ioctl.h>
43# endif
44#endif /* SYS_WINNT */
45#ifdef HAVE_SYS_RESOURCE_H
46# include <sys/resource.h>
47#endif /* HAVE_SYS_RESOURCE_H */
48
1/*
2 * ntpdate - set the time of day by polling one or more NTP servers
3 */
4
5#ifdef HAVE_CONFIG_H
6# include <config.h>
7#endif
8

--- 32 unchanged lines hidden (view full) ---

41# ifdef HAVE_SYS_IOCTL_H
42# include <sys/ioctl.h>
43# endif
44#endif /* SYS_WINNT */
45#ifdef HAVE_SYS_RESOURCE_H
46# include <sys/resource.h>
47#endif /* HAVE_SYS_RESOURCE_H */
48
49#include <arpa/inet.h>
50
51#ifdef __QNXNTO__
52# include "adjtime.h"
53#endif
54
49#ifdef SYS_VXWORKS
50# include "ioLib.h"
51# include "sockLib.h"
52# include "timers.h"
53
54/* select wants a zero structure ... */
55struct timeval timeout = {0,0};
56#else
57struct timeval timeout = {60,0};
58#endif
59
55#ifdef SYS_VXWORKS
56# include "ioLib.h"
57# include "sockLib.h"
58# include "timers.h"
59
60/* select wants a zero structure ... */
61struct timeval timeout = {0,0};
62#else
63struct timeval timeout = {60,0};
64#endif
65
66#ifdef HAVE_NETINFO
67#include <netinfo/ni.h>
68#endif
69
60#include "recvbuff.h"
61
62#ifdef SYS_WINNT
70#include "recvbuff.h"
71
72#ifdef SYS_WINNT
63# define TARGET_RESOLUTION 1 /* Try for 1-millisecond accuracy
73#define EPROTONOSUPPORT WSAEPROTONOSUPPORT
74#define EAFNOSUPPORT WSAEAFNOSUPPORT
75#define EPFNOSUPPORT WSAEPFNOSUPPORT
76#define TARGET_RESOLUTION 1 /* Try for 1-millisecond accuracy
64 on Windows NT timers. */
65#pragma comment(lib, "winmm")
66#endif /* SYS_WINNT */
67
68/*
69 * Scheduling priority we run at
70 */
71#ifndef SYS_VXWORKS

--- 21 unchanged lines hidden (view full) ---

93/*
94 * Debugging flag
95 */
96volatile int debug = 0;
97
98/*
99 * File descriptor masks etc. for call to select
100 */
77 on Windows NT timers. */
78#pragma comment(lib, "winmm")
79#endif /* SYS_WINNT */
80
81/*
82 * Scheduling priority we run at
83 */
84#ifndef SYS_VXWORKS

--- 21 unchanged lines hidden (view full) ---

106/*
107 * Debugging flag
108 */
109volatile int debug = 0;
110
111/*
112 * File descriptor masks etc. for call to select
113 */
101int fd;
114
115int ai_fam_templ;
116int nbsock;
117SOCKET fd[MAX_AF]; /* support up to 2 sockets */
118int fd_family[MAX_AF]; /* to remember the socket family */
102#ifdef HAVE_POLL_H
119#ifdef HAVE_POLL_H
103struct pollfd fdmask;
120struct pollfd fdmask[MAX_AF];
104#else
105fd_set fdmask;
121#else
122fd_set fdmask;
123int maxfd;
106#endif
124#endif
125int polltest = 0;
107
108/*
109 * Initializing flag. All async routines watch this and only do their
110 * thing when it is clear.
111 */
112int initializing = 1;
113
114/*

--- 64 unchanged lines hidden (view full) ---

179/*
180 * Miscellaneous flags
181 */
182int verbose = 0;
183int always_step = 0;
184int never_step = 0;
185
186int ntpdatemain P((int, char **));
126
127/*
128 * Initializing flag. All async routines watch this and only do their
129 * thing when it is clear.
130 */
131int initializing = 1;
132
133/*

--- 64 unchanged lines hidden (view full) ---

198/*
199 * Miscellaneous flags
200 */
201int verbose = 0;
202int always_step = 0;
203int never_step = 0;
204
205int ntpdatemain P((int, char **));
206
187static void transmit P((struct server *));
188static void receive P((struct recvbuf *));
189static void server_data P((struct server *, s_fp, l_fp *, u_fp));
190static void clock_filter P((struct server *));
191static struct server *clock_select P((void));
192static int clock_adjust P((void));
193static void addserver P((char *));
207static void transmit P((struct server *));
208static void receive P((struct recvbuf *));
209static void server_data P((struct server *, s_fp, l_fp *, u_fp));
210static void clock_filter P((struct server *));
211static struct server *clock_select P((void));
212static int clock_adjust P((void));
213static void addserver P((char *));
194static struct server *findserver P((struct sockaddr_in *));
214static struct server *findserver P((struct sockaddr_storage *));
195 void timer P((void));
196static void init_alarm P((void));
197#ifndef SYS_WINNT
198static RETSIGTYPE alarming P((int));
199#endif /* SYS_WINNT */
200static void init_io P((void));
215 void timer P((void));
216static void init_alarm P((void));
217#ifndef SYS_WINNT
218static RETSIGTYPE alarming P((int));
219#endif /* SYS_WINNT */
220static void init_io P((void));
201static void sendpkt P((struct sockaddr_in *, struct pkt *, int));
221static void sendpkt P((struct sockaddr_storage *, struct pkt *, int));
202void input_handler P((void));
203
204static int l_adj_systime P((l_fp *));
205static int l_step_systime P((l_fp *));
206
222void input_handler P((void));
223
224static int l_adj_systime P((l_fp *));
225static int l_step_systime P((l_fp *));
226
207static int getnetnum P((const char *, u_int32 *));
208static void printserver P((struct server *, FILE *));
209
210#ifdef SYS_WINNT
211int on = 1;
212WORD wVersionRequested;
213WSADATA wsaData;
214HANDLE TimerThreadHandle = NULL;
215#endif /* SYS_WINNT */

--- 84 unchanged lines hidden (view full) ---

300 )
301{
302 int was_alarmed;
303 struct recvbuf *rbuflist;
304 struct recvbuf *rbuf;
305 l_fp tmp;
306 int errflg;
307 int c;
227static void printserver P((struct server *, FILE *));
228
229#ifdef SYS_WINNT
230int on = 1;
231WORD wVersionRequested;
232WSADATA wsaData;
233HANDLE TimerThreadHandle = NULL;
234#endif /* SYS_WINNT */

--- 84 unchanged lines hidden (view full) ---

319 )
320{
321 int was_alarmed;
322 struct recvbuf *rbuflist;
323 struct recvbuf *rbuf;
324 l_fp tmp;
325 int errflg;
326 int c;
327 int nfound;
328
308#ifdef HAVE_NETINFO
309 ni_namelist *netinfoservers;
310#endif
311#ifdef SYS_WINNT
312 HANDLE process_handle;
313
314 wVersionRequested = MAKEWORD(1,1);
315 if (WSAStartup(wVersionRequested, &wsaData)) {
329#ifdef HAVE_NETINFO
330 ni_namelist *netinfoservers;
331#endif
332#ifdef SYS_WINNT
333 HANDLE process_handle;
334
335 wVersionRequested = MAKEWORD(1,1);
336 if (WSAStartup(wVersionRequested, &wsaData)) {
316 msyslog(LOG_ERR, "No useable winsock.dll: %m");
337 netsyslog(LOG_ERR, "No useable winsock.dll: %m");
317 exit(1);
318 }
319
320 key_file = key_file_storage;
321
322 if (!ExpandEnvironmentStrings(KEYFILE, key_file, MAX_PATH))
323 {
324 msyslog(LOG_ERR, "ExpandEnvironmentStrings(KEYFILE) failed: %m\n");

--- 6 unchanged lines hidden (view full) ---

331
332 errflg = 0;
333 progname = argv[0];
334 syslogit = 0;
335
336 /*
337 * Decode argument list
338 */
338 exit(1);
339 }
340
341 key_file = key_file_storage;
342
343 if (!ExpandEnvironmentStrings(KEYFILE, key_file, MAX_PATH))
344 {
345 msyslog(LOG_ERR, "ExpandEnvironmentStrings(KEYFILE) failed: %m\n");

--- 6 unchanged lines hidden (view full) ---

352
353 errflg = 0;
354 progname = argv[0];
355 syslogit = 0;
356
357 /*
358 * Decode argument list
359 */
339 while ((c = ntp_getopt(argc, argv, "a:bBde:k:o:p:qr:st:uv")) != EOF)
360 while ((c = ntp_getopt(argc, argv, "46a:bBde:k:o:p:qr:st:uv")) != EOF)
340 switch (c)
341 {
361 switch (c)
362 {
363 case '4':
364 ai_fam_templ = AF_INET;
365 break;
366 case '6':
367 ai_fam_templ = AF_INET6;
368 break;
342 case 'a':
343 c = atoi(ntp_optarg);
344 sys_authenticate = 1;
345 sys_authkey = c;
346 break;
347 case 'b':
348 always_step++;
349 never_step = 0;

--- 73 unchanged lines hidden (view full) ---

423 ++errflg;
424 break;
425 default:
426 break;
427 }
428
429 if (errflg) {
430 (void) fprintf(stderr,
369 case 'a':
370 c = atoi(ntp_optarg);
371 sys_authenticate = 1;
372 sys_authkey = c;
373 break;
374 case 'b':
375 always_step++;
376 never_step = 0;

--- 73 unchanged lines hidden (view full) ---

450 ++errflg;
451 break;
452 default:
453 break;
454 }
455
456 if (errflg) {
457 (void) fprintf(stderr,
431 "usage: %s [-bBdqsuv] [-a key#] [-e delay] [-k file] [-p samples] [-o version#] [-r rate] [-t timeo] server ...\n",
432 progname);
458 "usage: %s [-46bBdqsuv] [-a key#] [-e delay] [-k file] [-p samples] [-o version#] [-r rate] [-t timeo] server ...\n",
459 progname);
433 exit(2);
434 }
435
436 if (debug || simple_query) {
437#ifdef HAVE_SETVBUF
438 static char buf[BUFSIZ];
439 setvbuf(stdout, buf, _IOLBF, BUFSIZ);
440#else

--- 92 unchanged lines hidden (view full) ---

533#endif
534#ifdef SYS_WINNT
535 process_handle = GetCurrentProcess();
536 if (!SetPriorityClass(process_handle, (DWORD) REALTIME_PRIORITY_CLASS)) {
537 msyslog(LOG_ERR, "SetPriorityClass failed: %m");
538 }
539#endif /* SYS_WINNT */
540
460 exit(2);
461 }
462
463 if (debug || simple_query) {
464#ifdef HAVE_SETVBUF
465 static char buf[BUFSIZ];
466 setvbuf(stdout, buf, _IOLBF, BUFSIZ);
467#else

--- 92 unchanged lines hidden (view full) ---

560#endif
561#ifdef SYS_WINNT
562 process_handle = GetCurrentProcess();
563 if (!SetPriorityClass(process_handle, (DWORD) REALTIME_PRIORITY_CLASS)) {
564 msyslog(LOG_ERR, "SetPriorityClass failed: %m");
565 }
566#endif /* SYS_WINNT */
567
541 initializing = 0;
542
568
569
570 initializing = 0;
543 was_alarmed = 0;
544 rbuflist = (struct recvbuf *)0;
571 was_alarmed = 0;
572 rbuflist = (struct recvbuf *)0;
573
545 while (complete_servers < sys_numservers) {
546#ifdef HAVE_POLL_H
574 while (complete_servers < sys_numservers) {
575#ifdef HAVE_POLL_H
547 struct pollfd rdfdes;
576 struct pollfd* rdfdes;
577 rdfdes = fdmask;
548#else
549 fd_set rdfdes;
578#else
579 fd_set rdfdes;
580 rdfdes = fdmask;
550#endif
581#endif
551 int nfound;
552
553 if (alarm_flag) { /* alarmed? */
554 was_alarmed = 1;
555 alarm_flag = 0;
556 }
557 rbuflist = getrecvbufs(); /* get received buffers */
558
559 if (!was_alarmed && rbuflist == (struct recvbuf *)0) {
560 /*
561 * Nothing to do. Wait for something.
562 */
582
583 if (alarm_flag) { /* alarmed? */
584 was_alarmed = 1;
585 alarm_flag = 0;
586 }
587 rbuflist = getrecvbufs(); /* get received buffers */
588
589 if (!was_alarmed && rbuflist == (struct recvbuf *)0) {
590 /*
591 * Nothing to do. Wait for something.
592 */
563 rdfdes = fdmask;
564#ifdef HAVE_POLL_H
593#ifdef HAVE_POLL_H
565 nfound = poll(&rdfdes, 1, timeout.tv_sec * 1000);
594 nfound = poll(rdfdes, (unsigned int)nbsock, timeout.tv_sec * 1000);
595
566#else
596#else
567 nfound = select(fd+1, &rdfdes, (fd_set *)0,
597 nfound = select(maxfd, &rdfdes, (fd_set *)0,
568 (fd_set *)0, &timeout);
569#endif
570 if (nfound > 0)
571 input_handler();
572 else if (
573#ifndef SYS_WINNT
574 nfound == -1
575#else
576 nfound == SOCKET_ERROR
577#endif /* SYS_WINNT */
578 ) {
579#ifndef SYS_WINNT
580 if (errno != EINTR)
581#endif
598 (fd_set *)0, &timeout);
599#endif
600 if (nfound > 0)
601 input_handler();
602 else if (
603#ifndef SYS_WINNT
604 nfound == -1
605#else
606 nfound == SOCKET_ERROR
607#endif /* SYS_WINNT */
608 ) {
609#ifndef SYS_WINNT
610 if (errno != EINTR)
611#endif
582 msyslog(LOG_ERR,
612 netsyslog(LOG_ERR,
583#ifdef HAVE_POLL_H
584 "poll() error: %m"
585#else
586 "select() error: %m"
587#endif
588 );
589 } else {
590#ifndef SYS_VXWORKS
613#ifdef HAVE_POLL_H
614 "poll() error: %m"
615#else
616 "select() error: %m"
617#endif
618 );
619 } else {
620#ifndef SYS_VXWORKS
591 msyslog(LOG_DEBUG,
621 netsyslog(LOG_DEBUG,
592#ifdef HAVE_POLL_H
593 "poll(): nfound = %d, error: %m",
594#else
595 "select(): nfound = %d, error: %m",
596#endif
597 nfound);
598#endif
599 }

--- 34 unchanged lines hidden (view full) ---

634 */
635#ifdef SYS_WINNT
636 WSACleanup();
637#endif
638#ifdef SYS_VXWORKS
639 close (fd);
640 timer_delete(ntpdate_timerid);
641#endif
622#ifdef HAVE_POLL_H
623 "poll(): nfound = %d, error: %m",
624#else
625 "select(): nfound = %d, error: %m",
626#endif
627 nfound);
628#endif
629 }

--- 34 unchanged lines hidden (view full) ---

664 */
665#ifdef SYS_WINNT
666 WSACleanup();
667#endif
668#ifdef SYS_VXWORKS
669 close (fd);
670 timer_delete(ntpdate_timerid);
671#endif
672
642 return clock_adjust();
643}
644
645
646/*
647 * transmit - transmit a packet to the given server, or mark it completed.
648 * This is called by the timeout routine and by the receive
649 * procedure.
650 */
651static void
652transmit(
653 register struct server *server
654 )
655{
656 struct pkt xpkt;
657
658 if (debug)
673 return clock_adjust();
674}
675
676
677/*
678 * transmit - transmit a packet to the given server, or mark it completed.
679 * This is called by the timeout routine and by the receive
680 * procedure.
681 */
682static void
683transmit(
684 register struct server *server
685 )
686{
687 struct pkt xpkt;
688
689 if (debug)
659 printf("transmit(%s)\n", ntoa(&server->srcadr));
690 printf("transmit(%s)\n", stoa(&(server->srcadr)));
660
661 if (server->filter_nextpt < server->xmtcnt) {
662 l_fp ts;
663 /*
664 * Last message to this server timed out. Shift
665 * zeros into the filter.
666 */
667 L_CLR(&ts);

--- 38 unchanged lines hidden (view full) ---

706 get_systime(&server->xmt);
707 L_ADDUF(&server->xmt, sys_authdelay);
708 HTONL_FP(&server->xmt, &xpkt.xmt);
709 len = authencrypt(sys_authkey, (u_int32 *)&xpkt, LEN_PKT_NOMAC);
710 sendpkt(&(server->srcadr), &xpkt, (int)(LEN_PKT_NOMAC + len));
711
712 if (debug > 1)
713 printf("transmit auth to %s\n",
691
692 if (server->filter_nextpt < server->xmtcnt) {
693 l_fp ts;
694 /*
695 * Last message to this server timed out. Shift
696 * zeros into the filter.
697 */
698 L_CLR(&ts);

--- 38 unchanged lines hidden (view full) ---

737 get_systime(&server->xmt);
738 L_ADDUF(&server->xmt, sys_authdelay);
739 HTONL_FP(&server->xmt, &xpkt.xmt);
740 len = authencrypt(sys_authkey, (u_int32 *)&xpkt, LEN_PKT_NOMAC);
741 sendpkt(&(server->srcadr), &xpkt, (int)(LEN_PKT_NOMAC + len));
742
743 if (debug > 1)
744 printf("transmit auth to %s\n",
714 ntoa(&(server->srcadr)));
745 stoa(&(server->srcadr)));
715 } else {
716 get_systime(&(server->xmt));
717 HTONL_FP(&server->xmt, &xpkt.xmt);
718 sendpkt(&(server->srcadr), &xpkt, LEN_PKT_NOMAC);
719
720 if (debug > 1)
746 } else {
747 get_systime(&(server->xmt));
748 HTONL_FP(&server->xmt, &xpkt.xmt);
749 sendpkt(&(server->srcadr), &xpkt, LEN_PKT_NOMAC);
750
751 if (debug > 1)
721 printf("transmit to %s\n", ntoa(&(server->srcadr)));
752 printf("transmit to %s\n", stoa(&(server->srcadr)));
722 }
723
724 /*
725 * Update the server timeout and transmit count
726 */
727 server->event_time = current_time + sys_timeout;
728 server->xmtcnt++;
729}

--- 13 unchanged lines hidden (view full) ---

743 l_fp t10, t23, tmp;
744 l_fp org;
745 l_fp rec;
746 l_fp ci;
747 int has_mac;
748 int is_authentic;
749
750 if (debug)
753 }
754
755 /*
756 * Update the server timeout and transmit count
757 */
758 server->event_time = current_time + sys_timeout;
759 server->xmtcnt++;
760}

--- 13 unchanged lines hidden (view full) ---

774 l_fp t10, t23, tmp;
775 l_fp org;
776 l_fp rec;
777 l_fp ci;
778 int has_mac;
779 int is_authentic;
780
781 if (debug)
751 printf("receive(%s)\n", ntoa(&rbufp->recv_srcadr));
782 printf("receive(%s)\n", stoa(&rbufp->recv_srcadr));
752 /*
753 * Check to see if the packet basically looks like something
754 * intended for us.
755 */
756 if (rbufp->recv_length == LEN_PKT_NOMAC)
757 has_mac = 0;
758 else if (rbufp->recv_length >= LEN_PKT_NOMAC)
759 has_mac = 1;

--- 146 unchanged lines hidden (view full) ---

906static void
907server_data(
908 register struct server *server,
909 s_fp d,
910 l_fp *c,
911 u_fp e
912 )
913{
783 /*
784 * Check to see if the packet basically looks like something
785 * intended for us.
786 */
787 if (rbufp->recv_length == LEN_PKT_NOMAC)
788 has_mac = 0;
789 else if (rbufp->recv_length >= LEN_PKT_NOMAC)
790 has_mac = 1;

--- 146 unchanged lines hidden (view full) ---

937static void
938server_data(
939 register struct server *server,
940 s_fp d,
941 l_fp *c,
942 u_fp e
943 )
944{
914 register int i;
945 u_short i;
915
916 i = server->filter_nextpt;
917 if (i < NTP_SHIFT) {
918 server->filter_delay[i] = d;
919 server->filter_offset[i] = *c;
920 server->filter_soffset[i] = LFPTOFP(c);
921 server->filter_error[i] = e;
946
947 i = server->filter_nextpt;
948 if (i < NTP_SHIFT) {
949 server->filter_delay[i] = d;
950 server->filter_offset[i] = *c;
951 server->filter_soffset[i] = LFPTOFP(c);
952 server->filter_error[i] = e;
922 server->filter_nextpt = i + 1;
953 server->filter_nextpt = (u_short)(i + 1);
923 }
924}
925
926
927/*
928 * clock_filter - determine a server's delay, dispersion and offset
929 */
930static void

--- 318 unchanged lines hidden (view full) ---

1249 if (absoffset < 0)
1250 absoffset = -absoffset;
1251 dostep = (absoffset >= NTPDATE_THRESHOLD || absoffset < 0);
1252 }
1253
1254 if (dostep) {
1255 if (simple_query || l_step_systime(&server->offset)) {
1256 msyslog(LOG_NOTICE, "step time server %s offset %s sec",
954 }
955}
956
957
958/*
959 * clock_filter - determine a server's delay, dispersion and offset
960 */
961static void

--- 318 unchanged lines hidden (view full) ---

1280 if (absoffset < 0)
1281 absoffset = -absoffset;
1282 dostep = (absoffset >= NTPDATE_THRESHOLD || absoffset < 0);
1283 }
1284
1285 if (dostep) {
1286 if (simple_query || l_step_systime(&server->offset)) {
1287 msyslog(LOG_NOTICE, "step time server %s offset %s sec",
1257 ntoa(&server->srcadr),
1288 stoa(&server->srcadr),
1258 lfptoa(&server->offset, 6));
1259 }
1260 } else {
1261#if !defined SYS_WINNT && !defined SYS_CYGWIN32
1262 if (simple_query || l_adj_systime(&server->offset)) {
1263 msyslog(LOG_NOTICE, "adjust time server %s offset %s sec",
1289 lfptoa(&server->offset, 6));
1290 }
1291 } else {
1292#if !defined SYS_WINNT && !defined SYS_CYGWIN32
1293 if (simple_query || l_adj_systime(&server->offset)) {
1294 msyslog(LOG_NOTICE, "adjust time server %s offset %s sec",
1264 ntoa(&server->srcadr),
1295 stoa(&server->srcadr),
1265 lfptoa(&server->offset, 6));
1266 }
1267#else
1268 /* The NT SetSystemTimeAdjustment() call achieves slewing by
1269 * changing the clock frequency. This means that we cannot specify
1270 * it to slew the clock by a definite amount and then stop like
1271 * the Unix adjtime() routine. We can technically adjust the clock
1272 * frequency, have ntpdate sleep for a while, and then wake

--- 15 unchanged lines hidden (view full) ---

1288 * for it.
1289 */
1290static void
1291addserver(
1292 char *serv
1293 )
1294{
1295 register struct server *server;
1296 lfptoa(&server->offset, 6));
1297 }
1298#else
1299 /* The NT SetSystemTimeAdjustment() call achieves slewing by
1300 * changing the clock frequency. This means that we cannot specify
1301 * it to slew the clock by a definite amount and then stop like
1302 * the Unix adjtime() routine. We can technically adjust the clock
1303 * frequency, have ntpdate sleep for a while, and then wake

--- 15 unchanged lines hidden (view full) ---

1319 * for it.
1320 */
1321static void
1322addserver(
1323 char *serv
1324 )
1325{
1326 register struct server *server;
1296 u_int32 netnum;
1327 /* Address infos structure to store result of getaddrinfo */
1328 struct addrinfo *addrResult;
1329 /* Address infos structure to store hints for getaddrinfo */
1330 struct addrinfo hints;
1331 /* Error variable for getaddrinfo */
1332 int error;
1333 /* Service name */
1334 char service[5];
1335 strcpy(service, "ntp");
1297
1336
1298 if (!getnetnum(serv, &netnum)) {
1337 /* Get host address. Looking for UDP datagram connection. */
1338 memset(&hints, 0, sizeof(hints));
1339 hints.ai_family = ai_fam_templ;
1340 hints.ai_socktype = SOCK_DGRAM;
1341
1342 printf("Looking for host %s and service %s\n", serv, service);
1343
1344 error = getaddrinfo(serv, service, &hints, &addrResult);
1345 if (error != 0) {
1346 fprintf(stderr, "Error : %s\n", gai_strerror(error));
1299 msyslog(LOG_ERR, "can't find host %s\n", serv);
1300 return;
1301 }
1347 msyslog(LOG_ERR, "can't find host %s\n", serv);
1348 return;
1349 }
1350 else {
1351 fprintf(stderr, "host found : %s\n", stohost((struct sockaddr_storage*)addrResult->ai_addr));
1352 }
1302
1303 server = (struct server *)emalloc(sizeof(struct server));
1304 memset((char *)server, 0, sizeof(struct server));
1305
1353
1354 server = (struct server *)emalloc(sizeof(struct server));
1355 memset((char *)server, 0, sizeof(struct server));
1356
1306 server->srcadr.sin_family = AF_INET;
1307 server->srcadr.sin_addr.s_addr = netnum;
1308 server->srcadr.sin_port = htons(NTP_PORT);
1309
1357 /* For now we only get the first returned server of the addrinfo list */
1358 memset(&(server->srcadr), 0, sizeof(struct sockaddr_storage));
1359 memcpy(&(server->srcadr), addrResult->ai_addr, addrResult->ai_addrlen);
1310 server->event_time = ++sys_numservers;
1311 if (sys_servers == NULL)
1312 sys_servers = server;
1313 else {
1314 struct server *sp;
1315
1316 for (sp = sys_servers; sp->next_server != NULL;
1317 sp = sp->next_server) ;
1318 sp->next_server = server;
1319 }
1320}
1321
1322
1323/*
1324 * findserver - find a server in the list given its address
1360 server->event_time = ++sys_numservers;
1361 if (sys_servers == NULL)
1362 sys_servers = server;
1363 else {
1364 struct server *sp;
1365
1366 for (sp = sys_servers; sp->next_server != NULL;
1367 sp = sp->next_server) ;
1368 sp->next_server = server;
1369 }
1370}
1371
1372
1373/*
1374 * findserver - find a server in the list given its address
1375 * ***(For now it isn't totally AF-Independant, to check later..)
1325 */
1326static struct server *
1327findserver(
1376 */
1377static struct server *
1378findserver(
1328 struct sockaddr_in *addr
1379 struct sockaddr_storage *addr
1329 )
1330{
1380 )
1381{
1331 register u_int32 netnum;
1332 struct server *server;
1333 struct server *mc_server;
1334
1335 mc_server = NULL;
1382 struct server *server;
1383 struct server *mc_server;
1384
1385 mc_server = NULL;
1336 if (htons(addr->sin_port) != NTP_PORT)
1386 if (htons(((struct sockaddr_in*)addr)->sin_port) != NTP_PORT)
1337 return 0;
1387 return 0;
1338 netnum = addr->sin_addr.s_addr;
1339
1340 for (server = sys_servers; server != NULL;
1341 server = server->next_server) {
1388
1389 for (server = sys_servers; server != NULL;
1390 server = server->next_server) {
1342 register u_int32 servnum;
1343
1391
1344 servnum = server->srcadr.sin_addr.s_addr;
1345 if (netnum == servnum)
1392 if (memcmp(addr, &server->srcadr, SOCKLEN(addr))==0)
1346 return server;
1393 return server;
1347 if (IN_MULTICAST(ntohl(servnum)))
1394 /* Multicast compatibility to verify here... I'm not sure it's working */
1395 if(addr->ss_family == AF_INET) {
1396 if (IN_MULTICAST(ntohl(((struct sockaddr_in*)addr)->sin_addr.s_addr)))
1397 mc_server = server;
1398 }
1399 else {
1400#ifdef AF_INET6
1401 if (IN6_IS_ADDR_MULTICAST(&((struct sockaddr_in6*)(&server->srcadr))->sin6_addr))
1348 mc_server = server;
1402 mc_server = server;
1403#else
1404 return 0;
1405#endif
1406 }
1349 }
1350
1351 if (mc_server != NULL) {
1407 }
1408
1409 if (mc_server != NULL) {
1410
1352 struct server *sp;
1353
1354 if (mc_server->event_time != 0) {
1355 mc_server->event_time = 0;
1356 complete_servers++;
1357 }
1411 struct server *sp;
1412
1413 if (mc_server->event_time != 0) {
1414 mc_server->event_time = 0;
1415 complete_servers++;
1416 }
1417
1358 server = (struct server *)emalloc(sizeof(struct server));
1359 memset((char *)server, 0, sizeof(struct server));
1360
1418 server = (struct server *)emalloc(sizeof(struct server));
1419 memset((char *)server, 0, sizeof(struct server));
1420
1361 server->srcadr.sin_family = AF_INET;
1362 server->srcadr.sin_addr.s_addr = netnum;
1363 server->srcadr.sin_port = htons(NTP_PORT);
1421 memcpy(&server->srcadr, &addr, sizeof(struct sockaddr_storage));
1364
1365 server->event_time = ++sys_numservers;
1422
1423 server->event_time = ++sys_numservers;
1424
1366 for (sp = sys_servers; sp->next_server != NULL;
1367 sp = sp->next_server) ;
1368 sp->next_server = server;
1369 transmit(server);
1370 }
1371 return NULL;
1372}
1373

--- 106 unchanged lines hidden (view full) ---

1480 /*
1481 * Set up the alarm interrupt. The first comes 1/(2*TIMER_HZ)
1482 * seconds from now and they continue on every 1/TIMER_HZ seconds.
1483 */
1484 (void) signal_no_reset(SIGALRM, alarming);
1485 itimer.it_interval.tv_sec = itimer.it_value.tv_sec = 0;
1486 itimer.it_interval.tv_usec = 1000000/TIMER_HZ;
1487 itimer.it_value.tv_usec = 1000000/(TIMER_HZ<<1);
1425 for (sp = sys_servers; sp->next_server != NULL;
1426 sp = sp->next_server) ;
1427 sp->next_server = server;
1428 transmit(server);
1429 }
1430 return NULL;
1431}
1432

--- 106 unchanged lines hidden (view full) ---

1539 /*
1540 * Set up the alarm interrupt. The first comes 1/(2*TIMER_HZ)
1541 * seconds from now and they continue on every 1/TIMER_HZ seconds.
1542 */
1543 (void) signal_no_reset(SIGALRM, alarming);
1544 itimer.it_interval.tv_sec = itimer.it_value.tv_sec = 0;
1545 itimer.it_interval.tv_usec = 1000000/TIMER_HZ;
1546 itimer.it_value.tv_usec = 1000000/(TIMER_HZ<<1);
1547
1488 setitimer(ITIMER_REAL, &itimer, (struct itimerval *)0);
1489# endif
1490#if defined SYS_CYGWIN32
1491 /*
1492 * Get previleges needed for fiddling with the clock
1493 */
1494
1495 /* get the current process token handle */

--- 81 unchanged lines hidden (view full) ---

1577
1578
1579/*
1580 * init_io - initialize I/O data and open socket
1581 */
1582static void
1583init_io(void)
1584{
1548 setitimer(ITIMER_REAL, &itimer, (struct itimerval *)0);
1549# endif
1550#if defined SYS_CYGWIN32
1551 /*
1552 * Get previleges needed for fiddling with the clock
1553 */
1554
1555 /* get the current process token handle */

--- 81 unchanged lines hidden (view full) ---

1637
1638
1639/*
1640 * init_io - initialize I/O data and open socket
1641 */
1642static void
1643init_io(void)
1644{
1645 struct addrinfo *res, *ressave;
1646 struct addrinfo hints;
1647 char service[5];
1648 int optval = 1;
1649
1585 /*
1586 * Init buffer free list and stat counters
1587 */
1588 init_recvbuff(sys_numservers + 2);
1650 /*
1651 * Init buffer free list and stat counters
1652 */
1653 init_recvbuff(sys_numservers + 2);
1654
1589 /*
1590 * Open the socket
1591 */
1592
1655 /*
1656 * Open the socket
1657 */
1658
1659 strcpy(service, "ntp");
1660
1661 /*
1662 * Init hints addrinfo structure
1663 */
1664 memset(&hints, 0, sizeof(hints));
1665 hints.ai_flags = AI_PASSIVE;
1666 hints.ai_socktype = SOCK_DGRAM;
1667
1668 if(getaddrinfo(NULL, service, &hints, &res) != 0) {
1669 msyslog(LOG_ERR, "getaddrinfo() failed: %m");
1670 exit(1);
1671 /*NOTREACHED*/
1672 }
1673
1674 /* Remember the address of the addrinfo structure chain */
1675 ressave = res;
1676
1677 /*
1678 * For each structure returned, open and bind socket
1679 */
1680 for(nbsock = 0; (nbsock < MAX_AF) && res ; res = res->ai_next) {
1593 /* create a datagram (UDP) socket */
1681 /* create a datagram (UDP) socket */
1594 if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
1595 msyslog(LOG_ERR, "socket() failed: %m");
1682 if ((fd[nbsock] = socket(res->ai_family, res->ai_socktype, res->ai_protocol)) < 0) {
1683 if (errno == EPROTONOSUPPORT || errno == EAFNOSUPPORT ||
1684 errno == EPFNOSUPPORT)
1685 continue;
1686 netsyslog(LOG_ERR, "socket() failed: %m");
1596 exit(1);
1597 /*NOTREACHED*/
1598 }
1687 exit(1);
1688 /*NOTREACHED*/
1689 }
1690 /* set socket to reuse address */
1691 if (setsockopt(fd[nbsock], SOL_SOCKET, SO_REUSEADDR, (void*) &optval, sizeof(optval)) < 0) {
1692 netsyslog(LOG_ERR, "setsockopt() SO_REUSEADDR failed: %m");
1693 exit(1);
1694 /*NOTREACHED*/
1695 }
1696#ifdef IPV6_V6ONLY
1697 /* Restricts AF_INET6 socket to IPv6 communications (see RFC 2553bis-03) */
1698 if (res->ai_family == AF_INET6)
1699 if (setsockopt(fd[nbsock], IPPROTO_IPV6, IPV6_V6ONLY, (void*) &optval, sizeof(optval)) < 0) {
1700 netsyslog(LOG_ERR, "setsockopt() IPV6_V6ONLY failed: %m");
1701 exit(1);
1702 /*NOTREACHED*/
1703 }
1704#endif
1599
1705
1706 /* Remember the socket family in fd_family structure */
1707 fd_family[nbsock] = res->ai_family;
1708
1600 /*
1601 * bind the socket to the NTP port
1602 */
1603 if (!debug && !simple_query && !unpriv_port) {
1709 /*
1710 * bind the socket to the NTP port
1711 */
1712 if (!debug && !simple_query && !unpriv_port) {
1604 struct sockaddr_in addr;
1605
1606 memset((char *)&addr, 0, sizeof addr);
1607 addr.sin_family = AF_INET;
1608 addr.sin_port = htons(NTP_PORT);
1609 addr.sin_addr.s_addr = htonl(INADDR_ANY);
1610 if (bind(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
1713 if (bind(fd[nbsock], res->ai_addr, SOCKLEN(res->ai_addr)) < 0) {
1611#ifndef SYS_WINNT
1612 if (errno == EADDRINUSE)
1613#else
1614 if (WSAGetLastError() == WSAEADDRINUSE)
1615#endif /* SYS_WINNT */
1714#ifndef SYS_WINNT
1715 if (errno == EADDRINUSE)
1716#else
1717 if (WSAGetLastError() == WSAEADDRINUSE)
1718#endif /* SYS_WINNT */
1616 msyslog(LOG_ERR,
1719 netsyslog(LOG_ERR,
1617 "the NTP socket is in use, exiting");
1618 else
1720 "the NTP socket is in use, exiting");
1721 else
1619 msyslog(LOG_ERR, "bind() fails: %m");
1722 netsyslog(LOG_ERR, "bind() fails: %m");
1620 exit(1);
1621 }
1622 }
1623
1624#ifdef HAVE_POLL_H
1723 exit(1);
1724 }
1725 }
1726
1727#ifdef HAVE_POLL_H
1625 fdmask.fd = fd;
1626 fdmask.events = POLLIN;
1728 fdmask[nbsock].fd = fd[nbsock];
1729 fdmask[nbsock].events = POLLIN;
1627#else
1730#else
1628 FD_ZERO(&fdmask);
1629 FD_SET(fd, &fdmask);
1731 FD_SET(fd[nbsock], &fdmask);
1732 if ((SOCKET) maxfd < fd[nbsock]+1) {
1733 maxfd = fd[nbsock]+1;
1734 }
1630#endif
1631
1632 /*
1633 * set non-blocking,
1634 */
1635#ifndef SYS_WINNT
1636# ifdef SYS_VXWORKS
1637 {
1638 int on = TRUE;
1639
1735#endif
1736
1737 /*
1738 * set non-blocking,
1739 */
1740#ifndef SYS_WINNT
1741# ifdef SYS_VXWORKS
1742 {
1743 int on = TRUE;
1744
1640 if (ioctl(fd,FIONBIO, &on) == ERROR) {
1641 msyslog(LOG_ERR, "ioctl(FIONBIO) fails: %m");
1745 if (ioctl(fd[nbsock],FIONBIO, &on) == ERROR) {
1746 netsyslog(LOG_ERR, "ioctl(FIONBIO) fails: %m");
1642 exit(1);
1643 }
1644 }
1645# else /* not SYS_VXWORKS */
1646# if defined(O_NONBLOCK)
1747 exit(1);
1748 }
1749 }
1750# else /* not SYS_VXWORKS */
1751# if defined(O_NONBLOCK)
1647 if (fcntl(fd, F_SETFL, O_NONBLOCK) < 0) {
1648 msyslog(LOG_ERR, "fcntl(FNDELAY|FASYNC) fails: %m");
1752 if (fcntl(fd[nbsock], F_SETFL, O_NONBLOCK) < 0) {
1753 netsyslog(LOG_ERR, "fcntl(FNDELAY|FASYNC) fails: %m");
1649 exit(1);
1650 /*NOTREACHED*/
1651 }
1652# else /* not O_NONBLOCK */
1653# if defined(FNDELAY)
1754 exit(1);
1755 /*NOTREACHED*/
1756 }
1757# else /* not O_NONBLOCK */
1758# if defined(FNDELAY)
1654 if (fcntl(fd, F_SETFL, FNDELAY) < 0) {
1655 msyslog(LOG_ERR, "fcntl(FNDELAY|FASYNC) fails: %m");
1759 if (fcntl(fd[nbsock], F_SETFL, FNDELAY) < 0) {
1760 netsyslog(LOG_ERR, "fcntl(FNDELAY|FASYNC) fails: %m");
1656 exit(1);
1657 /*NOTREACHED*/
1658 }
1659# else /* FNDELAY */
1660# include "Bletch: Need non blocking I/O"
1661# endif /* FNDELAY */
1662# endif /* not O_NONBLOCK */
1663# endif /* SYS_VXWORKS */
1664#else /* SYS_WINNT */
1761 exit(1);
1762 /*NOTREACHED*/
1763 }
1764# else /* FNDELAY */
1765# include "Bletch: Need non blocking I/O"
1766# endif /* FNDELAY */
1767# endif /* not O_NONBLOCK */
1768# endif /* SYS_VXWORKS */
1769#else /* SYS_WINNT */
1665 if (ioctlsocket(fd, FIONBIO, (u_long *) &on) == SOCKET_ERROR) {
1666 msyslog(LOG_ERR, "ioctlsocket(FIONBIO) fails: %m");
1770 if (ioctlsocket(fd[nbsock], FIONBIO, (u_long *) &on) == SOCKET_ERROR) {
1771 netsyslog(LOG_ERR, "ioctlsocket(FIONBIO) fails: %m");
1667 exit(1);
1668 }
1669#endif /* SYS_WINNT */
1772 exit(1);
1773 }
1774#endif /* SYS_WINNT */
1775 nbsock++;
1776 }
1777 freeaddrinfo(ressave);
1670}
1671
1778}
1779
1672
1673/*
1674 * sendpkt - send a packet to the specified destination
1675 */
1676static void
1677sendpkt(
1780/*
1781 * sendpkt - send a packet to the specified destination
1782 */
1783static void
1784sendpkt(
1678 struct sockaddr_in *dest,
1785 struct sockaddr_storage *dest,
1679 struct pkt *pkt,
1680 int len
1681 )
1682{
1786 struct pkt *pkt,
1787 int len
1788 )
1789{
1790 int i;
1683 int cc;
1791 int cc;
1792 SOCKET sock = 0;
1684
1685#ifdef SYS_WINNT
1686 DWORD err;
1687#endif /* SYS_WINNT */
1688
1793
1794#ifdef SYS_WINNT
1795 DWORD err;
1796#endif /* SYS_WINNT */
1797
1689 cc = sendto(fd, (char *)pkt, (size_t)len, 0, (struct sockaddr *)dest,
1690 sizeof(struct sockaddr_in));
1798 /* Find a local family compatible socket to send ntp packet to ntp server */
1799 for(i = 0; (i < MAX_AF); i++) {
1800 if(dest->ss_family == fd_family[i]) {
1801 sock = fd[i];
1802 break;
1803 }
1804 }
1805
1806 if ( sock == 0 ) {
1807 netsyslog(LOG_ERR, "cannot find family compatible socket to send ntp packet");
1808 exit(1);
1809 /*NOTREACHED*/
1810 }
1811
1812 cc = sendto(sock, (char *)pkt, len, 0, (struct sockaddr *)dest,
1813 SOCKLEN(dest));
1814
1691#ifndef SYS_WINNT
1692 if (cc == -1) {
1693 if (errno != EWOULDBLOCK && errno != ENOBUFS)
1694#else
1695 if (cc == SOCKET_ERROR) {
1696 err = WSAGetLastError();
1697 if (err != WSAEWOULDBLOCK && err != WSAENOBUFS)
1698#endif /* SYS_WINNT */
1815#ifndef SYS_WINNT
1816 if (cc == -1) {
1817 if (errno != EWOULDBLOCK && errno != ENOBUFS)
1818#else
1819 if (cc == SOCKET_ERROR) {
1820 err = WSAGetLastError();
1821 if (err != WSAEWOULDBLOCK && err != WSAENOBUFS)
1822#endif /* SYS_WINNT */
1699 msyslog(LOG_ERR, "sendto(%s): %m", ntoa(dest));
1823 netsyslog(LOG_ERR, "sendto(%s): %m", stohost(dest));
1700 }
1701}
1702
1703
1704/*
1705 * input_handler - receive packets asynchronously
1706 */
1707void
1708input_handler(void)
1709{
1710 register int n;
1711 register struct recvbuf *rb;
1712 struct timeval tvzero;
1713 int fromlen;
1714 l_fp ts;
1824 }
1825}
1826
1827
1828/*
1829 * input_handler - receive packets asynchronously
1830 */
1831void
1832input_handler(void)
1833{
1834 register int n;
1835 register struct recvbuf *rb;
1836 struct timeval tvzero;
1837 int fromlen;
1838 l_fp ts;
1839 int i;
1715#ifdef HAVE_POLL_H
1840#ifdef HAVE_POLL_H
1716 struct pollfd fds;
1841 struct pollfd fds[MAX_AF];
1717#else
1718 fd_set fds;
1719#endif
1842#else
1843 fd_set fds;
1844#endif
1845 int fdc = 0;
1720
1721 /*
1722 * Do a poll to see if we have data
1723 */
1724 for (;;) {
1846
1847 /*
1848 * Do a poll to see if we have data
1849 */
1850 for (;;) {
1725 fds = fdmask;
1726 tvzero.tv_sec = tvzero.tv_usec = 0;
1727#ifdef HAVE_POLL_H
1851 tvzero.tv_sec = tvzero.tv_usec = 0;
1852#ifdef HAVE_POLL_H
1728 n = poll(&fds, 1, tvzero.tv_sec * 1000);
1853 memcpy(fds, fdmask, sizeof(fdmask));
1854 n = poll(fds, (unsigned int)nbsock, tvzero.tv_sec * 1000);
1855
1856 /*
1857 * Determine which socket received data
1858 */
1859
1860 for(i=0; i < nbsock; i++) {
1861 if(fds[i].revents & POLLIN) {
1862 fdc = fd[i];
1863 break;
1864 }
1865 }
1866
1729#else
1867#else
1730 n = select(fd+1, &fds, (fd_set *)0, (fd_set *)0, &tvzero);
1868 fds = fdmask;
1869 n = select(maxfd, &fds, (fd_set *)0, (fd_set *)0, &tvzero);
1870
1871 /*
1872 * Determine which socket received data
1873 */
1874
1875 for(i=0; i < maxfd; i++) {
1876 if(FD_ISSET(fd[i], &fds)) {
1877 fdc = fd[i];
1878 break;
1879 }
1880 }
1881
1731#endif
1732
1733 /*
1734 * If nothing to do, just return. If an error occurred,
1735 * complain and return. If we've got some, freeze a
1736 * timestamp.
1737 */
1738 if (n == 0)
1739 return;
1740 else if (n == -1) {
1741 if (errno != EINTR)
1882#endif
1883
1884 /*
1885 * If nothing to do, just return. If an error occurred,
1886 * complain and return. If we've got some, freeze a
1887 * timestamp.
1888 */
1889 if (n == 0)
1890 return;
1891 else if (n == -1) {
1892 if (errno != EINTR)
1742 msyslog(LOG_ERR,
1893 netsyslog(LOG_ERR,
1743#ifdef HAVE_POLL_H
1744 "poll() error: %m"
1745#else
1746 "select() error: %m"
1747#endif
1748 );
1749 return;
1750 }
1751 get_systime(&ts);
1752
1753 /*
1754 * Get a buffer and read the frame. If we
1755 * haven't got a buffer, or this is received
1756 * on the wild card socket, just dump the packet.
1757 */
1758 if (initializing || free_recvbuffs() == 0) {
1759 char buf[100];
1760
1894#ifdef HAVE_POLL_H
1895 "poll() error: %m"
1896#else
1897 "select() error: %m"
1898#endif
1899 );
1900 return;
1901 }
1902 get_systime(&ts);
1903
1904 /*
1905 * Get a buffer and read the frame. If we
1906 * haven't got a buffer, or this is received
1907 * on the wild card socket, just dump the packet.
1908 */
1909 if (initializing || free_recvbuffs() == 0) {
1910 char buf[100];
1911
1912
1761#ifndef SYS_WINNT
1913#ifndef SYS_WINNT
1762 (void) read(fd, buf, sizeof buf);
1914 (void) read(fdc, buf, sizeof buf);
1763#else
1764 /* NT's _read does not operate on nonblocking sockets
1765 * either recvfrom or ReadFile() has to be used here.
1766 * ReadFile is used in [ntpd]ntp_intres() and ntpdc,
1767 * just to be different use recvfrom() here
1768 */
1915#else
1916 /* NT's _read does not operate on nonblocking sockets
1917 * either recvfrom or ReadFile() has to be used here.
1918 * ReadFile is used in [ntpd]ntp_intres() and ntpdc,
1919 * just to be different use recvfrom() here
1920 */
1769 recvfrom(fd, buf, sizeof(buf), 0, (struct sockaddr *)0, NULL);
1921 recvfrom(fdc, buf, sizeof(buf), 0, (struct sockaddr *)0, NULL);
1770#endif /* SYS_WINNT */
1771 continue;
1772 }
1773
1774 rb = get_free_recv_buffer();
1775
1922#endif /* SYS_WINNT */
1923 continue;
1924 }
1925
1926 rb = get_free_recv_buffer();
1927
1776 fromlen = sizeof(struct sockaddr_in);
1777 rb->recv_length = recvfrom(fd, (char *)&rb->recv_pkt,
1928 fromlen = sizeof(struct sockaddr_storage);
1929 rb->recv_length = recvfrom(fdc, (char *)&rb->recv_pkt,
1778 sizeof(rb->recv_pkt), 0,
1779 (struct sockaddr *)&rb->recv_srcadr, &fromlen);
1780 if (rb->recv_length == -1) {
1781 freerecvbuf(rb);
1782 continue;
1783 }
1784
1785 /*

--- 117 unchanged lines hidden (view full) ---

1903#else /* SLEWALWAYS */
1904 if (debug)
1905 return 1;
1906 LFPTOD(ts, dtemp);
1907 return step_systime(dtemp);
1908#endif /* SLEWALWAYS */
1909}
1910
1930 sizeof(rb->recv_pkt), 0,
1931 (struct sockaddr *)&rb->recv_srcadr, &fromlen);
1932 if (rb->recv_length == -1) {
1933 freerecvbuf(rb);
1934 continue;
1935 }
1936
1937 /*

--- 117 unchanged lines hidden (view full) ---

2055#else /* SLEWALWAYS */
2056 if (debug)
2057 return 1;
2058 LFPTOD(ts, dtemp);
2059 return step_systime(dtemp);
2060#endif /* SLEWALWAYS */
2061}
2062
1911/*
1912 * getnetnum - given a host name, return its net number
1913 */
1914static int
1915getnetnum(
1916 const char *host,
1917 u_int32 *num
1918 )
1919{
1920 struct hostent *hp;
1921
2063
1922 if (decodenetnum(host, num)) {
1923 return 1;
1924 } else if ((hp = gethostbyname(host)) != 0) {
1925 memmove((char *)num, hp->h_addr, sizeof(u_int32));
1926 return (1);
1927 }
1928 return (0);
1929}
1930
1931/* XXX ELIMINATE printserver similar in ntptrace.c, ntpdate.c */
1932/*
1933 * printserver - print detail information for a server
1934 */
1935static void
1936printserver(
1937 register struct server *pp,
1938 FILE *fp
1939 )
1940{
1941 register int i;
1942 char junk[5];
1943 char *str;
1944
1945 if (!debug) {
1946 (void) fprintf(fp, "server %s, stratum %d, offset %s, delay %s\n",
2064/* XXX ELIMINATE printserver similar in ntptrace.c, ntpdate.c */
2065/*
2066 * printserver - print detail information for a server
2067 */
2068static void
2069printserver(
2070 register struct server *pp,
2071 FILE *fp
2072 )
2073{
2074 register int i;
2075 char junk[5];
2076 char *str;
2077
2078 if (!debug) {
2079 (void) fprintf(fp, "server %s, stratum %d, offset %s, delay %s\n",
1947 ntoa(&pp->srcadr), pp->stratum,
2080 stoa(&pp->srcadr), pp->stratum,
1948 lfptoa(&pp->offset, 6), fptoa((s_fp)pp->delay, 5));
1949 return;
1950 }
1951
1952 (void) fprintf(fp, "server %s, port %d\n",
2081 lfptoa(&pp->offset, 6), fptoa((s_fp)pp->delay, 5));
2082 return;
2083 }
2084
2085 (void) fprintf(fp, "server %s, port %d\n",
1953 ntoa(&pp->srcadr), ntohs(pp->srcadr.sin_port));
2086 stoa(&pp->srcadr), ntohs(((struct sockaddr_in*)&(pp->srcadr))->sin_port));
1954
1955 (void) fprintf(fp, "stratum %d, precision %d, leap %c%c, trust %03o\n",
1956 pp->stratum, pp->precision,
1957 pp->leap & 0x2 ? '1' : '0',
1958 pp->leap & 0x1 ? '1' : '0',
1959 pp->trust);
1960
1961 if (pp->stratum == 1) {
1962 junk[4] = 0;
1963 memmove(junk, (char *)&pp->refid, 4);
1964 str = junk;
1965 } else {
2087
2088 (void) fprintf(fp, "stratum %d, precision %d, leap %c%c, trust %03o\n",
2089 pp->stratum, pp->precision,
2090 pp->leap & 0x2 ? '1' : '0',
2091 pp->leap & 0x1 ? '1' : '0',
2092 pp->trust);
2093
2094 if (pp->stratum == 1) {
2095 junk[4] = 0;
2096 memmove(junk, (char *)&pp->refid, 4);
2097 str = junk;
2098 } else {
1966 str = numtoa(pp->refid);
2099 str = stoa(&pp->srcadr);
1967 }
1968 (void) fprintf(fp,
1969 "refid [%s], delay %s, dispersion %s\n",
1970 str, fptoa((s_fp)pp->delay, 5),
1971 ufptoa(pp->dispersion, 5));
1972
1973 (void) fprintf(fp, "transmitted %d, in filter %d\n",
1974 pp->xmtcnt, pp->filter_nextpt);

--- 113 unchanged lines hidden ---
2100 }
2101 (void) fprintf(fp,
2102 "refid [%s], delay %s, dispersion %s\n",
2103 str, fptoa((s_fp)pp->delay, 5),
2104 ufptoa(pp->dispersion, 5));
2105
2106 (void) fprintf(fp, "transmitted %d, in filter %d\n",
2107 pp->xmtcnt, pp->filter_nextpt);

--- 113 unchanged lines hidden ---