1209139Srpaulo/*
2209139Srpaulo * wpa_supplicant/hostapd / OS specific functions for Win32 systems
3209139Srpaulo * Copyright (c) 2005-2006, Jouni Malinen <j@w1.fi>
4209139Srpaulo *
5209139Srpaulo * This program is free software; you can redistribute it and/or modify
6209139Srpaulo * it under the terms of the GNU General Public License version 2 as
7209139Srpaulo * published by the Free Software Foundation.
8209139Srpaulo *
9209139Srpaulo * Alternatively, this software may be distributed under the terms of BSD
10209139Srpaulo * license.
11209139Srpaulo *
12209139Srpaulo * See README and COPYING for more details.
13209139Srpaulo */
14209139Srpaulo
15209139Srpaulo#include "includes.h"
16209139Srpaulo#include <winsock2.h>
17209139Srpaulo#include <wincrypt.h>
18209139Srpaulo
19209139Srpaulo#include "os.h"
20209139Srpaulo
21209139Srpaulovoid os_sleep(os_time_t sec, os_time_t usec)
22209139Srpaulo{
23209139Srpaulo	if (sec)
24209139Srpaulo		Sleep(sec * 1000);
25209139Srpaulo	if (usec)
26209139Srpaulo		Sleep(usec / 1000);
27209139Srpaulo}
28209139Srpaulo
29209139Srpaulo
30209139Srpauloint os_get_time(struct os_time *t)
31209139Srpaulo{
32209139Srpaulo#define EPOCHFILETIME (116444736000000000ULL)
33209139Srpaulo	FILETIME ft;
34209139Srpaulo	LARGE_INTEGER li;
35209139Srpaulo	ULONGLONG tt;
36209139Srpaulo
37209139Srpaulo#ifdef _WIN32_WCE
38209139Srpaulo	SYSTEMTIME st;
39209139Srpaulo
40209139Srpaulo	GetSystemTime(&st);
41209139Srpaulo	SystemTimeToFileTime(&st, &ft);
42209139Srpaulo#else /* _WIN32_WCE */
43209139Srpaulo	GetSystemTimeAsFileTime(&ft);
44209139Srpaulo#endif /* _WIN32_WCE */
45209139Srpaulo	li.LowPart = ft.dwLowDateTime;
46209139Srpaulo	li.HighPart = ft.dwHighDateTime;
47209139Srpaulo	tt = (li.QuadPart - EPOCHFILETIME) / 10;
48209139Srpaulo	t->sec = (os_time_t) (tt / 1000000);
49209139Srpaulo	t->usec = (os_time_t) (tt % 1000000);
50209139Srpaulo
51209139Srpaulo	return 0;
52209139Srpaulo}
53209139Srpaulo
54209139Srpaulo
55209139Srpauloint os_mktime(int year, int month, int day, int hour, int min, int sec,
56209139Srpaulo	      os_time_t *t)
57209139Srpaulo{
58209139Srpaulo	struct tm tm, *tm1;
59209139Srpaulo	time_t t_local, t1, t2;
60209139Srpaulo	os_time_t tz_offset;
61209139Srpaulo
62209139Srpaulo	if (year < 1970 || month < 1 || month > 12 || day < 1 || day > 31 ||
63209139Srpaulo	    hour < 0 || hour > 23 || min < 0 || min > 59 || sec < 0 ||
64209139Srpaulo	    sec > 60)
65209139Srpaulo		return -1;
66209139Srpaulo
67209139Srpaulo	memset(&tm, 0, sizeof(tm));
68209139Srpaulo	tm.tm_year = year - 1900;
69209139Srpaulo	tm.tm_mon = month - 1;
70209139Srpaulo	tm.tm_mday = day;
71209139Srpaulo	tm.tm_hour = hour;
72209139Srpaulo	tm.tm_min = min;
73209139Srpaulo	tm.tm_sec = sec;
74209139Srpaulo
75209139Srpaulo	t_local = mktime(&tm);
76209139Srpaulo
77209139Srpaulo	/* figure out offset to UTC */
78209139Srpaulo	tm1 = localtime(&t_local);
79209139Srpaulo	if (tm1) {
80209139Srpaulo		t1 = mktime(tm1);
81209139Srpaulo		tm1 = gmtime(&t_local);
82209139Srpaulo		if (tm1) {
83209139Srpaulo			t2 = mktime(tm1);
84209139Srpaulo			tz_offset = t2 - t1;
85209139Srpaulo		} else
86209139Srpaulo			tz_offset = 0;
87209139Srpaulo	} else
88209139Srpaulo		tz_offset = 0;
89209139Srpaulo
90209139Srpaulo	*t = (os_time_t) t_local - tz_offset;
91209139Srpaulo	return 0;
92209139Srpaulo}
93209139Srpaulo
94209139Srpaulo
95209139Srpauloint os_daemonize(const char *pid_file)
96209139Srpaulo{
97209139Srpaulo	/* TODO */
98209139Srpaulo	return -1;
99209139Srpaulo}
100209139Srpaulo
101209139Srpaulo
102209139Srpaulovoid os_daemonize_terminate(const char *pid_file)
103209139Srpaulo{
104209139Srpaulo}
105209139Srpaulo
106209139Srpaulo
107209139Srpauloint os_get_random(unsigned char *buf, size_t len)
108209139Srpaulo{
109209139Srpaulo	HCRYPTPROV prov;
110209139Srpaulo	BOOL ret;
111209139Srpaulo
112209139Srpaulo	if (!CryptAcquireContext(&prov, NULL, NULL, PROV_RSA_FULL,
113209139Srpaulo				 CRYPT_VERIFYCONTEXT))
114209139Srpaulo		return -1;
115209139Srpaulo
116209139Srpaulo	ret = CryptGenRandom(prov, len, buf);
117209139Srpaulo	CryptReleaseContext(prov, 0);
118209139Srpaulo
119209139Srpaulo	return ret ? 0 : -1;
120209139Srpaulo}
121209139Srpaulo
122209139Srpaulo
123209139Srpaulounsigned long os_random(void)
124209139Srpaulo{
125209139Srpaulo	return rand();
126209139Srpaulo}
127209139Srpaulo
128209139Srpaulo
129209139Srpaulochar * os_rel2abs_path(const char *rel_path)
130209139Srpaulo{
131209139Srpaulo	return _strdup(rel_path);
132209139Srpaulo}
133209139Srpaulo
134209139Srpaulo
135209139Srpauloint os_program_init(void)
136209139Srpaulo{
137209139Srpaulo#ifdef CONFIG_NATIVE_WINDOWS
138209139Srpaulo	WSADATA wsaData;
139209139Srpaulo	if (WSAStartup(MAKEWORD(2, 0), &wsaData)) {
140209139Srpaulo		printf("Could not find a usable WinSock.dll\n");
141209139Srpaulo		return -1;
142209139Srpaulo	}
143209139Srpaulo#endif /* CONFIG_NATIVE_WINDOWS */
144209139Srpaulo	return 0;
145209139Srpaulo}
146209139Srpaulo
147209139Srpaulo
148209139Srpaulovoid os_program_deinit(void)
149209139Srpaulo{
150209139Srpaulo#ifdef CONFIG_NATIVE_WINDOWS
151209139Srpaulo	WSACleanup();
152209139Srpaulo#endif /* CONFIG_NATIVE_WINDOWS */
153209139Srpaulo}
154209139Srpaulo
155209139Srpaulo
156209139Srpauloint os_setenv(const char *name, const char *value, int overwrite)
157209139Srpaulo{
158209139Srpaulo	return -1;
159209139Srpaulo}
160209139Srpaulo
161209139Srpaulo
162209139Srpauloint os_unsetenv(const char *name)
163209139Srpaulo{
164209139Srpaulo	return -1;
165209139Srpaulo}
166209139Srpaulo
167209139Srpaulo
168209139Srpaulochar * os_readfile(const char *name, size_t *len)
169209139Srpaulo{
170209139Srpaulo	FILE *f;
171209139Srpaulo	char *buf;
172209139Srpaulo
173209139Srpaulo	f = fopen(name, "rb");
174209139Srpaulo	if (f == NULL)
175209139Srpaulo		return NULL;
176209139Srpaulo
177209139Srpaulo	fseek(f, 0, SEEK_END);
178209139Srpaulo	*len = ftell(f);
179209139Srpaulo	fseek(f, 0, SEEK_SET);
180209139Srpaulo
181209139Srpaulo	buf = malloc(*len);
182209139Srpaulo	if (buf == NULL) {
183209139Srpaulo		fclose(f);
184209139Srpaulo		return NULL;
185209139Srpaulo	}
186209139Srpaulo
187209139Srpaulo	fread(buf, 1, *len, f);
188209139Srpaulo	fclose(f);
189209139Srpaulo
190209139Srpaulo	return buf;
191209139Srpaulo}
192209139Srpaulo
193209139Srpaulo
194209139Srpaulovoid * os_zalloc(size_t size)
195209139Srpaulo{
196209139Srpaulo	return calloc(1, size);
197209139Srpaulo}
198209139Srpaulo
199209139Srpaulo
200209139Srpaulosize_t os_strlcpy(char *dest, const char *src, size_t siz)
201209139Srpaulo{
202209139Srpaulo	const char *s = src;
203209139Srpaulo	size_t left = siz;
204209139Srpaulo
205209139Srpaulo	if (left) {
206209139Srpaulo		/* Copy string up to the maximum size of the dest buffer */
207209139Srpaulo		while (--left != 0) {
208209139Srpaulo			if ((*dest++ = *s++) == '\0')
209209139Srpaulo				break;
210209139Srpaulo		}
211209139Srpaulo	}
212209139Srpaulo
213209139Srpaulo	if (left == 0) {
214209139Srpaulo		/* Not enough room for the string; force NUL-termination */
215209139Srpaulo		if (siz != 0)
216209139Srpaulo			*dest = '\0';
217209139Srpaulo		while (*s++)
218209139Srpaulo			; /* determine total src string length */
219209139Srpaulo	}
220209139Srpaulo
221209139Srpaulo	return s - src - 1;
222209139Srpaulo}
223