Changeset 23692 in vbox
- Timestamp:
- Oct 12, 2009 1:42:13 PM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Main/ConsoleImpl-LiveMigration.cpp
r23686 r23692 109 109 void *mpvVMCallbackTask; 110 110 PRTTCPSERVER mhServer; 111 PRTTIMERLR mphTimerLR; 111 112 int mRc; 112 113 113 MigrationStateDst(Console *pConsole, PVM pVM, IMachine *pMachine )114 MigrationStateDst(Console *pConsole, PVM pVM, IMachine *pMachine, PRTTIMERLR phTimerLR) 114 115 : MigrationState(pConsole, pVM, false /*fIsSource*/) 115 116 , mpMachine(pMachine) 116 117 , mpvVMCallbackTask(NULL) 117 118 , mhServer(NULL) 119 , mphTimerLR(phTimerLR) 118 120 , mRc(VINF_SUCCESS) 119 121 { … … 190 192 191 193 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 212 194 /** 213 195 * Reads an ACK or NACK. … … 228 210 if (strcmp(szMsg, "ACK")) 229 211 { 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 } 232 226 return setError(E_FAIL, tr("Expected ACK or NACK, got '%s'"), szMsg); 233 227 } … … 809 803 * Do the job, when it returns we're done. 810 804 */ 811 MigrationStateDst State(this, pVM, pMachine );805 MigrationStateDst State(this, pVM, pMachine, &hTimerLR); 812 806 State.mstrPassword = strPassword; 813 807 State.mhServer = hServer; … … 838 832 839 833 834 static 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 844 static 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 840 856 /** 841 857 * @copydoc FNRTTCPSERVE … … 875 891 else 876 892 LogRel(("Migration: Invalid password (off=%u)\n", off)); 877 migrationTcpWriteNACK(pState );893 migrationTcpWriteNACK(pState, VERR_AUTHENTICATION_FAILURE); 878 894 return VINF_SUCCESS; 879 895 } … … 883 899 if (RT_FAILURE(vrc)) 884 900 return vrc; 901 885 902 RTTcpServerShutdown(pState->mhServer); 903 RTTimerLRDestroy(*pState->mphTimerLR); 904 *pState->mphTimerLR = NIL_RTTIMERLR; 886 905 887 906 /* … … 908 927 { 909 928 LogRel(("Migration: VMR3LoadFromStream -> %Rrc\n", vrc)); 929 migrationTcpWriteNACK(pState, vrc); 910 930 break; 911 931 } … … 919 939 else if (!strcmp(szCmd, "done")) 920 940 { 921 migrationTcpWriteACK(pState);941 vrc = migrationTcpWriteACK(pState); 922 942 break; 923 943 } … … 929 949 } 930 950 951 pState->mRc = vrc; 931 952 pState->mhSocket = NIL_RTSOCKET; 953 LogFlowFunc(("returns mRc=%Rrc\n", vrc)); 932 954 return VERR_TCP_SERVER_STOP; 933 955 }
Note:
See TracChangeset
for help on using the changeset viewer.