Source
static int unpack_ntp(ntp_data *data, const unsigned char *request, const unsigned char *response, int length)
/*
** Zabbix
** Copyright (C) 2001-2023 Zabbix SIA
**
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation; either version 2 of the License, or
** (at your option) any later version.
**
** 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 General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program; if not, write to the Free Software
** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
**/
/* 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++)