xref: /freebsd/contrib/wpa/src/utils/os_win32.c (revision 7079fc4e0236ff334c2fb0f4367159be6df39332)
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 
16 void os_sleep(os_time_t sec, os_time_t usec)
17 {
18 	if (sec)
19 		Sleep(sec * 1000);
20 	if (usec)
21 		Sleep(usec / 1000);
22 }
23 
24 
25 int os_get_time(struct os_time *t)
26 {
27 #define EPOCHFILETIME (116444736000000000ULL)
28 	FILETIME ft;
29 	LARGE_INTEGER li;
30 	ULONGLONG tt;
31 
32 #ifdef _WIN32_WCE
33 	SYSTEMTIME st;
34 
35 	GetSystemTime(&st);
36 	SystemTimeToFileTime(&st, &ft);
37 #else /* _WIN32_WCE */
38 	GetSystemTimeAsFileTime(&ft);
39 #endif /* _WIN32_WCE */
40 	li.LowPart = ft.dwLowDateTime;
41 	li.HighPart = ft.dwHighDateTime;
42 	tt = (li.QuadPart - EPOCHFILETIME) / 10;
43 	t->sec = (os_time_t) (tt / 1000000);
44 	t->usec = (os_time_t) (tt % 1000000);
45 
46 	return 0;
47 }
48 
49 
50 int os_mktime(int year, int month, int day, int hour, int min, int sec,
51 	      os_time_t *t)
52 {
53 	struct tm tm, *tm1;
54 	time_t t_local, t1, t2;
55 	os_time_t tz_offset;
56 
57 	if (year < 1970 || month < 1 || month > 12 || day < 1 || day > 31 ||
58 	    hour < 0 || hour > 23 || min < 0 || min > 59 || sec < 0 ||
59 	    sec > 60)
60 		return -1;
61 
62 	memset(&tm, 0, sizeof(tm));
63 	tm.tm_year = year - 1900;
64 	tm.tm_mon = month - 1;
65 	tm.tm_mday = day;
66 	tm.tm_hour = hour;
67 	tm.tm_min = min;
68 	tm.tm_sec = sec;
69 
70 	t_local = mktime(&tm);
71 
72 	/* figure out offset to UTC */
73 	tm1 = localtime(&t_local);
74 	if (tm1) {
75 		t1 = mktime(tm1);
76 		tm1 = gmtime(&t_local);
77 		if (tm1) {
78 			t2 = mktime(tm1);
79 			tz_offset = t2 - t1;
80 		} else
81 			tz_offset = 0;
82 	} else
83 		tz_offset = 0;
84 
85 	*t = (os_time_t) t_local - tz_offset;
86 	return 0;
87 }
88 
89 
90 int os_gmtime(os_time_t t, struct os_tm *tm)
91 {
92 	struct tm *tm2;
93 	time_t t2 = t;
94 
95 	tm2 = gmtime(&t2);
96 	if (tm2 == NULL)
97 		return -1;
98 	tm->sec = tm2->tm_sec;
99 	tm->min = tm2->tm_min;
100 	tm->hour = tm2->tm_hour;
101 	tm->day = tm2->tm_mday;
102 	tm->month = tm2->tm_mon + 1;
103 	tm->year = tm2->tm_year + 1900;
104 	return 0;
105 }
106 
107 
108 int os_daemonize(const char *pid_file)
109 {
110 	/* TODO */
111 	return -1;
112 }
113 
114 
115 void os_daemonize_terminate(const char *pid_file)
116 {
117 }
118 
119 
120 int os_get_random(unsigned char *buf, size_t len)
121 {
122 	HCRYPTPROV prov;
123 	BOOL ret;
124 
125 	if (!CryptAcquireContext(&prov, NULL, NULL, PROV_RSA_FULL,
126 				 CRYPT_VERIFYCONTEXT))
127 		return -1;
128 
129 	ret = CryptGenRandom(prov, len, buf);
130 	CryptReleaseContext(prov, 0);
131 
132 	return ret ? 0 : -1;
133 }
134 
135 
136 unsigned long os_random(void)
137 {
138 	return rand();
139 }
140 
141 
142 char * os_rel2abs_path(const char *rel_path)
143 {
144 	return _strdup(rel_path);
145 }
146 
147 
148 int os_program_init(void)
149 {
150 #ifdef CONFIG_NATIVE_WINDOWS
151 	WSADATA wsaData;
152 	if (WSAStartup(MAKEWORD(2, 0), &wsaData)) {
153 		printf("Could not find a usable WinSock.dll\n");
154 		return -1;
155 	}
156 #endif /* CONFIG_NATIVE_WINDOWS */
157 	return 0;
158 }
159 
160 
161 void os_program_deinit(void)
162 {
163 #ifdef CONFIG_NATIVE_WINDOWS
164 	WSACleanup();
165 #endif /* CONFIG_NATIVE_WINDOWS */
166 }
167 
168 
169 int os_setenv(const char *name, const char *value, int overwrite)
170 {
171 	return -1;
172 }
173 
174 
175 int os_unsetenv(const char *name)
176 {
177 	return -1;
178 }
179 
180 
181 char * os_readfile(const char *name, size_t *len)
182 {
183 	FILE *f;
184 	char *buf;
185 
186 	f = fopen(name, "rb");
187 	if (f == NULL)
188 		return NULL;
189 
190 	fseek(f, 0, SEEK_END);
191 	*len = ftell(f);
192 	fseek(f, 0, SEEK_SET);
193 
194 	buf = malloc(*len);
195 	if (buf == NULL) {
196 		fclose(f);
197 		return NULL;
198 	}
199 
200 	fread(buf, 1, *len, f);
201 	fclose(f);
202 
203 	return buf;
204 }
205 
206 
207 void * os_zalloc(size_t size)
208 {
209 	return calloc(1, size);
210 }
211 
212 
213 size_t os_strlcpy(char *dest, const char *src, size_t siz)
214 {
215 	const char *s = src;
216 	size_t left = siz;
217 
218 	if (left) {
219 		/* Copy string up to the maximum size of the dest buffer */
220 		while (--left != 0) {
221 			if ((*dest++ = *s++) == '\0')
222 				break;
223 		}
224 	}
225 
226 	if (left == 0) {
227 		/* Not enough room for the string; force NUL-termination */
228 		if (siz != 0)
229 			*dest = '\0';
230 		while (*s++)
231 			; /* determine total src string length */
232 	}
233 
234 	return s - src - 1;
235 }
236