X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fntpd.c;h=fe3576c23e08a981bffc47ca9417ec06e5b192ba;hb=46477f7660c7c6b9d4fa38070b2335c759179b1e;hp=dded360c68114a349533a4b41f41f5324d51fa8d;hpb=39d723f4cb1d50b7ebb90c3251f0ebabad576412;p=collectd.git diff --git a/src/ntpd.c b/src/ntpd.c index dded360c..fe3576c2 100644 --- a/src/ntpd.c +++ b/src/ntpd.c @@ -24,12 +24,6 @@ #include "plugin.h" #include "configfile.h" -#if HAVE_SYS_SOCKET_H -# define NTPD_HAVE_READ 1 -#else -# define NTPD_HAVE_READ 0 -#endif - #if HAVE_STDINT_H # include #endif @@ -52,36 +46,6 @@ # include #endif -static data_source_t seconds_dsrc[1] = -{ - {"seconds", DS_TYPE_GAUGE, -1000000.0, 1000000.0} -}; - -static data_set_t time_offset_ds = -{ - "time_offset", 1, seconds_dsrc -}; - -static data_set_t time_dispersion_ds = -{ - "time_dispersion", 1, seconds_dsrc -}; - -static data_set_t delay_ds = -{ - "delay", 1, seconds_dsrc -}; - -static data_source_t ppm_dsrc[1] = -{ - {"ppm", DS_TYPE_GAUGE, -1000000.0, 1000000.0} -}; - -static data_set_t frequency_offset_ds = -{ - "frequency_offset", 1, ppm_dsrc -}; - static const char *config_keys[] = { "Host", @@ -90,12 +54,11 @@ static const char *config_keys[] = }; static int config_keys_num = 2; -#if NTPD_HAVE_READ # define NTPD_DEFAULT_HOST "localhost" # define NTPD_DEFAULT_PORT "123" static int sock_descr = -1; static char *ntpd_host = NULL; -static char *ntpd_port = NULL; +static char ntpd_port[16]; /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * The following definitions were copied from the NTPd distribution * @@ -293,19 +256,22 @@ static int refclock_names_num = 45; static int ntpd_config (const char *key, const char *value) { - if (strcasecmp (key, "host") == 0) + if (strcasecmp (key, "Host") == 0) { if (ntpd_host != NULL) free (ntpd_host); if ((ntpd_host = strdup (value)) == NULL) return (1); } - else if (strcasecmp (key, "port") == 0) + else if (strcasecmp (key, "Port") == 0) { - if (ntpd_port != NULL) - free (ntpd_port); - if ((ntpd_port = strdup (value)) == NULL) - return (1); + int port = (int) (atof (value)); + if ((port > 0) && (port <= 65535)) + snprintf (ntpd_port, sizeof (ntpd_port), + "%i", port); + else + strncpy (ntpd_port, value, sizeof (ntpd_port)); + ntpd_port[sizeof (ntpd_port) - 1] = '\0'; } else { @@ -378,11 +344,14 @@ static int ntpd_connect (void) host = NTPD_DEFAULT_HOST; port = ntpd_port; - if (port == NULL) + if (strlen (port) == 0) port = NTPD_DEFAULT_PORT; memset (&ai_hints, '\0', sizeof (ai_hints)); - ai_hints.ai_flags = AI_ADDRCONFIG; + ai_hints.ai_flags = 0; +#ifdef AI_ADDRCONFIG + ai_hints.ai_flags |= AI_ADDRCONFIG; +#endif ai_hints.ai_family = PF_UNSPEC; ai_hints.ai_socktype = SOCK_DGRAM; ai_hints.ai_protocol = IPPROTO_UDP; @@ -598,6 +567,14 @@ static int ntpd_receive_response (int req_code, int *res_items, int *res_size, continue; } + if (pkt_item_len > res_item_size) + { + ERROR ("ntpd plugin: (pkt_item_len = %i) " + ">= (res_item_size = %i)", + pkt_item_len, res_item_size); + continue; + } + /* If this is the first packet (time wise, not sequence wise), * set `res_size'. If it's not the first packet check if the * items have the same size. Discard invalid packets. */ @@ -614,9 +591,16 @@ static int ntpd_receive_response (int req_code, int *res_items, int *res_size, continue; } + /* + * Because the items in the packet may be smaller than the + * items requested, the following holds true: + */ + assert ((*res_size == pkt_item_len) + && (pkt_item_len <= res_item_size)); + /* Calculate the padding. No idea why there might be any padding.. */ pkt_padding = 0; - if (res_item_size > pkt_item_len) + if (pkt_item_len < res_item_size) pkt_padding = res_item_size - pkt_item_len; DEBUG ("res_item_size = %i; pkt_padding = %i;", res_item_size, pkt_padding); @@ -661,18 +645,26 @@ static int ntpd_receive_response (int req_code, int *res_items, int *res_size, (items_num + pkt_item_num) * res_item_size); items = realloc ((void *) *res_data, (items_num + pkt_item_num) * res_item_size); - items_num += pkt_item_num; if (items == NULL) { items = *res_data; ERROR ("ntpd plugin: realloc failed."); continue; } + items_num += pkt_item_num; *res_data = items; for (i = 0; i < pkt_item_num; i++) { + /* dst: There are already `*res_items' items with + * res_item_size bytes each in in `*res_data'. Set + * dst to the first byte after that. */ void *dst = (void *) (*res_data + ((*res_items) * res_item_size)); + /* src: We use `pkt_item_len' to calculate the offset + * from the beginning of the packet, because the + * items in the packet may be smaller than the + * items that were requested. We skip `i' such + * items. */ void *src = (void *) (((char *) res.data) + (i * pkt_item_len)); /* Set the padding to zeros */ @@ -680,8 +672,10 @@ static int ntpd_receive_response (int req_code, int *res_items, int *res_size, memset (dst, '\0', res_item_size); memcpy (dst, src, (size_t) pkt_item_len); + /* Increment `*res_items' by one, so `dst' will end up + * one further in the next round. */ (*res_items)++; - } + } /* for (pkt_item_num) */ pkt_recvd[pkt_sequence] = (char) 1; pkt_recvd_num++; @@ -691,7 +685,7 @@ static int ntpd_receive_response (int req_code, int *res_items, int *res_size, } /* while (done == 0) */ return (0); -} +} /* int ntpd_receive_response */ /* For a description of the arguments see `ntpd_do_query' below. */ static int ntpd_send_request (int req_code, int req_items, int req_size, char *req_data) @@ -958,17 +952,10 @@ static int ntpd_read (void) return (0); } /* int ntpd_read */ -#endif /* NTPD_HAVE_READ */ void module_register (void) { - plugin_register_data_set (&time_offset_ds); - plugin_register_data_set (&time_dispersion_ds); - plugin_register_data_set (&delay_ds); - plugin_register_data_set (&frequency_offset_ds); - -#if NTPD_HAVE_READ - plugin_register_config ("ntpd", ntpd_config, config_keys, config_keys_num); + plugin_register_config ("ntpd", ntpd_config, + config_keys, config_keys_num); plugin_register_read ("ntpd", ntpd_read); -#endif /* NTPD_HAVE_READ */ -} +} /* void module_register */