2006-06-22 17:13:29 +00:00
|
|
|
/*
|
|
|
|
* PROJECT: ReactOS Timedate Control Panel
|
|
|
|
* LICENSE: GPL - See COPYING in the top level directory
|
|
|
|
* FILE: lib/cpl/timedate/ntpclient.c
|
|
|
|
* PURPOSE: Queries the NTP server
|
|
|
|
* COPYRIGHT: Copyright 2006 Ged Murphy <gedmurphy@gmail.com>
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
2006-03-07 20:59:11 +00:00
|
|
|
#include <timedate.h>
|
2006-03-01 21:44:17 +00:00
|
|
|
|
2006-06-22 17:13:29 +00:00
|
|
|
#define TIMEOUT 4000 /* 4 second timeout */
|
|
|
|
|
2006-03-01 21:44:17 +00:00
|
|
|
SOCKET Sock;
|
|
|
|
SOCKADDR_IN myAddr, ntpAddr;
|
|
|
|
|
2006-06-22 17:13:29 +00:00
|
|
|
BOOL
|
|
|
|
InitialiseConnection(LPSTR lpAddress)
|
2006-03-01 21:44:17 +00:00
|
|
|
{
|
|
|
|
WSADATA wsaData;
|
2006-06-22 17:13:29 +00:00
|
|
|
HOSTENT *he;
|
2006-03-01 21:44:17 +00:00
|
|
|
INT Ret;
|
|
|
|
|
|
|
|
Ret = WSAStartup(MAKEWORD(2, 2),
|
|
|
|
&wsaData);
|
|
|
|
if (Ret != 0)
|
|
|
|
return FALSE;
|
|
|
|
|
2006-06-22 17:13:29 +00:00
|
|
|
Sock = socket(AF_INET,
|
|
|
|
SOCK_DGRAM,
|
|
|
|
0);
|
|
|
|
if (Sock == INVALID_SOCKET)
|
2006-03-01 21:44:17 +00:00
|
|
|
return FALSE;
|
|
|
|
|
2006-06-22 17:13:29 +00:00
|
|
|
/* setup server info */
|
|
|
|
he = gethostbyname(lpAddress);
|
|
|
|
if (he != NULL)
|
|
|
|
{
|
|
|
|
/* setup server socket info */
|
|
|
|
ZeroMemory(&ntpAddr, sizeof(SOCKADDR_IN));
|
|
|
|
ntpAddr.sin_family = AF_INET; //he->h_addrtype;
|
|
|
|
ntpAddr.sin_port = htons(NTPPORT);
|
|
|
|
ntpAddr.sin_addr = *((struct in_addr *)he->h_addr);
|
|
|
|
}
|
|
|
|
else
|
2006-03-01 21:44:17 +00:00
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
2006-06-22 17:13:29 +00:00
|
|
|
VOID
|
|
|
|
DestroyConnection()
|
2006-03-01 21:44:17 +00:00
|
|
|
{
|
|
|
|
WSACleanup();
|
|
|
|
}
|
|
|
|
|
|
|
|
/* send some data to wake the server up */
|
2006-06-22 17:13:29 +00:00
|
|
|
BOOL
|
|
|
|
SendData()
|
2006-03-01 21:44:17 +00:00
|
|
|
{
|
|
|
|
CHAR Packet[] = "";
|
|
|
|
INT Ret;
|
|
|
|
|
|
|
|
Ret = sendto(Sock,
|
|
|
|
Packet,
|
|
|
|
sizeof(Packet),
|
|
|
|
0,
|
2006-06-22 17:13:29 +00:00
|
|
|
(SOCKADDR *)&ntpAddr,
|
2006-03-01 21:44:17 +00:00
|
|
|
sizeof(SOCKADDR_IN));
|
|
|
|
|
|
|
|
if (Ret == SOCKET_ERROR)
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2006-06-22 17:13:29 +00:00
|
|
|
ULONG
|
|
|
|
RecieveData(VOID)
|
2006-03-01 21:44:17 +00:00
|
|
|
{
|
2006-06-22 17:13:29 +00:00
|
|
|
TIMEVAL timeVal;
|
|
|
|
FD_SET readFDS;
|
2006-03-01 21:44:17 +00:00
|
|
|
INT Ret;
|
2006-06-22 17:13:29 +00:00
|
|
|
ULONG ulTime = 0;
|
|
|
|
|
|
|
|
/* monitor socket for incomming connections */
|
|
|
|
FD_ZERO(&readFDS);
|
|
|
|
FD_SET(Sock, &readFDS);
|
|
|
|
|
|
|
|
/* set timeout values */
|
|
|
|
timeVal.tv_sec = TIMEOUT / 1000;
|
|
|
|
timeVal.tv_usec = TIMEOUT % 1000;
|
|
|
|
|
|
|
|
/* check for data on the socket for TIMEOUT millisecs*/
|
|
|
|
Ret = select(0, &readFDS, NULL, NULL, &timeVal);
|
|
|
|
|
|
|
|
if ((Ret != SOCKET_ERROR) && (Ret != 0))
|
|
|
|
{
|
|
|
|
Ret = recvfrom(Sock,
|
|
|
|
(char *)&ulTime,
|
|
|
|
4,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
NULL);
|
|
|
|
if (Ret != SOCKET_ERROR)
|
|
|
|
ulTime = ntohl(ulTime);
|
|
|
|
}
|
2006-06-21 19:57:58 +00:00
|
|
|
|
|
|
|
return ulTime;
|
2006-03-01 21:44:17 +00:00
|
|
|
}
|