VirtualBox

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

Guest Control: Update (introducing contexts for callbacks).

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/common/VBoxService/VBoxServiceControl.cpp

    r28218 r28286  
    9696static int VBoxServiceControlHandleCmdExec(uint32_t u32ClientId, uint32_t uNumParms)
    9797{
     98    uint32_t uContextID;
    9899    char szCmd[_1K];
    99100    uint32_t uFlags;
     
    110111    uint32_t uTimeLimitMS;
    111112
    112     int rc = VbglR3GuestCtrlExecGetHostCmd(u32ClientId, uNumParms,
     113    if (uNumParms != 14)
     114        return VERR_INVALID_PARAMETER;
     115
     116    int rc = VbglR3GuestCtrlExecGetHostCmd(u32ClientId,
     117                                           uNumParms,
     118                                           &uContextID,
    113119                                           /* Command */
    114120                                           szCmd,      sizeof(szCmd),
     
    134140    else
    135141    {     
    136         rc = VBoxServiceControlExecProcess(szCmd, uFlags, szArgs, uNumArgs,                                           
     142        rc = VBoxServiceControlExecProcess(uContextID, szCmd, uFlags, szArgs, uNumArgs,                                           
    137143                                           szEnv, cbEnv, uNumEnvVars,
    138144                                           szStdIn, szStdOut, szStdErr,
  • trunk/src/VBox/Additions/common/VBoxService/VBoxServiceControlExec.cpp

    r28244 r28286  
    235235
    236236
    237 static int VBoxServiceControlExecProcLoop(uint32_t uClientID, RTPROCESS hProcess, RTMSINTERVAL cMillies, RTPOLLSET hPollSet,
     237static int VBoxServiceControlExecProcLoop(PVBOXSERVICECTRLTHREADDATA pData,
     238                                          RTPROCESS hProcess, RTMSINTERVAL cMillies, RTPOLLSET hPollSet,
    238239                                          RTPIPE hStdInW, RTPIPE hStdOutR, RTPIPE hStdErrR)
    239240{
     
    256257    RTMSINTERVAL        cMsPollCur                  = 0;
    257258
     259    /* Assign PID to thread data. */
     260    pData->uPID = hProcess;
     261
    258262    /*
    259263     * Before entering the loop, tell the host that we've started the guest
    260264     * and that it's now OK to send input to the process.
    261265     */
    262     rc = VbglR3GuestCtrlExecReportStatus(uClientID, hProcess,
    263                                          PROC_STS_STARTED, 0 /* u32Flags */,
     266    AssertPtr(pData);
     267    rc = VbglR3GuestCtrlExecReportStatus(pData->uClientID, pData->uContextID,
     268                                         pData->uPID, PROC_STS_STARTED, 0 /* u32Flags */,
    264269                                         NULL /* pvData */, 0 /* cbData */);
    265270
     
    446451        }
    447452       
    448         VBoxServiceVerbose(3, "Control: Process ended: Status=%u, Flags=%u\n", uStatus, uFlags);
    449         rc = VbglR3GuestCtrlExecReportStatus(uClientID, hProcess,
    450                                              uStatus, uFlags,
     453        VBoxServiceVerbose(3, "Control: Process ended: PID=%u, Status=%u, Flags=%u\n",
     454                           pData->uPID, uStatus, uFlags);
     455        rc = VbglR3GuestCtrlExecReportStatus(pData->uClientID, pData->uContextID,
     456                                             pData->uPID, uStatus, uFlags,
    451457                                             NULL /* pvData */, 0 /* cbData */);
    452458    }
     
    509515
    510516/** Allocates and gives back a thread data struct which then can be used by the worker thread. */
    511 PVBOXSERVICECTRLTHREADDATA VBoxServiceControlExecAllocateThreadData(const char *pszCmd, uint32_t uFlags,
     517PVBOXSERVICECTRLTHREADDATA VBoxServiceControlExecAllocateThreadData(uint32_t u32ContextID,
     518                                                                    const char *pszCmd, uint32_t uFlags,
    512519                                                                    const char *pszArgs, uint32_t uNumArgs,                                           
    513520                                                                    const char *pszEnv, uint32_t cbEnv, uint32_t uNumEnvVars,
     
    519526        return NULL;
    520527
     528    /* ClientID will be assigned when thread is started! */
     529    pData->uContextID = u32ContextID;
    521530    pData->pszCmd = RTStrDup(pszCmd);
    522531    pData->uFlags = uFlags;
     
    601610     */
    602611    RTThreadUserSignal(RTThreadSelf());
    603     VBoxServiceVerbose(3, "Control: Thread of process \"%s\" started.\n", pData->pszCmd);
    604 
    605     uint32_t u32ClientID;
    606     int rc = VbglR3GuestCtrlConnect(&u32ClientID);
     612    VBoxServiceVerbose(3, "Control: Thread of process \"%s\" started\n", pData->pszCmd);
     613
     614    int rc = VbglR3GuestCtrlConnect(&pData->uClientID);
    607615    if (RT_FAILURE(rc))
    608616    {
     
    685693
    686694                                    /* Enter the process loop. */
    687                                     rc = VBoxServiceControlExecProcLoop(u32ClientID,
     695                                    rc = VBoxServiceControlExecProcLoop(pData,
    688696                                                                        hProcess, pData->uTimeLimitMS, hPollSet,
    689697                                                                        hStdInW, hStdOutR, hStdErrR);
     
    704712                                else /* Something went wrong; report error! */
    705713                                {
    706                                     int rc2 = VbglR3GuestCtrlExecReportStatus(u32ClientID, 0 /* PID */,
     714                                    int rc2 = VbglR3GuestCtrlExecReportStatus(pData->uClientID, pData->uContextID, pData->uPID,
    707715                                                                              PROC_STS_ERROR, rc,
    708716                                                                              NULL /* pvData */, 0 /* cbData */);
     
    726734    }
    727735
    728     VbglR3GuestCtrlDisconnect(u32ClientID);
     736    VbglR3GuestCtrlDisconnect(pData->uClientID);
    729737    VBoxServiceVerbose(3, "Control: Thread of process \"%s\" ended with rc=%Rrc\n", pData->pszCmd, rc);
    730738
     
    743751}
    744752
    745 int VBoxServiceControlExecProcess(const char *pszCmd, uint32_t uFlags,
     753int VBoxServiceControlExecProcess(uint32_t uContextID, const char *pszCmd, uint32_t uFlags,
    746754                                  const char *pszArgs, uint32_t uNumArgs,                                           
    747755                                  const char *pszEnv, uint32_t cbEnv, uint32_t uNumEnvVars,
     
    750758{
    751759    PVBOXSERVICECTRLTHREADDATA pThreadData =
    752         VBoxServiceControlExecAllocateThreadData(pszCmd, uFlags,
     760        VBoxServiceControlExecAllocateThreadData(uContextID,
     761                                                 pszCmd, uFlags,
    753762                                                 pszArgs, uNumArgs,
    754763                                                 pszEnv, cbEnv, uNumEnvVars,
  • trunk/src/VBox/Additions/common/VBoxService/VBoxServiceInternal.h

    r28251 r28286  
    129129typedef struct
    130130{
     131    uint32_t  uClientID;
     132    uint32_t  uContextID;
     133    uint32_t  uPID;
    131134    char     *pszCmd;
    132135    uint32_t  uFlags;
     
    213216
    214217#ifdef VBOX_WITH_GUEST_CONTROL
    215 extern int VBoxServiceControlExecProcess(const char *pszCmd, uint32_t uFlags,
     218extern int VBoxServiceControlExecProcess(uint32_t uContext, const char *pszCmd, uint32_t uFlags,
    216219                                         const char *pszArgs, uint32_t uNumArgs,                                           
    217220                                         const char *pszEnv, uint32_t cbEnv, uint32_t uNumEnvVars,
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