VirtualBox

Ignore:
Timestamp:
Mar 28, 2012 2:48:00 PM (13 years ago)
Author:
vboxsync
Message:

Main/GuestCtrl: Introduced host<->guest PID mapping for immediate returns of executeProcess(); bugfixes.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/src-client/GuestCtrlImplTasks.cpp

    r40579 r40685  
    279279                        BOOL fCompleted = FALSE;
    280280                        BOOL fCanceled = FALSE;
     281
    281282                        uint64_t cbTransferedTotal = 0;
     283                        uint64_t cbToRead = cbSize;
    282284
    283285                        SafeArray<BYTE> aInputData(_64K);
     
    285287                               && !fCompleted)
    286288                        {
    287                             size_t cbToRead = cbSize;
    288289                            size_t cbRead = 0;
    289290                            if (cbSize) /* If we have nothing to read, take a shortcut. */
     
    334335                            }
    335336
    336                             ULONG uBytesWritten = 0;
     337                            ULONG cbBytesWritten = 0;
    337338                            rc = pGuest->SetProcessInput(uPID, uFlags,
    338339                                                         0 /* Infinite timeout */,
    339                                                          ComSafeArrayAsInParam(aInputData), &uBytesWritten);
     340                                                         ComSafeArrayAsInParam(aInputData), &cbBytesWritten);
    340341                            if (FAILED(rc))
    341342                            {
     
    346347                            Assert(cbRead <= cbToRead);
    347348                            Assert(cbToRead >= cbRead);
    348                             cbToRead -= cbRead;
    349 
    350                             cbTransferedTotal += uBytesWritten;
     349                            /* Only subtract bytes reported written by the guest. */
     350                            cbToRead -= cbBytesWritten;
     351
     352                            cbTransferedTotal += cbBytesWritten;
    351353                            Assert(cbTransferedTotal <= cbSize);
    352354                            aTask->pProgress->SetCurrentOperationProgress((ULONG)(cbTransferedTotal * 100 / cbSize));
     
    377379                             * canceled or we simply got all stuff transferred.
    378380                             */
    379                             ExecuteProcessStatus_T retStatus;
    380                             ULONG uRetExitCode;
    381 
    382                             rc = executeWaitForExit(uPID, execProgress, 0 /* No timeout */,
    383                                                     &retStatus, &uRetExitCode);
     381                            rc = executeWaitForExit(uPID, execProgress, 0 /* No timeout */);
    384382                            if (FAILED(rc))
    385383                            {
     
    388386                            else
    389387                            {
    390                                 if (   uRetExitCode != 0
    391                                     || retStatus    != ExecuteProcessStatus_TerminatedNormally)
     388                                VBOXGUESTCTRL_PROCESS proc;
     389                                vrc = processGetStatus(uPID, &proc, true /* Remove from PID list. */);
     390                                if (RT_SUCCESS(vrc))
    392391                                {
    393                                     rc = GuestTask::setProgressErrorMsg(VBOX_E_IPRT_ERROR, aTask->pProgress,
    394                                                                         Guest::tr("Guest process reported error %u (status: %u) while copying file \"%s\" to \"%s\""),
    395                                                                         uRetExitCode, retStatus, aTask->strSource.c_str(), aTask->strDest.c_str());
     392
     393                                    if (   proc.mExitCode != 0
     394                                        || proc.mStatus   != ExecuteProcessStatus_TerminatedNormally)
     395                                    {
     396                                        rc = GuestTask::setProgressErrorMsg(VBOX_E_IPRT_ERROR, aTask->pProgress,
     397                                                                            Guest::tr("Guest process reported error %u (status: %u) while copying file \"%s\" to \"%s\""),
     398                                                                            proc.mExitCode, proc.mStatus, aTask->strSource.c_str(), aTask->strDest.c_str());
     399                                    }
    396400                                }
    397401                            }
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