[monitoring-plugins] check_ntp_time: general refactoring
Lorenz Kästle
git at monitoring-plugins.org
Wed Mar 12 11:20:11 CET 2025
Module: monitoring-plugins
Branch: master
Commit: b770cc0f42a78a5bb934b7cf757a04f132b1e2de
Author: Lorenz Kästle <12514511+RincewindsHat at users.noreply.github.com>
Date: Wed Mar 12 01:23:50 2025 +0100
URL: https://www.monitoring-plugins.org/repositories/monitoring-plugins/commit/?id=b770cc0f
check_ntp_time: general refactoring
---
plugins/check_ntp_time.c | 105 +++++++++++++++++++++++------------------------
1 file changed, 51 insertions(+), 54 deletions(-)
diff --git a/plugins/check_ntp_time.c b/plugins/check_ntp_time.c
index 05c3d1e4..c757bc08 100644
--- a/plugins/check_ntp_time.c
+++ b/plugins/check_ntp_time.c
@@ -41,6 +41,7 @@ const char *email = "devel at monitoring-plugins.org";
#include "common.h"
#include "netutils.h"
#include "utils.h"
+#include "states.h"
static char *server_address = NULL;
static char *port = "123";
@@ -50,7 +51,7 @@ static char *owarn = "60";
static char *ocrit = "120";
static int time_offset = 0;
-static int process_arguments(int, char **);
+static int process_arguments(int /*argc*/, char ** /*argv*/);
static thresholds *offset_thresholds = NULL;
static void print_help(void);
void print_usage(void);
@@ -159,7 +160,7 @@ typedef struct {
#define EPOCHDIFF 0x83aa7e80UL
/* extract a 32-bit ntp fixed point number into a double */
-#define NTP32asDOUBLE(x) (ntohs(L16(x)) + (double)ntohs(R16(x)) / 65536.0)
+#define NTP32asDOUBLE(x) (ntohs(L16(x)) + ((double)ntohs(R16(x)) / 65536.0))
/* likewise for a 64-bit ntp fp number */
#define NTP64asDOUBLE(n) \
@@ -208,56 +209,52 @@ typedef struct {
} while (0);
/* calculate the offset of the local clock */
-static inline double calc_offset(const ntp_message *m, const struct timeval *t) {
- double client_tx = NTP64asDOUBLE(m->origts);
- double peer_rx = NTP64asDOUBLE(m->rxts);
- double peer_tx = NTP64asDOUBLE(m->txts);
- double client_rx = TVasDOUBLE((*t));
- return (.5 * ((peer_tx - client_rx) + (peer_rx - client_tx)));
+static inline double calc_offset(const ntp_message *message, const struct timeval *time_value) {
+ double client_tx = NTP64asDOUBLE(message->origts);
+ double peer_rx = NTP64asDOUBLE(message->rxts);
+ double peer_tx = NTP64asDOUBLE(message->txts);
+ double client_rx = TVasDOUBLE((*time_value));
+ return (((peer_tx - client_rx) + (peer_rx - client_tx)) / 2);
}
/* print out a ntp packet in human readable/debuggable format */
-void print_ntp_message(const ntp_message *p) {
+void print_ntp_message(const ntp_message *message) {
struct timeval ref;
struct timeval orig;
- struct timeval rx;
- struct timeval tx;
- NTP64toTV(p->refts, ref);
- NTP64toTV(p->origts, orig);
- NTP64toTV(p->rxts, rx);
- NTP64toTV(p->txts, tx);
+ NTP64toTV(message->refts, ref);
+ NTP64toTV(message->origts, orig);
printf("packet contents:\n");
- printf("\tflags: 0x%.2x\n", p->flags);
- printf("\t li=%d (0x%.2x)\n", LI(p->flags), p->flags & LI_MASK);
- printf("\t vn=%d (0x%.2x)\n", VN(p->flags), p->flags & VN_MASK);
- printf("\t mode=%d (0x%.2x)\n", MODE(p->flags), p->flags & MODE_MASK);
- printf("\tstratum = %d\n", p->stratum);
- printf("\tpoll = %g\n", pow(2, p->poll));
- printf("\tprecision = %g\n", pow(2, p->precision));
- printf("\trtdelay = %-.16g\n", NTP32asDOUBLE(p->rtdelay));
- printf("\trtdisp = %-.16g\n", NTP32asDOUBLE(p->rtdisp));
- printf("\trefid = %x\n", p->refid);
- printf("\trefts = %-.16g\n", NTP64asDOUBLE(p->refts));
- printf("\torigts = %-.16g\n", NTP64asDOUBLE(p->origts));
- printf("\trxts = %-.16g\n", NTP64asDOUBLE(p->rxts));
- printf("\ttxts = %-.16g\n", NTP64asDOUBLE(p->txts));
+ printf("\tflags: 0x%.2x\n", message->flags);
+ printf("\t li=%d (0x%.2x)\n", LI(message->flags), message->flags & LI_MASK);
+ printf("\t vn=%d (0x%.2x)\n", VN(message->flags), message->flags & VN_MASK);
+ printf("\t mode=%d (0x%.2x)\n", MODE(message->flags), message->flags & MODE_MASK);
+ printf("\tstratum = %d\n", message->stratum);
+ printf("\tpoll = %g\n", pow(2, message->poll));
+ printf("\tprecision = %g\n", pow(2, message->precision));
+ printf("\trtdelay = %-.16g\n", NTP32asDOUBLE(message->rtdelay));
+ printf("\trtdisp = %-.16g\n", NTP32asDOUBLE(message->rtdisp));
+ printf("\trefid = %x\n", message->refid);
+ printf("\trefts = %-.16g\n", NTP64asDOUBLE(message->refts));
+ printf("\torigts = %-.16g\n", NTP64asDOUBLE(message->origts));
+ printf("\trxts = %-.16g\n", NTP64asDOUBLE(message->rxts));
+ printf("\ttxts = %-.16g\n", NTP64asDOUBLE(message->txts));
}
-void setup_request(ntp_message *p) {
- memset(p, 0, sizeof(ntp_message));
- LI_SET(p->flags, LI_ALARM);
- VN_SET(p->flags, 4);
- MODE_SET(p->flags, MODE_CLIENT);
- p->poll = 4;
- p->precision = (int8_t)0xfa;
- L16(p->rtdelay) = htons(1);
- L16(p->rtdisp) = htons(1);
+void setup_request(ntp_message *message) {
+ memset(message, 0, sizeof(ntp_message));
+ LI_SET(message->flags, LI_ALARM);
+ VN_SET(message->flags, 4);
+ MODE_SET(message->flags, MODE_CLIENT);
+ message->poll = 4;
+ message->precision = (int8_t)0xfa;
+ L16(message->rtdelay) = htons(1);
+ L16(message->rtdisp) = htons(1);
struct timeval t;
gettimeofday(&t, NULL);
- TVtoNTP64(t, p->txts);
+ TVtoNTP64(t, message->txts);
}
/* select the "best" server from a list of servers, and return its index.
@@ -324,7 +321,7 @@ int best_offset_server(const ntp_server_results *slist, int nservers) {
* we don't waste time sitting around waiting for single packets.
* - we also "manually" handle resolving host names and connecting, because
* we have to do it in a way that our lazy macros don't handle currently :( */
-double offset_request(const char *host, int *status) {
+double offset_request(const char *host, mp_state_enum *status) {
/* setup hints to only return results from getaddrinfo that we'd like */
struct addrinfo hints;
memset(&hints, 0, sizeof(struct addrinfo));
@@ -333,15 +330,15 @@ double offset_request(const char *host, int *status) {
hints.ai_socktype = SOCK_DGRAM;
/* fill in ai with the list of hosts resolved by the host name */
- struct addrinfo *ai = NULL;
- int ga_result = getaddrinfo(host, port, &hints, &ai);
+ struct addrinfo *addresses = NULL;
+ int ga_result = getaddrinfo(host, port, &hints, &addresses);
if (ga_result != 0) {
die(STATE_UNKNOWN, "error getting address for %s: %s\n", host, gai_strerror(ga_result));
}
/* count the number of returned hosts, and allocate stuff accordingly */
- int num_hosts = 0;
- for (struct addrinfo *ai_tmp = ai; ai_tmp != NULL; ai_tmp = ai_tmp->ai_next) {
+ size_t num_hosts = 0;
+ for (struct addrinfo *ai_tmp = addresses; ai_tmp != NULL; ai_tmp = ai_tmp->ai_next) {
num_hosts++;
}
@@ -366,10 +363,10 @@ double offset_request(const char *host, int *status) {
die(STATE_UNKNOWN, "can not allocate server array");
}
memset(servers, 0, sizeof(ntp_server_results) * num_hosts);
- DBG(printf("Found %d peers to check\n", num_hosts));
+ DBG(printf("Found %zu peers to check\n", num_hosts));
/* setup each socket for writing, and the corresponding struct pollfd */
- struct addrinfo *ai_tmp = ai;
+ struct addrinfo *ai_tmp = addresses;
for (int i = 0; ai_tmp; i++) {
socklist[i] = socket(ai_tmp->ai_family, SOCK_DGRAM, IPPROTO_UDP);
if (socklist[i] == -1) {
@@ -427,10 +424,10 @@ double offset_request(const char *host, int *status) {
}
/* read from any sockets with pending data */
- for (int i = 0; servers_readable && i < num_hosts; i++) {
+ for (size_t i = 0; servers_readable && i < num_hosts; i++) {
if (ufds[i].revents & POLLIN && servers[i].num_responses < AVG_NUM) {
if (verbose) {
- printf("response from peer %d: ", i);
+ printf("response from peer %zu: ", i);
}
read(ufds[i].fd, &req[i], sizeof(ntp_message));
@@ -458,7 +455,7 @@ double offset_request(const char *host, int *status) {
/* lather, rinse, repeat. */
}
- if (one_read == false) {
+ if (!one_read) {
die(STATE_CRITICAL, "NTP CRITICAL: No response from NTP server\n");
}
@@ -476,14 +473,14 @@ double offset_request(const char *host, int *status) {
}
/* cleanup */
- for (int j = 0; j < num_hosts; j++) {
+ for (size_t j = 0; j < num_hosts; j++) {
close(socklist[j]);
}
free(socklist);
free(ufds);
free(servers);
free(req);
- freeaddrinfo(ai);
+ freeaddrinfo(addresses);
if (verbose) {
printf("overall average offset: %.10g\n", avg_offset);
@@ -602,8 +599,8 @@ int main(int argc, char *argv[]) {
/* set socket timeout */
alarm(socket_timeout);
- int offset_result = STATE_OK;
- int result = STATE_OK;
+ mp_state_enum offset_result = STATE_OK;
+ mp_state_enum result = STATE_OK;
double offset = offset_request(server_address, &offset_result);
if (offset_result == STATE_UNKNOWN) {
result = ((!quiet) ? STATE_UNKNOWN : STATE_CRITICAL);
@@ -640,7 +637,7 @@ int main(int argc, char *argv[]) {
if (server_address != NULL) {
free(server_address);
}
- return result;
+ exit(result);
}
void print_help(void) {
More information about the Commits
mailing list