xref: /netbsd-src/external/bsd/wpa/dist/src/utils/os_win32.c (revision 0a73ee0a32b4208ab171f89f408b38fd4c664291)
18dbcf02cSchristos /*
28dbcf02cSchristos  * wpa_supplicant/hostapd / OS specific functions for Win32 systems
38dbcf02cSchristos  * Copyright (c) 2005-2006, Jouni Malinen <j@w1.fi>
48dbcf02cSchristos  *
5e604d861Schristos  * This software may be distributed under the terms of the BSD license.
6e604d861Schristos  * See README for more details.
78dbcf02cSchristos  */
88dbcf02cSchristos 
98dbcf02cSchristos #include "includes.h"
10111b9fd8Schristos #include <time.h>
118dbcf02cSchristos #include <winsock2.h>
128dbcf02cSchristos #include <wincrypt.h>
138dbcf02cSchristos 
148dbcf02cSchristos #include "os.h"
15bb610346Schristos #include "common.h"
168dbcf02cSchristos 
os_sleep(os_time_t sec,os_time_t usec)178dbcf02cSchristos void os_sleep(os_time_t sec, os_time_t usec)
188dbcf02cSchristos {
198dbcf02cSchristos 	if (sec)
208dbcf02cSchristos 		Sleep(sec * 1000);
218dbcf02cSchristos 	if (usec)
228dbcf02cSchristos 		Sleep(usec / 1000);
238dbcf02cSchristos }
248dbcf02cSchristos 
258dbcf02cSchristos 
os_get_time(struct os_time * t)268dbcf02cSchristos int os_get_time(struct os_time *t)
278dbcf02cSchristos {
288dbcf02cSchristos #define EPOCHFILETIME (116444736000000000ULL)
298dbcf02cSchristos 	FILETIME ft;
308dbcf02cSchristos 	LARGE_INTEGER li;
318dbcf02cSchristos 	ULONGLONG tt;
328dbcf02cSchristos 
338dbcf02cSchristos #ifdef _WIN32_WCE
348dbcf02cSchristos 	SYSTEMTIME st;
358dbcf02cSchristos 
368dbcf02cSchristos 	GetSystemTime(&st);
378dbcf02cSchristos 	SystemTimeToFileTime(&st, &ft);
388dbcf02cSchristos #else /* _WIN32_WCE */
398dbcf02cSchristos 	GetSystemTimeAsFileTime(&ft);
408dbcf02cSchristos #endif /* _WIN32_WCE */
418dbcf02cSchristos 	li.LowPart = ft.dwLowDateTime;
428dbcf02cSchristos 	li.HighPart = ft.dwHighDateTime;
438dbcf02cSchristos 	tt = (li.QuadPart - EPOCHFILETIME) / 10;
448dbcf02cSchristos 	t->sec = (os_time_t) (tt / 1000000);
458dbcf02cSchristos 	t->usec = (os_time_t) (tt % 1000000);
468dbcf02cSchristos 
478dbcf02cSchristos 	return 0;
488dbcf02cSchristos }
498dbcf02cSchristos 
508dbcf02cSchristos 
os_get_reltime(struct os_reltime * t)513c260e60Schristos int os_get_reltime(struct os_reltime *t)
523c260e60Schristos {
533c260e60Schristos 	/* consider using performance counters or so instead */
543c260e60Schristos 	struct os_time now;
553c260e60Schristos 	int res = os_get_time(&now);
563c260e60Schristos 	t->sec = now.sec;
573c260e60Schristos 	t->usec = now.usec;
583c260e60Schristos 	return res;
593c260e60Schristos }
603c260e60Schristos 
613c260e60Schristos 
os_mktime(int year,int month,int day,int hour,int min,int sec,os_time_t * t)628dbcf02cSchristos int os_mktime(int year, int month, int day, int hour, int min, int sec,
638dbcf02cSchristos 	      os_time_t *t)
648dbcf02cSchristos {
658dbcf02cSchristos 	struct tm tm, *tm1;
668dbcf02cSchristos 	time_t t_local, t1, t2;
678dbcf02cSchristos 	os_time_t tz_offset;
688dbcf02cSchristos 
698dbcf02cSchristos 	if (year < 1970 || month < 1 || month > 12 || day < 1 || day > 31 ||
708dbcf02cSchristos 	    hour < 0 || hour > 23 || min < 0 || min > 59 || sec < 0 ||
718dbcf02cSchristos 	    sec > 60)
728dbcf02cSchristos 		return -1;
738dbcf02cSchristos 
748dbcf02cSchristos 	memset(&tm, 0, sizeof(tm));
758dbcf02cSchristos 	tm.tm_year = year - 1900;
768dbcf02cSchristos 	tm.tm_mon = month - 1;
778dbcf02cSchristos 	tm.tm_mday = day;
788dbcf02cSchristos 	tm.tm_hour = hour;
798dbcf02cSchristos 	tm.tm_min = min;
808dbcf02cSchristos 	tm.tm_sec = sec;
818dbcf02cSchristos 
828dbcf02cSchristos 	t_local = mktime(&tm);
838dbcf02cSchristos 
848dbcf02cSchristos 	/* figure out offset to UTC */
858dbcf02cSchristos 	tm1 = localtime(&t_local);
868dbcf02cSchristos 	if (tm1) {
878dbcf02cSchristos 		t1 = mktime(tm1);
888dbcf02cSchristos 		tm1 = gmtime(&t_local);
898dbcf02cSchristos 		if (tm1) {
908dbcf02cSchristos 			t2 = mktime(tm1);
918dbcf02cSchristos 			tz_offset = t2 - t1;
928dbcf02cSchristos 		} else
938dbcf02cSchristos 			tz_offset = 0;
948dbcf02cSchristos 	} else
958dbcf02cSchristos 		tz_offset = 0;
968dbcf02cSchristos 
978dbcf02cSchristos 	*t = (os_time_t) t_local - tz_offset;
988dbcf02cSchristos 	return 0;
998dbcf02cSchristos }
1008dbcf02cSchristos 
1018dbcf02cSchristos 
os_gmtime(os_time_t t,struct os_tm * tm)102111b9fd8Schristos int os_gmtime(os_time_t t, struct os_tm *tm)
103111b9fd8Schristos {
104111b9fd8Schristos 	struct tm *tm2;
105111b9fd8Schristos 	time_t t2 = t;
106111b9fd8Schristos 
107111b9fd8Schristos 	tm2 = gmtime(&t2);
108111b9fd8Schristos 	if (tm2 == NULL)
109111b9fd8Schristos 		return -1;
110111b9fd8Schristos 	tm->sec = tm2->tm_sec;
111111b9fd8Schristos 	tm->min = tm2->tm_min;
112111b9fd8Schristos 	tm->hour = tm2->tm_hour;
113111b9fd8Schristos 	tm->day = tm2->tm_mday;
114111b9fd8Schristos 	tm->month = tm2->tm_mon + 1;
115111b9fd8Schristos 	tm->year = tm2->tm_year + 1900;
116111b9fd8Schristos 	return 0;
117111b9fd8Schristos }
118111b9fd8Schristos 
119111b9fd8Schristos 
os_daemonize(const char * pid_file)1208dbcf02cSchristos int os_daemonize(const char *pid_file)
1218dbcf02cSchristos {
1228dbcf02cSchristos 	/* TODO */
1238dbcf02cSchristos 	return -1;
1248dbcf02cSchristos }
1258dbcf02cSchristos 
1268dbcf02cSchristos 
os_daemonize_terminate(const char * pid_file)1278dbcf02cSchristos void os_daemonize_terminate(const char *pid_file)
1288dbcf02cSchristos {
1298dbcf02cSchristos }
1308dbcf02cSchristos 
1318dbcf02cSchristos 
os_get_random(unsigned char * buf,size_t len)1328dbcf02cSchristos int os_get_random(unsigned char *buf, size_t len)
1338dbcf02cSchristos {
1348dbcf02cSchristos 	HCRYPTPROV prov;
1358dbcf02cSchristos 	BOOL ret;
1368dbcf02cSchristos 
1378dbcf02cSchristos 	if (!CryptAcquireContext(&prov, NULL, NULL, PROV_RSA_FULL,
1388dbcf02cSchristos 				 CRYPT_VERIFYCONTEXT))
1398dbcf02cSchristos 		return -1;
1408dbcf02cSchristos 
1418dbcf02cSchristos 	ret = CryptGenRandom(prov, len, buf);
1428dbcf02cSchristos 	CryptReleaseContext(prov, 0);
1438dbcf02cSchristos 
1448dbcf02cSchristos 	return ret ? 0 : -1;
1458dbcf02cSchristos }
1468dbcf02cSchristos 
1478dbcf02cSchristos 
os_random(void)1488dbcf02cSchristos unsigned long os_random(void)
1498dbcf02cSchristos {
1508dbcf02cSchristos 	return rand();
1518dbcf02cSchristos }
1528dbcf02cSchristos 
1538dbcf02cSchristos 
os_rel2abs_path(const char * rel_path)1548dbcf02cSchristos char * os_rel2abs_path(const char *rel_path)
1558dbcf02cSchristos {
1568dbcf02cSchristos 	return _strdup(rel_path);
1578dbcf02cSchristos }
1588dbcf02cSchristos 
1598dbcf02cSchristos 
os_program_init(void)1608dbcf02cSchristos int os_program_init(void)
1618dbcf02cSchristos {
1628dbcf02cSchristos #ifdef CONFIG_NATIVE_WINDOWS
1638dbcf02cSchristos 	WSADATA wsaData;
1648dbcf02cSchristos 	if (WSAStartup(MAKEWORD(2, 0), &wsaData)) {
1658dbcf02cSchristos 		printf("Could not find a usable WinSock.dll\n");
1668dbcf02cSchristos 		return -1;
1678dbcf02cSchristos 	}
1688dbcf02cSchristos #endif /* CONFIG_NATIVE_WINDOWS */
1698dbcf02cSchristos 	return 0;
1708dbcf02cSchristos }
1718dbcf02cSchristos 
1728dbcf02cSchristos 
os_program_deinit(void)1738dbcf02cSchristos void os_program_deinit(void)
1748dbcf02cSchristos {
1758dbcf02cSchristos #ifdef CONFIG_NATIVE_WINDOWS
1768dbcf02cSchristos 	WSACleanup();
1778dbcf02cSchristos #endif /* CONFIG_NATIVE_WINDOWS */
1788dbcf02cSchristos }
1798dbcf02cSchristos 
1808dbcf02cSchristos 
os_setenv(const char * name,const char * value,int overwrite)1818dbcf02cSchristos int os_setenv(const char *name, const char *value, int overwrite)
1828dbcf02cSchristos {
1838dbcf02cSchristos 	return -1;
1848dbcf02cSchristos }
1858dbcf02cSchristos 
1868dbcf02cSchristos 
os_unsetenv(const char * name)1878dbcf02cSchristos int os_unsetenv(const char *name)
1888dbcf02cSchristos {
1898dbcf02cSchristos 	return -1;
1908dbcf02cSchristos }
1918dbcf02cSchristos 
1928dbcf02cSchristos 
os_readfile(const char * name,size_t * len)1938dbcf02cSchristos char * os_readfile(const char *name, size_t *len)
1948dbcf02cSchristos {
1958dbcf02cSchristos 	FILE *f;
1968dbcf02cSchristos 	char *buf;
1978dbcf02cSchristos 
1988dbcf02cSchristos 	f = fopen(name, "rb");
1998dbcf02cSchristos 	if (f == NULL)
2008dbcf02cSchristos 		return NULL;
2018dbcf02cSchristos 
2028dbcf02cSchristos 	fseek(f, 0, SEEK_END);
2038dbcf02cSchristos 	*len = ftell(f);
2048dbcf02cSchristos 	fseek(f, 0, SEEK_SET);
2058dbcf02cSchristos 
2068dbcf02cSchristos 	buf = malloc(*len);
2078dbcf02cSchristos 	if (buf == NULL) {
2088dbcf02cSchristos 		fclose(f);
2098dbcf02cSchristos 		return NULL;
2108dbcf02cSchristos 	}
2118dbcf02cSchristos 
2128dbcf02cSchristos 	fread(buf, 1, *len, f);
2138dbcf02cSchristos 	fclose(f);
2148dbcf02cSchristos 
2158dbcf02cSchristos 	return buf;
2168dbcf02cSchristos }
2178dbcf02cSchristos 
2188dbcf02cSchristos 
os_fdatasync(FILE * stream)21936ebd06eSchristos int os_fdatasync(FILE *stream)
22036ebd06eSchristos {
22136ebd06eSchristos 	HANDLE h;
22236ebd06eSchristos 
22336ebd06eSchristos 	if (stream == NULL)
22436ebd06eSchristos 		return -1;
22536ebd06eSchristos 
22636ebd06eSchristos 	h = (HANDLE) _get_osfhandle(_fileno(stream));
22736ebd06eSchristos 	if (h == INVALID_HANDLE_VALUE)
22836ebd06eSchristos 		return -1;
22936ebd06eSchristos 
23036ebd06eSchristos 	if (!FlushFileBuffers(h))
23136ebd06eSchristos 		return -1;
23236ebd06eSchristos 
23336ebd06eSchristos 	return 0;
23436ebd06eSchristos }
23536ebd06eSchristos 
23636ebd06eSchristos 
os_zalloc(size_t size)2378dbcf02cSchristos void * os_zalloc(size_t size)
2388dbcf02cSchristos {
2398dbcf02cSchristos 	return calloc(1, size);
2408dbcf02cSchristos }
2418dbcf02cSchristos 
2428dbcf02cSchristos 
os_strlcpy(char * dest,const char * src,size_t siz)2438dbcf02cSchristos size_t os_strlcpy(char *dest, const char *src, size_t siz)
2448dbcf02cSchristos {
2458dbcf02cSchristos 	const char *s = src;
2468dbcf02cSchristos 	size_t left = siz;
2478dbcf02cSchristos 
2488dbcf02cSchristos 	if (left) {
2498dbcf02cSchristos 		/* Copy string up to the maximum size of the dest buffer */
2508dbcf02cSchristos 		while (--left != 0) {
2518dbcf02cSchristos 			if ((*dest++ = *s++) == '\0')
2528dbcf02cSchristos 				break;
2538dbcf02cSchristos 		}
2548dbcf02cSchristos 	}
2558dbcf02cSchristos 
2568dbcf02cSchristos 	if (left == 0) {
2578dbcf02cSchristos 		/* Not enough room for the string; force NUL-termination */
2588dbcf02cSchristos 		if (siz != 0)
2598dbcf02cSchristos 			*dest = '\0';
2608dbcf02cSchristos 		while (*s++)
2618dbcf02cSchristos 			; /* determine total src string length */
2628dbcf02cSchristos 	}
2638dbcf02cSchristos 
2648dbcf02cSchristos 	return s - src - 1;
2658dbcf02cSchristos }
2663c260e60Schristos 
2673c260e60Schristos 
os_memcmp_const(const void * a,const void * b,size_t len)2683c260e60Schristos int os_memcmp_const(const void *a, const void *b, size_t len)
2693c260e60Schristos {
2703c260e60Schristos 	const u8 *aa = a;
2713c260e60Schristos 	const u8 *bb = b;
2723c260e60Schristos 	size_t i;
2733c260e60Schristos 	u8 res;
2743c260e60Schristos 
2753c260e60Schristos 	for (res = 0, i = 0; i < len; i++)
2763c260e60Schristos 		res |= aa[i] ^ bb[i];
2773c260e60Schristos 
2783c260e60Schristos 	return res;
2793c260e60Schristos }
2803c260e60Schristos 
2813c260e60Schristos 
os_exec(const char * program,const char * arg,int wait_completion)2823c260e60Schristos int os_exec(const char *program, const char *arg, int wait_completion)
2833c260e60Schristos {
2843c260e60Schristos 	return -1;
2853c260e60Schristos }
286*0a73ee0aSchristos 
287*0a73ee0aSchristos 
os_memdup(const void * src,size_t len)288*0a73ee0aSchristos void * os_memdup(const void *src, size_t len)
289*0a73ee0aSchristos {
290*0a73ee0aSchristos 	void *r = os_malloc(len);
291*0a73ee0aSchristos 
292*0a73ee0aSchristos 	if (r)
293*0a73ee0aSchristos 		os_memcpy(r, src, len);
294*0a73ee0aSchristos 	return r;
295*0a73ee0aSchristos }
296