X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fntpd.c;h=ecc87c78977dbbdde88e920aa5f6156a1060fc0d;hb=8eb9e6285f394569d7fe6ad43a0f4e5f9bca454f;hp=a7ef0fa3fd13fd0efbbce605688efa72eb93b7d8;hpb=d767db104769bed7fefea61538bdacb364434e9a;p=collectd.git diff --git a/src/ntpd.c b/src/ntpd.c index a7ef0fa3..ecc87c78 100644 --- a/src/ntpd.c +++ b/src/ntpd.c @@ -19,6 +19,8 @@ * Florian octo Forster **/ +#define _BSD_SOURCE /* For NI_MAXHOST */ + #include "collectd.h" #include "common.h" #include "plugin.h" @@ -269,17 +271,14 @@ static int ntpd_config (const char *key, const char *value) { int port = (int) (atof (value)); if ((port > 0) && (port <= 65535)) - snprintf (ntpd_port, sizeof (ntpd_port), + ssnprintf (ntpd_port, sizeof (ntpd_port), "%i", port); else - strncpy (ntpd_port, value, sizeof (ntpd_port)); - ntpd_port[sizeof (ntpd_port) - 1] = '\0'; + sstrncpy (ntpd_port, value, sizeof (ntpd_port)); } else if (strcasecmp (key, "ReverseLookups") == 0) { - if ((strcasecmp (value, "True") == 0) - || (strcasecmp (value, "Yes") == 0) - || (strcasecmp (value, "On") == 0)) + if (IS_TRUE (value)) do_reverse_lookups = 1; else do_reverse_lookups = 0; @@ -301,38 +300,13 @@ static void ntpd_submit (char *type, char *type_inst, double value) vl.values = values; vl.values_len = 1; - vl.time = time (NULL); sstrncpy (vl.host, hostname_g, sizeof (vl.host)); sstrncpy (vl.plugin, "ntpd", sizeof (vl.plugin)); sstrncpy (vl.plugin_instance, "", sizeof (vl.plugin_instance)); - strncpy (vl.type_instance, type_inst, sizeof (vl.type_instance)); - - plugin_dispatch_values (type, &vl); -} - -/* returns `tv0 - tv1' in milliseconds or 0 if `tv1 > tv0' */ -static int timeval_sub (const struct timeval *tv0, const struct timeval *tv1) -{ - int sec; - int usec; - - if ((tv0->tv_sec < tv1->tv_sec) - || ((tv0->tv_sec == tv1->tv_sec) && (tv0->tv_usec < tv1->tv_usec))) - return (0); - - sec = tv0->tv_sec - tv1->tv_sec; - usec = tv0->tv_usec - tv1->tv_usec; - - while (usec < 0) - { - usec += 1000000; - sec -= 1; - } - - if (sec < 0) - return (0); + sstrncpy (vl.type, type, sizeof (vl.type)); + sstrncpy (vl.type_instance, type_inst, sizeof (vl.type_instance)); - return ((sec * 1000) + ((usec + 500) / 1000)); + plugin_dispatch_values (&vl); } static int ntpd_connect (void) @@ -459,6 +433,8 @@ static int ntpd_receive_response (int *res_items, int *res_size, done = 0; while (done == 0) { + struct timeval time_left; + if (gettimeofday (&time_now, NULL) < 0) { char errbuf[1024]; @@ -467,8 +443,14 @@ static int ntpd_receive_response (int *res_items, int *res_size, return (-1); } + if (timeval_cmp (time_end, time_now, &time_left) <= 0) + timeout = 0; + else + timeout = 1000 * time_left.tv_sec + + ((time_left.tv_usec + 500) / 1000); + /* timeout reached */ - if ((timeout = timeval_sub (&time_end, &time_now)) == 0) + if (timeout <= 0) break; poll_s.fd = sd; @@ -874,7 +856,7 @@ static int ntpd_read (void) if (refclock_id < refclock_names_num) { - strncpy (peername, refclock_names[refclock_id], + sstrncpy (peername, refclock_names[refclock_id], sizeof (peername)); } else @@ -883,7 +865,7 @@ static int ntpd_read (void) addr_obj.s_addr = ptr->srcadr; addr_str = inet_ntoa (addr_obj); - strncpy (peername, addr_str, sizeof (peername)); + sstrncpy (peername, addr_str, sizeof (peername)); } } else /* Normal network host. */ @@ -896,25 +878,33 @@ static int ntpd_read (void) if (ptr->v6_flag) { - struct sockaddr_in6 *sa_ptr; - sa_ptr = (struct sockaddr_in6 *) &sa; + struct sockaddr_in6 sa6; - sa_ptr->sin6_family = AF_INET6; - sa_ptr->sin6_port = htons (123); - memcpy (&sa_ptr->sin6_addr, &ptr->srcadr6, + assert (sizeof (sa) >= sizeof (sa6)); + + memset (&sa6, 0, sizeof (sa6)); + sa6.sin6_family = AF_INET6; + sa6.sin6_port = htons (123); + memcpy (&sa6.sin6_addr, &ptr->srcadr6, sizeof (struct in6_addr)); - sa_len = sizeof (struct sockaddr_in6); + sa_len = sizeof (sa6); + + memcpy (&sa, &sa6, sizeof (sa6)); } else { - struct sockaddr_in *sa_ptr; - sa_ptr = (struct sockaddr_in *) &sa; + struct sockaddr_in sa4; - sa_ptr->sin_family = AF_INET; - sa_ptr->sin_port = htons (123); - memcpy (&sa_ptr->sin_addr, &ptr->srcadr, + assert (sizeof (sa) >= sizeof (sa4)); + + memset (&sa4, 0, sizeof (sa4)); + sa4.sin_family = AF_INET; + sa4.sin_port = htons (123); + memcpy (&sa4.sin_addr, &ptr->srcadr, sizeof (struct in_addr)); - sa_len = sizeof (struct sockaddr_in); + sa_len = sizeof (sa4); + + memcpy (&sa, &sa4, sizeof (sa4)); } if (do_reverse_lookups == 0)