/usr/src/virtualbox-guest-4.1.42/vboxguest/VBoxGuestIDC-unix.c.h is in virtualbox-guest-dkms 4.1.42-dfsg-1+deb7u1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 | /* $Rev: 74164 $ */
/** @file
* VBoxGuest - Inter Driver Communication, unix implementation.
*
* This file is included by the platform specific source file.
*/
/*
* Copyright (C) 2006-2009 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
* you can redistribute it and/or modify it under the terms of the GNU
* General Public License (GPL) as published by the Free Software
* Foundation, in version 2 as it comes in the "COPYING" file of the
* VirtualBox OSE distribution. VirtualBox OSE is distributed in the
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
* Some lines of code to disable the local APIC on x86_64 machines taken
* from a Mandriva patch by Gwenole Beauchesne <gbeauchesne@mandriva.com>.
*/
/** @todo Use some header that we have in common with VBoxGuestLib.h... */
DECLVBGL(void *) VBoxGuestIDCOpen(uint32_t *pu32Version);
DECLVBGL(int) VBoxGuestIDCClose(void *pvSession);
DECLVBGL(int) VBoxGuestIDCCall(void *pvSession, unsigned iCmd, void *pvData, size_t cbData, size_t *pcbDataReturned);
/**
* Open a new IDC connection.
*
* @returns Opaque pointer to session object.
* @param pu32Version Where to store VMMDev version.
*/
DECLVBGL(void *) VBoxGuestIDCOpen(uint32_t *pu32Version)
{
PVBOXGUESTSESSION pSession;
int rc;
LogFlow(("VBoxGuestIDCOpen: Version=%#x\n", pu32Version ? *pu32Version : 0));
AssertPtrReturn(pu32Version, NULL);
#ifdef RT_OS_SOLARIS
mutex_enter(&g_LdiMtx);
if (!g_LdiHandle)
{
ldi_ident_t DevIdent = ldi_ident_from_anon();
rc = ldi_open_by_name(VBOXGUEST_DEVICE_NAME, FREAD, kcred, &g_LdiHandle, DevIdent);
ldi_ident_release(DevIdent);
if (rc)
{
LogRel(("VBoxGuestIDCOpen: ldi_open_by_name failed. rc=%d\n", rc));
mutex_exit(&g_LdiMtx);
return NULL;
}
}
++g_cLdiOpens;
mutex_exit(&g_LdiMtx);
#endif
rc = VBoxGuestCreateKernelSession(&g_DevExt, &pSession);
if (RT_SUCCESS(rc))
{
*pu32Version = VMMDEV_VERSION;
return pSession;
}
#ifdef RT_OS_SOLARIS
mutex_enter(&g_LdiMtx);
if (g_cLdiOpens > 0)
--g_cLdiOpens;
if ( g_cLdiOpens == 0
&& g_LdiHandle)
{
ldi_close(g_LdiHandle, FREAD, kcred);
g_LdiHandle = NULL;
}
mutex_exit(&g_LdiMtx);
#endif
LogRel(("VBoxGuestIDCOpen: VBoxGuestCreateKernelSession failed. rc=%d\n", rc));
return NULL;
}
/**
* Close an IDC connection.
*
* @returns VBox error code.
* @param pvState Opaque pointer to the session object.
*/
DECLVBGL(int) VBoxGuestIDCClose(void *pvSession)
{
PVBOXGUESTSESSION pSession = (PVBOXGUESTSESSION)pvSession;
LogFlow(("VBoxGuestIDCClose:\n"));
AssertPtrReturn(pSession, VERR_INVALID_POINTER);
VBoxGuestCloseSession(&g_DevExt, pSession);
#ifdef RT_OS_SOLARIS
mutex_enter(&g_LdiMtx);
if (g_cLdiOpens > 0)
--g_cLdiOpens;
if ( g_cLdiOpens == 0
&& g_LdiHandle)
{
ldi_close(g_LdiHandle, FREAD, kcred);
g_LdiHandle = NULL;
}
mutex_exit(&g_LdiMtx);
#endif
return VINF_SUCCESS;
}
/**
* Perform an IDC call.
*
* @returns VBox error code.
* @param pvSession Opaque pointer to the session.
* @param iCmd Requested function.
* @param pvData IO data buffer.
* @param cbData Size of the data buffer.
* @param pcbDataReturned Where to store the amount of returned data.
*/
DECLVBGL(int) VBoxGuestIDCCall(void *pvSession, unsigned iCmd, void *pvData, size_t cbData, size_t *pcbDataReturned)
{
PVBOXGUESTSESSION pSession = (PVBOXGUESTSESSION)pvSession;
LogFlow(("VBoxGuestIDCCall: %pvSession=%p Cmd=%u pvData=%p cbData=%d\n", pvSession, iCmd, pvData, cbData));
AssertPtrReturn(pSession, VERR_INVALID_POINTER);
AssertMsgReturn(pSession->pDevExt == &g_DevExt,
("SC: %p != %p\n", pSession->pDevExt, &g_DevExt), VERR_INVALID_HANDLE);
return VBoxGuestCommonIOCtl(iCmd, &g_DevExt, pSession, pvData, cbData, pcbDataReturned);
}
|