-static int chrony_query(const int p_command, tChrony_Request *p_req, tChrony_Response *p_resp, size_t *p_resp_size)
-{
- /* Check connection. We simply perform one try as collectd already handles retries */
- assert(p_req);
- assert(p_resp);
- assert(p_resp_size);
-
- if (g_is_connected == 0)
- {
- if (chrony_connect() == 0)
- {
- g_is_connected = 1;
- } else {
- ERROR ("chrony plugin: Unable to connect. Errno = %d", errno);
- return 1;
- }
- }
-
-
- do
- {
- int valid_command = 0;
- size_t req_size = sizeof(p_req->header) + sizeof(p_req->padding);
- size_t resp_size = sizeof(p_resp->header);
- uint16_t resp_code = RPY_NULL;
- switch (p_command)
- {
- case REQ_TRACKING:
- req_size += sizeof(p_req->body.tracking);
- resp_size += sizeof(p_resp->body.tracking);
- resp_code = RPY_TRACKING;
- valid_command = 1;
- break;
- case REQ_N_SOURCES:
- req_size += sizeof(p_req->body.n_sources);
- resp_size += sizeof(p_resp->body.n_sources);
- resp_code = RPY_N_SOURCES;
- valid_command = 1;
- break;
- case REQ_SOURCE_DATA:
- req_size += sizeof(p_req->body.source_data);
- resp_size += sizeof(p_resp->body.source_data);
- resp_code = RPY_SOURCE_DATA;
- valid_command = 1;
- break;
- case REQ_SOURCE_STATS:
- req_size += sizeof(p_req->body.source_stats);
- resp_size += sizeof(p_resp->body.source_stats);
- resp_code = RPY_SOURCE_STATS;
- valid_command = 1;
- break;
- default:
- ERROR ("chrony plugin: Unknown request command (Was: %d)", p_command);
- break;
- }
-
- if (valid_command == 0)
- {
- break;
- }
-
- p_req->header.f_cmd = htons(p_command);
- p_req->header.f_cmd_try = 0;
- p_req->header.f_seq = htonl(g_chrony_seq++);
-
- DEBUG("chrony plugin: Sending request (.cmd = %d, .seq = %d)",p_command,g_chrony_seq-1);
- if (chrony_send_request(p_req,req_size) != 0)
- {
- break;
- }
-
- DEBUG("chrony plugin: Waiting for response");
- if (chrony_recv_response(p_resp,resp_size,p_resp_size) != 0)
- {
- break;
- }
- DEBUG("chrony plugin: Received response: .version = %u, .type = %u, .cmd = %u, .reply = %u, .status = %u, .seq = %u",
- p_resp->header.f_version,p_resp->header.f_type,ntohs(p_resp->header.f_cmd),
- ntohs(p_resp->header.f_reply),ntohs(p_resp->header.f_status),ntohl(p_resp->header.f_seq));
-
- if (p_resp->header.f_version != p_req->header.f_version)
- {
- ERROR("chrony plugin: Wrong protocol version (Was: %d, expected: %d)", p_resp->header.f_version, p_req->header.f_version);
- return 1;
- }
- if (p_resp->header.f_type != PKT_TYPE_CMD_REPLY)
- {
- ERROR("chrony plugin: Wrong packet type (Was: %d, expected: %d)", p_resp->header.f_type, PKT_TYPE_CMD_REPLY);
- return 1;
- }
- if (p_resp->header.f_seq != p_req->header.f_seq)
- {
- /* FIXME: Implement sequence number handling */
- ERROR("chrony plugin: Unexpected sequence number (Was: %d, expected: %d)", p_resp->header.f_seq, p_req->header.f_seq);
- return 1;
- }
- if (p_resp->header.f_cmd != p_req->header.f_cmd)
- {
- ERROR("chrony plugin: Wrong reply command (Was: %d, expected: %d)", p_resp->header.f_cmd, p_req->header.f_cmd);
- return 1;
- }
-
- if (ntohs(p_resp->header.f_reply) != resp_code)
- {
- ERROR("chrony plugin: Wrong reply code (Was: %d, expected: %d)", ntohs(p_resp->header.f_reply), resp_code);
- return 1;
- }
-
- switch (p_resp->header.f_status)
- {
- case STT_SUCCESS:
- DEBUG("chrony plugin: Reply packet status STT_SUCCESS");
- break;
- default:
- ERROR("chrony plugin: Reply packet contains error status: %d (expected: %d)", p_resp->header.f_status, STT_SUCCESS);
- return 1;
- }
-
- //Good result
- return 0;
- } while (0);
-
- //Some error occured
- return 1;
+
+static int
+chrony_query(const int p_command, tChrony_Request * p_req,
+ tChrony_Response * p_resp, size_t * p_resp_size)
+{
+ /* Check connection. We simply perform one try as collectd already handles retries */
+ assert(p_req);
+ assert(p_resp);
+ assert(p_resp_size);
+
+ if (g_chrony_is_connected == 0)
+ {
+ if (chrony_connect() == CHRONY_RC_OK)
+ {
+ g_chrony_is_connected = 1;
+ }
+ else
+ {
+ ERROR(PLUGIN_NAME ": Unable to connect. Errno = %d", errno);
+ return CHRONY_RC_FAIL;
+ }
+ }
+
+ do
+ {
+ int valid_command = 0;
+ size_t req_size = sizeof(p_req->header) + sizeof(p_req->padding);
+ size_t resp_size = sizeof(p_resp->header);
+ uint16_t resp_code = RPY_NULL;
+ switch (p_command)
+ {
+ case REQ_TRACKING:
+ req_size += sizeof(p_req->body.tracking);
+ resp_size += sizeof(p_resp->body.tracking);
+ resp_code = RPY_TRACKING;
+ valid_command = 1;
+ break;
+ case REQ_N_SOURCES:
+ req_size += sizeof(p_req->body.n_sources);
+ resp_size += sizeof(p_resp->body.n_sources);
+ resp_code = RPY_N_SOURCES;
+ valid_command = 1;
+ break;
+ case REQ_SOURCE_DATA:
+ req_size += sizeof(p_req->body.source_data);
+ resp_size += sizeof(p_resp->body.source_data);
+ resp_code = RPY_SOURCE_DATA;
+ valid_command = 1;
+ break;
+ case REQ_SOURCE_STATS:
+ req_size += sizeof(p_req->body.source_stats);
+ resp_size += sizeof(p_resp->body.source_stats);
+ resp_code = RPY_SOURCE_STATS;
+ valid_command = 1;
+ break;
+ default:
+ ERROR(PLUGIN_NAME ": Unknown request command (Was: %d)", p_command);
+ break;
+ }
+
+ if (valid_command == 0)
+ break;
+
+ uint32_t seq_nr = rand_r(&g_chrony_rand);
+ p_req->header.f_cmd = htons(p_command);
+ p_req->header.f_cmd_try = 0;
+ p_req->header.f_seq = seq_nr;
+
+ DEBUG(PLUGIN_NAME ": Sending request (.cmd = %d, .seq = %d)", p_command,
+ seq_nr);
+ if (chrony_send_request(p_req, req_size) != 0)
+ break;
+
+ DEBUG(PLUGIN_NAME ": Waiting for response");
+ if (chrony_recv_response(p_resp, resp_size, p_resp_size) != 0)
+ break;
+
+ DEBUG(PLUGIN_NAME
+ ": Received response: .version = %u, .type = %u, .cmd = %u, .reply = %u, .status = %u, .seq = %u",
+ p_resp->header.f_version, p_resp->header.f_type,
+ ntohs(p_resp->header.f_cmd), ntohs(p_resp->header.f_reply),
+ ntohs(p_resp->header.f_status), p_resp->header.f_seq);
+
+ if (p_resp->header.f_version != p_req->header.f_version)
+ {
+ ERROR(PLUGIN_NAME ": Wrong protocol version (Was: %d, expected: %d)",
+ p_resp->header.f_version, p_req->header.f_version);
+ return CHRONY_RC_FAIL;
+ }
+ if (p_resp->header.f_type != PKT_TYPE_CMD_REPLY)
+ {
+ ERROR(PLUGIN_NAME ": Wrong packet type (Was: %d, expected: %d)",
+ p_resp->header.f_type, PKT_TYPE_CMD_REPLY);
+ return CHRONY_RC_FAIL;
+ }
+ if (p_resp->header.f_seq != seq_nr)
+ {
+ /* FIXME: Implement sequence number handling */
+ ERROR(PLUGIN_NAME
+ ": Unexpected sequence number (Was: %d, expected: %d)",
+ p_resp->header.f_seq, p_req->header.f_seq);
+ return CHRONY_RC_FAIL;
+ }
+ if (p_resp->header.f_cmd != p_req->header.f_cmd)
+ {
+ ERROR(PLUGIN_NAME ": Wrong reply command (Was: %d, expected: %d)",
+ p_resp->header.f_cmd, p_req->header.f_cmd);
+ return CHRONY_RC_FAIL;
+ }
+
+ if (ntohs(p_resp->header.f_reply) != resp_code)
+ {
+ ERROR(PLUGIN_NAME ": Wrong reply code (Was: %d, expected: %d)",
+ ntohs(p_resp->header.f_reply), resp_code);
+ return CHRONY_RC_FAIL;
+ }
+
+ switch (p_resp->header.f_status)
+ {
+ case STT_SUCCESS:
+ DEBUG(PLUGIN_NAME ": Reply packet status STT_SUCCESS");
+ break;
+ default:
+ ERROR(PLUGIN_NAME
+ ": Reply packet contains error status: %d (expected: %d)",
+ p_resp->header.f_status, STT_SUCCESS);
+ return CHRONY_RC_FAIL;
+ }
+
+ /* Good result */
+ return CHRONY_RC_OK;
+ }
+ while (0);
+
+ /* Some error occured */
+ return CHRONY_RC_FAIL;