VirtualBox

Ignore:
Timestamp:
Jun 18, 2007 2:36:56 PM (18 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
22047
Message:

Moved the X11 guest clipboard connection and disconnection code into the additions kernel module to deal with problems when the client is terminated too abruptly

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/linux/module/vboxmod.c

    r2980 r3142  
    277277               address space. */
    278278            return vbox_ioctl_hgcm_call(arg, vboxDev);
     279        }
     280
     281        case IOCTL_VBOXGUEST_CLIPBOARD_CONNECT:
     282        {
     283            static uint32_t u32ClientID = 0;
     284            VMMDevHGCMDisconnect *reqDisconnect = NULL;
     285            VMMDevHGCMConnect *reqConnect = NULL;
     286            size_t cbRequestSize;
     287            int rc;
     288
     289            /* First, disconnect any old client. */
     290            if (u32ClientID != 0)
     291            {
     292                /* get the request size */
     293                cbRequestSize = vmmdevGetRequestSize(VMMDevReq_HGCMDisconnect);
     294                /* request storage for the request */
     295                rc = VbglGRAlloc((VMMDevRequestHeader **) &reqDisconnect, cbRequestSize,
     296                                 VMMDevReq_HGCMDisconnect);
     297                if (VBOX_FAILURE(rc))
     298                {
     299                    printk(KERN_ERR
     300                          "vboxadd_ioctl: could not allocate request structure! rc = %d\n", rc);
     301                    return -EFAULT;
     302                }
     303                /* now get the full request */
     304                vmmdevInitRequest(&reqDisconnect->header.header, VMMDevReq_HGCMDisconnect);
     305                reqDisconnect->u32ClientID = u32ClientID;
     306
     307                /* now issue the request */
     308                rc = VbglGRPerform(&reqDisconnect->header.header);
     309
     310                /* asynchronous processing? */
     311                if (rc == VINF_HGCM_ASYNC_EXECUTE)
     312                {
     313                    VMMDevHGCMRequestHeader *reqHGCM = &reqDisconnect->header;
     314                    wait_event (vboxDev->eventq, reqHGCM->fu32Flags & VBOX_HGCM_REQ_DONE);
     315                    rc = reqHGCM->header.rc;
     316                }
     317
     318                /* failed? */
     319                if (VBOX_FAILURE(rc) || VBOX_FAILURE(reqDisconnect->header.header.rc))
     320                {
     321                    printk(KERN_ERR "vboxadd_ioctl: request execution failed!\n");
     322                    VbglGRFree(&reqDisconnect->header.header);
     323                    return -EFAULT;
     324                }
     325            }
     326
     327            /* And connect... */
     328            /* get the request size */
     329            cbRequestSize = vmmdevGetRequestSize(VMMDevReq_HGCMConnect);
     330            /* request storage for the request */
     331            rc = VbglGRAlloc((VMMDevRequestHeader **) &reqConnect, cbRequestSize, VMMDevReq_HGCMConnect);
     332            if (VBOX_FAILURE(rc))
     333            {
     334                printk(KERN_ERR
     335                       "vboxadd_ioctl: could not allocate request structure! rc = %d\n", rc);
     336                return -EFAULT;
     337            }
     338            /* now get the full request */
     339            vmmdevInitRequest((VMMDevRequestHeader*)reqConnect, VMMDevReq_HGCMConnect);
     340            reqConnect->loc.type = VMMDevHGCMLoc_LocalHost_Existing;
     341            strcpy (reqConnect->loc.u.host.achName, "VBoxSharedClipboard");
     342
     343            /* now issue the request */
     344            rc = VbglGRPerform(&reqConnect->header.header);
     345
     346            /* asynchronous processing? */
     347            if (rc == VINF_HGCM_ASYNC_EXECUTE)
     348            {
     349                VMMDevHGCMRequestHeader *reqHGCM = &reqConnect->header;
     350                wait_event (vboxDev->eventq, reqHGCM->fu32Flags & VBOX_HGCM_REQ_DONE);
     351                rc = reqHGCM->header.rc;
     352            }
     353
     354            /* failed? */
     355            if (VBOX_FAILURE(rc) || VBOX_FAILURE(reqConnect->header.header.rc))
     356            {
     357                printk(KERN_ERR "vboxadd_ioctl: request execution failed!\n");
     358                VbglGRFree(&reqConnect->header.header);
     359                return -EFAULT;
     360            }
     361            else
     362            {
     363                /* success, copy the result data to user space */
     364                u32ClientID = reqConnect->u32ClientID;
     365                if (copy_to_user((void*)arg, (void*)&(reqConnect->u32ClientID), sizeof(uint32_t)))
     366                {
     367                    printk(KERN_ERR
     368                           "vboxadd_ioctl: error copying request result to user space!\n");
     369                    VbglGRFree(&reqConnect->header.header);
     370                    return -EFAULT;
     371                }
     372            }
     373            VbglGRFree(&reqConnect->header.header);
     374            break;
    279375        }
    280376
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