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