/* * Environment variables parsing * Each variable is prfixed with PR_ * for example 'set PR_JVM=auto' has a same meaning as providing '--Jvm auto' * on the command line. * Multistring varisables are added to the present conf. */ void apxCmdlineLoadEnvVars( LPAPXCMDLINE lpCmdline) { WCHAR szEnv[64]; int i = 0; if (!lpCmdline || !lpCmdline->lpOptions) return; while (lpCmdline->lpOptions[i].szName) { DWORD l; WCHAR szVar[SIZ_HUGLEN]; lstrlcpyW(szEnv, 64, L"PR_"); lstrlcatW(szEnv, 64, lpCmdline->lpOptions[i].szName); l = GetEnvironmentVariableW(szEnv, szVar, SIZ_HUGMAX); if (l == 0 || l >= SIZ_HUGMAX) { if (l == 0 && GetLastError() != ERROR_ENVVAR_NOT_FOUND) { apxLogWrite(APXLOG_MARK_ERROR "Error geting environment variable %S", szEnv); return; } ++i; continue; } if (lpCmdline->lpOptions[i].dwType & APXCMDOPT_STR) { lpCmdline->lpOptions[i].szValue = apxPoolStrdupW(lpCmdline->hPool, szVar); lpCmdline->lpOptions[i].dwType |= APXCMDOPT_FOUND; } else if (lpCmdline->lpOptions[i].dwType & APXCMDOPT_INT) { lpCmdline->lpOptions[i].dwValue = (DWORD)apxAtoulW(szVar); lpCmdline->lpOptions[i].dwType |= APXCMDOPT_FOUND; } else if (lpCmdline->lpOptions[i].dwType & APXCMDOPT_MSZ) { LPWSTR pp; BOOL insquote = FALSE, indquote = FALSE; DWORD sp = 0; lpCmdline->lpOptions[i].dwValue = (lstrlenW(szVar) + 2) * sizeof(WCHAR); lpCmdline->lpOptions[i].szValue = apxPoolCalloc(lpCmdline->hPool, lpCmdline->lpOptions[i].dwValue); pp = szVar; while(*pp) { if (*pp == L'\'') insquote = !insquote; else if (*pp == L'"') { indquote = !indquote; lpCmdline->lpOptions[i].szValue[sp++] = L'"'; } else if ((*pp == L'#' || *pp == L';') && !insquote && !indquote) lpCmdline->lpOptions[i].szValue[sp++] = L'\0'; else lpCmdline->lpOptions[i].szValue[sp++] = *pp; pp++; } lpCmdline->lpOptions[i].dwType |= APXCMDOPT_FOUND | APXCMDOPT_ADD; } ++i; } }
static void logRotate(apx_logfile_st *lf, LPSYSTEMTIME t) { WCHAR sName[SIZ_PATHLEN]; ULARGE_INTEGER cft; ULARGE_INTEGER lft; HANDLE h; if (lf->dwRotate == 0) return; SystemTimeToFileTime(&lf->sysTime, (LPFILETIME)&lft); SystemTimeToFileTime(t, (LPFILETIME)&cft); if (cft.QuadPart < (lft.QuadPart + lf->dwRotate * 10000000ULL)) return; /* Rotate time */ lf->sysTime = *t; if (lf->dwRotate < 86400) wsprintfW(sName, L"\\%s" LOGF_EXR, lf->szPrefix, lf->sysTime.wYear, lf->sysTime.wMonth, lf->sysTime.wDay, lf->sysTime.wHour, lf->sysTime.wMinute, lf->sysTime.wSecond); else wsprintfW(sName, L"\\%s" LOGF_EXT, lf->szPrefix, lf->sysTime.wYear, lf->sysTime.wMonth, lf->sysTime.wDay); lstrlcpyW(lf->szFile, MAX_PATH, lf->szPath); lstrlcatW(lf->szFile, MAX_PATH, sName); h = CreateFileW(lf->szFile, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH | FILE_FLAG_SEQUENTIAL_SCAN, NULL); if (h == INVALID_HANDLE_VALUE) { /* TODO: Log something */ return; } CloseHandle(lf->hFile); lf->hFile = h; }
LPWSTR apxLogFile( APXHANDLE hPool, LPCWSTR szPath, LPCWSTR szPrefix, LPCWSTR szName, BOOL bTimeStamp, DWORD dwRotate) { LPWSTR sRet; WCHAR sPath[SIZ_PATHLEN]; WCHAR sName[SIZ_PATHLEN]; SYSTEMTIME sysTime; GetLocalTime(&sysTime); if (!szPath) { if (GetSystemDirectoryW(sPath, MAX_PATH) == 0) return INVALID_HANDLE_VALUE; lstrlcatW(sPath, MAX_PATH, L"\\LogFiles\\Apache"); } else { lstrlcpyW(sPath, MAX_PATH, szPath); } if (!szPrefix) szPrefix = L""; if (!szName) szName = L""; if (bTimeStamp) { if (dwRotate != 0 && dwRotate < 86400) wsprintfW(sName, L"\\%s%s" LOGF_EXR, szPrefix, szName, sysTime.wYear, sysTime.wMonth, sysTime.wDay, 0, 0, 0); else wsprintfW(sName, L"\\%s%s" LOGF_EXT, szPrefix, szName, sysTime.wYear, sysTime.wMonth, sysTime.wDay); } else { wsprintfW(sName, L"\\%s%s", szPrefix, szName); } sRet = apxPoolAlloc(hPool, (SIZ_PATHLEN) * sizeof(WCHAR)); /* Set default level to info */ CreateDirectoryW(sPath, NULL); lstrlcpyW(sRet, SIZ_PATHMAX, sPath); lstrlcatW(sRet, SIZ_PATHMAX, sName); return sRet; }
/* Open the log file * TODO: format like standard apache error.log * Add the EventLogger */ HANDLE apxLogOpen( APXHANDLE hPool, LPCWSTR szPath, LPCWSTR szPrefix, DWORD dwRotate) { WCHAR sPath[SIZ_PATHLEN]; WCHAR sName[SIZ_PATHLEN]; SYSTEMTIME sysTime; apx_logfile_st *h; GetLocalTime(&sysTime); if (!szPath) { if (GetSystemDirectoryW(sPath, MAX_PATH) == 0) return INVALID_HANDLE_VALUE; lstrlcatW(sPath, MAX_PATH, L"\\LogFiles"); if (!CreateDirectoryW(sPath, NULL) && GetLastError() != ERROR_ALREADY_EXISTS) { if (!CreateDirectoryW(sPath, NULL)) return INVALID_HANDLE_VALUE; } lstrlcatW(sPath, MAX_PATH, L"\\Apache"); if (!CreateDirectoryW(sPath, NULL) && GetLastError() != ERROR_ALREADY_EXISTS) { if (!CreateDirectoryW(sPath, NULL)) return INVALID_HANDLE_VALUE; } } else { lstrlcpyW(sPath, MAX_PATH, szPath); } if (!szPrefix) szPrefix = L"commons-daemon"; if (dwRotate != 0 && dwRotate < 86400) wsprintfW(sName, L"\\%s" LOGF_EXR, szPrefix, sysTime.wYear, sysTime.wMonth, sysTime.wDay, 0, 0, 0); else wsprintfW(sName, L"\\%s" LOGF_EXT, szPrefix, sysTime.wYear, sysTime.wMonth, sysTime.wDay); if (!(h = (apx_logfile_st *)apxPoolCalloc(hPool, sizeof(apx_logfile_st)))) return INVALID_HANDLE_VALUE; /* Set default level to info */ h->dwLogLevel = APXLOG_LEVEL_INFO; CreateDirectoryW(sPath, NULL); h->sysTime = sysTime; lstrlcpyW(h->szPath, MAX_PATH, sPath); lstrlcpyW(h->szFile, MAX_PATH, sPath); lstrlcatW(h->szFile, MAX_PATH, sName); lstrlcpyW(h->szPrefix, MAX_PATH, szPrefix); h->hFile = CreateFileW(h->szFile, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH | FILE_FLAG_SEQUENTIAL_SCAN, NULL); if (h->hFile == INVALID_HANDLE_VALUE) { /* Make sure we write somewhere */ h = &_st_sys_errhandle; apxDisplayError(FALSE, NULL, 0, "Unable to create logger at '%S'\n", h->szFile); return (HANDLE)h; } else { h->dwRotate = dwRotate; } /* Set this file as system log file */ if (!_st_sys_loghandle) _st_sys_loghandle = h; return (HANDLE)h; }
static BOOL __apxLoadJvmDll(LPCWSTR szJvmDllPath) { UINT errMode; WCHAR jreAltPath[SIZ_PATHLEN]; LPWSTR dllJvmPath = (LPWSTR)szJvmDllPath; DYNLOAD_FPTR_DECLARE(SetDllDirectoryW); if (!IS_INVALID_HANDLE(_st_sys_jvmDllHandle)) return TRUE; /* jvm.dll is already loaded */ if (dllJvmPath && *dllJvmPath) { /* Explicit JVM path. * Check if provided argument is valid */ if (GetFileAttributesW(dllJvmPath) == INVALID_FILE_ATTRIBUTES) { /* DAEMON-247: Invalid RuntimeLib explicitly specified is error. */ apxLogWrite(APXLOG_MARK_DEBUG "Invalid RuntimeLib specified '%S'", dllJvmPath); return FALSE; } } else { dllJvmPath = apxGetJavaSoftRuntimeLib(NULL); if (!dllJvmPath) return FALSE; } if (GetFileAttributesW(dllJvmPath) == INVALID_FILE_ATTRIBUTES) { /* DAEMON-184: RuntimeLib registry key is invalid. * Check from Jre JavaHome directly */ LPWSTR szJreHome = apxGetJavaSoftHome(NULL, TRUE); apxLogWrite(APXLOG_MARK_DEBUG "Invalid RuntimeLib '%S'", dllJvmPath); if (szJreHome) { apxLogWrite(APXLOG_MARK_DEBUG "Using Jre JavaHome '%S'", szJreHome); lstrlcpyW(jreAltPath, SIZ_PATHLEN, szJreHome); lstrlcatW(jreAltPath, SIZ_PATHLEN, L"\\bin\\server\\jvm.dll"); dllJvmPath = jreAltPath; } } /* Suppress the not found system popup message */ errMode = SetErrorMode(SEM_FAILCRITICALERRORS); apxLogWrite(APXLOG_MARK_DEBUG "loading jvm '%S'", dllJvmPath); _st_sys_jvmDllHandle = LoadLibraryExW(dllJvmPath, NULL, 0); if (IS_INVALID_HANDLE(_st_sys_jvmDllHandle) && GetFileAttributesW(dllJvmPath) != INVALID_FILE_ATTRIBUTES) { /* There is a file but cannot be loaded. * Try to load the MSVCRTxx.dll before JVM.dll */ WCHAR jreBinPath[SIZ_PATHLEN]; WCHAR crtBinPath[SIZ_PATHLEN]; DWORD i, l = 0; lstrlcpyW(jreBinPath, SIZ_PATHLEN, dllJvmPath); for (i = lstrlenW(jreBinPath); i > 0, l < 2; i--) { if (jreBinPath[i] == L'\\' || jreBinPath[i] == L'/') { jreBinPath[i] = L'\0'; lstrlcpyW(crtBinPath, SIZ_PATHLEN, jreBinPath); lstrlcatW(crtBinPath, SIZ_PATHLEN, MSVCRT71_DLLNAME); if (GetFileAttributesW(crtBinPath) != INVALID_FILE_ATTRIBUTES) { if (LoadLibraryW(crtBinPath)) { /* Found MSVCRTxx.dll */ apxLogWrite(APXLOG_MARK_DEBUG "preloaded '%S'", crtBinPath); break; } } l++; } } } /* This shuldn't happen, but try to search in %PATH% */ if (IS_INVALID_HANDLE(_st_sys_jvmDllHandle)) _st_sys_jvmDllHandle = LoadLibraryExW(dllJvmPath, NULL, LOAD_WITH_ALTERED_SEARCH_PATH); if (IS_INVALID_HANDLE(_st_sys_jvmDllHandle)) { WCHAR jreBinPath[SIZ_PATHLEN]; DWORD i, l = 0; lstrlcpyW(jreBinPath, SIZ_PATHLEN, dllJvmPath); DYNLOAD_FPTR_ADDRESS(SetDllDirectoryW, KERNEL32); for (i = lstrlenW(jreBinPath); i > 0, l < 2; i--) { if (jreBinPath[i] == L'\\' || jreBinPath[i] == L'/') { jreBinPath[i] = L'\0'; DYNLOAD_CALL(SetDllDirectoryW)(jreBinPath); apxLogWrite(APXLOG_MARK_DEBUG "Setting DLL search path to '%S'", jreBinPath); l++; } } _st_sys_jvmDllHandle = LoadLibraryExW(dllJvmPath, NULL, 0); if (IS_INVALID_HANDLE(_st_sys_jvmDllHandle)) _st_sys_jvmDllHandle = LoadLibraryExW(dllJvmPath, NULL, LOAD_WITH_ALTERED_SEARCH_PATH); } /* Restore the error mode signalization */ SetErrorMode(errMode); if (IS_INVALID_HANDLE(_st_sys_jvmDllHandle)) { apxLogWrite(APXLOG_MARK_SYSERR); return FALSE; } DYNLOAD_FPTR_LOAD(JNI_GetDefaultJavaVMInitArgs, _st_sys_jvmDllHandle); DYNLOAD_FPTR_LOAD(JNI_CreateJavaVM, _st_sys_jvmDllHandle); DYNLOAD_FPTR_LOAD(JNI_GetCreatedJavaVMs, _st_sys_jvmDllHandle); DYNLOAD_FPTR_LOAD(JVM_DumpAllStacks, _st_sys_jvmDllHandle); if (!DYNLOAD_FPTR(JNI_GetDefaultJavaVMInitArgs) || !DYNLOAD_FPTR(JNI_CreateJavaVM) || !DYNLOAD_FPTR(JNI_GetCreatedJavaVMs)) { apxLogWrite(APXLOG_MARK_SYSERR); FreeLibrary(_st_sys_jvmDllHandle); _st_sys_jvmDllHandle = NULL; return FALSE; } /* Real voodo ... */ return TRUE; }