VirtualBox

Changeset 23692 in vbox


Ignore:
Timestamp:
Oct 12, 2009 1:42:13 PM (15 years ago)
Author:
vboxsync
Message:

Console::migrationDstServeConnection: Set mRc, send VBox RC with NACK.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/ConsoleImpl-LiveMigration.cpp

    r23686 r23692  
    109109    void               *mpvVMCallbackTask;
    110110    PRTTCPSERVER        mhServer;
     111    PRTTIMERLR          mphTimerLR;
    111112    int                 mRc;
    112113
    113     MigrationStateDst(Console *pConsole, PVM pVM, IMachine *pMachine)
     114    MigrationStateDst(Console *pConsole, PVM pVM, IMachine *pMachine, PRTTIMERLR phTimerLR)
    114115        : MigrationState(pConsole, pVM, false /*fIsSource*/)
    115116        , mpMachine(pMachine)
    116117        , mpvVMCallbackTask(NULL)
    117118        , mhServer(NULL)
     119        , mphTimerLR(phTimerLR)
    118120        , mRc(VINF_SUCCESS)
    119121    {
     
    190192
    191193
    192 static int migrationTcpWriteACK(MigrationState *pState)
    193 {
    194     int rc = RTTcpWrite(pState->mhSocket, "ACK\n", sizeof("ACK\n") - 1);
    195     if (RT_FAILURE(rc))
    196         LogRel(("Migration: RTTcpWrite(,ACK,) -> %Rrc\n", rc));
    197     RTTcpFlush(pState->mhSocket);
    198     return rc;
    199 }
    200 
    201 
    202 static int migrationTcpWriteNACK(MigrationState *pState)
    203 {
    204     int rc = RTTcpWrite(pState->mhSocket, "NACK\n", sizeof("NACK\n") - 1);
    205     if (RT_FAILURE(rc))
    206         LogRel(("Migration: RTTcpWrite(,NACK,) -> %Rrc\n", rc));
    207     RTTcpFlush(pState->mhSocket);
    208     return rc;
    209 }
    210 
    211 
    212194/**
    213195 * Reads an ACK or NACK.
     
    228210    if (strcmp(szMsg, "ACK"))
    229211    {
    230         if (!strcmp(szMsg, "NACK"))
    231             return setError(E_FAIL, pszNAckMsg ? pszNAckMsg : "NACK");
     212        if (!strncmp(szMsg, "NACK=", sizeof("NACK=") - 1))
     213        {
     214            int32_t vrc2;
     215            vrc = RTStrToInt32Full(&szMsg[sizeof("NACK=") - 1], 10, &vrc2);
     216            if (vrc == VINF_SUCCESS)
     217            {
     218                if (pszNAckMsg)
     219                {
     220                    LogRel(("Migration: NACK=%Rrc (%d)\n", vrc2, vrc2));
     221                    return setError(E_FAIL, pszNAckMsg);
     222                }
     223                return setError(E_FAIL, "NACK - %Rrc (%d)", vrc2, vrc2);
     224            }
     225        }
    232226        return setError(E_FAIL, tr("Expected ACK or NACK, got '%s'"), szMsg);
    233227    }
     
    809803             * Do the job, when it returns we're done.
    810804             */
    811             MigrationStateDst State(this, pVM, pMachine);
     805            MigrationStateDst State(this, pVM, pMachine, &hTimerLR);
    812806            State.mstrPassword      = strPassword;
    813807            State.mhServer          = hServer;
     
    838832
    839833
     834static int migrationTcpWriteACK(MigrationStateDst *pState)
     835{
     836    int rc = RTTcpWrite(pState->mhSocket, "ACK\n", sizeof("ACK\n") - 1);
     837    if (RT_FAILURE(rc))
     838        LogRel(("Migration: RTTcpWrite(,ACK,) -> %Rrc\n", rc));
     839    RTTcpFlush(pState->mhSocket);
     840    return rc;
     841}
     842
     843
     844static int migrationTcpWriteNACK(MigrationStateDst *pState, int32_t rc2)
     845{
     846    char    szMsg[64];
     847    size_t  cch = RTStrPrintf(szMsg, sizeof(szMsg), "NACK=%d\n", rc2);
     848    int rc = RTTcpWrite(pState->mhSocket, szMsg, cch);
     849    if (RT_FAILURE(rc))
     850        LogRel(("Migration: RTTcpWrite(,%s,%zu) -> %Rrc\n", szMsg, cch, rc));
     851    RTTcpFlush(pState->mhSocket);
     852    return rc;
     853}
     854
     855
    840856/**
    841857 * @copydoc FNRTTCPSERVE
     
    875891            else
    876892                LogRel(("Migration: Invalid password (off=%u)\n", off));
    877             migrationTcpWriteNACK(pState);
     893            migrationTcpWriteNACK(pState, VERR_AUTHENTICATION_FAILURE);
    878894            return VINF_SUCCESS;
    879895        }
     
    883899    if (RT_FAILURE(vrc))
    884900        return vrc;
     901
    885902    RTTcpServerShutdown(pState->mhServer);
     903    RTTimerLRDestroy(*pState->mphTimerLR);
     904    *pState->mphTimerLR = NIL_RTTIMERLR;
    886905
    887906    /*
     
    908927            {
    909928                LogRel(("Migration: VMR3LoadFromStream -> %Rrc\n", vrc));
     929                migrationTcpWriteNACK(pState, vrc);
    910930                break;
    911931            }
     
    919939        else if (!strcmp(szCmd, "done"))
    920940        {
    921             migrationTcpWriteACK(pState);
     941            vrc = migrationTcpWriteACK(pState);
    922942            break;
    923943        }
     
    929949    }
    930950
     951    pState->mRc = vrc;
    931952    pState->mhSocket = NIL_RTSOCKET;
     953    LogFlowFunc(("returns mRc=%Rrc\n", vrc));
    932954    return VERR_TCP_SERVER_STOP;
    933955}
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