VirtualBox

Changeset 33159 in vbox


Ignore:
Timestamp:
Oct 15, 2010 12:33:13 PM (14 years ago)
Author:
vboxsync
Message:

VBoxService/Guest Execution: Update.

File:
1 edited

Legend:

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

    r33064 r33159  
    105105    {
    106106        size_t cbToWrite = pStdInBuf->cbSize - pStdInBuf->cbProcessed;
    107         int rc = VINF_SUCCESS;
     107#ifdef DEBUG
     108        VBoxServiceVerbose(4, "ControlExec: Write StdIn: cbToWrite=%u, cbSize=%u, cbProc=%u\n",
     109                               cbToWrite, pStdInBuf->cbSize, pStdInBuf->cbProcessed);
     110#endif
    108111        if (cbToWrite && pStdInBuf->fAlive)
    109112        {
    110113            rc = RTPipeWrite(hStdInW, &pStdInBuf->pbData[pStdInBuf->cbProcessed], cbToWrite, pcbWritten);
    111             if (RT_SUCCESS(rc))
     114            if (   RT_SUCCESS(rc)
     115                && rc != VINF_TRY_AGAIN)
    112116            {
    113117                Assert(*pcbWritten <= cbToWrite);
     
    115119            }
    116120            else
     121            {
    117122                *pcbWritten = 0;
    118         }
    119         else
    120             rc = VERR_BAD_PIPE;
     123                pStdInBuf->fAlive = false;
     124            }
     125#ifdef DEBUG
     126            VBoxServiceVerbose(4, "ControlExec: Written StdIn: rc=%Rrc, cbAlloc=%u, cbSize=%u, cbProc=%u, pcbWritten=%u\n",
     127                               rc, pStdInBuf->cbAllocated, pStdInBuf->cbSize,
     128                               pStdInBuf->cbProcessed, *pcbWritten);
     129#endif
     130        }
     131        /*else
     132            rc = VERR_BAD_PIPE;*/
    121133        int rc2 = RTCritSectLeave(&pStdInBuf->CritSect);
    122134        if (RT_SUCCESS(rc))
     
    136148 * @param   phStdInW            The standard input pipe.
    137149 * @param   pStdInBuf           The standard input buffer.
     150 * @param   pcbWritten
    138151 */
    139152static int  VBoxServiceControlExecProcHandleStdInWritableEvent(RTPOLLSET hPollSet, uint32_t fPollEvt, PRTPIPE phStdInW,
    140                                                                PVBOXSERVICECTRLEXECPIPEBUF pStdInBuf)
    141 {
     153                                                               PVBOXSERVICECTRLEXECPIPEBUF pStdInBuf, size_t *pcbWritten)
     154{
     155    AssertPtrReturn(pcbWritten, VERR_INVALID_PARAMETER);
     156#ifdef DEBUG
    142157    VBoxServiceVerbose(4, "ControlExec: HandleStdInWritableEvent: fPollEvt=%#x\n", fPollEvt);
    143 
     158#endif
    144159    int rc = VINF_SUCCESS;
    145160    if (!(fPollEvt & RTPOLL_EVT_ERROR))
    146161    {
    147         size_t cbWritten;
    148         rc = VBoxServiceControlExecProcWriteStdIn(pStdInBuf, *phStdInW, &cbWritten);
     162        rc = VBoxServiceControlExecProcWriteStdIn(pStdInBuf, *phStdInW, pcbWritten);
    149163        if (   RT_FAILURE(rc)
    150164            && rc != VERR_BAD_PIPE)
     
    153167            AssertRC(rc);
    154168        }
    155 
    156         /* No more data to write to stdin? Then remove stdin from poll set. */
    157         if (   cbWritten <= 0
    158             || rc == VERR_BAD_PIPE)
    159         {
     169        else if (/*   *pcbWritten <= 0
     170                 ||*/  rc == VERR_BAD_PIPE)
     171        {
     172            /* No (more) data to write to stdin? Then remove stdin from poll set. */
    160173            rc = RTPollSetRemove(hPollSet, VBOXSERVICECTRLPIPEID_STDIN_WRITABLE);
    161174            AssertRC(rc);
     
    167180}
    168181
    169 
     182/**
     183 *
     184 *
     185 * @returns IPRT status code.
     186 * @param   hPollSet
     187 * @param   fPollEvt
     188 * @param   phStdInW
     189 * @param   uHandleId
     190 * @param   pStdInBuf
     191 */
    170192static int VBoxServiceControlExecProcHandleInputEvent(RTPOLLSET hPollSet, uint32_t fPollEvt, PRTPIPE phStdInW,
    171193                                                      uint32_t uHandleId, PVBOXSERVICECTRLEXECPIPEBUF pStdInBuf)
    172194{
     195#ifdef DEBUG
    173196    VBoxServiceVerbose(4, "ControlExec: HandleInputEvent: fPollEvt=%#x\n", fPollEvt);
    174 
     197#endif
    175198    int rc = VINF_SUCCESS;
    176199    if (fPollEvt & RTPOLL_EVT_ERROR)
     
    240263
    241264    /*
    242      * If an error was raised signalled,
     265     * If an error was signalled, close reading stdout pipe.
    243266     */
    244267    if (fPollEvt & RTPOLL_EVT_ERROR)
     
    327350        if (RT_SUCCESS(rc2))
    328351        {
     352#ifdef DEBUG
    329353            VBoxServiceVerbose(4, "ControlExec: RTPollNoResume idPollHnd=%u\n", idPollHnd);
     354#endif
    330355            switch (idPollHnd)
    331356            {
     
    336361
    337362                case VBOXSERVICECTRLPIPEID_STDIN_WRITABLE:
    338                     rc = VBoxServiceControlExecProcHandleStdInWritableEvent(hPollSet, fPollEvt, &hStdInW, &pData->stdIn);
     363                {
     364                    uint32_t cbWritten;
     365                    rc = VBoxServiceControlExecProcHandleStdInWritableEvent(hPollSet, fPollEvt, &hStdInW,
     366                                                                            &pData->stdIn, &cbWritten);
     367                    if (RT_SUCCESS(rc))
     368                    {
     369                        rc = VbglR3GuestCtrlExecReportStatusIn(pThread->uClientID, pThread->uContextID, pData->uPID,
     370                                                               0 /* Flags */, cbWritten);
     371                    }
    339372                    break;
     373                }
    340374
    341375                case VBOXSERVICECTRLPIPEID_STDOUT:
     
    597631    pBuf->cbSize = 0;
    598632    pBuf->cbProcessed = 0;
    599     pBuf->fAlive = true;
     633    pBuf->fAlive = false;
    600634
    601635    return RTCritSectInit(&pBuf->CritSect);
     
    612646        pBuf->cbSize = 0;
    613647        pBuf->cbProcessed = 0;
    614     }
    615     pBuf->fAlive = false;
     648        pBuf->fAlive = false;
     649    }
    616650    return RTCritSectDelete(&pBuf->CritSect);
    617651}
     
    656690    if (RT_SUCCESS(rc))
    657691    {
    658         if (pBuf->fAlive)
    659         {
     692        /*if (pBuf->fAlive)
     693        {*/
    660694            /** @todo Buffer size limit! 4MB */
    661695
     
    677711                pBuf->cbSize += cbData;
    678712                /** @todo Add offset clamping! */
     713                pBuf->fAlive = true;
    679714            }
    680715            else
    681716                rc = VERR_NO_MEMORY;
    682         }
     717        //}
    683718        int rc2 = RTCritSectLeave(&pBuf->CritSect);
    684719        if (RT_SUCCESS(rc))
     
    11891224        VBoxServiceError("ControlExec: Failed to retrieve exec input command! Error: %Rrc\n", rc);
    11901225    }
    1191     else
    1192     {
     1226    else if (   cbSize > 0
     1227             && cbSize < sizeof(aBuffer))
     1228    {
     1229#ifdef DEBUG
     1230        VBoxServiceVerbose(4, "ControlExec: Input (PID %u) received: cbSize=%u\n", uPID, cbSize);
     1231#endif
    11931232        PVBOXSERVICECTRLTHREAD pNode = VBoxServiceControlExecFindProcess(uPID);
    11941233        if (pNode)
     
    11991238            if (RT_SUCCESS(rc))
    12001239            {
     1240#ifdef DEBUG
     1241                VBoxServiceVerbose(4, "ControlExec: Written to StdIn buffer (PID %u): cbAlloc=%u, cbSize=%u, cbProc=%u\n",
     1242                                   uPID, pData->stdIn.cbAllocated, pData->stdIn.cbSize,
     1243                                   pData->stdIn.cbProcessed);
     1244#endif
     1245#if 0
    12011246                size_t cbWritten;
    12021247                rc = VBoxServiceControlExecProcWriteStdIn(&pData->stdIn, pData->pipeStdInW, &cbWritten);
    12031248                if (RT_SUCCESS(rc))
     1249                {
    12041250                    rc = VbglR3GuestCtrlExecReportStatusIn(u32ClientId, uContextID, uPID, 0 /* Flags */,
    12051251                                                           cbWritten);
     1252                }
     1253#endif
    12061254            }
    12071255        }
     
    12091257            rc = VERR_NOT_FOUND; /* PID not found! */
    12101258    }
     1259    else
     1260        rc = VERR_INVALID_PARAMETER;
    12111261    VBoxServiceVerbose(3, "ControlExec: VBoxServiceControlExecHandleCmdSetInput returned with %Rrc\n", rc);
    12121262    return rc;
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