VirtualBox

Changeset 42203 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Jul 18, 2012 10:13:39 AM (13 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
79211
Message:

Additions/Solaris/vboxmouse: do not reply to messages twice, and some clean up.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/solaris/Mouse/vboxmouse.c

    r42043 r42203  
    559559    if (canput(pReadQueue->q_next))
    560560        putnext(pReadQueue, pMBlk);
    561     // else
    562     //     putq(pReadQueue, pMBlk);
     561    else
     562        putq(pReadQueue, pMBlk);
    563563}
    564564
     
    625625
    626626/* Helper for vbmsSolWPut. */
    627 static int vbmsSolDispatchIOCtl(queue_t *pWriteQueue, mblk_t *pMBlk);
     627static int vbmsSolDispatchIOCtl(PVBMSSTATE pState, mblk_t *pMBlk);
    628628
    629629/**
     
    633633int vbmsSolWPut(queue_t *pWriteQueue, mblk_t *pMBlk)
    634634{
    635     LogRelFlowFunc((DEVICE_NAME "::\n"));
     635    LogRelFlowFunc((DEVICE_NAME "::"));
    636636    switch (pMBlk->b_datap->db_type)
    637637    {
    638638        case M_FLUSH:
     639            LogRelFlow(("M_FLUSH, FLUSHW=%RTbool, FLUSHR=%RTbool\n",
     640                        *pMBlk->b_rptr & FLUSHW, *pMBlk->b_rptr & FLUSHR));
    639641            /* Flush the write queue if so requested. */
    640642            if (*pMBlk->b_rptr & FLUSHW)
     
    653655        case M_IOCDATA:
    654656        {
    655             int err = vbmsSolDispatchIOCtl(pWriteQueue, pMBlk);
     657            PVBMSSTATE pState = (PVBMSSTATE)pWriteQueue->q_ptr;
     658            int err;
     659
     660            LogRelFlow((  pMBlk->b_datap->db_type == M_IOCTL
     661                        ? "M_IOCTL\n" : "M_IOCDATA\n"));
     662            err = vbmsSolDispatchIOCtl(pState, pMBlk);
    656663            if (!err)
    657664                qreply(pWriteQueue, pMBlk);
     
    660667            break;
    661668        }
     669        default:
     670            LogRelFlow(("Unknown command, not acknowledging.\n"));
    662671    }
    663672    return 0;
     
    10211030
    10221031/* Helpers for vbmsSolDispatchIOCtl. */
    1023 static int vbmsSolHandleIOCtl(queue_t *pWriteQueue, mblk_t *pMBlk,
     1032static int vbmsSolHandleIOCtl(PVBMSSTATE pState, mblk_t *pMBlk,
    10241033                               PFNVBMSSOLIOCTL pfnHandler,
    1025                                int iCmd, size_t cbTransparent,
     1034                               int iCmd, size_t cbCmd,
    10261035                               enum IOCTLDIRECTION enmDirection);
    10271036static int vbmsSolVUIDIOCtl(PVBMSSTATE pState, int iCmd, void *pvData,
     
    10611070 * respectively.
    10621071 * @returns  0 on success or the IOCtl error code on failure.
    1063  * @param  pWriteQueue  pointer to the STREAMS write queue structure.
     1072 * @param  pState       pointer to the state structure.
    10641073 * @param  pMBlk        pointer to the STREAMS message block structure.
    10651074 */
    1066 static int vbmsSolDispatchIOCtl(queue_t *pWriteQueue, mblk_t *pMBlk)
     1075static int vbmsSolDispatchIOCtl(PVBMSSTATE pState, mblk_t *pMBlk)
    10671076{
    10681077    struct iocblk *pIOCBlk = (struct iocblk *)pMBlk->b_rptr;
     
    10711080    enum IOCTLDIRECTION enmDirection;
    10721081
    1073     LogRelFlowFunc((DEVICE_NAME "::iCmdType=%c, iCmd=0x%x\n",
    1074                  (char) (iCmdType >> 8), (unsigned)iCmd));
     1082    LogRelFlowFunc((DEVICE_NAME "::pIOCBlk=%p, iCmdType=%c, iCmd=0x%x\n",
     1083                    pIOCBlk, (char) (iCmdType >> 8), (unsigned)iCmd));
    10751084    switch (iCmdType)
    10761085    {
     
    10851094                    cbBuffer     = g_aVUIDIOCtlDescriptions[i].cbBuffer;
    10861095                    enmDirection = g_aVUIDIOCtlDescriptions[i].enmDirection;
    1087                     return vbmsSolHandleIOCtl(pWriteQueue, pMBlk,
    1088                                                vbmsSolVUIDIOCtl, iCmd,
    1089                                                cbBuffer, enmDirection);
     1096                    return vbmsSolHandleIOCtl(pState, pMBlk,
     1097                                              vbmsSolVUIDIOCtl, iCmd,
     1098                                              cbBuffer, enmDirection);
    10901099                }
    10911100            return EINVAL;
     
    10981107
    10991108/* Helpers for vbmsSolHandleIOCtl. */
    1100 static int vbmsSolHandleIOCtlData(queue_t *pWriteQueue, mblk_t *pMBlk,
    1101                                    PFNVBMSSOLIOCTL pfnHandler, int iCmd,
    1102                                    size_t cbTransparent,
    1103                                    enum IOCTLDIRECTION enmDirection);
    1104 
    1105 static int vbmsSolHandleTransparentIOCtl(queue_t *pWriteQueue, mblk_t *pMBlk,
    1106                                           PFNVBMSSOLIOCTL pfnHandler,
    1107                                           int iCmd, size_t cbTransparent,
    1108                                           enum IOCTLDIRECTION enmDirection);
    1109 
    1110 static int vbmsSolHandleIStrIOCtl(queue_t *pWriteQueue, mblk_t *pMBlk,
     1109static int vbmsSolHandleIOCtlData(PVBMSSTATE pState, mblk_t *pMBlk,
     1110                                  PFNVBMSSOLIOCTL pfnHandler, int iCmd,
     1111                                  size_t cbCmd,
     1112                                  enum IOCTLDIRECTION enmDirection);
     1113
     1114static int vbmsSolHandleTransparentIOCtl(PVBMSSTATE pState, mblk_t *pMBlk,
     1115                                         PFNVBMSSOLIOCTL pfnHandler,
     1116                                         int iCmd, size_t cbCmd,
     1117                                         enum IOCTLDIRECTION enmDirection);
     1118
     1119static int vbmsSolHandleIStrIOCtl(PVBMSSTATE pState, mblk_t *pMBlk,
    11111120                                   PFNVBMSSOLIOCTL pfnHandler, int iCmd);
     1121
     1122static void vbmsSolAcknowledgeIOCtl(mblk_t *pMBlk, int cbData, int rc)
     1123{
     1124    struct iocblk *pIOCBlk = (struct iocblk *)pMBlk->b_rptr;
     1125
     1126    pMBlk->b_datap->db_type = M_IOCACK;
     1127    pIOCBlk->ioc_count = cbData;
     1128    pIOCBlk->ioc_rval = rc;
     1129    pIOCBlk->ioc_error = 0;
     1130}
    11121131
    11131132/**
     
    11201139 * buffer anyway, but the caller can choose the buffer size).
    11211140 * @returns  0 on success or the IOCtl error code on failure.
    1122  * @param  pWriteQueue    pointer to the STREAMS write queue structure.
     1141 * @param  pState         pointer to the state structure.
    11231142 * @param  pMBlk          pointer to the STREAMS message block structure.
    11241143 * @param  pfnHandler     pointer to the right IOCtl handler function for this
    11251144 *                        IOCtl number.
    11261145 * @param  iCmd           IOCtl command number.
    1127  * @param  cbTransparent  size of the user space buffer for this IOCtl number,
     1146 * @param  cbCmd          size of the user space buffer for this IOCtl number,
    11281147 *                        used for processing transparent IOCtls.  Pass zero
    11291148 *                        for IOCtls with no maximum buffer size (which will
     
    11321151 * @param  enmDirection   data transfer direction of the IOCtl.
    11331152 */
    1134 static int vbmsSolHandleIOCtl(queue_t *pWriteQueue, mblk_t *pMBlk,
    1135                                PFNVBMSSOLIOCTL pfnHandler, int iCmd,
    1136                                size_t cbTransparent,
    1137                                enum IOCTLDIRECTION enmDirection)
     1153static int vbmsSolHandleIOCtl(PVBMSSTATE pState, mblk_t *pMBlk,
     1154                              PFNVBMSSOLIOCTL pfnHandler, int iCmd,
     1155                              size_t cbCmd, enum IOCTLDIRECTION enmDirection)
    11381156{
    11391157    struct iocblk *pIOCBlk = (struct iocblk *)pMBlk->b_rptr;
    11401158
    11411159    LogFlowFunc(("iCmd=0x%x, cbBuffer=%d, enmDirection=%d\n",
    1142                  (unsigned)iCmd, (int)cbTransparent, (int)enmDirection));
     1160                 (unsigned)iCmd, (int)cbCmd, (int)enmDirection));
    11431161    if (pMBlk->b_datap->db_type == M_IOCDATA)
    1144         return vbmsSolHandleIOCtlData(pWriteQueue, pMBlk, pfnHandler, iCmd,
    1145                                        cbTransparent, enmDirection);
     1162        return vbmsSolHandleIOCtlData(pState, pMBlk, pfnHandler, iCmd,
     1163                                      cbCmd, enmDirection);
    11461164    else if (   pMBlk->b_datap->db_type == M_IOCTL
    11471165             && pIOCBlk->ioc_count == TRANSPARENT)
    1148         return vbmsSolHandleTransparentIOCtl(pWriteQueue, pMBlk, pfnHandler,
    1149                                               iCmd, cbTransparent,
    1150                                               enmDirection);
     1166        return vbmsSolHandleTransparentIOCtl(pState, pMBlk, pfnHandler,
     1167                                             iCmd, cbCmd, enmDirection);
    11511168    else if (pMBlk->b_datap->db_type == M_IOCTL)
    1152         return vbmsSolHandleIStrIOCtl(pWriteQueue, pMBlk, pfnHandler, iCmd);
     1169        return vbmsSolHandleIStrIOCtl(pState, pMBlk, pfnHandler, iCmd);
    11531170    return EINVAL;
    11541171}
     
    11611178 * @copydoc vbmsSolHandleIOCtl
    11621179 */
    1163 static int vbmsSolHandleIOCtlData(queue_t *pWriteQueue, mblk_t *pMBlk,
    1164                                    PFNVBMSSOLIOCTL pfnHandler, int iCmd,
    1165                                    size_t cbTransparent,
    1166                                    enum IOCTLDIRECTION enmDirection)
     1180static int vbmsSolHandleIOCtlData(PVBMSSTATE pState, mblk_t *pMBlk,
     1181                                  PFNVBMSSOLIOCTL pfnHandler, int iCmd,
     1182                                  size_t cbCmd,
     1183                                  enum IOCTLDIRECTION enmDirection)
    11671184{
    11681185    struct copyresp *pCopyResp = (struct copyresp *)pMBlk->b_rptr;
    1169     PVBMSSTATE pState = (PVBMSSTATE)pWriteQueue->q_ptr;
    11701186
    11711187    LogFlowFunc(("iCmd=0x%x, cbBuffer=%d, enmDirection=%d, cp_rval=%d, cp_private=%p\n",
    1172                  (unsigned)iCmd, (int)cbTransparent, (int)enmDirection,
     1188                 (unsigned)iCmd, (int)cbCmd, (int)enmDirection,
    11731189                 (int)(uintptr_t)pCopyResp->cp_rval,
    11741190                 (void *)pCopyResp->cp_private));
     
    11891205            return EINVAL;
    11901206        pvData = pMBlk->b_cont->b_rptr;
    1191         err = pfnHandler(pState, iCmd, pvData, cbTransparent, &cbData, NULL);
     1207        err = pfnHandler(pState, iCmd, pvData, cbCmd, &cbData, NULL);
    11921208        if (!err && enmDirection == BOTH)
    11931209            mcopyout(pMBlk, NULL, cbData, pCopyResp->cp_private, NULL);
    11941210        else if (!err && enmDirection == IN)
    1195             miocack(pWriteQueue, pMBlk, 0, 0);
     1211            vbmsSolAcknowledgeIOCtl(pMBlk, 0, 0);
    11961212        return err;
    11971213    }
     
    11991215    {
    12001216        AssertReturn(enmDirection == OUT || enmDirection == BOTH, EINVAL);
    1201         miocack(pWriteQueue, pMBlk, 0, 0);
     1217        vbmsSolAcknowledgeIOCtl(pMBlk, 0, 0);
    12021218        return 0;
    12031219    }
     
    12101226 * @copydoc vbmsSolHandleIOCtl
    12111227 */
    1212 int vbmsSolHandleTransparentIOCtl(queue_t *pWriteQueue, mblk_t *pMBlk,
    1213                                    PFNVBMSSOLIOCTL pfnHandler, int iCmd,
    1214                                    size_t cbTransparent,
    1215                                    enum IOCTLDIRECTION enmDirection)
     1228int vbmsSolHandleTransparentIOCtl(PVBMSSTATE pState, mblk_t *pMBlk,
     1229                                  PFNVBMSSOLIOCTL pfnHandler, int iCmd,
     1230                                  size_t cbCmd,
     1231                                  enum IOCTLDIRECTION enmDirection)
    12161232{
    12171233    int err = 0, rc = 0;
    12181234    size_t cbData = 0;
    1219     PVBMSSTATE pState = (PVBMSSTATE)pWriteQueue->q_ptr;
    12201235
    12211236    LogFlowFunc(("iCmd=0x%x, cbBuffer=%d, enmDirection=%d\n",
    1222                  (unsigned)iCmd, (int)cbTransparent, (int)enmDirection));
     1237                 (unsigned)iCmd, (int)cbCmd, (int)enmDirection));
    12231238    if (   (enmDirection != NONE && !pMBlk->b_cont)
    12241239        || enmDirection == UNSPECIFIED)
     
    12301245        if (enmDirection == BOTH)
    12311246            pUserAddr = *(void **)pMBlk->b_cont->b_rptr;
    1232             mcopyin(pMBlk, pUserAddr /* state data */, cbTransparent, NULL);
     1247            mcopyin(pMBlk, pUserAddr /* state data */, cbCmd, NULL);
    12331248        }
    12341249        else if (enmDirection == OUT)
    12351250    {
    1236         mblk_t *pMBlkOut = allocb(cbTransparent, BPRI_MED);
     1251        mblk_t *pMBlkOut = allocb(cbCmd, BPRI_MED);
    12371252        void *pvData;
    12381253
     
    12401255            return EAGAIN;
    12411256        pvData = pMBlkOut->b_rptr;
    1242         err = pfnHandler(pState, iCmd, pvData, cbTransparent, &cbData, NULL);
     1257        err = pfnHandler(pState, iCmd, pvData, cbCmd, &cbData, NULL);
    12431258        if (!err)
    12441259            mcopyout(pMBlk, NULL, cbData, NULL, pMBlkOut);
     
    12511266        err = pfnHandler(pState, iCmd, NULL, 0, NULL, &rc);
    12521267        if (!err)
    1253             miocack(pWriteQueue, pMBlk, 0, rc);
     1268            vbmsSolAcknowledgeIOCtl(pMBlk, 0, rc);
    12541269    }
    12551270    return err;
     
    12611276 * @copydoc vbmsSolHandleIOCtl
    12621277 */
    1263 static int vbmsSolHandleIStrIOCtl(queue_t *pWriteQueue, mblk_t *pMBlk,
    1264                                    PFNVBMSSOLIOCTL pfnHandler, int iCmd)
     1278static int vbmsSolHandleIStrIOCtl(PVBMSSTATE pState, mblk_t *pMBlk,
     1279                                  PFNVBMSSOLIOCTL pfnHandler, int iCmd)
    12651280{
    12661281    struct iocblk *pIOCBlk = (struct iocblk *)pMBlk->b_rptr;
    1267     PVBMSSTATE pState = (PVBMSSTATE)pWriteQueue->q_ptr;
    12681282    uint_t cbBuffer = pIOCBlk->ioc_count;
    12691283    void *pvData = NULL;
     
    12811295        if (err)
    12821296            return err;
    1283     }
    1284     if (pMBlk->b_cont)  /* consms forgets to set ioc_count. */
    1285     {
    12861297        pvData = pMBlk->b_cont->b_rptr;
    1287         cbBuffer = pMBlk->b_cont->b_wptr - pMBlk->b_cont->b_rptr;
     1298    }
     1299    else if (pMBlk->b_cont)  /* consms forgets to set ioc_count. */
     1300    {
     1301        pvData = pMBlk->b_cont->b_rptr;
     1302        cbBuffer =   pMBlk->b_cont->b_datap->db_lim
     1303                   - pMBlk->b_cont->b_datap->db_base;
    12881304    }
    12891305    err = pfnHandler(pState, iCmd, pvData, cbBuffer, &cbData, &rc);
    12901306    if (!err)
    1291         miocack(pWriteQueue, pMBlk, cbData, rc);
     1307    {
     1308        LogRelFlowFunc(("pMBlk=%p, pMBlk->b_datap=%p, pMBlk->b_rptr=%p\n",
     1309                        pMBlk, pMBlk->b_datap, pMBlk->b_rptr));
     1310        vbmsSolAcknowledgeIOCtl(pMBlk, cbData, rc);
     1311    }
    12921312    return err;
    12931313}
     
    13011321                             size_t cbBuffer, size_t *pcbData, int *prc)
    13021322{
    1303     LogRelFlowFunc((DEVICE_NAME ":: " /* no '\n' */));
     1323    LogRelFlowFunc((DEVICE_NAME "::pvData=%p " /* no '\n' */, pvData));
    13041324    switch (iCmd)
    13051325    {
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