1 /*
2 * wpa_supplicant/hostapd / OS specific functions for Win32 systems
3 * Copyright (c) 2005-2006, Jouni Malinen <j@w1.fi>
4 *
5 * This software may be distributed under the terms of the BSD license.
6 * See README for more details.
7 */
8
9 #include "includes.h"
10 #include <time.h>
11 #include <winsock2.h>
12 #include <wincrypt.h>
13
14 #include "os.h"
15 #include "common.h"
16
os_sleep(os_time_t sec,os_time_t usec)17 void os_sleep(os_time_t sec, os_time_t usec)
18 {
19 if (sec)
20 Sleep(sec * 1000);
21 if (usec)
22 Sleep(usec / 1000);
23 }
24
25
os_get_time(struct os_time * t)26 int os_get_time(struct os_time *t)
27 {
28 #define EPOCHFILETIME (116444736000000000ULL)
29 FILETIME ft;
30 LARGE_INTEGER li;
31 ULONGLONG tt;
32
33 #ifdef _WIN32_WCE
34 SYSTEMTIME st;
35
36 GetSystemTime(&st);
37 SystemTimeToFileTime(&st, &ft);
38 #else /* _WIN32_WCE */
39 GetSystemTimeAsFileTime(&ft);
40 #endif /* _WIN32_WCE */
41 li.LowPart = ft.dwLowDateTime;
42 li.HighPart = ft.dwHighDateTime;
43 tt = (li.QuadPart - EPOCHFILETIME) / 10;
44 t->sec = (os_time_t) (tt / 1000000);
45 t->usec = (os_time_t) (tt % 1000000);
46
47 return 0;
48 }
49
50
os_get_reltime(struct os_reltime * t)51 int os_get_reltime(struct os_reltime *t)
52 {
53 /* consider using performance counters or so instead */
54 struct os_time now;
55 int res = os_get_time(&now);
56 t->sec = now.sec;
57 t->usec = now.usec;
58 return res;
59 }
60
61
os_mktime(int year,int month,int day,int hour,int min,int sec,os_time_t * t)62 int os_mktime(int year, int month, int day, int hour, int min, int sec,
63 os_time_t *t)
64 {
65 struct tm tm, *tm1;
66 time_t t_local, t1, t2;
67 os_time_t tz_offset;
68
69 if (year < 1970 || month < 1 || month > 12 || day < 1 || day > 31 ||
70 hour < 0 || hour > 23 || min < 0 || min > 59 || sec < 0 ||
71 sec > 60)
72 return -1;
73
74 memset(&tm, 0, sizeof(tm));
75 tm.tm_year = year - 1900;
76 tm.tm_mon = month - 1;
77 tm.tm_mday = day;
78 tm.tm_hour = hour;
79 tm.tm_min = min;
80 tm.tm_sec = sec;
81
82 t_local = mktime(&tm);
83
84 /* figure out offset to UTC */
85 tm1 = localtime(&t_local);
86 if (tm1) {
87 t1 = mktime(tm1);
88 tm1 = gmtime(&t_local);
89 if (tm1) {
90 t2 = mktime(tm1);
91 tz_offset = t2 - t1;
92 } else
93 tz_offset = 0;
94 } else
95 tz_offset = 0;
96
97 *t = (os_time_t) t_local - tz_offset;
98 return 0;
99 }
100
101
os_gmtime(os_time_t t,struct os_tm * tm)102 int os_gmtime(os_time_t t, struct os_tm *tm)
103 {
104 struct tm *tm2;
105 time_t t2 = t;
106
107 tm2 = gmtime(&t2);
108 if (tm2 == NULL)
109 return -1;
110 tm->sec = tm2->tm_sec;
111 tm->min = tm2->tm_min;
112 tm->hour = tm2->tm_hour;
113 tm->day = tm2->tm_mday;
114 tm->month = tm2->tm_mon + 1;
115 tm->year = tm2->tm_year + 1900;
116 return 0;
117 }
118
119
os_daemonize(const char * pid_file)120 int os_daemonize(const char *pid_file)
121 {
122 /* TODO */
123 return -1;
124 }
125
126
os_daemonize_terminate(const char * pid_file)127 void os_daemonize_terminate(const char *pid_file)
128 {
129 }
130
131
os_get_random(unsigned char * buf,size_t len)132 int os_get_random(unsigned char *buf, size_t len)
133 {
134 HCRYPTPROV prov;
135 BOOL ret;
136
137 if (!CryptAcquireContext(&prov, NULL, NULL, PROV_RSA_FULL,
138 CRYPT_VERIFYCONTEXT))
139 return -1;
140
141 ret = CryptGenRandom(prov, len, buf);
142 CryptReleaseContext(prov, 0);
143
144 return ret ? 0 : -1;
145 }
146
147
os_random(void)148 unsigned long os_random(void)
149 {
150 return rand();
151 }
152
153
os_rel2abs_path(const char * rel_path)154 char * os_rel2abs_path(const char *rel_path)
155 {
156 return _strdup(rel_path);
157 }
158
159
os_program_init(void)160 int os_program_init(void)
161 {
162 #ifdef CONFIG_NATIVE_WINDOWS
163 WSADATA wsaData;
164 if (WSAStartup(MAKEWORD(2, 0), &wsaData)) {
165 printf("Could not find a usable WinSock.dll\n");
166 return -1;
167 }
168 #endif /* CONFIG_NATIVE_WINDOWS */
169 return 0;
170 }
171
172
os_program_deinit(void)173 void os_program_deinit(void)
174 {
175 #ifdef CONFIG_NATIVE_WINDOWS
176 WSACleanup();
177 #endif /* CONFIG_NATIVE_WINDOWS */
178 }
179
180
os_setenv(const char * name,const char * value,int overwrite)181 int os_setenv(const char *name, const char *value, int overwrite)
182 {
183 return -1;
184 }
185
186
os_unsetenv(const char * name)187 int os_unsetenv(const char *name)
188 {
189 return -1;
190 }
191
192
os_readfile(const char * name,size_t * len)193 char * os_readfile(const char *name, size_t *len)
194 {
195 FILE *f;
196 char *buf;
197
198 f = fopen(name, "rb");
199 if (f == NULL)
200 return NULL;
201
202 fseek(f, 0, SEEK_END);
203 *len = ftell(f);
204 fseek(f, 0, SEEK_SET);
205
206 buf = malloc(*len);
207 if (buf == NULL) {
208 fclose(f);
209 return NULL;
210 }
211
212 fread(buf, 1, *len, f);
213 fclose(f);
214
215 return buf;
216 }
217
218
os_fdatasync(FILE * stream)219 int os_fdatasync(FILE *stream)
220 {
221 HANDLE h;
222
223 if (stream == NULL)
224 return -1;
225
226 h = (HANDLE) _get_osfhandle(_fileno(stream));
227 if (h == INVALID_HANDLE_VALUE)
228 return -1;
229
230 if (!FlushFileBuffers(h))
231 return -1;
232
233 return 0;
234 }
235
236
os_zalloc(size_t size)237 void * os_zalloc(size_t size)
238 {
239 return calloc(1, size);
240 }
241
242
os_strlcpy(char * dest,const char * src,size_t siz)243 size_t os_strlcpy(char *dest, const char *src, size_t siz)
244 {
245 const char *s = src;
246 size_t left = siz;
247
248 if (left) {
249 /* Copy string up to the maximum size of the dest buffer */
250 while (--left != 0) {
251 if ((*dest++ = *s++) == '\0')
252 break;
253 }
254 }
255
256 if (left == 0) {
257 /* Not enough room for the string; force NUL-termination */
258 if (siz != 0)
259 *dest = '\0';
260 while (*s++)
261 ; /* determine total src string length */
262 }
263
264 return s - src - 1;
265 }
266
267
os_memcmp_const(const void * a,const void * b,size_t len)268 int os_memcmp_const(const void *a, const void *b, size_t len)
269 {
270 const u8 *aa = a;
271 const u8 *bb = b;
272 size_t i;
273 u8 res;
274
275 for (res = 0, i = 0; i < len; i++)
276 res |= aa[i] ^ bb[i];
277
278 return res;
279 }
280
281
os_exec(const char * program,const char * arg,int wait_completion)282 int os_exec(const char *program, const char *arg, int wait_completion)
283 {
284 return -1;
285 }
286
287
os_memdup(const void * src,size_t len)288 void * os_memdup(const void *src, size_t len)
289 {
290 void *r = os_malloc(len);
291
292 if (r)
293 os_memcpy(r, src, len);
294 return r;
295 }
296