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