Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/crypto/krb5/src/windows/leashdll/timesync.c
34914 views
1
/* timesync stuff for leash - 7/28/94 - evanr */
2
3
#include <windows.h>
4
#include "leashdll.h"
5
6
#include <time.h>
7
#include <sys\timeb.h>
8
#include <stdlib.h>
9
#include <string.h>
10
11
#include <winsock2.h>
12
13
#include <stdio.h>
14
#include "leasherr.h"
15
#include "leashids.h"
16
17
int ProcessTimeSync(char *, int, char *);
18
19
#define TM_OFFSET 2208988800
20
21
/* timezone.h has a winsock.h conflict */
22
struct timezone {
23
int tz_minuteswest;
24
int tz_dsttime;
25
};
26
27
/************************************/
28
/* settimeofday(): */
29
/************************************/
30
int
31
settimeofday(
32
struct timeval *tv,
33
struct timezone *tz
34
)
35
{
36
SYSTEMTIME systime;
37
struct tm *newtime;
38
39
newtime = gmtime((time_t *)&(tv->tv_sec));
40
systime.wYear = 1900+newtime->tm_year;
41
systime.wMonth = 1+newtime->tm_mon;
42
systime.wDay = newtime->tm_mday;
43
systime.wHour = newtime->tm_hour;
44
systime.wMinute = newtime->tm_min;
45
systime.wSecond = newtime->tm_sec;
46
systime.wMilliseconds = 0;
47
return SetSystemTime(&systime);
48
}
49
50
/************************************/
51
/* gettimeofday(): */
52
/************************************/
53
int
54
gettimeofday(
55
struct timeval *tv,
56
struct timezone *tz
57
)
58
{
59
struct _timeb tb;
60
_tzset();
61
_ftime(&tb);
62
if (tv) {
63
tv->tv_sec = tb.time;
64
tv->tv_usec = tb.millitm * 1000;
65
}
66
if (tz) {
67
tz->tz_minuteswest = tb.timezone;
68
tz->tz_dsttime = tb.dstflag;
69
}
70
return 0;
71
}
72
73
74
LONG
75
get_time_server_name(
76
char *timeServerName,
77
const char *valueName
78
)
79
{
80
HMODULE hmLeash;
81
char hostname[128];
82
char value[80];
83
DWORD dwType;
84
DWORD dwCount;
85
int check = 0;
86
HKEY hKey;
87
HKEY rKey1;
88
HKEY rKey2;
89
LONG lResult;
90
BOOL bEnv;
91
92
memset(value, '\0', sizeof(value));
93
memset(hostname, '\0', sizeof(hostname));
94
95
GetEnvironmentVariable("TIMEHOST", hostname, sizeof(hostname));
96
bEnv = (GetLastError() == ERROR_ENVVAR_NOT_FOUND);
97
98
if (!(bEnv && hostname[0]))
99
{
100
// Check registry for TIMEHOST
101
rKey1 = HKEY_CURRENT_USER;
102
rKey2 = HKEY_LOCAL_MACHINE;
103
104
for (check = 0; check < 2; check++)
105
{
106
if (ERROR_SUCCESS == RegOpenKeyEx(check == 0 ? rKey1 : rKey2,
107
"Software\\MIT\\Leash32\\Settings",
108
0, KEY_QUERY_VALUE, &hKey))
109
{
110
memset(value, '\0', sizeof(value));
111
lResult = RegQueryValueEx(hKey, (LPTSTR)valueName, NULL,
112
&dwType, NULL, &dwCount);
113
if (lResult == ERROR_SUCCESS)
114
{
115
lResult = RegQueryValueEx(hKey, (LPTSTR)valueName,
116
NULL, &dwType,
117
(LPTSTR)value, &dwCount);
118
if (lResult == ERROR_SUCCESS && *value)
119
{
120
// found
121
strcpy(hostname, value);
122
break;
123
}
124
}
125
}
126
}
127
128
if (!*hostname)
129
{
130
// Check resource string for TIMEHOST
131
if ((hmLeash = GetModuleHandle(LEASH_DLL)) != NULL)
132
{
133
if (!LoadString(hmLeash, LSH_TIME_HOST, hostname,
134
sizeof(hostname)))
135
memset(hostname, '\0', sizeof(hostname));
136
}
137
}
138
if (!*hostname)
139
{
140
// OK, _Default_ it will be! :)
141
strcpy(hostname, "time");
142
}
143
}
144
strcpy(timeServerName, hostname);
145
return 0;
146
}
147
148
/************************************/
149
/* Leash_timesync(): */
150
/************************************/
151
LONG Leash_timesync(int MessageP)
152
{
153
char tmpstr[2048];
154
char hostname[128];
155
int Port;
156
int rc;
157
struct servent *sp;
158
WORD wVersionRequested;
159
WSADATA wsaData;
160
char name[80];
161
162
if (pkrb5_init_context == NULL)
163
return(0);
164
165
wVersionRequested = 0x0101;
166
memset(name, '\0', sizeof(name));
167
memset(hostname, '\0', sizeof(hostname));
168
memset(tmpstr, '\0', sizeof(tmpstr));
169
170
if ((rc = WSAStartup(wVersionRequested, &wsaData)))
171
{
172
wsprintf(tmpstr, "Couldn't initialize WinSock to synchronize time\n\rError Number: %d", rc);
173
WSACleanup();
174
return(LSH_BADWINSOCK);
175
}
176
177
sp = getservbyname("time", "udp");
178
if (sp == 0)
179
Port = htons(IPPORT_TIMESERVER);
180
else
181
Port = sp->s_port;
182
183
get_time_server_name(hostname, TIMEHOST);
184
185
rc = ProcessTimeSync(hostname, Port, tmpstr);
186
187
#ifdef USE_MESSAGE_BOX
188
if(MessageP != 0)
189
{
190
if (rc && !*tmpstr)
191
{
192
strcpy(tmpstr, "Unable to synchronize time!\n\n");
193
if (*hostname)
194
{
195
char tmpstr1[2048];
196
197
memset(tmpstr1, '\0', sizeof(tmpstr1));
198
sprintf(tmpstr1, "Unreachable server: %s\n", hostname);
199
strcat(tmpstr, tmpstr1);
200
}
201
}
202
203
MessageBox(NULL, tmpstr, "Time Server",
204
MB_ICONERROR | MB_OK);
205
}
206
#endif /* USE_MESSAGE_BOX */
207
WSACleanup();
208
return(rc);
209
}
210
211
212
/************************************/
213
/* ProcessTimeSync(): */
214
/************************************/
215
int ProcessTimeSync(char *hostname, int Port, char *tmpstr)
216
{
217
char buffer[512];
218
int cc;
219
long *nettime;
220
int s;
221
long hosttime;
222
struct hostent *host;
223
struct timeval tv;
224
struct timezone tz;
225
u_long argp;
226
struct sockaddr_in sin;
227
int i;
228
229
if ((host = gethostbyname(hostname)) == NULL)
230
return(LSH_BADTIMESERV);
231
232
sin.sin_port = (short)Port;
233
sin.sin_family = host->h_addrtype;
234
memcpy((struct sockaddr *)&sin.sin_addr, host->h_addr, host->h_length);
235
if ((s = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
236
{
237
return(LSH_NOSOCKET);
238
}
239
240
argp = 1;
241
if (ioctlsocket(s, FIONBIO, &argp) != 0)
242
{
243
closesocket(s);
244
return(LSH_NOCONNECT);
245
}
246
247
if (connect(s, (struct sockaddr *)&sin, sizeof(sin)) < 0)
248
{
249
closesocket(s);
250
return(LSH_NOCONNECT);
251
}
252
send(s, buffer, 40, 0);
253
if (gettimeofday (&tv, &tz) < 0)
254
{
255
closesocket(s);
256
return(LSH_GETTIMEOFDAY);
257
}
258
259
for (i = 0; i < 4; i++)
260
{
261
if ((cc = recv(s, buffer, 512, 0)) > 0)
262
break;
263
Sleep(500);
264
}
265
if (i == 4)
266
{
267
closesocket(s);
268
return(LSH_RECVTIME);
269
}
270
271
if (cc != 4)
272
{
273
closesocket(s);
274
return(LSH_RECVBYTES);
275
}
276
277
nettime = (long *)buffer;
278
hosttime = (long) ntohl (*nettime) - TM_OFFSET;
279
(&tv)->tv_sec = hosttime;
280
if (settimeofday(&tv, &tz) < 0)
281
{
282
closesocket(s);
283
return(LSH_SETTIMEOFDAY);
284
}
285
286
sprintf(tmpstr, "The time has been synchronized with the server: %s\n\n", hostname);
287
strcat(tmpstr, "To be able to use the Kerberos server, it was necessary to \nset the system time to: ") ;
288
strcat(tmpstr, ctime((time_t *)&hosttime));
289
strcat(tmpstr, "\n");
290
closesocket(s);
291
return(0);
292
}
293
294