HANDLE apxLogOpen()

in src/native/windows/src/log.c [176:264]


HANDLE apxLogOpen(
    APXHANDLE hPool,
    LPCWSTR szPath,
    LPCWSTR szPrefix,
    DWORD dwRotate)
{

    WCHAR sPath[SIZ_PATHLEN];
    WCHAR sName[SIZ_PATHLEN];
    SYSTEMTIME sysTime;
    apx_logfile_st *h;

    if (_pt_sys_loglock == NULL) {
        InitializeCriticalSection(&_st_sys_loglock);
        _pt_sys_loglock = &_st_sys_loglock;
    }
    GetLocalTime(&sysTime);
    if (!szPath) {
        if (GetSystemDirectoryW(sPath, MAX_PATH) == 0)
            return INVALID_HANDLE_VALUE;
        lstrlcatW(sPath, MAX_PATH, L"\\LogFiles");
        if (!SHCreateDirectoryExW(NULL, sPath, NULL) && GetLastError() != ERROR_ALREADY_EXISTS) {
            if (!SHCreateDirectoryExW(NULL, sPath, NULL))
                return INVALID_HANDLE_VALUE;
        }
        lstrlcatW(sPath, MAX_PATH, L"\\Apache");
        if (!SHCreateDirectoryExW(NULL, sPath, NULL) && GetLastError() != ERROR_ALREADY_EXISTS) {
            if (!SHCreateDirectoryExW(NULL, sPath, NULL))
                return INVALID_HANDLE_VALUE;
        }
    }
    else {
        lstrlcpyW(sPath, MAX_PATH, szPath);
    }
    if (!szPrefix)
        szPrefix = L"commons-daemon";
    if (dwRotate != 0 && dwRotate < 86400)
        StringCchPrintf(sName,
                  SIZ_PATHLEN,
                  L"\\%s"  LOGF_EXR,
                  szPrefix,
                  sysTime.wYear,
                  sysTime.wMonth,
                  sysTime.wDay,
                  0,
                  0,
                  0);
    else
        StringCchPrintf(sName,
                  SIZ_PATHLEN,
                  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;
    SHCreateDirectoryExW(NULL, 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;
}