Use time.windows.com too

This commit is contained in:
Sergey Lyubka committed 2022-05-26 16:22:44 +01:00
1 parent 2ae341cf5e
commit 7f8d12b9f7
3 files changed
+20 -15

No files matched your search

+5 -4
View File
@@ -3860,21 +3860,22 @@ void mg_sha1_final(unsigned char digest[20], mg_sha1_ctx *context) {
int64_t mg_sntp_parse(const unsigned char *buf, size_t len) { int64_t mg_sntp_parse(const unsigned char *buf, size_t len) {
int64_t res = -1; int64_t res = -1;
int mode = len > 0 ? buf[0] & 7 : 0; int mode = len > 0 ? buf[0] & 7 : 0;
int version = len > 0 ? (buf[0] >> 3) & 7 : 0;
if (len < 48) { if (len < 48) {
MG_ERROR(("%s", "corrupt packet")); MG_ERROR(("%s", "corrupt packet"));
} else if ((buf[0] & 0x38) >> 3 != 4) {
MG_ERROR(("%s", "wrong version"));
} else if (mode != 4 && mode != 5) { } else if (mode != 4 && mode != 5) {
MG_ERROR(("%s", "not a server reply")); MG_ERROR(("%s", "not a server reply"));
} else if (buf[1] == 0) { } else if (buf[1] == 0) {
MG_ERROR(("%s", "server sent a kiss of death")); MG_ERROR(("%s", "server sent a kiss of death"));
} else { } else if (version == 4 || version == 3) {
uint32_t *data = (uint32_t *) &buf[40]; uint32_t *data = (uint32_t *) &buf[40];
unsigned long seconds = mg_ntohl(data[0]) - SNTP_TIME_OFFSET; unsigned long seconds = mg_ntohl(data[0]) - SNTP_TIME_OFFSET;
unsigned long useconds = mg_ntohl(data[1]); unsigned long useconds = mg_ntohl(data[1]);
// MG_DEBUG(("%lu %lu %lu", time(0), seconds, useconds));
res = ((int64_t) seconds) * 1000 + (int64_t) ((useconds / 1000) % 1000); res = ((int64_t) seconds) * 1000 + (int64_t) ((useconds / 1000) % 1000);
} else {
MG_ERROR(("unexpected version: %d", version));
} }
if (res == -1) mg_hexdump(buf, len);
return res; return res;
} }
+5 -4
View File
@@ -10,21 +10,22 @@
int64_t mg_sntp_parse(const unsigned char *buf, size_t len) { int64_t mg_sntp_parse(const unsigned char *buf, size_t len) {
int64_t res = -1; int64_t res = -1;
int mode = len > 0 ? buf[0] & 7 : 0; int mode = len > 0 ? buf[0] & 7 : 0;
int version = len > 0 ? (buf[0] >> 3) & 7 : 0;
if (len < 48) { if (len < 48) {
MG_ERROR(("%s", "corrupt packet")); MG_ERROR(("%s", "corrupt packet"));
} else if ((buf[0] & 0x38) >> 3 != 4) {
MG_ERROR(("%s", "wrong version"));
} else if (mode != 4 && mode != 5) { } else if (mode != 4 && mode != 5) {
MG_ERROR(("%s", "not a server reply")); MG_ERROR(("%s", "not a server reply"));
} else if (buf[1] == 0) { } else if (buf[1] == 0) {
MG_ERROR(("%s", "server sent a kiss of death")); MG_ERROR(("%s", "server sent a kiss of death"));
} else { } else if (version == 4 || version == 3) {
uint32_t *data = (uint32_t *) &buf[40]; uint32_t *data = (uint32_t *) &buf[40];
unsigned long seconds = mg_ntohl(data[0]) - SNTP_TIME_OFFSET; unsigned long seconds = mg_ntohl(data[0]) - SNTP_TIME_OFFSET;
unsigned long useconds = mg_ntohl(data[1]); unsigned long useconds = mg_ntohl(data[1]);
// MG_DEBUG(("%lu %lu %lu", time(0), seconds, useconds));
res = ((int64_t) seconds) * 1000 + (int64_t) ((useconds / 1000) % 1000); res = ((int64_t) seconds) * 1000 + (int64_t) ((useconds / 1000) % 1000);
} else {
MG_ERROR(("unexpected version: %d", version));
} }
if (res == -1) mg_hexdump(buf, len);
return res; return res;
} }
+10 -7
View File
@@ -285,30 +285,33 @@ static void test_iobuf(void) {
static void sntp_cb(struct mg_connection *c, int ev, void *evd, void *fnd) { static void sntp_cb(struct mg_connection *c, int ev, void *evd, void *fnd) {
if (ev == MG_EV_SNTP_TIME) { if (ev == MG_EV_SNTP_TIME) {
*(int64_t *) fnd = *(int64_t *) evd; *(int64_t *) fnd = *(int64_t *) evd;
} else if (ev == MG_EV_POLL) { MG_DEBUG(("got time: %lld", *(int64_t *) evd));
// For some reason, GA on macos fails often, apparently SNTP request
// gets lost. We re-send it each poll
if (c->is_resolving == 0) mg_sntp_request(c);
} }
(void) c; (void) c;
} }
static void test_sntp(void) { static void test_sntp_server(const char *url) {
int64_t ms = 0; int64_t ms = 0;
struct mg_mgr mgr; struct mg_mgr mgr;
struct mg_connection *c = NULL; struct mg_connection *c = NULL;
int i; int i;
mg_mgr_init(&mgr); mg_mgr_init(&mgr);
c = mg_sntp_connect(&mgr, NULL, sntp_cb, &ms); c = mg_sntp_connect(&mgr, url, sntp_cb, &ms);
ASSERT(c != NULL); ASSERT(c != NULL);
ASSERT(c->is_udp == 1); ASSERT(c->is_udp == 1);
for (i = 0; i < 60 && ms == 0; i++) mg_mgr_poll(&mgr, 50); for (i = 0; i < 60 && ms == 0; i++) mg_mgr_poll(&mgr, 50);
MG_DEBUG(("ms: %lld", ms)); MG_DEBUG(("server: %s, ms: %lld", url ? url : "(default)", ms));
ASSERT(ms > 0); ASSERT(ms > 0);
mg_mgr_free(&mgr); mg_mgr_free(&mgr);
}
static void test_sntp(void) {
test_sntp_server("udp://time.windows.com:123");
test_sntp_server(NULL);
{ {
int64_t ms;
const unsigned char sntp_good[] = const unsigned char sntp_good[] =
"\x24\x02\x00\xeb\x00\x00\x00\x1e\x00\x00\x07\xb6\x3e" "\x24\x02\x00\xeb\x00\x00\x00\x1e\x00\x00\x07\xb6\x3e"
"\xc9\xd6\xa2\xdb\xde\xea\x30\x91\x86\xb7\x10\xdb\xde" "\xc9\xd6\xa2\xdb\xde\xea\x30\x91\x86\xb7\x10\xdb\xde"