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