Merge pull request #1816 from octo/grpc-free-iter
[collectd.git] / src / ntpd.c
index 4a31e45..f8f4f04 100644 (file)
 # include <poll.h>
 #endif
 
+#ifndef STA_NANO
+# define STA_NANO 0x2000
+#endif
+
 static const char *config_keys[] =
 {
        "Host",
@@ -505,7 +509,7 @@ static int ntpd_receive_response (int *res_items, int *res_size,
                        break;
                }
 
-               memset ((void *) &res, '\0', sizeof (res));
+               memset (&res, '\0', sizeof (res));
                status = recv (sd, (void *) &res, sizeof (res), 0 /* no flags */);
 
                if ((status < 0) && ((errno == EAGAIN) || (errno == EINTR)))
@@ -663,7 +667,7 @@ static int ntpd_receive_response (int *res_items, int *res_size,
                 */
                DEBUG ("realloc (%p, %zu)", (void *) *res_data,
                                (items_num + pkt_item_num) * res_item_size);
-               items = realloc ((void *) *res_data,
+               items = realloc (*res_data,
                                (items_num + pkt_item_num) * res_item_size);
                if (items == NULL)
                {
@@ -720,7 +724,7 @@ static int ntpd_send_request (int req_code, int req_items, int req_size, char *r
        if ((sd = ntpd_connect ()) < 0)
                return (-1);
 
-       memset ((void *) &req, '\0', sizeof (req));
+       memset (&req, '\0', sizeof (req));
        req.rm_vn_mode = RM_VN_MODE(0, 0, 0);
        req.auth_seq   = AUTH_SEQ (0, 0);
        req.implementation = IMPL_XNTPD;
@@ -910,8 +914,7 @@ static int ntpd_read (void)
        int i;
 
        /* On Linux, if the STA_NANO bit is set in ik->status, then ik->offset
-        * is is nanoseconds, otherwise it's microseconds.
-        * TODO(octo): STA_NANO is defined in the Linux specific <sys/timex.h> header. */
+        * is is nanoseconds, otherwise it's microseconds. */
        double scale_loop  = 1e-6;
        double scale_error = 1e-6;
 
@@ -936,6 +939,11 @@ static int ntpd_read (void)
                return (-1);
        }
 
+       if (ntohs(ik->status) & STA_NANO) {
+               scale_loop  = 1e-9;
+               scale_error = 1e-9;
+       }
+
        /* kerninfo -> estimated error */
        offset_loop  = scale_loop * ((gauge_t) ntohl (ik->offset));
        freq_loop    = ntpd_read_fp (ik->freq);