ReactOS  0.4.13-dev-443-g10f00f8
ntpclient.c File Reference
#include "timedate.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 14 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 63 of file ntpclient.c.

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

Referenced by GetServerTime().

◆ GetServerTime()

ULONG GetServerTime ( LPWSTR  lpAddress)

Definition at line 140 of file ntpclient.c.

141 {
142  PINFO pInfo;
143  LPSTR lpAddr;
144  DWORD dwSize = wcslen(lpAddress) + 1;
145  ULONG ulTime = 0;
146 
147  pInfo = (PINFO)HeapAlloc(GetProcessHeap(),
148  0,
149  sizeof(INFO));
150  lpAddr = (LPSTR)HeapAlloc(GetProcessHeap(),
151  0,
152  dwSize);
153 
154  if (pInfo && lpAddr)
155  {
157  0,
158  lpAddress,
159  -1,
160  lpAddr,
161  dwSize,
162  NULL,
163  NULL))
164  {
165  if (InitConnection(pInfo, lpAddr))
166  {
167  if (SendData(pInfo))
168  {
169  ulTime = ReceiveData(pInfo);
170  }
171  }
172 
174  }
175  }
176 
177  if (pInfo)
178  HeapFree(GetProcessHeap(), 0, pInfo);
179  if (lpAddr)
180  HeapFree(GetProcessHeap(), 0, lpAddr);
181 
182  return ulTime;
183 }
#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:27
static VOID DestroyConnection(VOID)
Definition: ntpclient.c:63
static ULONG ReceiveData(PINFO pInfo)
Definition: ntpclient.c:104
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:78
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 GetTimeFromServer().

◆ GetTransmitTime()

static BOOL GetTransmitTime ( PTIMEPACKET  ptp)
static

Definition at line 70 of file ntpclient.c.

71 {
72  return TRUE;
73 }
#define TRUE
Definition: types.h:120

Referenced by SendData().

◆ InitConnection()

static BOOL InitConnection ( PINFO  pInfo,
LPSTR  lpAddress 
)
static

Definition at line 27 of file ntpclient.c.

29 {
30  WSADATA wsaData;
31  HOSTENT *he;
32  INT Ret;
33 
34  Ret = WSAStartup(MAKEWORD(2, 2),
35  &wsaData);
36  if (Ret != 0)
37  return FALSE;
38 
39  pInfo->Sock = socket(AF_INET,
40  SOCK_DGRAM,
41  0);
42  if (pInfo->Sock == INVALID_SOCKET)
43  return FALSE;
44 
45  /* Setup server info */
46  he = gethostbyname(lpAddress);
47  if (he != NULL)
48  {
49  /* Setup server socket info */
50  ZeroMemory(&pInfo->ntpAddr, sizeof(SOCKADDR_IN));
51  pInfo->ntpAddr.sin_family = AF_INET; // he->h_addrtype;
52  pInfo->ntpAddr.sin_port = htons(NTPPORT);
53  pInfo->ntpAddr.sin_addr = *((struct in_addr *)he->h_addr);
54  }
55  else
56  return FALSE;
57 
58  return TRUE;
59 }
#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:20
#define NTPPORT
Definition: timedate.h:26
struct in_addr sin_addr
Definition: winsock.h:512
SOCKET Sock
Definition: ntpclient.c:18
#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 104 of file ntpclient.c.

105 {
106  TIMEVAL timeVal;
107  FD_SET readFDS;
108  INT Ret;
109  ULONG ulTime = 0;
110 
111  /* Monitor socket for incoming connections */
112  FD_ZERO(&readFDS);
113  FD_SET(pInfo->Sock, &readFDS);
114 
115  /* Set timeout values */
116  timeVal.tv_sec = TIMEOUT / 1000;
117  timeVal.tv_usec = TIMEOUT % 1000;
118 
119  /* Check for data on the socket for TIMEOUT millisecs */
120  Ret = select(0, &readFDS, NULL, NULL, &timeVal);
121 
122  if ((Ret != SOCKET_ERROR) && (Ret != 0))
123  {
124  Ret = recvfrom(pInfo->Sock,
125  (char *)&pInfo->RecvPacket,
126  sizeof(pInfo->RecvPacket),
127  0,
128  NULL,
129  NULL);
130 
131  if (Ret != SOCKET_ERROR)
132  ulTime = ntohl(pInfo->RecvPacket.TransmitTimestamp.dwInteger);
133  }
134 
135  return ulTime;
136 }
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:14
TIMEPACKET TransmitTimestamp
Definition: timedate.h:91
SOCKET Sock
Definition: ntpclient.c:18
DWORD dwInteger
Definition: timedate.h:74
NTPPACKET RecvPacket
Definition: ntpclient.c:22
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 78 of file ntpclient.c.

79 {
80  TIMEPACKET tp = { 0, 0 };
81  INT Ret;
82 
83  ZeroMemory(&pInfo->SendPacket, sizeof(pInfo->SendPacket));
84  pInfo->SendPacket.LiVnMode = 27;
85  if (!GetTransmitTime(&tp))
86  return FALSE;
88 
89  Ret = sendto(pInfo->Sock,
90  (char *)&pInfo->SendPacket,
91  sizeof(pInfo->SendPacket),
92  0,
93  (SOCKADDR *)&pInfo->ntpAddr,
94  sizeof(SOCKADDR_IN));
95 
96  if (Ret == SOCKET_ERROR)
97  return FALSE;
98 
99  return TRUE;
100 }
#define SOCKET_ERROR
Definition: winsock.h:333
#define TRUE
Definition: types.h:120
BYTE LiVnMode
Definition: timedate.h:81
NTPPACKET SendPacket
Definition: ntpclient.c:21
#define ZeroMemory
Definition: winbase.h:1635
_In_ UINT64 _In_ UINT64 _In_ UINT64 _In_opt_ traverse_ptr * tp
Definition: btrfs.c:2694
int32_t INT
Definition: typedefs.h:56
static BOOL GetTransmitTime(PTIMEPACKET ptp)
Definition: ntpclient.c:70
SOCKADDR_IN ntpAddr
Definition: ntpclient.c:20
TIMEPACKET TransmitTimestamp
Definition: timedate.h:91
SOCKET Sock
Definition: ntpclient.c:18
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().