#ifndef MISC_H
#define MISC_H
#include "apr.h"
#include "apr_portable.h"
#include "apr_private.h"
#include "apr_general.h"
#include "apr_pools.h"
#include "apr_getopt.h"
#include "apr_thread_proc.h"
#include "apr_file_io.h"
#include "apr_errno.h"
#include "apr_getopt.h"
#if APR_HAVE_STDIO_H
#include <stdio.h>
#endif
#if APR_HAVE_SIGNAL_H
#include <signal.h>
#endif
#if APR_HAVE_PTHREAD_H
#include <pthread.h>
#endif
#if APR_HAVE_STDLIB_H
#include <stdlib.h>
#endif
#if APR_HAVE_STRING_H
#include <string.h>
#endif
#ifndef _WIN32_WCE
#include <tlhelp32.h>
#endif
struct apr_other_child_rec_t {
apr_pool_t *p;
struct apr_other_child_rec_t *next;
apr_proc_t *proc;
void (*maintenance) (int, void *, int);
void *data;
apr_os_file_t write_fd;
};
#define WSAHighByte 2
#define WSALowByte 0
extern int APR_DECLARE_DATA apr_app_init_complete;
int apr_wastrtoastr(char const * const * *retarr,
wchar_t const * const *arr, int args);
typedef enum {
APR_WIN_UNK = 0,
APR_WIN_UNSUP = 1,
APR_WIN_95 = 10,
APR_WIN_95_B = 11,
APR_WIN_95_OSR2 = 12,
APR_WIN_98 = 14,
APR_WIN_98_SE = 16,
APR_WIN_ME = 18,
APR_WIN_UNICODE = 20,
APR_WIN_CE_3 = 23,
APR_WIN_NT = 30,
APR_WIN_NT_3_5 = 35,
APR_WIN_NT_3_51 = 36,
APR_WIN_NT_4 = 40,
APR_WIN_NT_4_SP2 = 42,
APR_WIN_NT_4_SP3 = 43,
APR_WIN_NT_4_SP4 = 44,
APR_WIN_NT_4_SP5 = 45,
APR_WIN_NT_4_SP6 = 46,
APR_WIN_2000 = 50,
APR_WIN_2000_SP1 = 51,
APR_WIN_2000_SP2 = 52,
APR_WIN_XP = 60,
APR_WIN_XP_SP1 = 61,
APR_WIN_XP_SP2 = 62,
APR_WIN_2003 = 70,
APR_WIN_VISTA = 80
} apr_oslevel_e;
extern APR_DECLARE_DATA apr_oslevel_e apr_os_level;
apr_status_t apr_get_oslevel(apr_oslevel_e *);
#if defined(_WIN32_WCE) || defined(WINNT)
#define APR_HAS_ANSI_FS 0
#else
#define APR_HAS_ANSI_FS 1
#endif
#if APR_HAS_ANSI_FS && APR_HAS_UNICODE_FS
#define IF_WIN_OS_IS_UNICODE if (apr_os_level >= APR_WIN_UNICODE)
#define ELSE_WIN_OS_IS_ANSI else
#else
#define IF_WIN_OS_IS_UNICODE
#define ELSE_WIN_OS_IS_ANSI
#endif
#if defined(_MSC_VER) && !defined(_WIN32_WCE)
#include "crtdbg.h"
static APR_INLINE void* apr_malloc_dbg(size_t size, const char* filename,
int linenumber)
{
return _malloc_dbg(size, _CRT_BLOCK, filename, linenumber);
}
static APR_INLINE void* apr_realloc_dbg(void* userData, size_t newSize,
const char* filename, int linenumber)
{
return _realloc_dbg(userData, newSize, _CRT_BLOCK, filename, linenumber);
}
#else
static APR_INLINE void* apr_malloc_dbg(size_t size, const char* filename,
int linenumber)
{
return malloc(size);
}
static APR_INLINE void* apr_realloc_dbg(void* userData, size_t newSize,
const char* filename, int linenumber)
{
return realloc(userData, newSize);
}
#endif
typedef enum {
DLL_WINBASEAPI = 0,
DLL_WINADVAPI = 1,
DLL_WINSOCKAPI = 2,
DLL_WINSOCK2API = 3,
DLL_SHSTDAPI = 4,
DLL_NTDLL = 5,
DLL_defined = 6
} apr_dlltoken_e;
FARPROC apr_load_dll_func(apr_dlltoken_e fnLib, char *fnName, int ordinal);
#define APR_DECLARE_LATE_DLL_FUNC(lib, rettype, calltype, fn, ord, args, names) \
typedef rettype (calltype *apr_winapi_fpt_##fn) args; \
static apr_winapi_fpt_##fn apr_winapi_pfn_##fn = NULL; \
static int apr_winapi_chk_##fn = 0; \
static APR_INLINE int apr_winapi_ld_##fn(void) \
{ if (apr_winapi_pfn_##fn) return 1; \
if (apr_winapi_chk_##fn ++) return 0; \
if (!apr_winapi_pfn_##fn) \
apr_winapi_pfn_##fn = (apr_winapi_fpt_##fn) \
apr_load_dll_func(lib, #fn, ord); \
if (apr_winapi_pfn_##fn) return 1; else return 0; }; \
static APR_INLINE rettype apr_winapi_##fn args \
{ if (apr_winapi_ld_##fn()) \
return (*(apr_winapi_pfn_##fn)) names; \
else { SetLastError(ERROR_INVALID_FUNCTION); return 0;} }; \
#define APR_HAVE_LATE_DLL_FUNC(fn) apr_winapi_ld_##fn()
#if !defined(_WIN32_WCE) && !defined(WINNT)
#ifdef GetFileAttributesExA
#undef GetFileAttributesExA
#endif
APR_DECLARE_LATE_DLL_FUNC(DLL_WINBASEAPI, BOOL, WINAPI, GetFileAttributesExA, 0, (
IN LPCSTR lpFileName,
IN GET_FILEEX_INFO_LEVELS fInfoLevelId,
OUT LPVOID lpFileInformation),
(lpFileName, fInfoLevelId, lpFileInformation));
#define GetFileAttributesExA apr_winapi_GetFileAttributesExA
#undef GetFileAttributesEx
#define GetFileAttributesEx apr_winapi_GetFileAttributesExA
#ifdef GetFileAttributesExW
#undef GetFileAttributesExW
#endif
APR_DECLARE_LATE_DLL_FUNC(DLL_WINBASEAPI, BOOL, WINAPI, GetFileAttributesExW, 0, (
IN LPCWSTR lpFileName,
IN GET_FILEEX_INFO_LEVELS fInfoLevelId,
OUT LPVOID lpFileInformation),
(lpFileName, fInfoLevelId, lpFileInformation));
#define GetFileAttributesExW apr_winapi_GetFileAttributesExW
APR_DECLARE_LATE_DLL_FUNC(DLL_WINBASEAPI, BOOL, WINAPI, CancelIo, 0, (
IN HANDLE hFile),
(hFile));
#define CancelIo apr_winapi_CancelIo
APR_DECLARE_LATE_DLL_FUNC(DLL_WINBASEAPI, BOOL, WINAPI, TryEnterCriticalSection, 0, (
LPCRITICAL_SECTION lpCriticalSection),
(lpCriticalSection));
#define TryEnterCriticalSection apr_winapi_TryEnterCriticalSection
APR_DECLARE_LATE_DLL_FUNC(DLL_WINBASEAPI, BOOL, WINAPI, SwitchToThread, 0, (
void),
());
#define SwitchToThread apr_winapi_SwitchToThread
APR_DECLARE_LATE_DLL_FUNC(DLL_WINADVAPI, BOOL, WINAPI, GetEffectiveRightsFromAclW, 0, (
IN PACL pacl,
IN PTRUSTEE_W pTrustee,
OUT PACCESS_MASK pAccessRights),
(pacl, pTrustee, pAccessRights));
#define GetEffectiveRightsFromAclW apr_winapi_GetEffectiveRightsFromAclW
APR_DECLARE_LATE_DLL_FUNC(DLL_WINADVAPI, BOOL, WINAPI, GetNamedSecurityInfoW, 0, (
IN LPWSTR pObjectName,
IN SE_OBJECT_TYPE ObjectType,
IN SECURITY_INFORMATION SecurityInfo,
OUT PSID *ppsidOwner,
OUT PSID *ppsidGroup,
OUT PACL *ppDacl,
OUT PACL *ppSacl,
OUT PSECURITY_DESCRIPTOR *ppSecurityDescriptor),
(pObjectName, ObjectType, SecurityInfo, ppsidOwner, ppsidGroup,
ppDacl, ppSacl, ppSecurityDescriptor));
#define GetNamedSecurityInfoW apr_winapi_GetNamedSecurityInfoW
APR_DECLARE_LATE_DLL_FUNC(DLL_WINADVAPI, BOOL, WINAPI, GetNamedSecurityInfoA, 0, (
IN LPSTR pObjectName,
IN SE_OBJECT_TYPE ObjectType,
IN SECURITY_INFORMATION SecurityInfo,
OUT PSID *ppsidOwner,
OUT PSID *ppsidGroup,
OUT PACL *ppDacl,
OUT PACL *ppSacl,
OUT PSECURITY_DESCRIPTOR *ppSecurityDescriptor),
(pObjectName, ObjectType, SecurityInfo, ppsidOwner, ppsidGroup,
ppDacl, ppSacl, ppSecurityDescriptor));
#define GetNamedSecurityInfoA apr_winapi_GetNamedSecurityInfoA
#undef GetNamedSecurityInfo
#define GetNamedSecurityInfo apr_winapi_GetNamedSecurityInfoA
APR_DECLARE_LATE_DLL_FUNC(DLL_WINADVAPI, BOOL, WINAPI, GetSecurityInfo, 0, (
IN HANDLE handle,
IN SE_OBJECT_TYPE ObjectType,
IN SECURITY_INFORMATION SecurityInfo,
OUT PSID *ppsidOwner,
OUT PSID *ppsidGroup,
OUT PACL *ppDacl,
OUT PACL *ppSacl,
OUT PSECURITY_DESCRIPTOR *ppSecurityDescriptor),
(handle, ObjectType, SecurityInfo, ppsidOwner, ppsidGroup,
ppDacl, ppSacl, ppSecurityDescriptor));
#define GetSecurityInfo apr_winapi_GetSecurityInfo
APR_DECLARE_LATE_DLL_FUNC(DLL_SHSTDAPI, LPWSTR *, WINAPI, CommandLineToArgvW, 0, (
LPCWSTR lpCmdLine,
int *pNumArgs),
(lpCmdLine, pNumArgs));
#define CommandLineToArgvW apr_winapi_CommandLineToArgvW
#endif
#if !defined(_WIN32_WCE)
#ifdef GetCompressedFileSizeA
#undef GetCompressedFileSizeA
#endif
APR_DECLARE_LATE_DLL_FUNC(DLL_WINBASEAPI, DWORD, WINAPI, GetCompressedFileSizeA, 0, (
IN LPCSTR lpFileName,
OUT LPDWORD lpFileSizeHigh),
(lpFileName, lpFileSizeHigh));
#define GetCompressedFileSizeA apr_winapi_GetCompressedFileSizeA
#undef GetCompressedFileSize
#define GetCompressedFileSize apr_winapi_GetCompressedFileSizeA
#ifdef GetCompressedFileSizeW
#undef GetCompressedFileSizeW
#endif
APR_DECLARE_LATE_DLL_FUNC(DLL_WINBASEAPI, DWORD, WINAPI, GetCompressedFileSizeW, 0, (
IN LPCWSTR lpFileName,
OUT LPDWORD lpFileSizeHigh),
(lpFileName, lpFileSizeHigh));
#define GetCompressedFileSizeW apr_winapi_GetCompressedFileSizeW
APR_DECLARE_LATE_DLL_FUNC(DLL_NTDLL, LONG, WINAPI, NtQueryTimerResolution, 0, (
ULONG *pMaxRes,
ULONG *pMinRes,
ULONG *pCurRes),
(pMaxRes, pMinRes, pCurRes));
#define QueryTimerResolution apr_winapi_NtQueryTimerResolution
APR_DECLARE_LATE_DLL_FUNC(DLL_NTDLL, LONG, WINAPI, NtSetTimerResolution, 0, (
ULONG ReqRes,
BOOL Acquire,
ULONG *pNewRes),
(ReqRes, Acquire, pNewRes));
#define SetTimerResolution apr_winapi_NtSetTimerResolution
typedef struct PBI {
LONG ExitStatus;
PVOID PebBaseAddress;
apr_uintptr_t AffinityMask;
LONG BasePriority;
apr_uintptr_t UniqueProcessId;
apr_uintptr_t InheritedFromUniqueProcessId;
} PBI, *PPBI;
APR_DECLARE_LATE_DLL_FUNC(DLL_NTDLL, LONG, WINAPI, NtQueryInformationProcess, 0, (
HANDLE hProcess,
INT info,
PVOID pPI,
ULONG LenPI,
ULONG *pSizePI),
(hProcess, info, pPI, LenPI, pSizePI));
#define QueryInformationProcess apr_winapi_NtQueryInformationProcess
APR_DECLARE_LATE_DLL_FUNC(DLL_NTDLL, LONG, WINAPI, NtQueryObject, 0, (
HANDLE hObject,
INT info,
PVOID pOI,
ULONG LenOI,
ULONG *pSizeOI),
(hObject, info, pOI, LenOI, pSizeOI));
#define QueryObject apr_winapi_NtQueryObject
typedef struct IOSB {
union {
UINT Status;
PVOID reserved;
};
apr_uintptr_t Information;
} IOSB, *PIOSB;
typedef struct FSI {
LONGLONG AllocationSize;
LONGLONG EndOfFile;
ULONG NumberOfLinks;
BOOL DeletePending;
BOOL Directory;
} FSI, *PFSI;
APR_DECLARE_LATE_DLL_FUNC(DLL_NTDLL, LONG, WINAPI, ZwQueryInformationFile, 0, (
HANDLE hObject,
PVOID pIOSB,
PVOID pFI,
ULONG LenFI,
ULONG info),
(hObject, pIOSB, pFI, LenFI, info));
#define ZwQueryInformationFile apr_winapi_ZwQueryInformationFile
#ifdef CreateToolhelp32Snapshot
#undef CreateToolhelp32Snapshot
#endif
APR_DECLARE_LATE_DLL_FUNC(DLL_WINBASEAPI, HANDLE, WINAPI, CreateToolhelp32Snapshot, 0, (
DWORD dwFlags,
DWORD th32ProcessID),
(dwFlags, th32ProcessID));
#define CreateToolhelp32Snapshot apr_winapi_CreateToolhelp32Snapshot
#ifdef Process32FirstW
#undef Process32FirstW
#endif
APR_DECLARE_LATE_DLL_FUNC(DLL_WINBASEAPI, BOOL, WINAPI, Process32FirstW, 0, (
HANDLE hSnapshot,
LPPROCESSENTRY32W lppe),
(hSnapshot, lppe));
#define Process32FirstW apr_winapi_Process32FirstW
#ifdef Process32NextW
#undef Process32NextW
#endif
APR_DECLARE_LATE_DLL_FUNC(DLL_WINBASEAPI, BOOL, WINAPI, Process32NextW, 0, (
HANDLE hSnapshot,
LPPROCESSENTRY32W lppe),
(hSnapshot, lppe));
#define Process32NextW apr_winapi_Process32NextW
#if !defined(POLLERR)
#define POLLRDNORM 0x0100
#define POLLRDBAND 0x0200
#define POLLIN (POLLRDNORM | POLLRDBAND)
#define POLLPRI 0x0400
#define POLLWRNORM 0x0010
#define POLLOUT (POLLWRNORM)
#define POLLWRBAND 0x0020
#define POLLERR 0x0001
#define POLLHUP 0x0002
#define POLLNVAL 0x0004
typedef struct pollfd {
SOCKET fd;
SHORT events;
SHORT revents;
} WSAPOLLFD, *PWSAPOLLFD, FAR *LPWSAPOLLFD;
#endif
#ifdef WSAPoll
#undef WSAPoll
#endif
APR_DECLARE_LATE_DLL_FUNC(DLL_WINSOCK2API, int, WSAAPI, WSAPoll, 0, (
IN OUT LPWSAPOLLFD fdArray,
IN ULONG fds,
IN INT timeout),
(fdArray, fds, timeout));
#define WSAPoll apr_winapi_WSAPoll
#define HAVE_POLL 1
#ifdef SetDllDirectoryW
#undef SetDllDirectoryW
#endif
APR_DECLARE_LATE_DLL_FUNC(DLL_WINBASEAPI, BOOL, WINAPI, SetDllDirectoryW, 0, (
IN LPCWSTR lpPathName),
(lpPathName));
#define SetDllDirectoryW apr_winapi_SetDllDirectoryW
#endif
#endif