VirtualBox

Changeset 39690 in vbox for trunk/src/VBox/Runtime


Ignore:
Timestamp:
Dec 30, 2011 1:06:50 PM (13 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
75528
Message:

IPRT: Added RTPipeQueryReadable.

Location:
trunk/src/VBox/Runtime
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/r3/os2/pipe-os2.cpp

    r28800 r39690  
    9595}
    9696
     97
     98RTDECL(int) RTPipeQueryReadable(RTPIPE hPipe, size_t *pcbReadable)
     99{
     100    return VERR_NOT_IMPLEMENTED;
     101}
     102
  • trunk/src/VBox/Runtime/r3/posix/pipe-posix.cpp

    r39489 r39690  
    4444#include <limits.h>
    4545#include <unistd.h>
     46#include <sys/ioctl.h>
    4647#include <sys/poll.h>
    4748#include <sys/stat.h>
     
    638639}
    639640
     641
     642RTDECL(int) RTPipeQueryReadable(RTPIPE hPipe, size_t *pcbReadable)
     643{
     644    RTPIPEINTERNAL *pThis = hPipe;
     645    AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
     646    AssertReturn(pThis->u32Magic == RTPIPE_MAGIC, VERR_INVALID_HANDLE);
     647    AssertReturn(pThis->fRead, VERR_PIPE_NOT_READ);
     648    AssertPtrReturn(pcbReadable, VERR_INVALID_POINTER);
     649
     650    int cb = 0;
     651    int rc = ioctl(pThis->fd, FIONREAD, &cb);
     652    if (rc != -1)
     653    {
     654        AssertStmt(cb >= 0, cb = 0);
     655        *pcbReadable = cb;
     656        return VINF_SUCCESS;
     657    }
     658
     659    rc = errno;
     660    if (rc == ENOTTY)
     661        rc = VERR_NOT_SUPPORTED;
     662    else
     663        rc = RTErrConvertFromErrno(rc);
     664    return rc;
     665}
     666
  • trunk/src/VBox/Runtime/r3/win/pipe-win.cpp

    r34119 r39690  
    11481148
    11491149
     1150RTDECL(int) RTPipeQueryReadable(RTPIPE hPipe, size_t *pcbReadable)
     1151{
     1152    RTPIPEINTERNAL *pThis = hPipe;
     1153    AssertPtrReturn(pThis, VERR_INVALID_HANDLE);
     1154    AssertReturn(pThis->u32Magic == RTPIPE_MAGIC, VERR_INVALID_HANDLE);
     1155    AssertReturn(pThis->fRead, VERR_PIPE_NOT_READ);
     1156    AssertPtrReturn(pcbReadable, VERR_INVALID_POINTER);
     1157
     1158    int rc = RTCritSectEnter(&pThis->CritSect);
     1159    if (RT_FAILURE(rc))
     1160        return rc;
     1161
     1162    DWORD cbAvailable = 0;
     1163    if (PeekNamedPipe(pThis->hPipe, NULL, 0, NULL, &cbAvailable, NULL)
     1164        *pcbReadable = cbAvailable;
     1165    else
     1166        rc = RTErrConvertFromWin32(GetLastError());
     1167
     1168    RTCritSectLeave(&pThis->CritSect);
     1169    return rc;
     1170}
     1171
     1172
    11501173/**
    11511174 * Internal RTPollSetAdd helper that returns the handle that should be added to
  • trunk/src/VBox/Runtime/testcase/tstRTPipe.cpp

    r38636 r39690  
    351351    RTTESTI_CHECK_RC_RETV(RTPipeWrite(hPipeW, "BigQ", 4, &cbWritten), VINF_SUCCESS);
    352352    RTTESTI_CHECK_RETV(cbWritten == 4);
    353     cbRead = ~(size_t)0;
    354353    RTTESTI_CHECK_RC_RETV(RTPipeSelectOne(hPipeR, 0), VINF_SUCCESS);
    355354    RTTESTI_CHECK_RC_RETV(RTPipeSelectOne(hPipeR, 1), VINF_SUCCESS);
     355    cbRead = ~(size_t)0;
     356    RTTESTI_CHECK_RC_RETV(RTPipeQueryReadable(hPipeR, &cbRead), VINF_SUCCESS);
     357    RTTESTI_CHECK_MSG(cbRead == cbWritten, ("cbRead=%zu cbWritten=%zu\n", cbRead, cbWritten));
     358    cbRead = ~(size_t)0;
    356359    RTTESTI_CHECK_RC_RETV(RTPipeRead(hPipeR, abBuf, sizeof(abBuf), &cbRead), VINF_SUCCESS);
    357360    RTTESTI_CHECK_RETV(cbRead == 4);
     
    362365    RTTESTI_CHECK_RETV(cbWritten == 4);
    363366    cbRead = ~(size_t)0;
     367    RTTESTI_CHECK_RC_RETV(RTPipeQueryReadable(hPipeR, &cbRead), VINF_SUCCESS);
     368    RTTESTI_CHECK_MSG(cbRead == cbWritten, ("cbRead=%zu cbWritten=%zu\n", cbRead, cbWritten));
     369    cbRead = ~(size_t)0;
    364370    RTTESTI_CHECK_RC_RETV(RTPipeRead(hPipeR, &abBuf[0], 1, &cbRead), VINF_SUCCESS);
    365371    RTTESTI_CHECK_RETV(cbRead == 1);
    366372    cbRead = ~(size_t)0;
     373    RTTESTI_CHECK_RC_RETV(RTPipeQueryReadable(hPipeR, &cbRead), VINF_SUCCESS);
     374    RTTESTI_CHECK_MSG(cbRead == cbWritten - 1, ("cbRead=%zu cbWritten=%zu\n", cbRead, cbWritten));
     375    cbRead = ~(size_t)0;
    367376    RTTESTI_CHECK_RC_RETV(RTPipeRead(hPipeR, &abBuf[1], 1, &cbRead), VINF_SUCCESS);
    368377    RTTESTI_CHECK_RETV(cbRead == 1);
    369378    cbRead = ~(size_t)0;
     379    RTTESTI_CHECK_RC_RETV(RTPipeQueryReadable(hPipeR, &cbRead), VINF_SUCCESS);
     380    RTTESTI_CHECK_MSG(cbRead == cbWritten - 2, ("cbRead=%zu cbWritten=%zu\n", cbRead, cbWritten));
     381    cbRead = ~(size_t)0;
    370382    RTTESTI_CHECK_RC_RETV(RTPipeRead(hPipeR, &abBuf[2], 1, &cbRead), VINF_SUCCESS);
    371383    RTTESTI_CHECK_RETV(cbRead == 1);
     384    cbRead = ~(size_t)0;
     385    RTTESTI_CHECK_RC_RETV(RTPipeQueryReadable(hPipeR, &cbRead), VINF_SUCCESS);
     386    RTTESTI_CHECK_MSG(cbRead == cbWritten - 3, ("cbRead=%zu cbWritten=%zu\n", cbRead, cbWritten));
    372387    cbRead = ~(size_t)0;
    373388    RTTESTI_CHECK_RC_RETV(RTPipeRead(hPipeR, &abBuf[3], 1, &cbRead), VINF_SUCCESS);
    374389    RTTESTI_CHECK_RETV(cbRead == 1);
    375390    RTTESTI_CHECK_RETV(!memcmp(abBuf, "H2G2", 4));
     391    cbRead = ~(size_t)0;
     392    RTTESTI_CHECK_RC_RETV(RTPipeQueryReadable(hPipeR, &cbRead), VINF_SUCCESS);
     393    RTTESTI_CHECK_MSG(cbRead == cbWritten - 4, ("cbRead=%zu cbWritten=%zu\n", cbRead, cbWritten));
    376394
    377395    RTTESTI_CHECK_RC_RETV(RTPipeClose(hPipeR), VINF_SUCCESS);
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette