VirtualBox

Changeset 28132 in vbox for trunk


Ignore:
Timestamp:
Apr 9, 2010 10:02:00 AM (15 years ago)
Author:
vboxsync
Message:

Guest Control: Update (fixed leak in host service, --wait option for VBoxManage).

Location:
trunk/src/VBox
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Frontends/VBoxManage/VBoxManageGuestCtrl.cpp

    r28032 r28132  
    6565             "                            <path to program> [--arguments \"<arguments>\"] [--environment \"NAME=VALUE NAME=VALUE\"]\n"
    6666             "                            [--flags <flags>] [--username <name> [--password <password>]]\n"
    67              "                            [--timeout <msec>]\n"
     67             "                            [--timeout <msec>] [--wait stdout[,[stderr]]]\n"
    6868             "\n");
    6969}
     
    9191    Utf8Str Utf8Password;
    9292    uint32_t uTimeoutMS = 0;
     93    bool waitForOutput = false;
    9394
    9495    /* Iterate through all possible commands (if available). */
     
    175176            else
    176177                ++i;
     178        }
     179        else if (!strcmp(a->argv[i], "--wait"))
     180        {
     181            if (i + 1 >= a->argc)
     182                usageOK = false;
     183            else
     184            {
     185                /** @todo Check for "stdout" or "stderr"! */
     186                waitForOutput = true;
     187                ++i;
     188            }
    177189        }
    178190        /** @todo Add fancy piping stuff here. */
     
    231243                                                    Bstr(Utf8UserName), Bstr(Utf8Password), uTimeoutMS,
    232244                                                    &uPID, progress.asOutParam()));
     245            if (waitForOutput)
     246            {
     247
     248            }
    233249            /** @todo Show some progress here? */
    234250            a->session->Close();
  • trunk/src/VBox/HostServices/GuestControl/service.cpp

    r28087 r28132  
    453453                 rc = execBufferAssign(&curCmd.parmBuf, cParms, paParms);
    454454                 if (RT_SUCCESS(rc))
     455                 {
     456                     execBufferFree(&curCmd.parmBuf);
    455457                     mHostCmds.pop_front();
     458                 }
    456459             }
    457460        }
     
    487490    int rc = VINF_SUCCESS;
    488491
    489     HostCmd newCmd;
    490     execBufferAllocate(&newCmd.parmBuf, cParms, paParms);
    491     mHostCmds.push_back(newCmd);
    492 
    493     /* Limit list size by deleting oldest element. */
    494     if (mHostCmds.size() > 256) /** @todo Use a define! */
    495         mHostCmds.pop_front();
    496 
    497492    /* Some lazy guests to wake up? */
    498493    if (!mGuestWaiters.empty())
     
    501496        rc = hostNotifyGuest(&curCall, eFunction, cParms, paParms);
    502497        mGuestWaiters.pop_front();
     498    }
     499    else /* No guests waiting, buffer it */
     500    {
     501        HostCmd newCmd;
     502        rc = execBufferAllocate(&newCmd.parmBuf, cParms, paParms);
     503        if (RT_SUCCESS(rc))
     504        {
     505            mHostCmds.push_back(newCmd);
     506       
     507            /* Limit list size by deleting oldest element. */
     508            if (mHostCmds.size() > 256) /** @todo Use a define! */
     509                mHostCmds.pop_front();
     510        }
    503511    }
    504512    return rc;
  • trunk/src/VBox/Main/GuestImpl.cpp

    r28051 r28132  
    2626#include "Global.h"
    2727#include "ConsoleImpl.h"
     28#include "ProgressImpl.h"
    2829#include "VMMDev.h"
    2930
     
    448449
    449450    CheckComArgStrNotEmptyOrNull(aCommand);
     451    CheckComArgOutPointerValid(aPID);
    450452    CheckComArgOutPointerValid(aProgress);
    451     CheckComArgOutPointerValid(aPID);
    452     /* Flags are not supported at the moment. */
    453     if (aFlags != 0)
     453    if (aFlags != 0) /* Flags are not supported at the moment. */
    454454        return E_INVALIDARG;
    455455
     
    461461        if (FAILED(autoCaller.rc())) return autoCaller.rc();
    462462
    463         AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
    464 
    465         /* Just be on the safe side when calling another process. */
    466         alock.leave();
    467 
    468         HRESULT rc = E_UNEXPECTED;
    469         using namespace guestControl;
    470 
     463        AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
     464
     465        /*
     466         * Create progress object.
     467         */
     468#if 0
     469        ComObjPtr <Progress> progress;
     470        progress.createObject();
     471        HRESULT rc = progress->init(/** @todo How to get the machine here? */
     472                                    static_cast<IGuest*>(this),
     473                                    BstrFmt(tr("Executing process")),
     474                                    FALSE);
     475        if (FAILED(rc)) return rc;
     476#endif
     477
     478        /*
     479         * Prepare process execution.
     480         */
    471481        int vrc = VINF_SUCCESS;
    472482        Utf8Str Utf8Command(aCommand);
     
    547557            }
    548558            if (RT_SUCCESS(vrc))
     559            {
     560#if 0
     561                progress.queryInterfaceTo(aProgress);
     562#endif
    549563                rc = S_OK;
     564            }
    550565            else
    551566                rc = setError(E_UNEXPECTED,
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