Source
static int unpack_ntp(ntp_data *data, const unsigned char *request, const unsigned char *response, int length)
/*
** Copyright (C) 2001-2025 Zabbix SIA
**
** This program is free software: you can redistribute it and/or modify it under the terms of
** the GNU Affero General Public License as published by the Free Software Foundation, version 3.
**
** This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
** without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
** See the GNU Affero General Public License for more details.
**
** You should have received a copy of the GNU Affero General Public License along with this program.
** If not, see <https://www.gnu.org/licenses/>.
**/
/* 2^32, of course! */
/* without authentication */
/* offset of originate timestamp */
/* offset of transmit timestamp */
/* the current version */
/* NTP client request */
/* NTP server response */
typedef struct
{
unsigned char version;
unsigned char mode;
double transmit;
}
ntp_data;
static void make_packet(ntp_data *data)
{
data->version = NTP_VERSION;
data->mode = NTP_MODE_CLIENT;
data->transmit = zbx_current_time();
}
static void pack_ntp(const ntp_data *data, unsigned char *request, int length)
{
/* Pack the essential data into an NTP packet, bypassing struct layout */
/* and endian problems. Note that it ignores fields irrelevant to SNTP. */
memset(request, 0, length);
request[0] = (data->version << 3) | data->mode;
double d = data->transmit / NTP_SCALE;
for (int i = 0; i < 8; i++)
{
int k = (int)(d *= 256.0);
if (k >= 256)
k = 255;