VirtualBox

Changeset 94624 in vbox for trunk/src


Ignore:
Timestamp:
Apr 19, 2022 9:20:51 AM (3 years ago)
Author:
vboxsync
Message:

Runtime/log: Allow setting a custom output interface for the file destination (for encryption), bugref:9955

Location:
trunk/src/VBox
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/common/VBoxService/VBoxService.cpp

    r93372 r94624  
    318318                           0 /*cBufDescs*/, NULL /*paBufDescs*/, RTLOGDEST_STDOUT | RTLOGDEST_USER,
    319319                           vgsvcLogHeaderFooter, g_cHistory, g_uHistoryFileSize, g_uHistoryFileTime,
     320                           NULL /*pOutputIf*/, NULL /*pvOutputIfUser*/,
    320321                           NULL /*pErrInfo*/, "%s", pszLogFile ? pszLogFile : "");
    321322    if (RT_SUCCESS(rc))
  • trunk/src/VBox/Additions/x11/VBoxClient/logging.cpp

    r93220 r94624  
    286286                           0 /*cBufDescs*/, NULL /*paBufDescs*/, RTLOGDEST_STDOUT | RTLOGDEST_USER,
    287287                           vbClLogHeaderFooter, g_cHistory, g_uHistoryFileSize, g_uHistoryFileTime,
     288                           NULL /*pOutputIf*/, NULL /*pvOutputIfUser*/,
    288289                           NULL /*pErrInfo*/, "%s", pszLogFile ? pszLogFile : "");
    289290    if (RT_SUCCESS(rc))
  • trunk/src/VBox/Main/glue/VBoxLogRelCreate.cpp

    r93115 r94624  
    172172                            cMaxEntriesPerGroup, 0 /*cBufDescs*/, NULL /*paBufDescs*/, fDestFlags,
    173173                            vboxHeaderFooter, cHistory, uHistoryFileSize, uHistoryFileTime,
     174                            NULL /*pOutputIf*/, NULL /*pvOutputIfUser*/,
    174175                            pErrInfo, pcszLogFile ? "%s" : NULL, pcszLogFile);
    175176    if (RT_SUCCESS(vrc))
  • trunk/src/VBox/Main/src-helper-apps/OpenGLTest/OpenGLTestApp.cpp

    r94138 r94624  
    303303                            0 /*cBufDescs*/, NULL /*paBufDescs*/, enmLogDest,
    304304                            NULL /*pfnBeginEnd*/, 0 /*cHistory*/, 0 /*cbHistoryFileMax*/, 0 /*uHistoryTimeMax*/,
     305                            NULL /*pOutputIf*/, NULL /*pvOutputIfUser*/,
    305306                            NULL /*pErrInfo*/, pszFilenameFmt, pszFilename, RTTimeMilliTS());
    306307    if (RT_SUCCESS(vrc))
  • trunk/src/VBox/Runtime/common/log/RTLogCreateEx.cpp

    r93115 r94624  
    4040                          uint32_t cBufDescs, PRTLOGBUFFERDESC paBufDescs, uint32_t fDestFlags,
    4141                          PFNRTLOGPHASE pfnPhase, uint32_t cHistory, uint64_t cbHistoryFileMax, uint32_t cSecsHistoryTimeSlot,
     42                          PCRTLOGOUTPUTIF pOutputIf, void *pvOutputIfUser,
    4243                          PRTERRINFO pErrInfo, const char *pszFilenameFmt, ...)
    4344{
     
    4950                        cBufDescs, paBufDescs, fDestFlags,
    5051                        pfnPhase, cHistory, cbHistoryFileMax, cSecsHistoryTimeSlot,
     52                        pOutputIf, pvOutputIfUser,
    5153                        pErrInfo, pszFilenameFmt, va);
    5254    va_end(va);
  • trunk/src/VBox/Runtime/common/log/log.cpp

    r94611 r94624  
    212212     * This can be NULL. */
    213213    PFNRTLOGPHASE           pfnPhase;
    214 
    215     /** Handle to log file (if open). */
     214    /** Pointer to the output interface used. */
     215    PCRTLOGOUTPUTIF         pOutputIf;
     216    /** Opaque user data passed to the callbacks in the output interface. */
     217    void                    *pvOutputIfUser;
     218
     219    /** Handle to log file (if open) - only used by the default output interface to avoid additional layers of indirection. */
    216220    RTFILE                  hFile;
    217221    /** Log file history settings: maximum amount of data to put in a file. */
     
    228232    /** Pointer to filename. */
    229233    char                    szFilename[RTPATH_MAX];
     234    /** Flag whether the log file was opened successfully. */
     235    bool                    fLogOpened;
    230236    /** @} */
    231237#endif /* IN_RING3 */
     
    241247
    242248/** The revision of the internal logger structure. */
    243 # define RTLOGGERINTERNAL_REV    UINT32_C(12)
     249# define RTLOGGERINTERNAL_REV    UINT32_C(13)
    244250
    245251AssertCompileMemberAlignment(RTLOGGERINTERNAL, cbRingBufUnflushed, sizeof(uint64_t));
     
    725731
    726732
     733#ifdef IN_RING3
     734/*********************************************************************************************************************************
     735*   Default file I/O interface                                                                                                   *
     736*********************************************************************************************************************************/
     737
     738static DECLCALLBACK(int) rtLogOutputIfDefOpen(PCRTLOGOUTPUTIF pIf, void *pvUser, const char *pszFilename, uint32_t fFlags)
     739{
     740    RT_NOREF(pIf);
     741    PRTLOGGERINTERNAL pLoggerInt = (PRTLOGGERINTERNAL)pvUser;
     742
     743    return RTFileOpen(&pLoggerInt->hFile, pszFilename, fFlags);
     744}
     745
     746
     747static DECLCALLBACK(int) rtLogOutputIfDefClose(PCRTLOGOUTPUTIF pIf, void *pvUser)
     748{
     749    RT_NOREF(pIf);
     750    PRTLOGGERINTERNAL pLoggerInt = (PRTLOGGERINTERNAL)pvUser;
     751
     752    int rc = VINF_SUCCESS;
     753    if (pLoggerInt->hFile != NIL_RTFILE)
     754        rc = RTFileClose(pLoggerInt->hFile);
     755
     756    pLoggerInt->hFile = NIL_RTFILE;
     757    return rc;
     758}
     759
     760
     761static DECLCALLBACK(int) rtLogOutputIfDefDelete(PCRTLOGOUTPUTIF pIf, void *pvUser, const char *pszFilename)
     762{
     763    RT_NOREF(pIf, pvUser);
     764    return RTFileDelete(pszFilename);
     765}
     766
     767
     768static DECLCALLBACK(int) rtLogOutputIfDefRename(PCRTLOGOUTPUTIF pIf, void *pvUser, const char *pszFilenameOld,
     769                                                const char *pszFilenameNew, uint32_t fFlags)
     770{
     771    RT_NOREF(pIf, pvUser);
     772    return RTFileRename(pszFilenameOld, pszFilenameNew, fFlags);
     773}
     774
     775
     776static DECLCALLBACK(int) rtLogOutputIfDefQuerySize(PCRTLOGOUTPUTIF pIf, void *pvUser, uint64_t *pcbSize)
     777{
     778    RT_NOREF(pIf);
     779    PRTLOGGERINTERNAL pLoggerInt = (PRTLOGGERINTERNAL)pvUser;
     780
     781    if (pLoggerInt->hFile != NIL_RTFILE)
     782        return RTFileQuerySize(pLoggerInt->hFile, pcbSize);
     783
     784    *pcbSize = 0;
     785    return VINF_SUCCESS;
     786}
     787
     788
     789static DECLCALLBACK(int) rtLogOutputIfDefWrite(PCRTLOGOUTPUTIF pIf, void *pvUser, const void *pvBuf,
     790                                               size_t cbWrite, size_t *pcbWritten)
     791{
     792    RT_NOREF(pIf);
     793    PRTLOGGERINTERNAL pLoggerInt = (PRTLOGGERINTERNAL)pvUser;
     794
     795    if (pLoggerInt->hFile != NIL_RTFILE)
     796        return RTFileWrite(pLoggerInt->hFile, pvBuf, cbWrite, pcbWritten);
     797
     798    return VINF_SUCCESS;
     799}
     800
     801
     802static DECLCALLBACK(int) rtLogOutputIfDefFlush(PCRTLOGOUTPUTIF pIf, void *pvUser)
     803{
     804    RT_NOREF(pIf);
     805    PRTLOGGERINTERNAL pLoggerInt = (PRTLOGGERINTERNAL)pvUser;
     806
     807    if (pLoggerInt->hFile != NIL_RTFILE)
     808        return RTFileFlush(pLoggerInt->hFile);
     809
     810    return VINF_SUCCESS;
     811}
     812
     813
     814/**
     815 * The default file output interface.
     816 */
     817static const RTLOGOUTPUTIF g_LogOutputIfDef =
     818{
     819    rtLogOutputIfDefOpen,
     820    rtLogOutputIfDefClose,
     821    rtLogOutputIfDefDelete,
     822    rtLogOutputIfDefRename,
     823    rtLogOutputIfDefQuerySize,
     824    rtLogOutputIfDefWrite,
     825    rtLogOutputIfDefFlush
     826};
     827#endif
     828
     829
    727830/*********************************************************************************************************************************
    728831*   Ring Buffer                                                                                                                  *
     
    9541057    if (pLoggerInt->fDestFlags & RTLOGDEST_FILE)
    9551058    {
    956         if (pLoggerInt->hFile != NIL_RTFILE)
     1059        if (pLoggerInt->fLogOpened)
    9571060        {
    9581061            if (cchPreamble)
    959                 RTFileWrite(pLoggerInt->hFile, pszPreamble, cchPreamble, NULL);
     1062                pLoggerInt->pOutputIf->pfnWrite(pLoggerInt->pOutputIf, pLoggerInt->pvOutputIfUser,
     1063                                                pszPreamble, cchPreamble, NULL /*pcbWritten*/);
    9601064            if (cchFirst)
    961                 RTFileWrite(pLoggerInt->hFile, pszFirst, cchFirst, NULL);
     1065                pLoggerInt->pOutputIf->pfnWrite(pLoggerInt->pOutputIf, pLoggerInt->pvOutputIfUser,
     1066                                                pszFirst, cchFirst, NULL /*pcbWritten*/);
    9621067            if (cchSecond)
    963                 RTFileWrite(pLoggerInt->hFile, pszSecond, cchSecond, NULL);
     1068                pLoggerInt->pOutputIf->pfnWrite(pLoggerInt->pOutputIf, pLoggerInt->pvOutputIfUser,
     1069                                                pszSecond, cchSecond, NULL /*pcbWritten*/);
    9641070            if (pLoggerInt->fFlags & RTLOGFLAGS_FLUSH)
    965                 RTFileFlush(pLoggerInt->hFile);
     1071                pLoggerInt->pOutputIf->pfnFlush(pLoggerInt->pOutputIf, pLoggerInt->pvOutputIfUser);
    9661072        }
    9671073        if (pLoggerInt->cHistory)
     
    10121118                           uint32_t cBufDescs, PRTLOGBUFFERDESC paBufDescs, uint32_t fDestFlags,
    10131119                           PFNRTLOGPHASE pfnPhase, uint32_t cHistory, uint64_t cbHistoryFileMax, uint32_t cSecsHistoryTimeSlot,
     1120                           PCRTLOGOUTPUTIF pOutputIf, void *pvOutputIfUser,
    10141121                           PRTERRINFO pErrInfo, const char *pszFilenameFmt, va_list args)
    10151122{
     
    11131220        pLoggerInt->pfnPhase                    = pfnPhase;
    11141221        pLoggerInt->hFile                       = NIL_RTFILE;
     1222        pLoggerInt->fLogOpened                  = false;
    11151223        pLoggerInt->cHistory                    = cHistory;
    11161224        if (cbHistoryFileMax == 0)
     
    11221230        else
    11231231            pLoggerInt->cSecsHistoryTimeSlot    = cSecsHistoryTimeSlot;
     1232
     1233        if (pOutputIf)
     1234        {
     1235            pLoggerInt->pOutputIf               = pOutputIf;
     1236            pLoggerInt->pvOutputIfUser          = pvOutputIfUser;
     1237        }
     1238        else
     1239        {
     1240            /* Use the default interface for output logging. */
     1241            pLoggerInt->pOutputIf               = &g_LogOutputIfDef;
     1242            pLoggerInt->pvOutputIfUser          = pLoggerInt;
     1243        }
     1244
    11241245# else   /* !IN_RING3 */
    11251246        RT_NOREF_PV(pfnPhase); RT_NOREF_PV(cHistory); RT_NOREF_PV(cbHistoryFileMax); RT_NOREF_PV(cSecsHistoryTimeSlot);
     
    13181439            }
    13191440# ifdef IN_RING3
    1320             RTFileClose(pLoggerInt->hFile);
     1441            pLoggerInt->pOutputIf->pfnClose(pLoggerInt->pOutputIf, pLoggerInt->pvOutputIfUser);
    13211442# endif
    13221443# if defined(RT_ARCH_X86) && !defined(LOG_USE_C99)
     
    13501471                        0 /*cBufDescs*/, NULL /*paBufDescs*/, fDestFlags,
    13511472                        NULL /*pfnPhase*/, 0 /*cHistory*/, 0 /*cbHistoryFileMax*/, 0 /*cSecsHistoryTimeSlot*/,
     1473                        NULL /*pOutputIf*/, NULL /*pvOutputIfUser*/,
    13521474                        NULL /*pErrInfo*/, pszFilenameFmt, va);
    13531475    va_end(va);
     
    14011523     */
    14021524    if (   (pLoggerInt->fDestFlags & RTLOGDEST_FILE)
    1403         && pLoggerInt->hFile != NIL_RTFILE)
     1525        && pLoggerInt->fLogOpened)
    14041526        pLoggerInt->pfnPhase(&pLoggerInt->Core, RTLOGPHASE_END, rtlogPhaseMsgLocked);
    14051527
     
    14071529     * Close output stuffs.
    14081530     */
    1409     if (pLoggerInt->hFile != NIL_RTFILE)
    1410     {
    1411         int rc2 = RTFileClose(pLoggerInt->hFile);
    1412         AssertRC(rc2);
     1531    if (pLoggerInt->fLogOpened)
     1532    {
     1533        int rc2 = pLoggerInt->pOutputIf->pfnClose(pLoggerInt->pOutputIf, pLoggerInt->pvOutputIfUser);
    14131534        if (RT_FAILURE(rc2) && RT_SUCCESS(rc))
    14141535            rc = rc2;
    1415         pLoggerInt->hFile = NIL_RTFILE;
     1536        pLoggerInt->fLogOpened = false;
    14161537    }
    14171538# endif
     
    24432564# ifdef IN_RING3
    24442565            if (   pLoggerInt->fDestFlags & RTLOGDEST_FILE
    2445                 && pLoggerInt->hFile == NIL_RTFILE)
     2566                && !pLoggerInt->fLogOpened)
    24462567            {
    24472568                rc = rtR3LogOpenFileDestination(pLoggerInt, pErrInfo);
     
    26542775    else
    26552776    {
    2656         RTFileDelete(pLoggerInt->szFilename);
     2777        pLoggerInt->pOutputIf->pfnDelete(pLoggerInt->pOutputIf, pLoggerInt->pvOutputIfUser,
     2778                                         pLoggerInt->szFilename);
    26572779        fOpen |= RTFILE_O_CREATE;
    26582780    }
     
    26632785
    26642786    unsigned cBackoff = 0;
    2665     int rc = RTFileOpen(&pLoggerInt->hFile, pLoggerInt->szFilename, fOpen);
     2787    int rc = pLoggerInt->pOutputIf->pfnOpen(pLoggerInt->pOutputIf, pLoggerInt->pvOutputIfUser,
     2788                                            pLoggerInt->szFilename, fOpen);
    26662789    while (   (   rc == VERR_SHARING_VIOLATION
    26672790               || (rc == VERR_ALREADY_EXISTS && !(pLoggerInt->fFlags & RTLOGFLAGS_APPEND)))
     
    26702793        RTThreadSleep(g_acMsLogBackoff[cBackoff++]);
    26712794        if (!(pLoggerInt->fFlags & RTLOGFLAGS_APPEND))
    2672             RTFileDelete(pLoggerInt->szFilename);
    2673         rc = RTFileOpen(&pLoggerInt->hFile, pLoggerInt->szFilename, fOpen);
     2795            pLoggerInt->pOutputIf->pfnDelete(pLoggerInt->pOutputIf, pLoggerInt->pvOutputIfUser,
     2796                                             pLoggerInt->szFilename);
     2797        rc = pLoggerInt->pOutputIf->pfnOpen(pLoggerInt->pOutputIf, pLoggerInt->pvOutputIfUser,
     2798                                            pLoggerInt->szFilename, fOpen);
    26742799    }
    26752800    if (RT_SUCCESS(rc))
    26762801    {
    2677         rc = RTFileQuerySize(pLoggerInt->hFile, &pLoggerInt->cbHistoryFileWritten);
     2802        pLoggerInt->fLogOpened = true;
     2803
     2804        rc = pLoggerInt->pOutputIf->pfnQuerySize(pLoggerInt->pOutputIf, pLoggerInt->pvOutputIfUser,
     2805                                                 &pLoggerInt->cbHistoryFileWritten);
    26782806        if (RT_FAILURE(rc))
    26792807        {
     
    26852813    else
    26862814    {
    2687         pLoggerInt->hFile = NIL_RTFILE;
     2815        pLoggerInt->fLogOpened = false;
    26882816        RTErrInfoSetF(pErrInfo, rc, N_("could not open file '%s' (fOpen=%#x)"), pLoggerInt->szFilename, fOpen);
    26892817    }
     
    27342862     * Close the old log file.
    27352863     */
    2736     if (pLoggerInt->hFile != NIL_RTFILE)
     2864    if (pLoggerInt->fLogOpened)
    27372865    {
    27382866        /* Use the callback to generate some final log contents, but only if
     
    27462874            pLoggerInt->fDestFlags = fODestFlags;
    27472875        }
    2748         RTFileClose(pLoggerInt->hFile);
    2749         pLoggerInt->hFile = NIL_RTFILE;
     2876
     2877        pLoggerInt->pOutputIf->pfnClose(pLoggerInt->pOutputIf, pLoggerInt->pvOutputIfUser);
    27502878    }
    27512879
     
    27672895
    27682896            unsigned cBackoff = 0;
    2769             int rc = RTFileRename(szOldName, szNewName, RTFILEMOVE_FLAGS_REPLACE);
     2897            int rc = pLoggerInt->pOutputIf->pfnRename(pLoggerInt->pOutputIf, pLoggerInt->pvOutputIfUser,
     2898                                                      szOldName, szNewName, RTFILEMOVE_FLAGS_REPLACE);
    27702899            while (   rc == VERR_SHARING_VIOLATION
    27712900                   && cBackoff < RT_ELEMENTS(g_acMsLogBackoff))
    27722901            {
    27732902                RTThreadSleep(g_acMsLogBackoff[cBackoff++]);
    2774                 rc = RTFileRename(szOldName, szNewName, RTFILEMOVE_FLAGS_REPLACE);
     2903                rc = pLoggerInt->pOutputIf->pfnRename(pLoggerInt->pOutputIf, pLoggerInt->pvOutputIfUser,
     2904                                                      szOldName, szNewName, RTFILEMOVE_FLAGS_REPLACE);
    27752905            }
    27762906
    27772907            if (rc == VERR_FILE_NOT_FOUND)
    2778                 RTFileDelete(szNewName);
     2908                pLoggerInt->pOutputIf->pfnDelete(pLoggerInt->pOutputIf, pLoggerInt->pvOutputIfUser, szNewName);
    27792909        }
    27802910
     
    27862916            char szExcessName[sizeof(pLoggerInt->szFilename) + 32];
    27872917            RTStrPrintf(szExcessName, sizeof(szExcessName), "%s.%u", pLoggerInt->szFilename, i);
    2788             int rc = RTFileDelete(szExcessName);
     2918            int rc = pLoggerInt->pOutputIf->pfnDelete(pLoggerInt->pOutputIf, pLoggerInt->pvOutputIfUser, szExcessName);
    27892919            if (RT_FAILURE(rc))
    27902920                break;
     
    28462976
    28472977        /* If the file is not open then rotation is not set up. */
    2848         if (pLoggerInt->hFile == NIL_RTFILE)
     2978        if (!pLoggerInt->fLogOpened)
    28492979        {
    28502980            pLoggerInt->cbHistoryFileWritten = 0;
     
    31543284        if ((pLoggerInt->fDestFlags & (RTLOGDEST_FILE | RTLOGDEST_RINGBUF)) == RTLOGDEST_FILE)
    31553285        {
    3156             if (pLoggerInt->hFile != NIL_RTFILE)
     3286            if (pLoggerInt->fLogOpened)
    31573287            {
    3158                 RTFileWrite(pLoggerInt->hFile, pchToFlush, cchToFlush, NULL);
     3288                pLoggerInt->pOutputIf->pfnWrite(pLoggerInt->pOutputIf, pLoggerInt->pvOutputIfUser,
     3289                                                pchToFlush, cchToFlush, NULL /*pcbWritten*/);
    31593290                if (pLoggerInt->fFlags & RTLOGFLAGS_FLUSH)
    3160                     RTFileFlush(pLoggerInt->hFile);
     3291                    pLoggerInt->pOutputIf->pfnFlush(pLoggerInt->pOutputIf, pLoggerInt->pvOutputIfUser);
    31613292            }
    31623293            if (pLoggerInt->cHistory)
  • trunk/src/VBox/VMM/VMMR0/VMMR0.cpp

    r93716 r94624  
    33303330                           VMMLOGGER_BUFFER_COUNT, pR0Log->aBufDescs, RTLOGDEST_DUMMY,
    33313331                           NULL /*pfnPhase*/, 0 /*cHistory*/, 0 /*cbHistoryFileMax*/, 0 /*cSecsHistoryTimeSlot*/,
     3332                           NULL /*pOutputIf*/, NULL /*pvOutputIfUser*/,
    33323333                           NULL /*pErrInfo*/, NULL /*pszFilenameFmt*/);
    33333334    if (RT_SUCCESS(rc))
  • trunk/src/VBox/ValidationKit/utils/TestExecServ/TestExecService.cpp

    r94525 r94624  
    39563956                           logHeaderFooter /* pfnPhase */ ,
    39573957                           10 /* cHistory */, 100 * _1M /* cbHistoryFileMax */, RT_SEC_1DAY /* cSecsHistoryTimeSlot */,
     3958                           NULL /*pOutputIf*/, NULL /*pvOutputIfUser*/,
    39583959                           NULL /* pErrInfo */, "%s", szLogFile);
    39593960        if (RT_SUCCESS(rc))
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette