| /* Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #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 |
| |
| /* ### create APR_HAVE_* macros for these? */ |
| #if APR_HAVE_STDLIB_H |
| #include <stdlib.h> |
| #endif |
| #if APR_HAVE_STRING_H |
| #include <string.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 |
| |
| /* start.c and apr_app.c helpers and communication within misc.c |
| * |
| * They are not for public consumption, although apr_app_init_complete |
| * must be an exported symbol to avoid reinitialization. |
| */ |
| extern int APR_DECLARE_DATA apr_app_init_complete; |
| |
| int apr_wastrtoastr(char const * const * *retarr, |
| wchar_t const * const *arr, int args); |
| |
| /* Platform specific designation of run time os version. |
| * Gaps allow for specific service pack levels that |
| * export new kernel or winsock functions or behavior. |
| */ |
| 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, /* Prior versions support only narrow chars */ |
| |
| APR_WIN_CE_3 = 23, /* CE is an odd beast, not supporting */ |
| /* some pre-NT features, such as the */ |
| APR_WIN_NT = 30, /* narrow charset APIs (fooA fns), while */ |
| APR_WIN_NT_3_5 = 35, /* not supporting some NT-family features. */ |
| 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_oslevel_e; |
| |
| extern APR_DECLARE_DATA apr_oslevel_e apr_os_level; |
| |
| apr_status_t apr_get_oslevel(apr_oslevel_e *); |
| |
| /* The APR_HAS_ANSI_FS symbol is PRIVATE, and internal to APR. |
| * APR only supports char data for filenames. Like most applications, |
| * characters >127 are essentially undefined. APR_HAS_UNICODE_FS lets |
| * the application know that utf-8 is the encoding method of APR, and |
| * only incidently hints that we have Wide OS calls. |
| * |
| * APR_HAS_ANSI_FS is simply an OS flag to tell us all calls must be |
| * the unicode eqivilant. |
| */ |
| |
| #if defined(_WIN32_WCE) || defined(WINNT) |
| #define APR_HAS_ANSI_FS 0 |
| #else |
| #define APR_HAS_ANSI_FS 1 |
| #endif |
| |
| /* IF_WIN_OS_IS_UNICODE / ELSE_WIN_OS_IS_ANSI help us keep the code trivial |
| * where have runtime tests for unicode-ness, that aren't needed in any |
| * build which supports only WINNT or WCE. |
| */ |
| #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 /* APR_HAS_UNICODE_FS */ |
| #define IF_WIN_OS_IS_UNICODE |
| #define ELSE_WIN_OS_IS_ANSI |
| #endif /* WINNT */ |
| |
| typedef enum { |
| DLL_WINBASEAPI = 0, // kernel32 From WinBase.h |
| DLL_WINADVAPI = 1, // advapi32 From WinBase.h |
| DLL_WINSOCKAPI = 2, // mswsock From WinSock.h |
| DLL_WINSOCK2API = 3, // ws2_32 From WinSock2.h |
| DLL_SHSTDAPI = 4, // shell32 From ShellAPI.h |
| DLL_NTDLL = 5, // shell32 From our real kernel |
| DLL_defined = 6 // must define as last idx_ + 1 |
| } apr_dlltoken_e; |
| |
| FARPROC apr_load_dll_func(apr_dlltoken_e fnLib, char *fnName, int ordinal); |
| |
| /* The apr_load_dll_func call WILL fault if the function cannot be loaded */ |
| |
| #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; \ |
| __inline rettype apr_winapi_##fn args \ |
| { if (!apr_winapi_pfn_##fn) \ |
| apr_winapi_pfn_##fn = (apr_winapi_fpt_##fn) \ |
| apr_load_dll_func(lib, #fn, ord); \ |
| return (*(apr_winapi_pfn_##fn)) names; }; \ |
| |
| /* Provide late bound declarations of every API function missing from |
| * one or more supported releases of the Win32 API |
| * |
| * lib is the enumerated token from apr_dlltoken_e, and must correspond |
| * to the string table entry in start.c used by the apr_load_dll_func(). |
| * Token names (attempt to) follow Windows.h declarations prefixed by DLL_ |
| * in order to facilitate comparison. Use the exact declaration syntax |
| * and names from Windows.h to prevent ambigutity and bugs. |
| * |
| * rettype and calltype follow the original declaration in Windows.h |
| * fn is the true function name - beware Ansi/Unicode #defined macros |
| * ord is the ordinal within the library, use 0 if it varies between versions |
| * args is the parameter list following the original declaration, in parens |
| * names is the parameter list sans data types, enclosed in parens |
| * |
| * #undef/re#define the Ansi/Unicode generic name to abate confusion |
| * In the case of non-text functions, simply #define the original name |
| */ |
| |
| #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 /* !defined(_WIN32_WCE) && !defined(WINNT) */ |
| |
| #if !defined(_WIN32_WCE) |
| |
| APR_DECLARE_LATE_DLL_FUNC(DLL_NTDLL, DWORD, WINAPI, NtQueryTimerResolution, 0, ( |
| ULONG *pMaxRes, /* Minimum NS Resolution */ |
| ULONG *pMinRes, /* Maximum NS Resolution */ |
| ULONG *pCurRes), /* Current NS Resolution */ |
| (pMaxRes, pMinRes, pCurRes)); |
| #define QueryTimerResolution apr_winapi_NtQueryTimerResolution |
| |
| APR_DECLARE_LATE_DLL_FUNC(DLL_NTDLL, DWORD, WINAPI, NtSetTimerResolution, 0, ( |
| ULONG ReqRes, /* Requested NS Clock Resolution */ |
| BOOL Acquire, /* Aquire (1) or Release (0) our interest */ |
| ULONG *pNewRes), /* The NS Clock Resolution granted */ |
| (ReqRes, Acquire, pNewRes)); |
| #define SetTimerResolution apr_winapi_NtSetTimerResolution |
| |
| typedef struct PBI { |
| LONG ExitStatus; |
| PVOID PebBaseAddress; |
| ULONG_PTR AffinityMask; |
| LONG BasePriority; |
| ULONG_PTR UniqueProcessId; |
| ULONG_PTR InheritedFromUniqueProcessId; |
| } PBI, *PPBI; |
| |
| APR_DECLARE_LATE_DLL_FUNC(DLL_NTDLL, DWORD, WINAPI, NtQueryInformationProcess, 0, ( |
| HANDLE hProcess, /* Obvious */ |
| INT info, /* Use 0 for PBI documented above */ |
| PVOID pPI, /* The PIB buffer */ |
| ULONG LenPI, /* Use sizeof(PBI) */ |
| ULONG *pSizePI), /* returns pPI buffer used (may pass NULL) */ |
| (hProcess, info, pPI, LenPI, pSizePI)); |
| #define QueryInformationProcess apr_winapi_NtQueryInformationProcess |
| |
| APR_DECLARE_LATE_DLL_FUNC(DLL_NTDLL, DWORD, WINAPI, NtQueryObject, 0, ( |
| HANDLE hObject, /* Obvious */ |
| INT info, /* Use 0 for PBI documented above */ |
| PVOID pOI, /* The PIB buffer */ |
| ULONG LenOI, /* Use sizeof(PBI) */ |
| ULONG *pSizeOI), /* returns pPI buffer used (may pass NULL) */ |
| (hObject, info, pOI, LenOI, pSizeOI)); |
| #define QueryObject apr_winapi_NtQueryObject |
| |
| #endif /* !defined(_WIN32_WCE) */ |
| |
| #endif /* ! MISC_H */ |
| |