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