18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* 28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * wpa_supplicant/hostapd / Internal implementation of OS specific functions 38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2005-2006, Jouni Malinen <j@w1.fi> 48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 5c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * This software may be distributed under the terms of the BSD license. 6c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * See README for more details. 78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * This file is an example of operating system specific wrapper functions. 98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * This version implements many of the functions internally, so it can be used 108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * to fill in missing functions from the target system C libraries. 118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * 128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Some of the functions are using standard C library calls in order to keep 138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * this file in working condition to allow the functions to be tested on a 148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Linux target. Please note that OS_NO_C_LIB_DEFINES needs to be defined for 158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * this file to work correctly. Note that these implementations are only 168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * examples and are not optimized for speed. 178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#include "includes.h" 20fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt#include <time.h> 21fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt#include <sys/wait.h> 228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#undef OS_REJECT_C_LIB_FUNCTIONS 24fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt#include "common.h" 258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid os_sleep(os_time_t sec, os_time_t usec) 278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (sec) 298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sleep(sec); 308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (usec) 318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt usleep(usec); 328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint os_get_time(struct os_time *t) 368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int res; 388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct timeval tv; 398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = gettimeofday(&tv, NULL); 408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt t->sec = tv.tv_sec; 418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt t->usec = tv.tv_usec; 428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return res; 438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 46fa3fc4a1ac08ad14272301c7f6f01b362997c3e4Dmitry Shmidtint os_get_reltime(struct os_reltime *t) 47fa3fc4a1ac08ad14272301c7f6f01b362997c3e4Dmitry Shmidt{ 48fa3fc4a1ac08ad14272301c7f6f01b362997c3e4Dmitry Shmidt int res; 49fa3fc4a1ac08ad14272301c7f6f01b362997c3e4Dmitry Shmidt struct timeval tv; 50fa3fc4a1ac08ad14272301c7f6f01b362997c3e4Dmitry Shmidt res = gettimeofday(&tv, NULL); 51fa3fc4a1ac08ad14272301c7f6f01b362997c3e4Dmitry Shmidt t->sec = tv.tv_sec; 52fa3fc4a1ac08ad14272301c7f6f01b362997c3e4Dmitry Shmidt t->usec = tv.tv_usec; 53fa3fc4a1ac08ad14272301c7f6f01b362997c3e4Dmitry Shmidt return res; 54fa3fc4a1ac08ad14272301c7f6f01b362997c3e4Dmitry Shmidt} 55fa3fc4a1ac08ad14272301c7f6f01b362997c3e4Dmitry Shmidt 56fa3fc4a1ac08ad14272301c7f6f01b362997c3e4Dmitry Shmidt 578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint os_mktime(int year, int month, int day, int hour, int min, int sec, 588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_time_t *t) 598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt struct tm tm; 618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (year < 1970 || month < 1 || month > 12 || day < 1 || day > 31 || 638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt hour < 0 || hour > 23 || min < 0 || min > 59 || sec < 0 || 648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt sec > 60) 658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(&tm, 0, sizeof(tm)); 688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tm.tm_year = year - 1900; 698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tm.tm_mon = month - 1; 708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tm.tm_mday = day; 718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tm.tm_hour = hour; 728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tm.tm_min = min; 738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt tm.tm_sec = sec; 748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *t = (os_time_t) mktime(&tm); 768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 801f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidtint os_gmtime(os_time_t t, struct os_tm *tm) 811f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt{ 821f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt struct tm *tm2; 831f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt time_t t2 = t; 841f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 851f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt tm2 = gmtime(&t2); 861f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt if (tm2 == NULL) 871f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return -1; 881f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt tm->sec = tm2->tm_sec; 891f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt tm->min = tm2->tm_min; 901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt tm->hour = tm2->tm_hour; 911f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt tm->day = tm2->tm_mday; 921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt tm->month = tm2->tm_mon + 1; 931f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt tm->year = tm2->tm_year + 1900; 941f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt return 0; 951f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt} 961f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 971f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt 988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint os_daemonize(const char *pid_file) 998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (daemon(0, 0)) { 101fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt wpa_printf(MSG_ERROR, "daemon: %s", strerror(errno)); 1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pid_file) { 1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt FILE *f = fopen(pid_file, "w"); 1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (f) { 1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fprintf(f, "%u\n", getpid()); 1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fclose(f); 1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -0; 1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid os_daemonize_terminate(const char *pid_file) 1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (pid_file) 1208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unlink(pid_file); 1218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint os_get_random(unsigned char *buf, size_t len) 1258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt FILE *f; 1278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t rc; 1288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt f = fopen("/dev/urandom", "rb"); 1308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (f == NULL) { 1318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt printf("Could not open /dev/urandom.\n"); 1328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return -1; 1338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt rc = fread(buf, 1, len, f); 1368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fclose(f); 1378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return rc != len ? -1 : 0; 1398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtunsigned long os_random(void) 1438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return random(); 1458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtchar * os_rel2abs_path(const char *rel_path) 1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *buf = NULL, *cwd, *ret; 1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t len = 128, cwd_len, rel_len, ret_len; 1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (rel_path[0] == '/') 1548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return os_strdup(rel_path); 1558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt for (;;) { 1578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt buf = os_malloc(len); 1588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (buf == NULL) 1598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 1608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt cwd = getcwd(buf, len); 1618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (cwd == NULL) { 1628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(buf); 1638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (errno != ERANGE) { 1648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 1658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt len *= 2; 1678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } else { 1688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 1698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 172fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt cwd_len = os_strlen(cwd); 173fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt rel_len = os_strlen(rel_path); 1748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret_len = cwd_len + 1 + rel_len + 1; 1758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = os_malloc(ret_len); 1768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (ret) { 1778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(ret, cwd, cwd_len); 1788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret[cwd_len] = '/'; 1798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(ret + cwd_len + 1, rel_path, rel_len); 1808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret[ret_len - 1] = '\0'; 1818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 1828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(buf); 1838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return ret; 1848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint os_program_init(void) 1888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 1908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid os_program_deinit(void) 1948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 1958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 1968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 1988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint os_setenv(const char *name, const char *value, int overwrite) 1998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 2008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return setenv(name, value, overwrite); 2018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 2028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint os_unsetenv(const char *name) 2058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 2068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#if defined(__FreeBSD__) || defined(__NetBSD__) 2078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt unsetenv(name); 2088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 2098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#else 2108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return unsetenv(name); 2118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif 2128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 2138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtchar * os_readfile(const char *name, size_t *len) 2168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 2178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt FILE *f; 2188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *buf; 2198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt f = fopen(name, "rb"); 2218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (f == NULL) 2228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 2238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fseek(f, 0, SEEK_END); 2258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *len = ftell(f); 2268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fseek(f, 0, SEEK_SET); 2278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt buf = os_malloc(*len); 2298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (buf == NULL) { 2308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fclose(f); 2318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 2328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (fread(buf, 1, *len, f) != *len) { 2358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fclose(f); 2368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_free(buf); 2378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 2388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 2398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt fclose(f); 2418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return buf; 2438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 2448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 246447c7ff83da0d89ffa70c378be2a4a58f9b14d3bMitchell Willsint os_fsync(FILE *stream) 247447c7ff83da0d89ffa70c378be2a4a58f9b14d3bMitchell Wills{ 248447c7ff83da0d89ffa70c378be2a4a58f9b14d3bMitchell Wills return 0; 249447c7ff83da0d89ffa70c378be2a4a58f9b14d3bMitchell Wills} 250447c7ff83da0d89ffa70c378be2a4a58f9b14d3bMitchell Wills 251447c7ff83da0d89ffa70c378be2a4a58f9b14d3bMitchell Wills 2528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid * os_zalloc(size_t size) 2538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 2548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt void *n = os_malloc(size); 2558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (n) 2568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memset(n, 0, size); 2578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return n; 2588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 2598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid * os_malloc(size_t size) 2628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 2638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return malloc(size); 2648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 2658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid * os_realloc(void *ptr, size_t size) 2688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 2698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return realloc(ptr, size); 2708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 2718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid os_free(void *ptr) 2748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 2758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt free(ptr); 2768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 2778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid * os_memcpy(void *dest, const void *src, size_t n) 2808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 2818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *d = dest; 2828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *s = src; 2838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (n--) 2848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *d++ = *s++; 2858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dest; 2868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 2878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 2898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid * os_memmove(void *dest, const void *src, size_t n) 2908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 2918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (dest < src) 2928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(dest, src, n); 2938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt else { 2948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* overlapping areas */ 2958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *d = (char *) dest + n; 2968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *s = (const char *) src + n; 2978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (n--) 2988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *--d = *--s; 2998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dest; 3018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtvoid * os_memset(void *s, int c, size_t n) 3058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *p = s; 3078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (n--) 3088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *p++ = c; 3098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return s; 3108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint os_memcmp(const void *s1, const void *s2, size_t n) 3148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const unsigned char *p1 = s1, *p2 = s2; 3168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (n == 0) 3188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 3198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*p1 == *p2) { 3218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt p1++; 3228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt p2++; 3238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt n--; 3248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (n == 0) 3258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 3268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return *p1 - *p2; 3298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtchar * os_strdup(const char *s) 3338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *res; 3358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t len; 3368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (s == NULL) 3378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 3388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt len = os_strlen(s); 3398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt res = os_malloc(len + 1); 3408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (res) 3418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt os_memcpy(res, s, len + 1); 3428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return res; 3438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtsize_t os_strlen(const char *s) 3478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *p = s; 3498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*p) 3508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt p++; 3518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return p - s; 3528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint os_strcasecmp(const char *s1, const char *s2) 3568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* 3588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Ignoring case is not required for main functionality, so just use 3598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * the case sensitive version of the function. 3608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 3618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return os_strcmp(s1, s2); 3628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint os_strncasecmp(const char *s1, const char *s2, size_t n) 3668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* 3688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Ignoring case is not required for main functionality, so just use 3698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * the case sensitive version of the function. 3708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 3718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return os_strncmp(s1, s2, n); 3728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtchar * os_strchr(const char *s, int c) 3768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*s) { 3788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*s == c) 3798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return (char *) s; 3808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt s++; 3818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 3838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 3868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtchar * os_strrchr(const char *s, int c) 3878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 3888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *p = s; 3898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*p) 3908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt p++; 3918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt p--; 3928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (p >= s) { 3938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*p == c) 3948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return (char *) p; 3958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt p--; 3968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 3978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 3988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 3998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint os_strcmp(const char *s1, const char *s2) 4028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 4038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*s1 == *s2) { 4048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*s1 == '\0') 4058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt s1++; 4078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt s2++; 4088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return *s1 - *s2; 4118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 4128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint os_strncmp(const char *s1, const char *s2, size_t n) 4158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 4168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (n == 0) 4178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 4188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*s1 == *s2) { 4208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*s1 == '\0') 4218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt s1++; 4238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt s2++; 4248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt n--; 4258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (n == 0) 4268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return 0; 4278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return *s1 - *s2; 4308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 4318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtchar * os_strncpy(char *dest, const char *src, size_t n) 4348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 4358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt char *d = dest; 4368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (n--) { 4388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *d = *src; 4398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (*src == '\0') 4408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt d++; 4428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt src++; 4438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return dest; 4468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 4478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtsize_t os_strlcpy(char *dest, const char *src, size_t siz) 4508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 4518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt const char *s = src; 4528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t left = siz; 4538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (left) { 4558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Copy string up to the maximum size of the dest buffer */ 4568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (--left != 0) { 4578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if ((*dest++ = *s++) == '\0') 4588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt break; 4598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (left == 0) { 4638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* Not enough room for the string; force NUL-termination */ 4648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (siz != 0) 4658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *dest = '\0'; 4668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*s++) 4678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ; /* determine total src string length */ 4688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return s - src - 1; 4718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 4728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 474c28170251eb54dbf64a9074a07fee377587425b2Dmitry Shmidtint os_memcmp_const(const void *a, const void *b, size_t len) 475c28170251eb54dbf64a9074a07fee377587425b2Dmitry Shmidt{ 476c28170251eb54dbf64a9074a07fee377587425b2Dmitry Shmidt const u8 *aa = a; 477c28170251eb54dbf64a9074a07fee377587425b2Dmitry Shmidt const u8 *bb = b; 478c28170251eb54dbf64a9074a07fee377587425b2Dmitry Shmidt size_t i; 479c28170251eb54dbf64a9074a07fee377587425b2Dmitry Shmidt u8 res; 480c28170251eb54dbf64a9074a07fee377587425b2Dmitry Shmidt 481c28170251eb54dbf64a9074a07fee377587425b2Dmitry Shmidt for (res = 0, i = 0; i < len; i++) 482c28170251eb54dbf64a9074a07fee377587425b2Dmitry Shmidt res |= aa[i] ^ bb[i]; 483c28170251eb54dbf64a9074a07fee377587425b2Dmitry Shmidt 484c28170251eb54dbf64a9074a07fee377587425b2Dmitry Shmidt return res; 485c28170251eb54dbf64a9074a07fee377587425b2Dmitry Shmidt} 486c28170251eb54dbf64a9074a07fee377587425b2Dmitry Shmidt 487c28170251eb54dbf64a9074a07fee377587425b2Dmitry Shmidt 4888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtchar * os_strstr(const char *haystack, const char *needle) 4898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 4908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt size_t len = os_strlen(needle); 4918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt while (*haystack) { 4928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (os_strncmp(haystack, needle, len) == 0) 4938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return (char *) haystack; 4948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt haystack++; 4958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt } 4968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 4978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return NULL; 4988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 4998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint os_snprintf(char *str, size_t size, const char *format, ...) 5028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{ 5038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt va_list ap; 5048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt int ret; 5058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt /* See http://www.ijs.si/software/snprintf/ for portable 5078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * implementation of snprintf. 5088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */ 5098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt 5108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt va_start(ap, format); 5118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ret = vsnprintf(str, size, format, ap); 5128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt va_end(ap); 5138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt if (size > 0) 5148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt str[size - 1] = '\0'; 5158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt return ret; 5168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} 517fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt 518fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt 519fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidtint os_exec(const char *program, const char *arg, int wait_completion) 520fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt{ 521fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt pid_t pid; 522fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt int pid_status; 523fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt 524fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt pid = fork(); 525fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt if (pid < 0) { 526fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt wpa_printf(MSG_ERROR, "fork: %s", strerror(errno)); 527fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt return -1; 528fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt } 529fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt 530fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt if (pid == 0) { 531fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt /* run the external command in the child process */ 532fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt const int MAX_ARG = 30; 533fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt char *_program, *_arg, *pos; 534fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt char *argv[MAX_ARG + 1]; 535fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt int i; 536fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt 537fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt _program = os_strdup(program); 538fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt _arg = os_strdup(arg); 539fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt 540fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt argv[0] = _program; 541fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt 542fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt i = 1; 543fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt pos = _arg; 544fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt while (i < MAX_ARG && pos && *pos) { 545fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt while (*pos == ' ') 546fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt pos++; 547fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt if (*pos == '\0') 548fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt break; 549fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt argv[i++] = pos; 550fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt pos = os_strchr(pos, ' '); 551fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt if (pos) 552fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt *pos++ = '\0'; 553fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt } 554fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt argv[i] = NULL; 555fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt 556fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt execv(program, argv); 557fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt wpa_printf(MSG_ERROR, "execv: %s", strerror(errno)); 558fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt os_free(_program); 559fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt os_free(_arg); 560fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt exit(0); 561fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt return -1; 562fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt } 563fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt 564fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt if (wait_completion) { 565fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt /* wait for the child process to complete in the parent */ 566fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt waitpid(pid, &pid_status, 0); 567fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt } 568fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt 569fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt return 0; 570fb45fd5cfed8bdccd0859c7fc05449fc187e2d06Dmitry Shmidt} 571