X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fntpd.c;h=33acc69fe1b0631d28f65e49a4144d111d77be7d;hb=48622c3d7c8c0d3ab07cda8a1947c33bfe31df73;hp=84512d2bea1769431e9fb92e48a392100ab76fe4;hpb=687e10aea101bf6338d31e69dd6537202bc5acc1;p=collectd.git diff --git a/src/ntpd.c b/src/ntpd.c index 84512d2b..33acc69f 100644 --- a/src/ntpd.c +++ b/src/ntpd.c @@ -29,8 +29,8 @@ #include "collectd.h" -#include "common.h" #include "plugin.h" +#include "utils/common/common.h" #if HAVE_NETDB_H #include @@ -56,17 +56,17 @@ static const char *config_keys[] = {"Host", "Port", "ReverseLookups", "IncludeUnitID"}; static int config_keys_num = STATIC_ARRAY_SIZE(config_keys); -static _Bool do_reverse_lookups = 1; +static bool do_reverse_lookups = true; /* This option only exists for backward compatibility. If it is false and two * ntpd peers use the same refclock driver, the plugin will try to write * simultaneous measurements from both to the same type instance. */ -static _Bool include_unit_id = 0; +static bool include_unit_id; #define NTPD_DEFAULT_HOST "localhost" #define NTPD_DEFAULT_PORT "123" static int sock_descr = -1; -static char *ntpd_host = NULL; +static char *ntpd_host; static char ntpd_port[16]; /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * @@ -251,7 +251,7 @@ static const char *refclock_names[] = { "CHRONOLOG", "DUMBCLOCK", "ULINK_M320", "PCF", /* 32-35 */ "WWV_AUDIO", "GPS_FG", "HOPF_S", "HOPF_P", /* 36-39 */ "JJY", "TT_IRIG", "GPS_ZYFER", "GPS_RIPENCC", /* 40-43 */ - "NEOCLK4X" /* 44 */ + "NEOCLK4X", "PCI_TSYNC", "GPSD_JSON" /* 44-46 */ }; static size_t refclock_names_num = STATIC_ARRAY_SIZE(refclock_names); /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * @@ -272,14 +272,14 @@ static int ntpd_config(const char *key, const char *value) { sstrncpy(ntpd_port, value, sizeof(ntpd_port)); } else if (strcasecmp(key, "ReverseLookups") == 0) { if (IS_TRUE(value)) - do_reverse_lookups = 1; + do_reverse_lookups = true; else - do_reverse_lookups = 0; + do_reverse_lookups = false; } else if (strcasecmp(key, "IncludeUnitID") == 0) { if (IS_TRUE(value)) - include_unit_id = 1; + include_unit_id = true; else - include_unit_id = 0; + include_unit_id = false; } else { return -1; } @@ -717,7 +717,7 @@ ntpd_get_refclock_id(struct info_peer_summary const *peer_info) { static int ntpd_get_name_from_address(char *buffer, size_t buffer_size, struct info_peer_summary const *peer_info, - _Bool do_reverse_lookup) { + bool do_reverse_lookup) { struct sockaddr_storage sa = {0}; socklen_t sa_len; int flags = 0; @@ -779,17 +779,6 @@ static int ntpd_get_name_refclock(char *buffer, size_t buffer_size, return 0; } /* int ntpd_get_name_refclock */ -static int ntpd_get_name(char *buffer, size_t buffer_size, - struct info_peer_summary const *peer_info) { - uint32_t addr = ntohl(peer_info->srcadr); - - if (!peer_info->v6_flag && ((addr & REFCLOCK_MASK) == REFCLOCK_ADDR)) - return ntpd_get_name_refclock(buffer, buffer_size, peer_info); - else - return ntpd_get_name_from_address(buffer, buffer_size, peer_info, - do_reverse_lookups); -} /* int ntpd_addr_to_name */ - static int ntpd_read(void) { struct info_kernel *ik; int ik_num; @@ -821,11 +810,13 @@ static int ntpd_read(void) { if (status != 0) { ERROR("ntpd plugin: ntpd_do_query (REQ_GET_KERNEL) failed with status %i", status); + free(ik); return status; } else if ((ik == NULL) || (ik_num == 0) || (ik_size == 0)) { ERROR("ntpd plugin: ntpd_do_query returned unexpected data. " "(ik = %p; ik_num = %i; ik_size = %i)", (void *)ik, ik_num, ik_size); + free(ik); return -1; } @@ -860,11 +851,13 @@ static int ntpd_read(void) { ERROR( "ntpd plugin: ntpd_do_query (REQ_PEER_LIST_SUM) failed with status %i", status); + free(ps); return status; } else if ((ps == NULL) || (ps_num == 0) || (ps_size == 0)) { ERROR("ntpd plugin: ntpd_do_query returned unexpected data. " "(ps = %p; ps_num = %i; ps_size = %i)", (void *)ps, ps_num, ps_size); + free(ps); return -1; } @@ -877,18 +870,34 @@ static int ntpd_read(void) { ptr = ps + i; - status = ntpd_get_name(peername, sizeof(peername), ptr); + int is_refclock = !ptr->v6_flag && + ((ntohl(ptr->srcadr) & REFCLOCK_MASK) == REFCLOCK_ADDR); + + if (is_refclock) + status = ntpd_get_name_refclock(peername, sizeof(peername), ptr); + else + status = ntpd_get_name_from_address(peername, sizeof(peername), ptr, + do_reverse_lookups); + if (status != 0) { ERROR("ntpd plugin: Determining name of peer failed."); continue; } + // `0.0.0.0` hosts are caused by POOL servers + // see https://github.com/collectd/collectd/issues/2358 + if (strcmp(peername, "0.0.0.0") == 0) { + continue; + } + refclock_id = ntpd_get_refclock_id(ptr); /* Convert the `long floating point' offset value to double */ M_LFPTOD(ntohl(ptr->offset_int), ntohl(ptr->offset_frc), offset); DEBUG("peer %i:\n" + " is_refclock= %d\n" + " refclock_id= %d\n" " peername = %s\n" " srcadr = 0x%08x\n" " reach = 0%03o\n" @@ -897,16 +906,19 @@ static int ntpd_read(void) { " offset_frc = %i\n" " offset = %f\n" " dispersion = %f\n", - i, peername, ntohl(ptr->srcadr), ptr->reach, ntpd_read_fp(ptr->delay), + i, is_refclock, (is_refclock > 0) ? refclock_id : 0, peername, + ntohl(ptr->srcadr), ptr->reach, ntpd_read_fp(ptr->delay), ntohl(ptr->offset_int), ntohl(ptr->offset_frc), offset, ntpd_read_fp(ptr->dispersion)); - if (refclock_id != - 1) /* not the system clock (offset will always be zero.. */ - ntpd_submit_reach("time_offset", peername, ptr->reach, offset); ntpd_submit_reach("time_dispersion", peername, ptr->reach, ntpd_read_fp(ptr->dispersion)); - if (refclock_id == 0) /* not a reference clock */ + + /* not the system clock (offset will always be zero) */ + if (!(is_refclock && refclock_id == 1)) + ntpd_submit_reach("time_offset", peername, ptr->reach, offset); + + if (!is_refclock) /* not a reference clock */ ntpd_submit_reach("delay", peername, ptr->reach, ntpd_read_fp(ptr->delay)); }