ReactOS  0.4.14-dev-57-g333b8f1
ntpclient.c File Reference
#include "w32time.h"
#include <winsock2.h>
Include dependency graph for ntpclient.c:

Go to the source code of this file.

Classes

struct  _INFO
 

Macros

#define TIMEOUT   4000 /* 4 second timeout */
 

Typedefs

typedef struct _INFO INFO
 
typedef struct _INFOPINFO
 

Functions

static BOOL InitConnection (PINFO pInfo, LPSTR lpAddress)
 
static VOID DestroyConnection (VOID)
 
static BOOL GetTransmitTime (PTIMEPACKET ptp)
 
static BOOL SendData (PINFO pInfo)
 
static ULONG ReceiveData (PINFO pInfo)
 
ULONG GetServerTime (LPWSTR lpAddress)
 

Macro Definition Documentation

◆ TIMEOUT

#define TIMEOUT   4000 /* 4 second timeout */

Definition at line 12 of file ntpclient.c.

Typedef Documentation

◆ INFO

typedef struct _INFO INFO

◆ PINFO

typedef struct _INFO * PINFO

Function Documentation

◆ DestroyConnection()

static VOID DestroyConnection ( VOID  )
static

Definition at line 61 of file ntpclient.c.

62 {
63  WSACleanup();
64 }
INT WSAAPI WSACleanup(VOID)
Definition: startup.c:60

Referenced by GetServerTime().

◆ GetServerTime()

ULONG GetServerTime ( LPWSTR  lpAddress)

Definition at line 138 of file ntpclient.c.

139 {
140  PINFO pInfo;
141  LPSTR lpAddr;
142  DWORD dwSize = wcslen(lpAddress) + 1;
143  ULONG ulTime = 0;
144 
145  pInfo = (PINFO)HeapAlloc(GetProcessHeap(),
146  0,
147  sizeof(INFO));
148  lpAddr = (LPSTR)HeapAlloc(GetProcessHeap(),
149  0,
150  dwSize);
151 
152  if (pInfo && lpAddr)
153  {
155  0,
156  lpAddress,
157  -1,
158  lpAddr,
159  dwSize,
160  NULL,
161  NULL))
162  {
163  if (InitConnection(pInfo, lpAddr))
164  {
165  if (SendData(pInfo))
166  {
167  ulTime = ReceiveData(pInfo);
168  }
169  }
170 
172  }
173  }
174 
175  if (pInfo)
176  HeapFree(GetProcessHeap(), 0, pInfo);
177  if (lpAddr)
178  HeapFree(GetProcessHeap(), 0, lpAddr);
179 
180  return ulTime;
181 }
#define WideCharToMultiByte
Definition: compat.h:101
#define CP_ACP
Definition: compat.h:99
char * LPSTR
Definition: xmlstorage.h:182
static BOOL InitConnection(PINFO pInfo, LPSTR lpAddress)
Definition: ntpclient.c:25
static VOID DestroyConnection(VOID)
Definition: ntpclient.c:61
static ULONG ReceiveData(PINFO pInfo)
Definition: ntpclient.c:102
smooth NULL
Definition: ftsmooth.c:416
#define GetProcessHeap()
Definition: compat.h:395
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
unsigned long DWORD
Definition: ntddk_ex.h:95
Definition: precomp.h:83
static BOOL SendData(PINFO pInfo)
Definition: ntpclient.c:76
unsigned int ULONG
Definition: retypes.h:1
struct _INFO * PINFO
struct _INFO INFO
size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define HeapFree(x, y, z)
Definition: compat.h:394
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:54

Referenced by SetTime().

◆ GetTransmitTime()

static BOOL GetTransmitTime ( PTIMEPACKET  ptp)
static

Definition at line 68 of file ntpclient.c.

69 {
70  return TRUE;
71 }
#define TRUE
Definition: types.h:120

Referenced by SendData().

◆ InitConnection()

static BOOL InitConnection ( PINFO  pInfo,
LPSTR  lpAddress 
)
static

Definition at line 25 of file ntpclient.c.

27 {
28  WSADATA wsaData;
29  HOSTENT *he;
30  INT Ret;
31 
32  Ret = WSAStartup(MAKEWORD(2, 2),
33  &wsaData);
34  if (Ret != 0)
35  return FALSE;
36 
37  pInfo->Sock = socket(AF_INET,
38  SOCK_DGRAM,
39  0);
40  if (pInfo->Sock == INVALID_SOCKET)
41  return FALSE;
42 
43  /* Setup server info */
44  he = gethostbyname(lpAddress);
45  if (he != NULL)
46  {
47  /* Setup server socket info */
48  ZeroMemory(&pInfo->ntpAddr, sizeof(SOCKADDR_IN));
49  pInfo->ntpAddr.sin_family = AF_INET; // he->h_addrtype;
50  pInfo->ntpAddr.sin_port = htons(NTPPORT);
51  pInfo->ntpAddr.sin_addr = *((struct in_addr *)he->h_addr);
52  }
53  else
54  return FALSE;
55 
56  return TRUE;
57 }
#define TRUE
Definition: types.h:120
SOCKET WSAAPI socket(IN INT af, IN INT type, IN INT protocol)
Definition: socklife.c:143
u_short sin_port
Definition: winsock.h:511
#define MAKEWORD(a, b)
Definition: typedefs.h:247
#define ZeroMemory
Definition: winbase.h:1635
int32_t INT
Definition: typedefs.h:56
INT WINAPI WSAStartup(IN WORD wVersionRequested, OUT LPWSADATA lpWSAData)
Definition: startup.c:113
smooth NULL
Definition: ftsmooth.c:416
PHOSTENT WSAAPI gethostbyname(IN const char FAR *name)
Definition: getxbyxx.c:221
#define INVALID_SOCKET
Definition: winsock.h:332
Definition: tcpip.h:125
SOCKADDR_IN ntpAddr
Definition: ntpclient.c:18
struct in_addr sin_addr
Definition: winsock.h:512
SOCKET Sock
Definition: ntpclient.c:16
#define NTPPORT
Definition: w32time.h:17
#define AF_INET
Definition: tcpip.h:117
#define htons(x)
Definition: module.h:213
#define SOCK_DGRAM
Definition: winsock.h:336
short sin_family
Definition: winsock.h:510

