VirtualBox

Changeset 39544 in vbox


Ignore:
Timestamp:
Dec 6, 2011 9:46:22 PM (13 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
75252
Message:

HostServices/SharedFolders: support multiple simultaneous connections to the service from one guest.

Location:
trunk/src/VBox/HostServices/SharedFolders
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostServices/SharedFolders/shflhandle.cpp

    r28800 r39544  
    3030typedef struct
    3131{
    32     uint32_t    uFlags;
    33     uintptr_t   pvUserData;
     32    uint32_t         uFlags;
     33    uintptr_t        pvUserData;
     34    PSHFLCLIENTDATA  pClient;
    3435} SHFLINTHANDLE, *PSHFLINTHANDLE;
    3536
     
    6768}
    6869
    69 SHFLHANDLE  vbsfAllocHandle(uint32_t uType, uintptr_t pvUserData)
     70SHFLHANDLE  vbsfAllocHandle(PSHFLCLIENTDATA pClient, uint32_t uType,
     71                            uintptr_t pvUserData)
    7072{
    7173    SHFLHANDLE handle;
     
    111113    pHandles[handle].uFlags     = (uType & SHFL_HF_TYPE_MASK) | SHFL_HF_VALID;
    112114    pHandles[handle].pvUserData = pvUserData;
     115    pHandles[handle].pClient    = pClient;
    113116
    114117    lastHandleIndex++;
     
    119122}
    120123
    121 int vbsfFreeHandle(SHFLHANDLE handle)
    122 {
    123     if (handle < SHFLHANDLE_MAX && (pHandles[handle].uFlags & SHFL_HF_VALID))
     124static int vbsfFreeHandle(PSHFLCLIENTDATA pClient, SHFLHANDLE handle)
     125{
     126    if (   handle < SHFLHANDLE_MAX
     127        && (pHandles[handle].uFlags & SHFL_HF_VALID)
     128        && pHandles[handle].pClient == pClient)
    124129    {
    125130        pHandles[handle].uFlags     = 0;
    126131        pHandles[handle].pvUserData = 0;
     132        pHandles[handle].pClient    = 0;
    127133        return VINF_SUCCESS;
    128134    }
     
    130136}
    131137
    132 uintptr_t vbsfQueryHandle(SHFLHANDLE handle, uint32_t uType)
    133 {
    134     if (handle < SHFLHANDLE_MAX && (pHandles[handle].uFlags & SHFL_HF_VALID))
     138uintptr_t vbsfQueryHandle(PSHFLCLIENTDATA pClient, SHFLHANDLE handle,
     139                          uint32_t uType)
     140{
     141    if (   handle < SHFLHANDLE_MAX
     142        && (pHandles[handle].uFlags & SHFL_HF_VALID)
     143        && pHandles[handle].pClient == pClient)
    135144    {
    136145        Assert((uType & SHFL_HF_TYPE_MASK) != 0);
     
    142151}
    143152
    144 SHFLHANDLE vbsfAllocDirHandle (void)
     153SHFLFILEHANDLE *vbsfQueryFileHandle(PSHFLCLIENTDATA pClient, SHFLHANDLE handle)
     154{
     155    return (SHFLFILEHANDLE *)vbsfQueryHandle(pClient, handle,
     156                                             SHFL_HF_TYPE_FILE);
     157}
     158
     159SHFLFILEHANDLE *vbsfQueryDirHandle(PSHFLCLIENTDATA pClient, SHFLHANDLE handle)
     160{
     161    return (SHFLFILEHANDLE *)vbsfQueryHandle(pClient, handle,
     162                                             SHFL_HF_TYPE_DIR);
     163}
     164
     165uint32_t vbsfQueryHandleType(PSHFLCLIENTDATA pClient, SHFLHANDLE handle)
     166{
     167    if (   handle < SHFLHANDLE_MAX
     168        && (pHandles[handle].uFlags & SHFL_HF_VALID)
     169        && pHandles[handle].pClient == pClient)
     170        return pHandles[handle].uFlags & SHFL_HF_TYPE_MASK;
     171    else
     172        return 0;
     173}
     174
     175SHFLHANDLE vbsfAllocDirHandle(PSHFLCLIENTDATA pClient)
    145176{
    146177    SHFLFILEHANDLE *pHandle = (SHFLFILEHANDLE *)RTMemAllocZ (sizeof (SHFLFILEHANDLE));
     
    149180    {
    150181        pHandle->Header.u32Flags = SHFL_HF_TYPE_DIR;
    151         return vbsfAllocHandle(pHandle->Header.u32Flags, (uintptr_t)pHandle);
     182        return vbsfAllocHandle(pClient, pHandle->Header.u32Flags,
     183                               (uintptr_t)pHandle);
    152184    }
    153185
     
    155187}
    156188
    157 SHFLHANDLE vbsfAllocFileHandle (void)
     189SHFLHANDLE vbsfAllocFileHandle(PSHFLCLIENTDATA pClient)
    158190{
    159191    SHFLFILEHANDLE *pHandle = (SHFLFILEHANDLE *)RTMemAllocZ (sizeof (SHFLFILEHANDLE));
     
    162194    {
    163195        pHandle->Header.u32Flags = SHFL_HF_TYPE_FILE;
    164         return vbsfAllocHandle(pHandle->Header.u32Flags, (uintptr_t)pHandle);
     196        return vbsfAllocHandle(pClient, pHandle->Header.u32Flags,
     197                               (uintptr_t)pHandle);
    165198    }
    166199
     
    168201}
    169202
    170 void vbsfFreeFileHandle (SHFLHANDLE hHandle)
    171 {
    172     SHFLFILEHANDLE *pHandle = (SHFLFILEHANDLE *)vbsfQueryHandle(hHandle, SHFL_HF_TYPE_DIR|SHFL_HF_TYPE_FILE);
     203void vbsfFreeFileHandle(PSHFLCLIENTDATA pClient, SHFLHANDLE hHandle)
     204{
     205    SHFLFILEHANDLE *pHandle = (SHFLFILEHANDLE *)vbsfQueryHandle(pClient,
     206               hHandle, SHFL_HF_TYPE_DIR|SHFL_HF_TYPE_FILE);
    173207
    174208    if (pHandle)
    175209    {
    176         vbsfFreeHandle(hHandle);
     210        vbsfFreeHandle(pClient, hHandle);
    177211        RTMemFree (pHandle);
    178212    }
  • trunk/src/VBox/HostServices/SharedFolders/shflhandle.h

    r28800 r39544  
    6060
    6161
    62 SHFLHANDLE      vbsfAllocDirHandle (void);
    63 SHFLHANDLE      vbsfAllocFileHandle (void);
    64 void            vbsfFreeFileHandle (SHFLHANDLE hHandle);
     62SHFLHANDLE      vbsfAllocDirHandle(PSHFLCLIENTDATA pClient);
     63SHFLHANDLE      vbsfAllocFileHandle(PSHFLCLIENTDATA pClient);
     64void            vbsfFreeFileHandle (PSHFLCLIENTDATA pClient, SHFLHANDLE hHandle);
    6565
    6666
    6767int         vbsfInitHandleTable();
    6868int         vbsfFreeHandleTable();
    69 SHFLHANDLE  vbsfAllocHandle(uint32_t uType, uintptr_t pvUserData);
    70 uintptr_t   vbsfQueryHandle(SHFLHANDLE handle, uint32_t uType);
    71 int         vbsfFreeHandle(SHFLHANDLE handle);
     69SHFLHANDLE  vbsfAllocHandle(PSHFLCLIENTDATA pClient, uint32_t uType,
     70                            uintptr_t pvUserData);
     71SHFLFILEHANDLE *vbsfQueryFileHandle(PSHFLCLIENTDATA pClient,
     72                                    SHFLHANDLE handle);
     73SHFLFILEHANDLE *vbsfQueryDirHandle(PSHFLCLIENTDATA pClient, SHFLHANDLE handle);
     74uint32_t        vbsfQueryHandleType(PSHFLCLIENTDATA pClient,
     75                                    SHFLHANDLE handle);
    7276
    7377#endif /* __SHFLHANDLE__H */
  • trunk/src/VBox/HostServices/SharedFolders/vbsf.cpp

    r39542 r39544  
    858858    if (RT_SUCCESS(rc))
    859859    {
    860         handle  = vbsfAllocFileHandle();
     860        handle  = vbsfAllocFileHandle(pClient);
    861861    }
    862862    if (SHFL_HANDLE_NIL != handle)
    863863    {
    864864        rc = VERR_NO_MEMORY;  /* If this fails - rewritten immediately on success. */
    865         pHandle = (SHFLFILEHANDLE *)vbsfQueryHandle(handle, SHFL_HF_TYPE_FILE);
     865        pHandle = vbsfQueryFileHandle(pClient, handle);
    866866    }
    867867    if (0 != pHandle)
     
    986986        if (SHFL_HANDLE_NIL != handle)
    987987        {
    988             vbsfFreeFileHandle (handle);
     988            vbsfFreeFileHandle(pClient, handle);
    989989        }
    990990        pParms->Handle = SHFL_HANDLE_NIL;
     
    10161016 * @note folders are created with fMode = 0777
    10171017 */
    1018 static int vbsfOpenDir (const char *pszPath, SHFLCREATEPARMS *pParms)
     1018static int vbsfOpenDir(SHFLCLIENTDATA *pClient, const char *pszPath,
     1019                       SHFLCREATEPARMS *pParms)
    10191020{
    10201021    LogFlow(("vbsfOpenDir: pszPath = %s, pParms = %p\n", pszPath, pParms));
     
    10221023
    10231024    int rc = VERR_NO_MEMORY;
    1024     SHFLHANDLE      handle = vbsfAllocDirHandle();
    1025     SHFLFILEHANDLE *pHandle = (SHFLFILEHANDLE *)vbsfQueryHandle(handle, SHFL_HF_TYPE_DIR);
     1025    SHFLHANDLE      handle = vbsfAllocDirHandle(pClient);
     1026    SHFLFILEHANDLE *pHandle = vbsfQueryDirHandle(pClient, handle);
    10261027    if (0 != pHandle)
    10271028    {
     
    11011102        if (SHFL_HANDLE_NIL != handle)
    11021103        {
    1103             vbsfFreeFileHandle (handle);
     1104            vbsfFreeFileHandle(pClient, handle);
    11041105        }
    11051106        pParms->Handle = SHFL_HANDLE_NIL;
     
    13251326                if (BIT_FLAG(pParms->CreateFlags, SHFL_CF_DIRECTORY))
    13261327                {
    1327                     rc = vbsfOpenDir (pszFullPath, pParms);
     1328                    rc = vbsfOpenDir(pClient, pszFullPath, pParms);
    13281329                }
    13291330                else
     
    13641365             pClient, Handle));
    13651366
    1366     SHFLFILEHANDLE *pHandle = (SHFLFILEHANDLE *)vbsfQueryHandle(Handle, SHFL_HF_TYPE_DIR|SHFL_HF_TYPE_FILE);
    1367     //Assert(pHandle);
    1368     if (!pHandle)
    1369         return VERR_INVALID_HANDLE;
    1370 
    1371     switch (ShflHandleType (&pHandle->Header))
     1367    uint32_t type = vbsfQueryHandleType(pClient, Handle);
     1368    Assert((type & ~(SHFL_HF_TYPE_DIR | SHFL_HF_TYPE_FILE)) == 0);
     1369
     1370    switch (type & (SHFL_HF_TYPE_DIR | SHFL_HF_TYPE_FILE))
    13721371    {
    13731372        case SHFL_HF_TYPE_DIR:
    13741373        {
    1375             rc = vbsfCloseDir (pHandle);
     1374            rc = vbsfCloseDir(vbsfQueryDirHandle(pClient, Handle));
    13761375            break;
    13771376        }
    13781377        case SHFL_HF_TYPE_FILE:
    13791378        {
    1380             rc = vbsfCloseFile (pHandle);
     1379            rc = vbsfCloseFile(vbsfQueryFileHandle(pClient, Handle));
    13811380            break;
    13821381        }
    13831382        default:
    1384             AssertFailed();
    1385             break;
    1386     }
    1387     vbsfFreeFileHandle(Handle);
     1383            return VERR_INVALID_HANDLE;
     1384    }
     1385    vbsfFreeFileHandle(pClient, Handle);
    13881386
    13891387    Log(("vbsfClose: rc = %Rrc\n", rc));
     
    14061404int vbsfRead  (SHFLCLIENTDATA *pClient, SHFLROOT root, SHFLHANDLE Handle, uint64_t offset, uint32_t *pcbBuffer, uint8_t *pBuffer)
    14071405{
    1408     SHFLFILEHANDLE *pHandle = (SHFLFILEHANDLE *)vbsfQueryHandle(Handle, SHFL_HF_TYPE_FILE);
     1406    SHFLFILEHANDLE *pHandle = vbsfQueryFileHandle(pClient, Handle);
    14091407    size_t count = 0;
    14101408    int rc;
     
    14491447int vbsfWrite (SHFLCLIENTDATA *pClient, SHFLROOT root, SHFLHANDLE Handle, uint64_t offset, uint32_t *pcbBuffer, uint8_t *pBuffer)
    14501448{
    1451     SHFLFILEHANDLE *pHandle = (SHFLFILEHANDLE *)vbsfQueryHandle(Handle, SHFL_HF_TYPE_FILE);
     1449    SHFLFILEHANDLE *pHandle = vbsfQueryFileHandle(pClient, Handle);
    14521450    size_t count = 0;
    14531451    int rc;
     
    14991497int vbsfFlush(SHFLCLIENTDATA *pClient, SHFLROOT root, SHFLHANDLE Handle)
    15001498{
    1501     SHFLFILEHANDLE *pHandle = (SHFLFILEHANDLE *)vbsfQueryHandle(Handle, SHFL_HF_TYPE_FILE);
     1499    SHFLFILEHANDLE *pHandle = vbsfQueryFileHandle(pClient, Handle);
    15021500    int rc = VINF_SUCCESS;
    15031501
     
    15291527                uint32_t *pcbBuffer, uint8_t *pBuffer, uint32_t *pIndex, uint32_t *pcFiles)
    15301528{
    1531     SHFLFILEHANDLE *pHandle = (SHFLFILEHANDLE *)vbsfQueryHandle(Handle, SHFL_HF_TYPE_DIR);
     1529    SHFLFILEHANDLE *pHandle = vbsfQueryDirHandle(pClient, Handle);
    15321530    PRTDIRENTRYEX  pDirEntry = 0, pDirEntryOrg;
    15331531    uint32_t       cbDirEntry, cbBufferOrg;
     
    17721770int vbsfQueryFileInfo(SHFLCLIENTDATA *pClient, SHFLROOT root, SHFLHANDLE Handle, uint32_t flags, uint32_t *pcbBuffer, uint8_t *pBuffer)
    17731771{
    1774     SHFLFILEHANDLE *pHandle = (SHFLFILEHANDLE *)vbsfQueryHandle(Handle, SHFL_HF_TYPE_DIR|SHFL_HF_TYPE_FILE);
     1772    uint32_t type = vbsfQueryHandleType(pClient, Handle);
    17751773    int            rc = VINF_SUCCESS;
    17761774    SHFLFSOBJINFO   *pObjInfo = (SHFLFSOBJINFO *)pBuffer;
     
    17781776
    17791777
    1780     if (pHandle == 0 || pcbBuffer == 0 || pObjInfo == 0 || *pcbBuffer < sizeof(SHFLFSOBJINFO))
     1778    if (   !(type == SHFL_HF_TYPE_DIR || type == SHFL_HF_TYPE_FILE)
     1779        || pcbBuffer == 0
     1780        || pObjInfo == 0
     1781        || *pcbBuffer < sizeof(SHFLFSOBJINFO))
    17811782    {
    17821783        AssertFailed();
     
    17891790    *pcbBuffer  = 0;
    17901791
    1791     if (pHandle->Header.u32Flags & SHFL_HF_TYPE_DIR)
    1792     {
     1792    if (type == SHFL_HF_TYPE_DIR)
     1793    {
     1794        SHFLFILEHANDLE *pHandle = vbsfQueryDirHandle(pClient, Handle);
    17931795        rc = RTDirQueryInfo(pHandle->dir.Handle, &fileinfo, RTFSOBJATTRADD_NOTHING);
    17941796    }
    17951797    else
    17961798    {
     1799        SHFLFILEHANDLE *pHandle = vbsfQueryFileHandle(pClient, Handle);
    17971800        rc = RTFileQueryInfo(pHandle->file.Handle, &fileinfo, RTFSOBJATTRADD_NOTHING);
    17981801#ifdef RT_OS_WINDOWS
     
    18141817static int vbsfSetFileInfo(SHFLCLIENTDATA *pClient, SHFLROOT root, SHFLHANDLE Handle, uint32_t flags, uint32_t *pcbBuffer, uint8_t *pBuffer)
    18151818{
    1816     SHFLFILEHANDLE *pHandle = (SHFLFILEHANDLE *)vbsfQueryHandle(Handle, SHFL_HF_TYPE_DIR|SHFL_HF_TYPE_FILE);
     1819    uint32_t type = vbsfQueryHandleType(pClient, Handle);
    18171820    int             rc = VINF_SUCCESS;
    18181821    SHFLFSOBJINFO  *pSFDEntry;
    18191822
    1820     if (pHandle == 0 || pcbBuffer == 0 || pBuffer == 0 || *pcbBuffer < sizeof(SHFLFSOBJINFO))
     1823    if (   !(type == SHFL_HF_TYPE_DIR || type == SHFL_HF_TYPE_FILE)
     1824        || pcbBuffer == 0
     1825        || pBuffer == 0
     1826        || *pcbBuffer < sizeof(SHFLFSOBJINFO))
    18211827    {
    18221828        AssertFailed();
     
    18301836
    18311837    /* Change only the time values that are not zero */
    1832     if (pHandle->Header.u32Flags & SHFL_HF_TYPE_DIR)
    1833     {
     1838    if (type == SHFL_HF_TYPE_DIR)
     1839    {
     1840        SHFLFILEHANDLE *pHandle = vbsfQueryDirHandle(pClient, Handle);
    18341841        rc = RTDirSetTimes(pHandle->dir.Handle,
    18351842                            (RTTimeSpecGetNano(&pSFDEntry->AccessTime)) ?       &pSFDEntry->AccessTime : NULL,
     
    18411848    else
    18421849    {
     1850        SHFLFILEHANDLE *pHandle = vbsfQueryFileHandle(pClient, Handle);
    18431851        rc = RTFileSetTimes(pHandle->file.Handle,
    18441852                            (RTTimeSpecGetNano(&pSFDEntry->AccessTime)) ?       &pSFDEntry->AccessTime : NULL,
     
    18591867    }
    18601868
    1861     if (pHandle->Header.u32Flags & SHFL_HF_TYPE_FILE)
    1862     {
     1869    if (type == SHFL_HF_TYPE_FILE)
     1870    {
     1871        SHFLFILEHANDLE *pHandle = vbsfQueryFileHandle(pClient, Handle);
    18631872        /* Change file attributes if necessary */
    18641873        if (pSFDEntry->Attr.fMode)
     
    19031912static int vbsfSetEndOfFile(SHFLCLIENTDATA *pClient, SHFLROOT root, SHFLHANDLE Handle, uint32_t flags, uint32_t *pcbBuffer, uint8_t *pBuffer)
    19041913{
    1905     SHFLFILEHANDLE *pHandle = (SHFLFILEHANDLE *)vbsfQueryHandle(Handle, SHFL_HF_TYPE_FILE);
     1914    SHFLFILEHANDLE *pHandle = vbsfQueryFileHandle(pClient, Handle);
    19061915    int             rc = VINF_SUCCESS;
    19071916    SHFLFSOBJINFO  *pSFDEntry;
     
    20332042int vbsfSetFSInfo(SHFLCLIENTDATA *pClient, SHFLROOT root, SHFLHANDLE Handle, uint32_t flags, uint32_t *pcbBuffer, uint8_t *pBuffer)
    20342043{
    2035     SHFLFILEHANDLE *pHandle = (SHFLFILEHANDLE *)vbsfQueryHandle(Handle, SHFL_HF_TYPE_DIR|SHFL_HF_TYPE_FILE|SHFL_HF_TYPE_VOLUME);
    2036 
    2037     if (pHandle == 0 || pcbBuffer == 0 || pBuffer == 0)
     2044    uint32_t type =   vbsfQueryHandleType(pClient, Handle)
     2045                    & (SHFL_HF_TYPE_DIR|SHFL_HF_TYPE_FILE|SHFL_HF_TYPE_VOLUME);
     2046
     2047    if (type == 0 || pcbBuffer == 0 || pBuffer == 0)
    20382048    {
    20392049        AssertFailed();
     
    20732083int vbsfLock(SHFLCLIENTDATA *pClient, SHFLROOT root, SHFLHANDLE Handle, uint64_t offset, uint64_t length, uint32_t flags)
    20742084{
    2075     SHFLFILEHANDLE *pHandle = (SHFLFILEHANDLE *)vbsfQueryHandle(Handle, SHFL_HF_TYPE_FILE);
     2085    SHFLFILEHANDLE *pHandle = vbsfQueryFileHandle(pClient, Handle);
    20762086    uint32_t        fRTLock = 0;
    20772087    int             rc;
     
    21272137int vbsfUnlock(SHFLCLIENTDATA *pClient, SHFLROOT root, SHFLHANDLE Handle, uint64_t offset, uint64_t length, uint32_t flags)
    21282138{
    2129     SHFLFILEHANDLE *pHandle = (SHFLFILEHANDLE *)vbsfQueryHandle(Handle, SHFL_HF_TYPE_FILE);
     2139    SHFLFILEHANDLE *pHandle = vbsfQueryFileHandle(pClient, Handle);
    21302140    int             rc;
    21312141
     
    23292339    for (int i=0;i<SHFLHANDLE_MAX;i++)
    23302340    {
    2331         SHFLFILEHANDLE *pHandle = (SHFLFILEHANDLE *)vbsfQueryHandle(i, SHFL_HF_TYPE_MASK);
    2332 
    2333         if (pHandle)
     2341        SHFLHANDLE Handle = (SHFLHANDLE)i;
     2342        if (vbsfQueryHandleType(pClient, Handle))
    23342343        {
    23352344            Log(("Open handle %08x\n", i));
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