19277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran/* This file contains functions which implement those POSIX and Linux functions
29277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran * that MinGW and Microsoft don't provide. The implementations contain just enough
39277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran * functionality to support fio.
49277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran */
59277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
69277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran#include <arpa/inet.h>
79277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran#include <netinet/in.h>
89277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran#include <windows.h>
99277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran#include <stddef.h>
10ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran#include <string.h>
119277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran#include <stdlib.h>
129277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran#include <unistd.h>
139277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran#include <dirent.h>
149277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran#include <pthread.h>
15f16b7405fff7c3fc1da421b6bdf8552cc99c3156Bruce Cran#include <time.h>
169277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran#include <semaphore.h>
179277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran#include <sys/shm.h>
189277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran#include <sys/mman.h>
199277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran#include <sys/uio.h>
209277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran#include <sys/resource.h>
219277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran#include <sys/poll.h>
2270a61165b46f210407bcac839b4f0ffe7b4e009fBruce Cran#include <sys/wait.h>
2370a61165b46f210407bcac839b4f0ffe7b4e009fBruce Cran#include <setjmp.h>
249277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
259277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran#include "../os-windows.h"
26671b060056d176f646280f1fd0c29d72f76183e6Bruce Cran#include "../../lib/hweight.h"
279277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
2821c753874722ceff6e78c9e57768932436bce35bBruce Cranextern unsigned long mtime_since_now(struct timeval *);
2921c753874722ceff6e78c9e57768932436bce35bBruce Cranextern void fio_gettime(struct timeval *, void *);
3021c753874722ceff6e78c9e57768932436bce35bBruce Cran
31ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran/* These aren't defined in the MinGW headers */
32ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce CranHRESULT WINAPI StringCchCopyA(
33ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran  char *pszDest,
34ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran  size_t cchDest,
35ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran  const char *pszSrc);
36ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran
37ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce CranHRESULT WINAPI StringCchPrintfA(
38ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran  char *pszDest,
39ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran  size_t cchDest,
40ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran  const char *pszFormat,
41ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran  ...);
42ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran
4310a6b3c67042914fe9d287027bf8792f69e84524Bruce Cranint win_to_posix_error(DWORD winerr)
4410a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran{
4510a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	switch (winerr)
4610a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	{
4710a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_FILE_NOT_FOUND:		return ENOENT;
4810a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_PATH_NOT_FOUND:		return ENOENT;
4910a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_ACCESS_DENIED:		return EACCES;
5010a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_INVALID_HANDLE:		return EBADF;
5110a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_NOT_ENOUGH_MEMORY:	return ENOMEM;
5210a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_INVALID_DATA:		return EINVAL;
5310a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_OUTOFMEMORY:			return ENOMEM;
5410a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_INVALID_DRIVE:		return ENODEV;
5510a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_NOT_SAME_DEVICE:		return EXDEV;
5610a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_WRITE_PROTECT:		return EROFS;
5710a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_BAD_UNIT:			return ENODEV;
5810a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_SHARING_VIOLATION:	return EACCES;
5910a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_LOCK_VIOLATION:		return EACCES;
6010a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_SHARING_BUFFER_EXCEEDED:	return ENOLCK;
6110a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_HANDLE_DISK_FULL:	return ENOSPC;
6210a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_NOT_SUPPORTED:		return ENOSYS;
6310a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_FILE_EXISTS:			return EEXIST;
6410a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_CANNOT_MAKE:			return EPERM;
6510a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_INVALID_PARAMETER:	return EINVAL;
6610a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_NO_PROC_SLOTS:		return EAGAIN;
6710a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_BROKEN_PIPE:			return EPIPE;
6810a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_OPEN_FAILED:			return EIO;
6910a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_NO_MORE_SEARCH_HANDLES:	return ENFILE;
7010a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_CALL_NOT_IMPLEMENTED:	return ENOSYS;
7110a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_INVALID_NAME:		return ENOENT;
7210a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_WAIT_NO_CHILDREN:	return ECHILD;
7310a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_CHILD_NOT_COMPLETE:	return EBUSY;
7410a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_DIR_NOT_EMPTY:		return ENOTEMPTY;
7510a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_SIGNAL_REFUSED:		return EIO;
7610a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_BAD_PATHNAME:		return ENOENT;
7710a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_SIGNAL_PENDING:		return EBUSY;
7810a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_MAX_THRDS_REACHED:	return EAGAIN;
7910a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_BUSY:				return EBUSY;
8010a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_ALREADY_EXISTS:		return EEXIST;
8110a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_NO_SIGNAL_SENT:		return EIO;
8210a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_FILENAME_EXCED_RANGE:	return EINVAL;
8310a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_META_EXPANSION_TOO_LONG:	return EINVAL;
8410a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_INVALID_SIGNAL_NUMBER:	return EINVAL;
8510a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_THREAD_1_INACTIVE:	return EINVAL;
8610a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_BAD_PIPE:			return EINVAL;
8710a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_PIPE_BUSY:			return EBUSY;
8810a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_NO_DATA:				return EPIPE;
8910a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_MORE_DATA:			return EAGAIN;
9010a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_DIRECTORY:			return ENOTDIR;
9110a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_PIPE_CONNECTED:		return EBUSY;
9210a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_NO_TOKEN:			return EINVAL;
9310a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_PROCESS_ABORTED:		return EFAULT;
9410a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_BAD_DEVICE:			return ENODEV;
9510a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_BAD_USERNAME:		return EINVAL;
9610a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_OPEN_FILES:			return EAGAIN;
9710a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_ACTIVE_CONNECTIONS:	return EAGAIN;
9810a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_DEVICE_IN_USE:		return EAGAIN;
9910a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_INVALID_AT_INTERRUPT_TIME:	return EINTR;
10010a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_IO_DEVICE:			return EIO;
10110a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_NOT_OWNER:			return EPERM;
10210a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_END_OF_MEDIA:		return ENOSPC;
10310a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_EOM_OVERFLOW:		return ENOSPC;
10410a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_BEGINNING_OF_MEDIA:	return ESPIPE;
10510a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_SETMARK_DETECTED:	return ESPIPE;
10610a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_NO_DATA_DETECTED:	return ENOSPC;
10710a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_POSSIBLE_DEADLOCK:	return EDEADLOCK;
10810a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_CRC:					return EIO;
10910a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_NEGATIVE_SEEK:		return EINVAL;
11010a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_DISK_FULL:			return ENOSPC;
11110a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_NOACCESS:			return EFAULT;
11210a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	case ERROR_FILE_INVALID:		return ENXIO;
11310a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	}
11410a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran
11510a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	return winerr;
11610a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran}
11710a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran
118671b060056d176f646280f1fd0c29d72f76183e6Bruce Cranint GetNumLogicalProcessors(void)
119671b060056d176f646280f1fd0c29d72f76183e6Bruce Cran{
120671b060056d176f646280f1fd0c29d72f76183e6Bruce Cran	SYSTEM_LOGICAL_PROCESSOR_INFORMATION *processor_info = NULL;
121671b060056d176f646280f1fd0c29d72f76183e6Bruce Cran	DWORD len = 0;
122671b060056d176f646280f1fd0c29d72f76183e6Bruce Cran	DWORD num_processors = 0;
123671b060056d176f646280f1fd0c29d72f76183e6Bruce Cran	DWORD error = 0;
124671b060056d176f646280f1fd0c29d72f76183e6Bruce Cran	DWORD i;
125671b060056d176f646280f1fd0c29d72f76183e6Bruce Cran
126671b060056d176f646280f1fd0c29d72f76183e6Bruce Cran	while (!GetLogicalProcessorInformation(processor_info, &len)) {
127671b060056d176f646280f1fd0c29d72f76183e6Bruce Cran		error = GetLastError();
128671b060056d176f646280f1fd0c29d72f76183e6Bruce Cran		if (error == ERROR_INSUFFICIENT_BUFFER)
129671b060056d176f646280f1fd0c29d72f76183e6Bruce Cran			processor_info = malloc(len);
130671b060056d176f646280f1fd0c29d72f76183e6Bruce Cran		else {
131671b060056d176f646280f1fd0c29d72f76183e6Bruce Cran			log_err("Error: GetLogicalProcessorInformation failed: %d\n", error);
132671b060056d176f646280f1fd0c29d72f76183e6Bruce Cran			return -1;
133671b060056d176f646280f1fd0c29d72f76183e6Bruce Cran		}
134671b060056d176f646280f1fd0c29d72f76183e6Bruce Cran
135671b060056d176f646280f1fd0c29d72f76183e6Bruce Cran		if (processor_info == NULL) {
136671b060056d176f646280f1fd0c29d72f76183e6Bruce Cran			log_err("Error: failed to allocate memory for GetLogicalProcessorInformation");
137671b060056d176f646280f1fd0c29d72f76183e6Bruce Cran			return -1;
138671b060056d176f646280f1fd0c29d72f76183e6Bruce Cran		}
139671b060056d176f646280f1fd0c29d72f76183e6Bruce Cran	}
140671b060056d176f646280f1fd0c29d72f76183e6Bruce Cran
141671b060056d176f646280f1fd0c29d72f76183e6Bruce Cran	for (i = 0; i < len / sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION); i++)
142671b060056d176f646280f1fd0c29d72f76183e6Bruce Cran	{
143671b060056d176f646280f1fd0c29d72f76183e6Bruce Cran		if (processor_info[i].Relationship == RelationProcessorCore)
1444ee47af0e535676100380034dbc5e05c2f1b1642Jens Axboe			num_processors += hweight64(processor_info[i].ProcessorMask);
145671b060056d176f646280f1fd0c29d72f76183e6Bruce Cran	}
146671b060056d176f646280f1fd0c29d72f76183e6Bruce Cran
147671b060056d176f646280f1fd0c29d72f76183e6Bruce Cran	free(processor_info);
148671b060056d176f646280f1fd0c29d72f76183e6Bruce Cran	return num_processors;
149671b060056d176f646280f1fd0c29d72f76183e6Bruce Cran}
150671b060056d176f646280f1fd0c29d72f76183e6Bruce Cran
1519277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cranlong sysconf(int name)
1529277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran{
153671b060056d176f646280f1fd0c29d72f76183e6Bruce Cran	long val = -1;
15401d269552bca14c90bdcc2288e64ba2426c045eaBruce Cran	long val2 = -1;
1559277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	SYSTEM_INFO sysInfo;
1569277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	MEMORYSTATUSEX status;
1579277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
1589277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	switch (name)
1599277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	{
1609277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	case _SC_NPROCESSORS_ONLN:
161671b060056d176f646280f1fd0c29d72f76183e6Bruce Cran		val = GetNumLogicalProcessors();
162671b060056d176f646280f1fd0c29d72f76183e6Bruce Cran		if (val == -1)
16301d269552bca14c90bdcc2288e64ba2426c045eaBruce Cran			log_err("sysconf(_SC_NPROCESSORS_ONLN) failed\n");
164671b060056d176f646280f1fd0c29d72f76183e6Bruce Cran
1659277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		break;
1669277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
1679277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	case _SC_PAGESIZE:
1689277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		GetSystemInfo(&sysInfo);
1699277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		val = sysInfo.dwPageSize;
1709277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		break;
1719277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
1729277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	case _SC_PHYS_PAGES:
1739277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		status.dwLength = sizeof(status);
17401d269552bca14c90bdcc2288e64ba2426c045eaBruce Cran		val2 = sysconf(_SC_PAGESIZE);
17501d269552bca14c90bdcc2288e64ba2426c045eaBruce Cran		if (GlobalMemoryStatusEx(&status) && val2 != -1)
17601d269552bca14c90bdcc2288e64ba2426c045eaBruce Cran			val = status.ullTotalPhys / val2;
17701d269552bca14c90bdcc2288e64ba2426c045eaBruce Cran		else
17801d269552bca14c90bdcc2288e64ba2426c045eaBruce Cran			log_err("sysconf(_SC_PHYS_PAGES) failed\n");
1799277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		break;
1809277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	default:
1819277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		log_err("sysconf(%d) is not implemented\n", name);
1829277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		break;
1839277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	}
1849277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
1859277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	return val;
1869277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran}
1879277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
1889277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cranchar *dl_error = NULL;
1899277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
1909277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cranint dlclose(void *handle)
1919277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran{
1929277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	return !FreeLibrary((HMODULE)handle);
1939277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran}
1949277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
1959277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cranvoid *dlopen(const char *file, int mode)
1969277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran{
1979277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	HMODULE hMod;
1989277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
1999277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	hMod = LoadLibrary(file);
2009277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	if (hMod == INVALID_HANDLE_VALUE)
2019277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		dl_error = (char*)"LoadLibrary failed";
2029277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	else
2039277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		dl_error = NULL;
2049277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
2059277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	return hMod;
2069277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran}
2079277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
2089277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cranvoid *dlsym(void *handle, const char *name)
2099277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran{
2109277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	FARPROC fnPtr;
2119277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
2129277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	fnPtr = GetProcAddress((HMODULE)handle, name);
2139277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	if (fnPtr == NULL)
2149277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		dl_error = (char*)"GetProcAddress failed";
2159277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	else
2169277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		dl_error = NULL;
2179277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
2189277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	return fnPtr;
2199277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran}
2209277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
2219277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cranchar *dlerror(void)
2229277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran{
2239277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	return dl_error;
2249277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran}
2259277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
226eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes/* Copied from http://blogs.msdn.com/b/joshpoley/archive/2007/12/19/date-time-formats-and-conversions.aspx */
227eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughesvoid Time_tToSystemTime(time_t dosTime, SYSTEMTIME *systemTime)
228eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes{
229eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes    FILETIME utcFT;
230eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes    LONGLONG jan1970;
231eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes
232eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes    jan1970 = Int32x32To64(dosTime, 10000000) + 116444736000000000;
233eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes    utcFT.dwLowDateTime = (DWORD)jan1970;
234eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes    utcFT.dwHighDateTime = jan1970 >> 32;
235eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes
236eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes    FileTimeToSystemTime((FILETIME*)&utcFT, systemTime);
237eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes}
238eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes
239eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hugheschar* ctime_r(const time_t *t, char *buf)
240eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes{
241eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes    SYSTEMTIME systime;
242eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes    const char * const dayOfWeek[] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
243eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes    const char * const monthOfYear[] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
244eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes
245eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes    Time_tToSystemTime(*t, &systime);
246eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes    /* We don't know how long `buf` is, but assume it's rounded up from the minimum of 25 to 32 */
247eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes    StringCchPrintfA(buf, 31, "%s %s %d %02d:%02d:%02d %04d\n", dayOfWeek[systime.wDayOfWeek % 7], monthOfYear[(systime.wMonth - 1) % 12],
248eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes										 systime.wDay, systime.wHour, systime.wMinute, systime.wSecond, systime.wYear);
249eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes    return buf;
250eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes}
251eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes
2529277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cranint gettimeofday(struct timeval *restrict tp, void *restrict tzp)
2539277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran{
2549277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	FILETIME fileTime;
2559576f613be6dd7217a31c27742cb9aae09a77bf8Bruce Cran	uint64_t unix_time, windows_time;
2569576f613be6dd7217a31c27742cb9aae09a77bf8Bruce Cran	const uint64_t MILLISECONDS_BETWEEN_1601_AND_1970 = 11644473600000;
2579277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
258fc0b830f419bf64fff6fee91d1d3b9e94da11091Bruce Cran	/* Ignore the timezone parameter */
2599277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	(void)tzp;
2609277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
2619277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	/*
2629277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	 * Windows time is stored as the number 100 ns intervals since January 1 1601.
2639277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	 * Conversion details from http://www.informit.com/articles/article.aspx?p=102236&seqNum=3
2649277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	 * Its precision is 100 ns but accuracy is only one clock tick, or normally around 15 ms.
2659277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	 */
2669277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	GetSystemTimeAsFileTime(&fileTime);
2679576f613be6dd7217a31c27742cb9aae09a77bf8Bruce Cran	windows_time = ((uint64_t)fileTime.dwHighDateTime << 32) + fileTime.dwLowDateTime;
2689277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	/* Divide by 10,000 to convert to ms and subtract the time between 1601 and 1970 */
2699277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	unix_time = (((windows_time)/10000) - MILLISECONDS_BETWEEN_1601_AND_1970);
2709277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	/* unix_time is now the number of milliseconds since 1970 (the Unix epoch) */
2719277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	tp->tv_sec = unix_time / 1000;
2729277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	tp->tv_usec = (unix_time % 1000) * 1000;
2739277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	return 0;
2749277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran}
2759277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
2769277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cranint sigaction(int sig, const struct sigaction *act,
2779277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		struct sigaction *oact)
2789277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran{
279e5b8f91cc6229a5f8b38f1338fad29c800fef179Bruce Cran	int rc = 0;
280e5b8f91cc6229a5f8b38f1338fad29c800fef179Bruce Cran	void (*prev_handler)(int);
281e5b8f91cc6229a5f8b38f1338fad29c800fef179Bruce Cran
282e5b8f91cc6229a5f8b38f1338fad29c800fef179Bruce Cran	prev_handler = signal(sig, act->sa_handler);
283e5b8f91cc6229a5f8b38f1338fad29c800fef179Bruce Cran	if (oact != NULL)
284e5b8f91cc6229a5f8b38f1338fad29c800fef179Bruce Cran		oact->sa_handler = prev_handler;
285e5b8f91cc6229a5f8b38f1338fad29c800fef179Bruce Cran
286e5b8f91cc6229a5f8b38f1338fad29c800fef179Bruce Cran	if (prev_handler == SIG_ERR)
287e5b8f91cc6229a5f8b38f1338fad29c800fef179Bruce Cran		rc = -1;
288e5b8f91cc6229a5f8b38f1338fad29c800fef179Bruce Cran
289e5b8f91cc6229a5f8b38f1338fad29c800fef179Bruce Cran	return rc;
2909277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran}
2919277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
2929277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cranint lstat(const char * path, struct stat * buf)
2939277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran{
2949277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	return stat(path, buf);
2959277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran}
2969277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
2979277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cranvoid *mmap(void *addr, size_t len, int prot, int flags,
2989277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		int fildes, off_t off)
2999277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran{
3009277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	DWORD vaProt = 0;
301eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	DWORD mapAccess = 0;
302eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	DWORD lenlow;
303eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	DWORD lenhigh;
304eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	HANDLE hMap;
3059277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	void* allocAddr = NULL;
3069277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
3079277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	if (prot & PROT_NONE)
3089277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		vaProt |= PAGE_NOACCESS;
3099277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
310eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	if ((prot & PROT_READ) && !(prot & PROT_WRITE)) {
3119277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		vaProt |= PAGE_READONLY;
312eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		mapAccess = FILE_MAP_READ;
313eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	}
3149277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
315eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	if (prot & PROT_WRITE) {
3169277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		vaProt |= PAGE_READWRITE;
317eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		mapAccess |= FILE_MAP_WRITE;
318eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	}
319eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes
320eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	lenlow = len & 0xFFFF;
321eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	lenhigh = len >> 16;
322eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	/* If the low DWORD is zero and the high DWORD is non-zero, `CreateFileMapping`
323eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	   will return ERROR_INVALID_PARAMETER. To avoid this, set both to zero. */
324eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	if (lenlow == 0) {
325eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		lenhigh = 0;
326eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	}
3279277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
328eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	if (flags & MAP_ANON || flags & MAP_ANONYMOUS)
3299277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	{
3309277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		allocAddr = VirtualAlloc(addr, len, MEM_COMMIT, vaProt);
33110a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran		if (allocAddr == NULL)
33210a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran			errno = win_to_posix_error(GetLastError());
3339277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	}
334eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	else
335eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	{
336eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		hMap = CreateFileMapping((HANDLE)_get_osfhandle(fildes), NULL, vaProt, lenhigh, lenlow, NULL);
337eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes
338eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		if (hMap != NULL)
339eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		{
340eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes			allocAddr = MapViewOfFile(hMap, mapAccess, off >> 16, off & 0xFFFF, len);
341eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		}
342eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes
343eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		if (hMap == NULL || allocAddr == NULL)
344eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes			errno = win_to_posix_error(GetLastError());
345eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes
346eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	}
3479277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
3489277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	return allocAddr;
3499277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran}
3509277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
3519277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cranint munmap(void *addr, size_t len)
3529277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran{
353eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	BOOL success;
354eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes
355eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	/* We may have allocated the memory with either MapViewOfFile or
356eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		 VirtualAlloc. Therefore, try calling UnmapViewOfFile first, and if that
357eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		 fails, call VirtualFree. */
358eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	success = UnmapViewOfFile(addr);
359eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes
360eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	if (!success)
361eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	{
362eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		success = VirtualFree(addr, 0, MEM_RELEASE);
36310a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	}
36410a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran
365eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	return !success;
366eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes}
367eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes
368eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughesint msync(void *addr, size_t len, int flags)
369eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes{
370eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	return !FlushViewOfFile(addr, len);
3719277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran}
3729277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
3739277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cranint fork(void)
3749277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran{
3759277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	log_err("%s is not implemented\n", __func__);
3769277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	errno = ENOSYS;
37710a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	return -1;
3789277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran}
3799277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
3809277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cranpid_t setsid(void)
3819277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran{
3829277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	log_err("%s is not implemented\n", __func__);
3839277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	errno = ENOSYS;
38410a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	return -1;
3859277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran}
3869277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
387ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cranstatic HANDLE log_file = INVALID_HANDLE_VALUE;
388ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran
3899277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cranvoid openlog(const char *ident, int logopt, int facility)
3909277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran{
391ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran	if (log_file == INVALID_HANDLE_VALUE)
392ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran		log_file = CreateFileA("syslog.txt", GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, 0, NULL);
3939277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran}
3949277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
3959277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cranvoid closelog(void)
3969277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran{
397ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran	CloseHandle(log_file);
398ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran	log_file = INVALID_HANDLE_VALUE;
399ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran}
400ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran
401ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cranvoid syslog(int priority, const char *message, ... /* argument */)
402ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran{
403ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran	va_list v;
404ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran	int len;
405ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran	char *output;
406ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran	DWORD bytes_written;
407ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran
408ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran	if (log_file == INVALID_HANDLE_VALUE) {
409ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran		log_file = CreateFileA("syslog.txt", GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, 0, NULL);
410ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran	}
411ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran
412ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran	if (log_file == INVALID_HANDLE_VALUE) {
413ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran		log_err("syslog: failed to open log file\n");
414ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran		return;
415ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran	}
416ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran
417ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran	va_start(v, message);
418ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran	len = _vscprintf(message, v);
419ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran	output = malloc(len + sizeof(char));
42098dc2db5f11e6d597ca44aa6bf49f0dbd4397725Bruce Cran	vsprintf(output, message, v);
421ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran	WriteFile(log_file, output, len, &bytes_written, NULL);
422ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran	va_end(v);
42398dc2db5f11e6d597ca44aa6bf49f0dbd4397725Bruce Cran	free(output);
4249277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran}
4259277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
4269277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cranint kill(pid_t pid, int sig)
4279277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran{
4289277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	errno = ESRCH;
42910a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	return -1;
4309277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran}
4319277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
432fc0b830f419bf64fff6fee91d1d3b9e94da11091Bruce Cran/*
433fc0b830f419bf64fff6fee91d1d3b9e94da11091Bruce Cran * This is assumed to be used only by the network code,
434fc0b830f419bf64fff6fee91d1d3b9e94da11091Bruce Cran * and so doesn't try and handle any of the other cases
435fc0b830f419bf64fff6fee91d1d3b9e94da11091Bruce Cran */
4369277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cranint fcntl(int fildes, int cmd, ...)
4379277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran{
438fc0b830f419bf64fff6fee91d1d3b9e94da11091Bruce Cran	/*
439fc0b830f419bf64fff6fee91d1d3b9e94da11091Bruce Cran	 * non-blocking mode doesn't work the same as in BSD sockets,
440fc0b830f419bf64fff6fee91d1d3b9e94da11091Bruce Cran	 * so ignore it.
441fc0b830f419bf64fff6fee91d1d3b9e94da11091Bruce Cran	 */
4429277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran#if 0
4439277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	va_list ap;
4449277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	int val, opt, status;
4459277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
4469277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	if (cmd == F_GETFL)
4479277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		return 0;
4489277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	else if (cmd != F_SETFL) {
4499277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		errno = EINVAL;
45010a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran		return -1;
4519277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	}
4529277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
4539277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	va_start(ap, 1);
4549277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
4559277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	opt = va_arg(ap, int);
4569277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	if (opt & O_NONBLOCK)
4579277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		val = 1;
4589277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	else
4599277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		val = 0;
4609277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
4619277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	status = ioctlsocket((SOCKET)fildes, opt, &val);
4629277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
4639277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	if (status == SOCKET_ERROR) {
4649277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		errno = EINVAL;
4659277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		val = -1;
4669277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	}
4679277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
4689277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	va_end(ap);
4699277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
4709277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	return val;
4719277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran#endif
4729277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cranreturn 0;
4739277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran}
4749277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
4759277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran/*
4769277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran * Get the value of a local clock source.
4779277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran * This implementation supports 2 clocks: CLOCK_MONOTONIC provides high-accuracy
4789277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran * relative time, while CLOCK_REALTIME provides a low-accuracy wall time.
4799277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran */
4809277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cranint clock_gettime(clockid_t clock_id, struct timespec *tp)
4819277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran{
4829277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	int rc = 0;
4839277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
4849277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	if (clock_id == CLOCK_MONOTONIC)
4859277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	{
4869277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		static LARGE_INTEGER freq = {{0,0}};
4879277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		LARGE_INTEGER counts;
4885aa23eb8d6ae67c5a5e31737164307675b36518eBruce Cran		uint64_t t;
4899277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
4909277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		QueryPerformanceCounter(&counts);
4919277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		if (freq.QuadPart == 0)
4929277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran			QueryPerformanceFrequency(&freq);
4939277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
4949277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		tp->tv_sec = counts.QuadPart / freq.QuadPart;
4959277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		/* Get the difference between the number of ns stored
4969277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		 * in 'tv_sec' and that stored in 'counts' */
4975aa23eb8d6ae67c5a5e31737164307675b36518eBruce Cran		t = tp->tv_sec * freq.QuadPart;
4989277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		t = counts.QuadPart - t;
4999277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		/* 't' now contains the number of cycles since the last second.
5009277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		 * We want the number of nanoseconds, so multiply out by 1,000,000,000
5019277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		 * and then divide by the frequency. */
5029277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		t *= 1000000000;
5039277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		tp->tv_nsec = t / freq.QuadPart;
5049277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	}
5059277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	else if (clock_id == CLOCK_REALTIME)
5069277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	{
5079277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		/* clock_gettime(CLOCK_REALTIME,...) is just an alias for gettimeofday with a
5089277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		 * higher-precision field. */
5099277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		struct timeval tv;
5109277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		gettimeofday(&tv, NULL);
5119277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		tp->tv_sec = tv.tv_sec;
5129277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		tp->tv_nsec = tv.tv_usec * 1000;
5139277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	} else {
5149277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		errno = EINVAL;
5159277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		rc = -1;
5169277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	}
5179277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
5189277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	return rc;
5199277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran}
5209277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
5219277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cranint mlock(const void * addr, size_t len)
5229277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran{
52310a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	SIZE_T min, max;
52410a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	BOOL success;
52510a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	HANDLE process = GetCurrentProcess();
52610a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran
52710a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	success = GetProcessWorkingSetSize(process, &min, &max);
52810a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	if (!success) {
52910a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran		errno = win_to_posix_error(GetLastError());
53010a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran		return -1;
53110a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	}
53210a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran
53310a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	min += len;
53410a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	max += len;
53510a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	success = SetProcessWorkingSetSize(process, min, max);
53610a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	if (!success) {
53710a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran		errno = win_to_posix_error(GetLastError());
53810a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran		return -1;
53910a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	}
54010a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran
54110a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	success = VirtualLock((LPVOID)addr, len);
54210a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	if (!success) {
54310a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran		errno = win_to_posix_error(GetLastError());
54410a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran		return -1;
54510a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	}
54610a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran
54710a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	return 0;
5489277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran}
5499277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
5509277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cranint munlock(const void * addr, size_t len)
5519277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran{
55210a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	BOOL success = VirtualUnlock((LPVOID)addr, len);
55310a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	if (!success) {
55410a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran		errno = win_to_posix_error(GetLastError());
55510a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran		return -1;
55610a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	}
55710a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran
55810a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	return 0;
5599277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran}
5609277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
5619277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cranpid_t waitpid(pid_t pid, int *stat_loc, int options)
5629277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran{
5639277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	log_err("%s is not implemented\n", __func__);
5649277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	errno = ENOSYS;
5659277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	return -1;
5669277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran}
5679277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
5689277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cranint usleep(useconds_t useconds)
5699277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran{
5709277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	Sleep(useconds / 1000);
5719277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	return 0;
5729277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran}
5739277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
5749277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cranchar *basename(char *path)
5759277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran{
5769277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	static char name[MAX_PATH];
5779277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	int i;
5789277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
5799277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	if (path == NULL || strlen(path) == 0)
5809277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		return (char*)".";
5819277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
5829277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	i = strlen(path) - 1;
5839277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
5849576f613be6dd7217a31c27742cb9aae09a77bf8Bruce Cran	while (path[i] != '\\' && path[i] != '/' && i >= 0)
5859277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		i--;
5869277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
5879576f613be6dd7217a31c27742cb9aae09a77bf8Bruce Cran	strncpy(name, path + i + 1, MAX_PATH);
5889277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
5899277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	return name;
5909277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran}
5919277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
5929277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cranint fsync(int fildes)
5939277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran{
5949277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	HANDLE hFile = (HANDLE)_get_osfhandle(fildes);
59510a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	if (!FlushFileBuffers(hFile)) {
59610a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran		errno = win_to_posix_error(GetLastError());
59710a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran		return -1;
59810a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	}
59910a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran
60010a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	return 0;
6019277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran}
6029277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
6039277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cranint nFileMappings = 0;
6049277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce CranHANDLE fileMappings[1024];
6059277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
6069277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cranint shmget(key_t key, size_t size, int shmflg)
6079277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran{
6089277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	int mapid = -1;
609d39879467ccb7f136815be0ba7fd283524c2dafbBruce Cran	uint32_t size_low = size & 0xFFFFFFFF;
610d39879467ccb7f136815be0ba7fd283524c2dafbBruce Cran	uint32_t size_high = ((uint64_t)size) >> 32;
611d39879467ccb7f136815be0ba7fd283524c2dafbBruce Cran	HANDLE hMapping = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, (PAGE_EXECUTE_READWRITE | SEC_RESERVE), size_high, size_low, NULL);
6129277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	if (hMapping != NULL) {
6139277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		fileMappings[nFileMappings] = hMapping;
6149277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		mapid = nFileMappings;
6159277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		nFileMappings++;
6169277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	} else {
6179277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		errno = ENOSYS;
6189277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	}
6199277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
6209277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	return mapid;
6219277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran}
6229277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
6239277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cranvoid *shmat(int shmid, const void *shmaddr, int shmflg)
6249277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran{
6259277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	void* mapAddr;
6269277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	MEMORY_BASIC_INFORMATION memInfo;
6279277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	mapAddr = MapViewOfFile(fileMappings[shmid], FILE_MAP_ALL_ACCESS, 0, 0, 0);
62810a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	if (mapAddr == NULL) {
62910a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran		errno = win_to_posix_error(GetLastError());
63010a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran		return (void*)-1;
63110a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	}
63210a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran
63310a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	if (VirtualQuery(mapAddr, &memInfo, sizeof(memInfo)) == 0) {
63410a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran		errno = win_to_posix_error(GetLastError());
63510a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran		return (void*)-1;
63610a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	}
63710a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran
6389277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	mapAddr = VirtualAlloc(mapAddr, memInfo.RegionSize, MEM_COMMIT, PAGE_READWRITE);
63910a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	if (mapAddr == NULL) {
64010a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran		errno = win_to_posix_error(GetLastError());
64110a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran		return (void*)-1;
64210a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	}
64310a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran
6449277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	return mapAddr;
6459277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran}
6469277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
6479277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cranint shmdt(const void *shmaddr)
6489277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran{
64910a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	if (!UnmapViewOfFile(shmaddr)) {
65010a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran		errno = win_to_posix_error(GetLastError());
65110a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran		return -1;
65210a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	}
65310a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran
65410a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	return 0;
6559277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran}
6569277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
6579277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cranint shmctl(int shmid, int cmd, struct shmid_ds *buf)
6589277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran{
6599277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	if (cmd == IPC_RMID) {
6609277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		fileMappings[shmid] = INVALID_HANDLE_VALUE;
6619277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		return 0;
6629277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	} else {
6639277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		log_err("%s is not implemented\n", __func__);
6649277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	}
66510a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	errno = ENOSYS;
66610a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	return -1;
6679277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran}
6689277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
6699277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cranint setuid(uid_t uid)
6709277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran{
6719277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	log_err("%s is not implemented\n", __func__);
6729277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	errno = ENOSYS;
67310a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	return -1;
6749277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran}
6759277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
6769277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cranint setgid(gid_t gid)
6779277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran{
6789277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	log_err("%s is not implemented\n", __func__);
6799277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	errno = ENOSYS;
68010a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	return -1;
6819277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran}
6829277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
6839277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cranint nice(int incr)
6849277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran{
685eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	DWORD prioclass = NORMAL_PRIORITY_CLASS;
686eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes
687eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	if (incr < -15)
688eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		prioclass = HIGH_PRIORITY_CLASS;
689eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	else if (incr < 0)
690eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		prioclass = ABOVE_NORMAL_PRIORITY_CLASS;
691eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	else if (incr > 15)
692eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		prioclass = IDLE_PRIORITY_CLASS;
693eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	else if (incr > 0)
694eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		prioclass = BELOW_NORMAL_PRIORITY_CLASS;
695eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes
696eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes	if (!SetPriorityClass(GetCurrentProcess(), prioclass))
697eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		log_err("fio: SetPriorityClass failed\n");
6989277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
6999277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	return 0;
7009277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran}
7019277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
7029277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cranint getrusage(int who, struct rusage *r_usage)
7039277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran{
7049576f613be6dd7217a31c27742cb9aae09a77bf8Bruce Cran	const uint64_t SECONDS_BETWEEN_1601_AND_1970 = 11644473600;
7059277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	FILETIME cTime, eTime, kTime, uTime;
7069277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	time_t time;
7077732a09b0a5331f20b7fdf42f811a3f2805dcaaeHuadong Liu	HANDLE h;
7089277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
7099277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	memset(r_usage, 0, sizeof(*r_usage));
7109277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
7117732a09b0a5331f20b7fdf42f811a3f2805dcaaeHuadong Liu	if (who == RUSAGE_SELF) {
7127732a09b0a5331f20b7fdf42f811a3f2805dcaaeHuadong Liu		h = GetCurrentProcess();
7137732a09b0a5331f20b7fdf42f811a3f2805dcaaeHuadong Liu		GetProcessTimes(h, &cTime, &eTime, &kTime, &uTime);
7147732a09b0a5331f20b7fdf42f811a3f2805dcaaeHuadong Liu	} else if (who == RUSAGE_THREAD) {
7157732a09b0a5331f20b7fdf42f811a3f2805dcaaeHuadong Liu		h = GetCurrentThread();
7167732a09b0a5331f20b7fdf42f811a3f2805dcaaeHuadong Liu		GetThreadTimes(h, &cTime, &eTime, &kTime, &uTime);
7177732a09b0a5331f20b7fdf42f811a3f2805dcaaeHuadong Liu	} else {
7187732a09b0a5331f20b7fdf42f811a3f2805dcaaeHuadong Liu		log_err("fio: getrusage %d is not implemented\n", who);
7197732a09b0a5331f20b7fdf42f811a3f2805dcaaeHuadong Liu		return -1;
7207732a09b0a5331f20b7fdf42f811a3f2805dcaaeHuadong Liu	}
7217732a09b0a5331f20b7fdf42f811a3f2805dcaaeHuadong Liu
7229576f613be6dd7217a31c27742cb9aae09a77bf8Bruce Cran	time = ((uint64_t)uTime.dwHighDateTime << 32) + uTime.dwLowDateTime;
7239277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	/* Divide by 10,000,000 to get the number of seconds and move the epoch from
7249277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	 * 1601 to 1970 */
7259277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	time = (time_t)(((time)/10000000) - SECONDS_BETWEEN_1601_AND_1970);
7269277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	r_usage->ru_utime.tv_sec = time;
7279277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	/* getrusage() doesn't care about anything other than seconds, so set tv_usec to 0 */
7289277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	r_usage->ru_utime.tv_usec = 0;
7299576f613be6dd7217a31c27742cb9aae09a77bf8Bruce Cran	time = ((uint64_t)kTime.dwHighDateTime << 32) + kTime.dwLowDateTime;
7309277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	/* Divide by 10,000,000 to get the number of seconds and move the epoch from
7319277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	 * 1601 to 1970 */
7329277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	time = (time_t)(((time)/10000000) - SECONDS_BETWEEN_1601_AND_1970);
7339277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	r_usage->ru_stime.tv_sec = time;
7349277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	r_usage->ru_stime.tv_usec = 0;
7359277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	return 0;
7369277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran}
7379277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
7389277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cranint posix_madvise(void *addr, size_t len, int advice)
7399277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran{
7409277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	return ENOSYS;
7419277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran}
7429277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
7439277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cranint fdatasync(int fildes)
7449277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran{
7459277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	return fsync(fildes);
7469277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran}
7479277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
7489277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cranssize_t pwrite(int fildes, const void *buf, size_t nbyte,
7499277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		off_t offset)
7509277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran{
7519576f613be6dd7217a31c27742cb9aae09a77bf8Bruce Cran	int64_t pos = _telli64(fildes);
7529576f613be6dd7217a31c27742cb9aae09a77bf8Bruce Cran	ssize_t len = _write(fildes, buf, nbyte);
7539576f613be6dd7217a31c27742cb9aae09a77bf8Bruce Cran	_lseeki64(fildes, pos, SEEK_SET);
7549277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	return len;
7559277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran}
7569277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
7579277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cranssize_t pread(int fildes, void *buf, size_t nbyte, off_t offset)
7589277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran{
7599576f613be6dd7217a31c27742cb9aae09a77bf8Bruce Cran	int64_t pos = _telli64(fildes);
7609277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	ssize_t len = read(fildes, buf, nbyte);
7619576f613be6dd7217a31c27742cb9aae09a77bf8Bruce Cran	_lseeki64(fildes, pos, SEEK_SET);
7629277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	return len;
7639277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran}
7649277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
7659277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cranssize_t readv(int fildes, const struct iovec *iov, int iovcnt)
7669277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran{
7679277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	log_err("%s is not implemented\n", __func__);
7689277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	errno = ENOSYS;
76910a6b3c67042914fe9d287027bf8792f69e84524Bruce Cran	return -1;
7709277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran}
7719277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
7729277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cranssize_t writev(int fildes, const struct iovec *iov, int iovcnt)
7739277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran{
77470a61165b46f210407bcac839b4f0ffe7b4e009fBruce Cran	int i;
77570a61165b46f210407bcac839b4f0ffe7b4e009fBruce Cran	DWORD bytes_written = 0;
77670a61165b46f210407bcac839b4f0ffe7b4e009fBruce Cran	for (i = 0; i < iovcnt; i++)
77770a61165b46f210407bcac839b4f0ffe7b4e009fBruce Cran	{
77870a61165b46f210407bcac839b4f0ffe7b4e009fBruce Cran		int len = send((SOCKET)fildes, iov[i].iov_base, iov[i].iov_len, 0);
77970a61165b46f210407bcac839b4f0ffe7b4e009fBruce Cran		if (len == SOCKET_ERROR)
78070a61165b46f210407bcac839b4f0ffe7b4e009fBruce Cran		{
78170a61165b46f210407bcac839b4f0ffe7b4e009fBruce Cran			DWORD err = GetLastError();
78270a61165b46f210407bcac839b4f0ffe7b4e009fBruce Cran			errno = win_to_posix_error(err);
78370a61165b46f210407bcac839b4f0ffe7b4e009fBruce Cran			bytes_written = -1;
78470a61165b46f210407bcac839b4f0ffe7b4e009fBruce Cran			break;
78570a61165b46f210407bcac839b4f0ffe7b4e009fBruce Cran		}
78670a61165b46f210407bcac839b4f0ffe7b4e009fBruce Cran		bytes_written += len;
78770a61165b46f210407bcac839b4f0ffe7b4e009fBruce Cran	}
78870a61165b46f210407bcac839b4f0ffe7b4e009fBruce Cran
78970a61165b46f210407bcac839b4f0ffe7b4e009fBruce Cran	return bytes_written;
7909277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran}
7919277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
7929277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cranlong long strtoll(const char *restrict str, char **restrict endptr,
7939277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		int base)
7949277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran{
7959277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	return _strtoi64(str, endptr, base);
7969277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran}
7979277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
7989277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cranint poll(struct pollfd fds[], nfds_t nfds, int timeout)
7999277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran{
8009277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	struct timeval tv;
8019277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	struct timeval *to = NULL;
8029277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	fd_set readfds, writefds, exceptfds;
8039277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	int i;
8049277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	int rc;
8059277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
8063f457bea08a6bd60d99950c59c5432b8e78c69e2Bruce Cran	if (timeout != -1) {
807f9a58c2a6818830c772f3aa0b82bf04de7569acfBruce Cran		to = &tv;
8083f457bea08a6bd60d99950c59c5432b8e78c69e2Bruce Cran		to->tv_sec = timeout / 1000;
8093f457bea08a6bd60d99950c59c5432b8e78c69e2Bruce Cran		to->tv_usec = (timeout % 1000) * 1000;
8103f457bea08a6bd60d99950c59c5432b8e78c69e2Bruce Cran	}
8119277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
8129277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	FD_ZERO(&readfds);
8139277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	FD_ZERO(&writefds);
8149277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	FD_ZERO(&exceptfds);
8159277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
8169277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	for (i = 0; i < nfds; i++)
8179277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	{
8189277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		if (fds[i].fd < 0) {
8199277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran			fds[i].revents = 0;
8209277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran			continue;
8219277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		}
8229277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
8239277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		if (fds[i].events & POLLIN)
8249277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran			FD_SET(fds[i].fd, &readfds);
8259277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
8269277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		if (fds[i].events & POLLOUT)
8279277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran			FD_SET(fds[i].fd, &writefds);
8289277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
829f9a58c2a6818830c772f3aa0b82bf04de7569acfBruce Cran		FD_SET(fds[i].fd, &exceptfds);
8309277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	}
8319277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	rc = select(nfds, &readfds, &writefds, &exceptfds, to);
8329277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
8339277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	if (rc != SOCKET_ERROR) {
8349277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		for (i = 0; i < nfds; i++)
8359277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		{
8369277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran			if (fds[i].fd < 0) {
8379277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran				continue;
8389277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran			}
8399277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
8409277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran			if ((fds[i].events & POLLIN) && FD_ISSET(fds[i].fd, &readfds))
8419277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran				fds[i].revents |= POLLIN;
8429277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
8439277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran			if ((fds[i].events & POLLOUT) && FD_ISSET(fds[i].fd, &writefds))
8449277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran				fds[i].revents |= POLLOUT;
8459277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
8469277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran			if (FD_ISSET(fds[i].fd, &exceptfds))
8479277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran				fds[i].revents |= POLLHUP;
8489277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		}
8499277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	}
8509277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	return rc;
8519277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran}
8529277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
8539277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cranint nanosleep(const struct timespec *rqtp, struct timespec *rmtp)
8549277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran{
85521c753874722ceff6e78c9e57768932436bce35bBruce Cran	struct timeval tv;
85621c753874722ceff6e78c9e57768932436bce35bBruce Cran	DWORD ms_remaining;
85721c753874722ceff6e78c9e57768932436bce35bBruce Cran	DWORD ms_total = (rqtp->tv_sec * 1000) + (rqtp->tv_nsec / 1000000.0);
85821c753874722ceff6e78c9e57768932436bce35bBruce Cran
85921c753874722ceff6e78c9e57768932436bce35bBruce Cran	if (ms_total == 0)
86021c753874722ceff6e78c9e57768932436bce35bBruce Cran		ms_total = 1;
86121c753874722ceff6e78c9e57768932436bce35bBruce Cran
86221c753874722ceff6e78c9e57768932436bce35bBruce Cran	ms_remaining = ms_total;
86321c753874722ceff6e78c9e57768932436bce35bBruce Cran
86421c753874722ceff6e78c9e57768932436bce35bBruce Cran	/* Since Sleep() can sleep for less than the requested time, add a loop to
86521c753874722ceff6e78c9e57768932436bce35bBruce Cran	   ensure we only return after the requested length of time has elapsed */
86621c753874722ceff6e78c9e57768932436bce35bBruce Cran	do {
86721c753874722ceff6e78c9e57768932436bce35bBruce Cran		fio_gettime(&tv, NULL);
86821c753874722ceff6e78c9e57768932436bce35bBruce Cran		Sleep(ms_remaining);
86921c753874722ceff6e78c9e57768932436bce35bBruce Cran		ms_remaining = ms_total - mtime_since_now(&tv);
87021c753874722ceff6e78c9e57768932436bce35bBruce Cran	} while (ms_remaining > 0 && ms_remaining < ms_total);
87121c753874722ceff6e78c9e57768932436bce35bBruce Cran
87221c753874722ceff6e78c9e57768932436bce35bBruce Cran	/* this implementation will never sleep for less than the requested time */
87321c753874722ceff6e78c9e57768932436bce35bBruce Cran	if (rmtp != NULL) {
87421c753874722ceff6e78c9e57768932436bce35bBruce Cran		rmtp->tv_sec = 0;
87521c753874722ceff6e78c9e57768932436bce35bBruce Cran		rmtp->tv_nsec = 0;
87621c753874722ceff6e78c9e57768932436bce35bBruce Cran	}
87721c753874722ceff6e78c9e57768932436bce35bBruce Cran
87821c753874722ceff6e78c9e57768932436bce35bBruce Cran	return 0;
8799277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran}
8809277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
8819277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce CranDIR *opendir(const char *dirname)
8829277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran{
88301d269552bca14c90bdcc2288e64ba2426c045eaBruce Cran	struct dirent_ctx *dc = NULL;
88401d269552bca14c90bdcc2288e64ba2426c045eaBruce Cran
88501d269552bca14c90bdcc2288e64ba2426c045eaBruce Cran	/* See if we can open it. If not, we'll return an error here */
88601d269552bca14c90bdcc2288e64ba2426c045eaBruce Cran	HANDLE file = CreateFileA(dirname, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
88701d269552bca14c90bdcc2288e64ba2426c045eaBruce Cran	if (file != INVALID_HANDLE_VALUE) {
88801d269552bca14c90bdcc2288e64ba2426c045eaBruce Cran		CloseHandle(file);
88901d269552bca14c90bdcc2288e64ba2426c045eaBruce Cran		dc = (struct dirent_ctx*)malloc(sizeof(struct dirent_ctx));
89001d269552bca14c90bdcc2288e64ba2426c045eaBruce Cran		StringCchCopyA(dc->dirname, MAX_PATH, dirname);
89101d269552bca14c90bdcc2288e64ba2426c045eaBruce Cran		dc->find_handle = INVALID_HANDLE_VALUE;
89201d269552bca14c90bdcc2288e64ba2426c045eaBruce Cran	} else {
89301d269552bca14c90bdcc2288e64ba2426c045eaBruce Cran		DWORD error = GetLastError();
89401d269552bca14c90bdcc2288e64ba2426c045eaBruce Cran		if (error == ERROR_FILE_NOT_FOUND)
89501d269552bca14c90bdcc2288e64ba2426c045eaBruce Cran			errno = ENOENT;
89601d269552bca14c90bdcc2288e64ba2426c045eaBruce Cran
89701d269552bca14c90bdcc2288e64ba2426c045eaBruce Cran		else if (error == ERROR_PATH_NOT_FOUND)
89801d269552bca14c90bdcc2288e64ba2426c045eaBruce Cran			errno = ENOTDIR;
89901d269552bca14c90bdcc2288e64ba2426c045eaBruce Cran		else if (error == ERROR_TOO_MANY_OPEN_FILES)
90001d269552bca14c90bdcc2288e64ba2426c045eaBruce Cran			errno = ENFILE;
90101d269552bca14c90bdcc2288e64ba2426c045eaBruce Cran		else if (error == ERROR_ACCESS_DENIED)
90201d269552bca14c90bdcc2288e64ba2426c045eaBruce Cran			errno = EACCES;
90301d269552bca14c90bdcc2288e64ba2426c045eaBruce Cran		else
90401d269552bca14c90bdcc2288e64ba2426c045eaBruce Cran			errno = error;
90501d269552bca14c90bdcc2288e64ba2426c045eaBruce Cran	}
90601d269552bca14c90bdcc2288e64ba2426c045eaBruce Cran
90701d269552bca14c90bdcc2288e64ba2426c045eaBruce Cran	return dc;
9089277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran}
9099277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
9109277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cranint closedir(DIR *dirp)
9119277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran{
91201d269552bca14c90bdcc2288e64ba2426c045eaBruce Cran	if (dirp != NULL && dirp->find_handle != INVALID_HANDLE_VALUE)
91301d269552bca14c90bdcc2288e64ba2426c045eaBruce Cran		FindClose(dirp->find_handle);
914ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran
91501d269552bca14c90bdcc2288e64ba2426c045eaBruce Cran	free(dirp);
91601d269552bca14c90bdcc2288e64ba2426c045eaBruce Cran	return 0;
9179277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran}
9189277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
9199277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cranstruct dirent *readdir(DIR *dirp)
9209277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran{
921ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran	static struct dirent de;
922ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran	WIN32_FIND_DATA find_data;
923ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran
924ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran	if (dirp == NULL)
925ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran		return NULL;
926ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran
927ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran	if (dirp->find_handle == INVALID_HANDLE_VALUE) {
928ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran		char search_pattern[MAX_PATH];
929eda3a60699e1d96bb68875ef2169ca819eb8f4f9Elliott Hughes		StringCchPrintfA(search_pattern, MAX_PATH-1, "%s\\*", dirp->dirname);
930ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran		dirp->find_handle = FindFirstFileA(search_pattern, &find_data);
931ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran		if (dirp->find_handle == INVALID_HANDLE_VALUE)
932ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran			return NULL;
933ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran	} else {
934ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran		if (!FindNextFile(dirp->find_handle, &find_data))
935ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran			return NULL;
936ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran	}
937ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran
938ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran	StringCchCopyA(de.d_name, MAX_PATH, find_data.cFileName);
939ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran	de.d_ino = 0;
940ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran
941ad9c0fbc7ce6d1bba089f543036c997cbad84d7bBruce Cran	return &de;
9429277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran}
9439277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
9449277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cranuid_t geteuid(void)
9459277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran{
9469277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	log_err("%s is not implemented\n", __func__);
9479277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	errno = ENOSYS;
9489277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	return -1;
9499277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran}
9509277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
951f16b7405fff7c3fc1da421b6bdf8552cc99c3156Bruce Cranin_addr_t inet_network(const char *cp)
952f16b7405fff7c3fc1da421b6bdf8552cc99c3156Bruce Cran{
953f16b7405fff7c3fc1da421b6bdf8552cc99c3156Bruce Cran	in_addr_t hbo;
954f16b7405fff7c3fc1da421b6bdf8552cc99c3156Bruce Cran	in_addr_t nbo = inet_addr(cp);
955f16b7405fff7c3fc1da421b6bdf8552cc99c3156Bruce Cran	hbo = ((nbo & 0xFF) << 24) + ((nbo & 0xFF00) << 8) + ((nbo & 0xFF0000) >> 8) + ((nbo & 0xFF000000) >> 24);
956f16b7405fff7c3fc1da421b6bdf8552cc99c3156Bruce Cran	return hbo;
957f16b7405fff7c3fc1da421b6bdf8552cc99c3156Bruce Cran}
958f16b7405fff7c3fc1da421b6bdf8552cc99c3156Bruce Cran
9599277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cranconst char* inet_ntop(int af, const void *restrict src,
9609277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		char *restrict dst, socklen_t size)
9619277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran{
9629277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	INT status = SOCKET_ERROR;
9639277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	WSADATA wsd;
9649277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	char *ret = NULL;
9659277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
9669277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	if (af != AF_INET && af != AF_INET6) {
9679277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		errno = EAFNOSUPPORT;
9689277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		return NULL;
9699277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	}
9709277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
9719277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	WSAStartup(MAKEWORD(2,2), &wsd);
9729277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
9739277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	if (af == AF_INET) {
9749277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		struct sockaddr_in si;
9759277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		DWORD len = size;
9769277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		memset(&si, 0, sizeof(si));
9779277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		si.sin_family = af;
9789277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		memcpy(&si.sin_addr, src, sizeof(si.sin_addr));
9799277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		status = WSAAddressToString((struct sockaddr*)&si, sizeof(si), NULL, dst, &len);
9809277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	} else if (af == AF_INET6) {
9819277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		struct sockaddr_in6 si6;
9829277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		DWORD len = size;
9839277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		memset(&si6, 0, sizeof(si6));
9849277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		si6.sin6_family = af;
9859277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		memcpy(&si6.sin6_addr, src, sizeof(si6.sin6_addr));
9869277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		status = WSAAddressToString((struct sockaddr*)&si6, sizeof(si6), NULL, dst, &len);
9879277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	}
9889277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
9899277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	if (status != SOCKET_ERROR)
9909277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		ret = dst;
9919277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	else
9929277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		errno = ENOSPC;
9939277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
9949277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	WSACleanup();
9953f457bea08a6bd60d99950c59c5432b8e78c69e2Bruce Cran
9969277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	return ret;
9979277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran}
9989277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
9999277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cranint inet_pton(int af, const char *restrict src, void *restrict dst)
10009277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran{
10019277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	INT status = SOCKET_ERROR;
10029277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	WSADATA wsd;
10039277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	int ret = 1;
10049277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
10059277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	if (af != AF_INET && af != AF_INET6) {
10069277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		errno = EAFNOSUPPORT;
10079277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		return -1;
10089277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	}
10099277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
10109277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	WSAStartup(MAKEWORD(2,2), &wsd);
10119277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
10129277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	if (af == AF_INET) {
10139277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		struct sockaddr_in si;
10149277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		INT len = sizeof(si);
10159277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		memset(&si, 0, sizeof(si));
10169277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		si.sin_family = af;
10179277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		status = WSAStringToAddressA((char*)src, af, NULL, (struct sockaddr*)&si, &len);
10189277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		if (status != SOCKET_ERROR)
10199277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran			memcpy(dst, &si.sin_addr, sizeof(si.sin_addr));
10209277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	} else if (af == AF_INET6) {
10219277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		struct sockaddr_in6 si6;
10229277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		INT len = sizeof(si6);
10239277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		memset(&si6, 0, sizeof(si6));
10249277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		si6.sin6_family = af;
10259277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		status = WSAStringToAddressA((char*)src, af, NULL, (struct sockaddr*)&si6, &len);
10269277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		if (status != SOCKET_ERROR)
10279277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran			memcpy(dst, &si6.sin6_addr, sizeof(si6.sin6_addr));
10289277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	}
10299277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
10309277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	if (status == SOCKET_ERROR) {
10319277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		errno = ENOSPC;
10329277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran		ret = 0;
10339277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	}
10349277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
10359277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	WSACleanup();
10369277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran
10379277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran	return ret;
10389277ec144b7a2a852a72e2c4d3f0ff806ccd97aaBruce Cran}
1039