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