Changeset 3142 in vbox for trunk/src/VBox/Additions/linux/module
- Timestamp:
- Jun 18, 2007 2:36:56 PM (18 years ago)
- svn:sync-xref-src-repo-rev:
- 22047
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/linux/module/vboxmod.c
r2980 r3142 277 277 address space. */ 278 278 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; 279 375 } 280 376
Note:
See TracChangeset
for help on using the changeset viewer.