Referenced by GetServerTime().

◆ ReceiveData()

static ULONG ReceiveData ( PINFO  pInfo)
static

Definition at line 102 of file ntpclient.c.

103 {
104  TIMEVAL timeVal;
105  FD_SET readFDS;
106  INT Ret;
107  ULONG ulTime = 0;
108 
109  /* Monitor socket for incoming connections */
110  FD_ZERO(&readFDS);
111  FD_SET(pInfo->Sock, &readFDS);
112 
113  /* Set timeout values */
114  timeVal.tv_sec = TIMEOUT / 1000;
115  timeVal.tv_usec = TIMEOUT % 1000;
116 
117  /* Check for data on the socket for TIMEOUT millisecs */
118  Ret = select(0, &readFDS, NULL, NULL, &timeVal);
119 
120  if ((Ret != SOCKET_ERROR) && (Ret != 0))
121  {
122  Ret = recvfrom(pInfo->Sock,
123  (char *)&pInfo->RecvPacket,
124  sizeof(pInfo->RecvPacket),
125  0,
126  NULL,
127  NULL);
128 
129  if (Ret != SOCKET_ERROR)
130  ulTime = ntohl(pInfo->RecvPacket.TransmitTimestamp.dwInteger);
131  }
132 
133  return ulTime;
134 }
Definition: winsock.h:66
#define SOCKET_ERROR
Definition: winsock.h:333
INT WSAAPI recvfrom(IN SOCKET s, OUT CHAR FAR *buf, IN INT len, IN INT flags, OUT LPSOCKADDR from, IN OUT INT FAR *fromlen)
Definition: recv.c:87
unsigned long tv_sec
Definition: linux.h:1738
#define FD_ZERO(set)
Definition: winsock.h:96
#define FD_SET(fd, set)
Definition: winsock.h:89
int32_t INT
Definition: typedefs.h:56
INT WSAAPI select(IN INT s, IN OUT LPFD_SET readfds, IN OUT LPFD_SET writefds, IN OUT LPFD_SET exceptfds, IN CONST struct timeval *timeout)
Definition: select.c:41
smooth NULL
Definition: ftsmooth.c:416
unsigned long tv_usec
Definition: linux.h:1739
#define TIMEOUT
Definition: ntpclient.c:12
TIMEPACKET TransmitTimestamp
Definition: w32time.h:41
SOCKET Sock
Definition: ntpclient.c:16
DWORD dwInteger
Definition: w32time.h:24
NTPPACKET RecvPacket
Definition: ntpclient.c:20
unsigned int ULONG
Definition: retypes.h:1
#define ntohl(x)
Definition: module.h:203

Referenced by GetServerTime(), KdVmKdVmExchangeData(), and KdVmSendReceive().

◆ SendData()

static BOOL SendData ( PINFO  pInfo)
static

Definition at line 76 of file ntpclient.c.

77 {
78  TIMEPACKET tp = { 0, 0 };
79  INT Ret;
80 
81  ZeroMemory(&pInfo->SendPacket, sizeof(pInfo->SendPacket));
82  pInfo->SendPacket.LiVnMode = 0x1b; /* 0x1b = 011 011 - version 3 , mode 3 (client) */
83  if (!GetTransmitTime(&tp))
84  return FALSE;
86 
87  Ret = sendto(pInfo->Sock,
88  (char *)&pInfo->SendPacket,
89  sizeof(pInfo->SendPacket),
90  0,
91  (SOCKADDR *)&pInfo->ntpAddr,
92  sizeof(SOCKADDR_IN));
93 
94  if (Ret == SOCKET_ERROR)
95  return FALSE;
96 
97  return TRUE;
98 }
#define SOCKET_ERROR
Definition: winsock.h:333
#define TRUE
Definition: types.h:120
BYTE LiVnMode
Definition: w32time.h:31
NTPPACKET SendPacket
Definition: ntpclient.c:19
#define ZeroMemory
Definition: winbase.h:1635
int32_t INT
Definition: typedefs.h:56
static BOOL GetTransmitTime(PTIMEPACKET ptp)
Definition: ntpclient.c:68
_In_ uint64_t _In_ uint64_t _In_ uint64_t _In_opt_ traverse_ptr * tp
Definition: btrfs.c:2883
SOCKADDR_IN ntpAddr
Definition: ntpclient.c:18
TIMEPACKET TransmitTimestamp
Definition: w32time.h:41
SOCKET Sock
Definition: ntpclient.c:16
INT WSAAPI sendto(IN SOCKET s, IN CONST CHAR FAR *buf, IN INT len, IN INT flags, IN CONST struct sockaddr *to, IN INT tolen)
Definition: send.c:82

Referenced by GetServerTime(), KdpSendWaitContinue(), and test_IcmpSendEcho().