1209139Srpaulo/* 2209139Srpaulo * wpa_supplicant/hostapd / OS specific functions for Win32 systems 3209139Srpaulo * Copyright (c) 2005-2006, Jouni Malinen <j@w1.fi> 4209139Srpaulo * 5209139Srpaulo * This program is free software; you can redistribute it and/or modify 6209139Srpaulo * it under the terms of the GNU General Public License version 2 as 7209139Srpaulo * published by the Free Software Foundation. 8209139Srpaulo * 9209139Srpaulo * Alternatively, this software may be distributed under the terms of BSD 10209139Srpaulo * license. 11209139Srpaulo * 12209139Srpaulo * See README and COPYING for more details. 13209139Srpaulo */ 14209139Srpaulo 15209139Srpaulo#include "includes.h" 16209139Srpaulo#include <winsock2.h> 17209139Srpaulo#include <wincrypt.h> 18209139Srpaulo 19209139Srpaulo#include "os.h" 20209139Srpaulo 21209139Srpaulovoid os_sleep(os_time_t sec, os_time_t usec) 22209139Srpaulo{ 23209139Srpaulo if (sec) 24209139Srpaulo Sleep(sec * 1000); 25209139Srpaulo if (usec) 26209139Srpaulo Sleep(usec / 1000); 27209139Srpaulo} 28209139Srpaulo 29209139Srpaulo 30209139Srpauloint os_get_time(struct os_time *t) 31209139Srpaulo{ 32209139Srpaulo#define EPOCHFILETIME (116444736000000000ULL) 33209139Srpaulo FILETIME ft; 34209139Srpaulo LARGE_INTEGER li; 35209139Srpaulo ULONGLONG tt; 36209139Srpaulo 37209139Srpaulo#ifdef _WIN32_WCE 38209139Srpaulo SYSTEMTIME st; 39209139Srpaulo 40209139Srpaulo GetSystemTime(&st); 41209139Srpaulo SystemTimeToFileTime(&st, &ft); 42209139Srpaulo#else /* _WIN32_WCE */ 43209139Srpaulo GetSystemTimeAsFileTime(&ft); 44209139Srpaulo#endif /* _WIN32_WCE */ 45209139Srpaulo li.LowPart = ft.dwLowDateTime; 46209139Srpaulo li.HighPart = ft.dwHighDateTime; 47209139Srpaulo tt = (li.QuadPart - EPOCHFILETIME) / 10; 48209139Srpaulo t->sec = (os_time_t) (tt / 1000000); 49209139Srpaulo t->usec = (os_time_t) (tt % 1000000); 50209139Srpaulo 51209139Srpaulo return 0; 52209139Srpaulo} 53209139Srpaulo 54209139Srpaulo 55209139Srpauloint os_mktime(int year, int month, int day, int hour, int min, int sec, 56209139Srpaulo os_time_t *t) 57209139Srpaulo{ 58209139Srpaulo struct tm tm, *tm1; 59209139Srpaulo time_t t_local, t1, t2; 60209139Srpaulo os_time_t tz_offset; 61209139Srpaulo 62209139Srpaulo if (year < 1970 || month < 1 || month > 12 || day < 1 || day > 31 || 63209139Srpaulo hour < 0 || hour > 23 || min < 0 || min > 59 || sec < 0 || 64209139Srpaulo sec > 60) 65209139Srpaulo return -1; 66209139Srpaulo 67209139Srpaulo memset(&tm, 0, sizeof(tm)); 68209139Srpaulo tm.tm_year = year - 1900; 69209139Srpaulo tm.tm_mon = month - 1; 70209139Srpaulo tm.tm_mday = day; 71209139Srpaulo tm.tm_hour = hour; 72209139Srpaulo tm.tm_min = min; 73209139Srpaulo tm.tm_sec = sec; 74209139Srpaulo 75209139Srpaulo t_local = mktime(&tm); 76209139Srpaulo 77209139Srpaulo /* figure out offset to UTC */ 78209139Srpaulo tm1 = localtime(&t_local); 79209139Srpaulo if (tm1) { 80209139Srpaulo t1 = mktime(tm1); 81209139Srpaulo tm1 = gmtime(&t_local); 82209139Srpaulo if (tm1) { 83209139Srpaulo t2 = mktime(tm1); 84209139Srpaulo tz_offset = t2 - t1; 85209139Srpaulo } else 86209139Srpaulo tz_offset = 0; 87209139Srpaulo } else 88209139Srpaulo tz_offset = 0; 89209139Srpaulo 90209139Srpaulo *t = (os_time_t) t_local - tz_offset; 91209139Srpaulo return 0; 92209139Srpaulo} 93209139Srpaulo 94209139Srpaulo 95209139Srpauloint os_daemonize(const char *pid_file) 96209139Srpaulo{ 97209139Srpaulo /* TODO */ 98209139Srpaulo return -1; 99209139Srpaulo} 100209139Srpaulo 101209139Srpaulo 102209139Srpaulovoid os_daemonize_terminate(const char *pid_file) 103209139Srpaulo{ 104209139Srpaulo} 105209139Srpaulo 106209139Srpaulo 107209139Srpauloint os_get_random(unsigned char *buf, size_t len) 108209139Srpaulo{ 109209139Srpaulo HCRYPTPROV prov; 110209139Srpaulo BOOL ret; 111209139Srpaulo 112209139Srpaulo if (!CryptAcquireContext(&prov, NULL, NULL, PROV_RSA_FULL, 113209139Srpaulo CRYPT_VERIFYCONTEXT)) 114209139Srpaulo return -1; 115209139Srpaulo 116209139Srpaulo ret = CryptGenRandom(prov, len, buf); 117209139Srpaulo CryptReleaseContext(prov, 0); 118209139Srpaulo 119209139Srpaulo return ret ? 0 : -1; 120209139Srpaulo} 121209139Srpaulo 122209139Srpaulo 123209139Srpaulounsigned long os_random(void) 124209139Srpaulo{ 125209139Srpaulo return rand(); 126209139Srpaulo} 127209139Srpaulo 128209139Srpaulo 129209139Srpaulochar * os_rel2abs_path(const char *rel_path) 130209139Srpaulo{ 131209139Srpaulo return _strdup(rel_path); 132209139Srpaulo} 133209139Srpaulo 134209139Srpaulo 135209139Srpauloint os_program_init(void) 136209139Srpaulo{ 137209139Srpaulo#ifdef CONFIG_NATIVE_WINDOWS 138209139Srpaulo WSADATA wsaData; 139209139Srpaulo if (WSAStartup(MAKEWORD(2, 0), &wsaData)) { 140209139Srpaulo printf("Could not find a usable WinSock.dll\n"); 141209139Srpaulo return -1; 142209139Srpaulo } 143209139Srpaulo#endif /* CONFIG_NATIVE_WINDOWS */ 144209139Srpaulo return 0; 145209139Srpaulo} 146209139Srpaulo 147209139Srpaulo 148209139Srpaulovoid os_program_deinit(void) 149209139Srpaulo{ 150209139Srpaulo#ifdef CONFIG_NATIVE_WINDOWS 151209139Srpaulo WSACleanup(); 152209139Srpaulo#endif /* CONFIG_NATIVE_WINDOWS */ 153209139Srpaulo} 154209139Srpaulo 155209139Srpaulo 156209139Srpauloint os_setenv(const char *name, const char *value, int overwrite) 157209139Srpaulo{ 158209139Srpaulo return -1; 159209139Srpaulo} 160209139Srpaulo 161209139Srpaulo 162209139Srpauloint os_unsetenv(const char *name) 163209139Srpaulo{ 164209139Srpaulo return -1; 165209139Srpaulo} 166209139Srpaulo 167209139Srpaulo 168209139Srpaulochar * os_readfile(const char *name, size_t *len) 169209139Srpaulo{ 170209139Srpaulo FILE *f; 171209139Srpaulo char *buf; 172209139Srpaulo 173209139Srpaulo f = fopen(name, "rb"); 174209139Srpaulo if (f == NULL) 175209139Srpaulo return NULL; 176209139Srpaulo 177209139Srpaulo fseek(f, 0, SEEK_END); 178209139Srpaulo *len = ftell(f); 179209139Srpaulo fseek(f, 0, SEEK_SET); 180209139Srpaulo 181209139Srpaulo buf = malloc(*len); 182209139Srpaulo if (buf == NULL) { 183209139Srpaulo fclose(f); 184209139Srpaulo return NULL; 185209139Srpaulo } 186209139Srpaulo 187209139Srpaulo fread(buf, 1, *len, f); 188209139Srpaulo fclose(f); 189209139Srpaulo 190209139Srpaulo return buf; 191209139Srpaulo} 192209139Srpaulo 193209139Srpaulo 194209139Srpaulovoid * os_zalloc(size_t size) 195209139Srpaulo{ 196209139Srpaulo return calloc(1, size); 197209139Srpaulo} 198209139Srpaulo 199209139Srpaulo 200209139Srpaulosize_t os_strlcpy(char *dest, const char *src, size_t siz) 201209139Srpaulo{ 202209139Srpaulo const char *s = src; 203209139Srpaulo size_t left = siz; 204209139Srpaulo 205209139Srpaulo if (left) { 206209139Srpaulo /* Copy string up to the maximum size of the dest buffer */ 207209139Srpaulo while (--left != 0) { 208209139Srpaulo if ((*dest++ = *s++) == '\0') 209209139Srpaulo break; 210209139Srpaulo } 211209139Srpaulo } 212209139Srpaulo 213209139Srpaulo if (left == 0) { 214209139Srpaulo /* Not enough room for the string; force NUL-termination */ 215209139Srpaulo if (siz != 0) 216209139Srpaulo *dest = '\0'; 217209139Srpaulo while (*s++) 218209139Srpaulo ; /* determine total src string length */ 219209139Srpaulo } 220209139Srpaulo 221209139Srpaulo return s - src - 1; 222209139Srpaulo} 223