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 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