Home | History | Annotate | Download | only in utils
      1 /*
      2  * wpa_supplicant/hostapd / OS specific functions for Win32 systems
      3  * Copyright (c) 2005-2006, Jouni Malinen <j (at) 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_get_reltime(struct os_reltime *t)
     51 {
     52 	/* consider using performance counters or so instead */
     53 	struct os_time now;
     54 	int res = os_get_time(&now);
     55 	t->sec = now.sec;
     56 	t->usec = now.usec;
     57 	return res;
     58 }
     59 
     60 
     61 int os_mktime(int year, int month, int day, int hour, int min, int sec,
     62 	      os_time_t *t)
     63 {
     64 	struct tm tm, *tm1;
     65 	time_t t_local, t1, t2;
     66 	os_time_t tz_offset;
     67 
     68 	if (year < 1970 || month < 1 || month > 12 || day < 1 || day > 31 ||
     69 	    hour < 0 || hour > 23 || min < 0 || min > 59 || sec < 0 ||
     70 	    sec > 60)
     71 		return -1;
     72 
     73 	memset(&tm, 0, sizeof(tm));
     74 	tm.tm_year = year - 1900;
     75 	tm.tm_mon = month - 1;
     76 	tm.tm_mday = day;
     77 	tm.tm_hour = hour;
     78 	tm.tm_min = min;
     79 	tm.tm_sec = sec;
     80 
     81 	t_local = mktime(&tm);
     82 
     83 	/* figure out offset to UTC */
     84 	tm1 = localtime(&t_local);
     85 	if (tm1) {
     86 		t1 = mktime(tm1);
     87 		tm1 = gmtime(&t_local);
     88 		if (tm1) {
     89 			t2 = mktime(tm1);
     90 			tz_offset = t2 - t1;
     91 		} else
     92 			tz_offset = 0;
     93 	} else
     94 		tz_offset = 0;
     95 
     96 	*t = (os_time_t) t_local - tz_offset;
     97 	return 0;
     98 }
     99 
    100 
    101 int os_gmtime(os_time_t t, struct os_tm *tm)
    102 {
    103 	struct tm *tm2;
    104 	time_t t2 = t;
    105 
    106 	tm2 = gmtime(&t2);
    107 	if (tm2 == NULL)
    108 		return -1;
    109 	tm->sec = tm2->tm_sec;
    110 	tm->min = tm2->tm_min;
    111 	tm->hour = tm2->tm_hour;
    112 	tm->day = tm2->tm_mday;
    113 	tm->month = tm2->tm_mon + 1;
    114 	tm->year = tm2->tm_year + 1900;
    115 	return 0;
    116 }
    117 
    118 
    119 int os_daemonize(const char *pid_file)
    120 {
    121 	/* TODO */
    122 	return -1;
    123 }
    124 
    125 
    126 void os_daemonize_terminate(const char *pid_file)
    127 {
    128 }
    129 
    130 
    131 int os_get_random(unsigned char *buf, size_t len)
    132 {
    133 	HCRYPTPROV prov;
    134 	BOOL ret;
    135 
    136 	if (!CryptAcquireContext(&prov, NULL, NULL, PROV_RSA_FULL,
    137 				 CRYPT_VERIFYCONTEXT))
    138 		return -1;
    139 
    140 	ret = CryptGenRandom(prov, len, buf);
    141 	CryptReleaseContext(prov, 0);
    142 
    143 	return ret ? 0 : -1;
    144 }
    145 
    146 
    147 unsigned long os_random(void)
    148 {
    149 	return rand();
    150 }
    151 
    152 
    153 char * os_rel2abs_path(const char *rel_path)
    154 {
    155 	return _strdup(rel_path);
    156 }
    157 
    158 
    159 int os_program_init(void)
    160 {
    161 #ifdef CONFIG_NATIVE_WINDOWS
    162 	WSADATA wsaData;
    163 	if (WSAStartup(MAKEWORD(2, 0), &wsaData)) {
    164 		printf("Could not find a usable WinSock.dll\n");
    165 		return -1;
    166 	}
    167 #endif /* CONFIG_NATIVE_WINDOWS */
    168 	return 0;
    169 }
    170 
    171 
    172 void os_program_deinit(void)
    173 {
    174 #ifdef CONFIG_NATIVE_WINDOWS
    175 	WSACleanup();
    176 #endif /* CONFIG_NATIVE_WINDOWS */
    177 }
    178 
    179 
    180 int os_setenv(const char *name, const char *value, int overwrite)
    181 {
    182 	return -1;
    183 }
    184 
    185 
    186 int os_unsetenv(const char *name)
    187 {
    188 	return -1;
    189 }
    190 
    191 
    192 char * os_readfile(const char *name, size_t *len)
    193 {
    194 	FILE *f;
    195 	char *buf;
    196 
    197 	f = fopen(name, "rb");
    198 	if (f == NULL)
    199 		return NULL;
    200 
    201 	fseek(f, 0, SEEK_END);
    202 	*len = ftell(f);
    203 	fseek(f, 0, SEEK_SET);
    204 
    205 	buf = malloc(*len);
    206 	if (buf == NULL) {
    207 		fclose(f);
    208 		return NULL;
    209 	}
    210 
    211 	fread(buf, 1, *len, f);
    212 	fclose(f);
    213 
    214 	return buf;
    215 }
    216 
    217 
    218 void * os_zalloc(size_t size)
    219 {
    220 	return calloc(1, size);
    221 }
    222 
    223 
    224 size_t os_strlcpy(char *dest, const char *src, size_t siz)
    225 {
    226 	const char *s = src;
    227 	size_t left = siz;
    228 
    229 	if (left) {
    230 		/* Copy string up to the maximum size of the dest buffer */
    231 		while (--left != 0) {
    232 			if ((*dest++ = *s++) == '\0')
    233 				break;
    234 		}
    235 	}
    236 
    237 	if (left == 0) {
    238 		/* Not enough room for the string; force NUL-termination */
    239 		if (siz != 0)
    240 			*dest = '\0';
    241 		while (*s++)
    242 			; /* determine total src string length */
    243 	}
    244 
    245 	return s - src - 1;
    246 }
    247 
    248 
    249 int os_memcmp_const(const void *a, const void *b, size_t len)
    250 {
    251 	const u8 *aa = a;
    252 	const u8 *bb = b;
    253 	size_t i;
    254 	u8 res;
    255 
    256 	for (res = 0, i = 0; i < len; i++)
    257 		res |= aa[i] ^ bb[i];
    258 
    259 	return res;
    260 }
    261 
    262 
    263 int os_exec(const char *program, const char *arg, int wait_completion)
    264 {
    265 	return -1;
    266 }
    267