static void logRotate()

in src/native/windows/src/log.c [51:104]


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)
        StringCchPrintf(sName,
                  SIZ_PATHLEN,
                  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
        StringCchPrintf(sName,
                  SIZ_PATHLEN,
                  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;
    }
    /* Make sure we relock the correct file */
    APX_LOGLOCK(h);
    APX_LOGUNLOCK(lf->hFile);
    /* Close original handle */
    CloseHandle(lf->hFile);
    lf->hFile = h;
}