VirtualBox

Changeset 1083 in vbox


Ignore:
Timestamp:
Feb 28, 2007 8:32:30 AM (18 years ago)
Author:
vboxsync
Message:

HGCM: VbglHGCMCall shouldn't return failure if the request produced an error; it should only do so if the request could not be completed

Location:
trunk/src/VBox/Additions/common/VBoxGuestLib
Files:
3 edited

Legend:

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

    r769 r1083  
    4747#include <VBox/VBoxGuestLib.h>
    4848#include "VBGLInternal.h"
     49#include <iprt/assert.h>
    4950
    5051/* These functions can be only used by VBoxGuest. */
     
    174175        /* Initialize request memory */
    175176        pHGCMCall->header.fu32Flags = 0;
     177        pHGCMCall->header.result    = VINF_SUCCESS;
    176178
    177179        pHGCMCall->u32ClientID = pCallInfo->u32ClientID;
     
    190192
    191193        dprintf (("VbglGRPerform rc = %Vrc\n", rc));
     194
     195        /** If the call failed, but as a result of the request itself, then pretend success 
     196         *  Upper layers will interpret the result code in the packet.
     197         */
     198        if (VBOX_FAILURE(rc) && rc == pHGCMCall->header.result)
     199        {
     200            Assert(pHGCMCall->header.fu32Flags & VBOX_HGCM_REQ_DONE);
     201            rc = VINF_SUCCESS;
     202        }
    192203
    193204        if (VBOX_SUCCESS(rc))
  • trunk/src/VBox/Additions/common/VBoxGuestLib/SysHlp.cpp

    r719 r1083  
    2020 * license agreement apply instead of the previous paragraph.
    2121 */
     22#define LOG_GROUP LOG_GROUP_HGCM
     23#include <VBox/log.h>
    2224
    2325#include <VBox/VBoxGuestLib.h>
    2426#include "SysHlp.h"
    2527
    26 #define LOG_GROUP LOG_GROUP_HGCM
    27 #include <VBox/log.h>
    2828#include <iprt/assert.h>
    2929
  • trunk/src/VBox/Additions/common/VBoxGuestLib/VBoxCalls.c

    r1 r1083  
    4646#endif
    4747
     48
     49#define VBOXSF_RECONNECT_AFTER_RESTORE(pClient, data)                                           \
     50    /* After a restore our client id is no longer valid; try to reconnect when that happens */  \
     51    /** @todo settings lost! */ \
     52    if (RT_UNLIKELY(rc == VERR_HGCM_INVALID_CLIENT_ID))                                         \
     53    {                                                                                           \
     54        Log(("VBOXSF: reconnect after restore\n"));                                             \
     55        rc = vboxConnect(pClient);                                                              \
     56        if (VBOX_SUCCESS(rc))                                                                   \
     57            rc = VbglHGCMCall (pClient->handle, &data.callInfo, sizeof (data));                 \
     58    }
     59
    4860DECLVBGL(int) vboxInit (void)
    4961{
     
    134146*/
    135147    rc = VbglHGCMCall (pClient->handle, &data.callInfo, sizeof (data));
     148    VBOXSF_RECONNECT_AFTER_RESTORE(pClient, data);
     149
    136150/*
    137151    Log(("VBOXSF: VBoxSF::vboxCallQueryMappings: "
     
    171185
    172186    rc = VbglHGCMCall (pClient->handle, &data.callInfo, sizeof (data));
     187    VBOXSF_RECONNECT_AFTER_RESTORE(pClient, data);
    173188
    174189/*    Log(("VBOXSF: VBoxSF::vboxCallQueryMapName: "
     
    203218
    204219    rc = VbglHGCMCall (pClient->handle, &data.callInfo, sizeof (data));
     220    VBOXSF_RECONNECT_AFTER_RESTORE(pClient, data);
    205221
    206222/*    Log(("VBOXSF: VBoxSF::vboxCallMapFolder: "
     
    227243
    228244    rc = VbglHGCMCall (pClient->handle, &data.callInfo, sizeof (data));
     245    VBOXSF_RECONNECT_AFTER_RESTORE(pClient, data);
    229246
    230247/*    Log(("VBOXSF: VBoxSF::vboxCallUnmapFolder: "
     
    260277
    261278    rc = VbglHGCMCall (pClient->handle, &data.callInfo, sizeof (data));
     279    VBOXSF_RECONNECT_AFTER_RESTORE(pClient, data);
    262280
    263281/*    Log(("VBOXSF: VBoxSF::vboxCallCreate: "
     
    318336
    319337    rc = VbglHGCMCall (pClient->handle, &data.callInfo, sizeof (data));
     338    VBOXSF_RECONNECT_AFTER_RESTORE(pClient, data);
    320339
    321340/*    Log(("VBOXSF: VBoxSF::vboxCallRemove: "
     
    354373
    355374    rc = VbglHGCMCall (pClient->handle, &data.callInfo, sizeof (data));
     375    VBOXSF_RECONNECT_AFTER_RESTORE(pClient, data);
    356376
    357377/*    Log(("VBOXSF: VBoxSF::vboxCallRename: "
     
    502522
    503523    rc = VbglHGCMCall (pClient->handle, &data.callInfo, sizeof (data));
     524    VBOXSF_RECONNECT_AFTER_RESTORE(pClient, data);
    504525
    505526/*    Log(("VBOXSF: VBoxSF::vboxCallDirInfo: "
     
    538559
    539560    rc = VbglHGCMCall (pClient->handle, &data.callInfo, sizeof (data));
     561    VBOXSF_RECONNECT_AFTER_RESTORE(pClient, data);
    540562
    541563/*    Log(("VBOXSF: VBoxSF::vboxCallFileInfo: "
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