vbsf.cpp revision 85eacd3b0da01098b4dd15fd744afe062e484aa5
97f795f0be0c10aae9b31cc8f8d5cdf8ea2ab421vboxsync * Shared Folders:
97f795f0be0c10aae9b31cc8f8d5cdf8ea2ab421vboxsync * VBox Shared Folders.
97f795f0be0c10aae9b31cc8f8d5cdf8ea2ab421vboxsync * Copyright (C) 2006-2007 innotek GmbH
97f795f0be0c10aae9b31cc8f8d5cdf8ea2ab421vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
97f795f0be0c10aae9b31cc8f8d5cdf8ea2ab421vboxsync * available from http://www.virtualbox.org. This file is free software;
97f795f0be0c10aae9b31cc8f8d5cdf8ea2ab421vboxsync * you can redistribute it and/or modify it under the terms of the GNU
97f795f0be0c10aae9b31cc8f8d5cdf8ea2ab421vboxsync * General Public License as published by the Free Software Foundation,
97f795f0be0c10aae9b31cc8f8d5cdf8ea2ab421vboxsync * in version 2 as it comes in the "COPYING" file of the VirtualBox OSE
97f795f0be0c10aae9b31cc8f8d5cdf8ea2ab421vboxsync * distribution. VirtualBox OSE is distributed in the hope that it will
97f795f0be0c10aae9b31cc8f8d5cdf8ea2ab421vboxsync * be useful, but WITHOUT ANY WARRANTY of any kind.
97f795f0be0c10aae9b31cc8f8d5cdf8ea2ab421vboxsyncvoid vbsfStripLastComponent (char *pszFullPath, uint32_t cbFullPathRoot)
97f795f0be0c10aae9b31cc8f8d5cdf8ea2ab421vboxsync /* Do not strip root. */
97f795f0be0c10aae9b31cc8f8d5cdf8ea2ab421vboxsync LogFlowFunc(("%s, %s, %s\n", pszFullPath, delimLast, delimSecondLast));
97f795f0be0c10aae9b31cc8f8d5cdf8ea2ab421vboxsyncstatic int vbsfCorrectCasing(char *pszFullPath, char *pszStartComponent)
97f795f0be0c10aae9b31cc8f8d5cdf8ea2ab421vboxsync Log2(("vbsfCorrectCasing: %s %s\n", pszFullPath, pszStartComponent));
97f795f0be0c10aae9b31cc8f8d5cdf8ea2ab421vboxsync /** @todo this is quite inefficient, especially for directories with many files */
97f795f0be0c10aae9b31cc8f8d5cdf8ea2ab421vboxsync Assert(*(pszStartComponent-1) == RTPATH_DELIMITER);
97f795f0be0c10aae9b31cc8f8d5cdf8ea2ab421vboxsync rc = RTDirOpenFiltered (&hSearch, pDirEntry->szName, RTDIRFILTER_WINNT);
97f795f0be0c10aae9b31cc8f8d5cdf8ea2ab421vboxsync rc = RTDirReadEx(hSearch, pDirEntry, &cbDirEntrySize, RTFSOBJATTRADD_NOTHING);
97f795f0be0c10aae9b31cc8f8d5cdf8ea2ab421vboxsync if (VINF_SUCCESS != rc && rc != VWRN_NO_DIRENT_INFO)
97f795f0be0c10aae9b31cc8f8d5cdf8ea2ab421vboxsync Log2(("vbsfCorrectCasing: found %s\n", &pDirEntry->szName[0]));
97f795f0be0c10aae9b31cc8f8d5cdf8ea2ab421vboxsync && !RTStrICmp(pszStartComponent, &pDirEntry->szName[0]))
97f795f0be0c10aae9b31cc8f8d5cdf8ea2ab421vboxsync Log(("Found original name %s (%s)\n", &pDirEntry->szName[0], pszStartComponent));
end:
if (pDirEntry)
if (hSearch)
return rc;
/* Query UCS2 root prefix for the path, cbRoot is the length in bytes including trailing (RTUCS2)0. */
return VERR_INVALID_PARAMETER;
int rc;
char *utf8Root;
char *utf8FullPath;
if (!utf8FullPath)
if (pcbFullPathRoot)
Log(("Root %ls path %.*ls\n", pszRoot, pPath->u16Length/sizeof(pPath->String.ucs2[0]), pPath->String.ucs2));
if (!pszFullPath)
AssertFailed();
return rc;
cbRoot++;
if (pcbFullPathRoot)
while (*src)
src++;
AssertFailed();
return rc;
cb -= l;
dst += l;
*dst = 0;
/* When the host file system is case sensitive and the guest expects a case insensitive fs, then problems can occur */
if (fWildCard)
src--;
bool fHaveWildcards = false;
while(*temp)
fHaveWildcards = true;
temp++;
if (fHaveWildcards)
*pszWildCardComponent = 0;
*src = 0;
#ifdef DEBUG
*src = 0;
src--;
src++;
bool fEndOfString = true;
while(*end)
end++;
fEndOfString = false;
*end = 0;
if (!fEndOfString)
if (fEndOfString)
if (pszWildCardComponent)
return rc;
static int vbsfOpenFile (SHFLHANDLE *phHandle, const char *pszPath, SHFLCREATEPARMS *pParms, bool fCreate)
unsigned fOpen;
case SHFL_CF_ACCESS_NONE:
case SHFL_CF_ACCESS_READ:
case SHFL_CF_ACCESS_WRITE:
case SHFL_CF_ACCESS_READWRITE:
case SHFL_CF_ACCESS_DENYNONE:
case SHFL_CF_ACCESS_DENYREAD:
case SHFL_CF_ACCESS_DENYWRITE:
case SHFL_CF_ACCESS_DENYALL:
if (fCreate)
return rc;
return rc;
return rc;
return rc;
static int vbsfOpenReplace (const char *pszPath, SHFLCREATEPARMS *pParms, bool bReplace, RTFSOBJINFO *pInfo)
if (!pHandle)
AssertFailed();
return rc;
if (bReplace)
return rc;
if (!pHandle)
AssertFailed();
return rc;
return rc;
return rc;
int vbsfCreate (SHFLCLIENTDATA *pClient, SHFLROOT root, SHFLSTRING *pPath, uint32_t cbPath, SHFLCREATEPARMS *pParms)
switch (rc)
case VINF_SUCCESS:
case VERR_FILE_NOT_FOUND:
case VERR_PATH_NOT_FOUND:
case SHFL_CF_ACT_FAIL_IF_NEW:
case SHFL_CF_ACT_FAIL_IF_NEW:
rc = vbsfQueryFileInfo(pClient, root, pParms->Handle, SHFL_INFO_GET|SHFL_INFO_FILE, &bufsize, (uint8_t *)&pParms->Info);
Log(("vbsfCreate: handle = %RX64 rc = %Vrc result=%x\n", (uint64_t)pParms->Handle, rc, pParms->Result));
return rc;
SHFLFILEHANDLE *pHandle = (SHFLFILEHANDLE *)vbsfQueryHandle(Handle, SHFL_HF_TYPE_DIR|SHFL_HF_TYPE_FILE);
if (!pHandle)
return VERR_INVALID_HANDLE;
case SHFL_HF_TYPE_DIR:
case SHFL_HF_TYPE_FILE:
return rc;
int vbsfRead (SHFLCLIENTDATA *pClient, SHFLROOT root, SHFLHANDLE Handle, uint64_t offset, uint32_t *pcbBuffer, uint8_t *pBuffer)
int rc;
AssertFailed();
return VERR_INVALID_PARAMETER;
if (*pcbBuffer == 0)
return rc;
return rc;
int vbsfWrite (SHFLCLIENTDATA *pClient, SHFLROOT root, SHFLHANDLE Handle, uint64_t offset, uint32_t *pcbBuffer, uint8_t *pBuffer)
int rc;
AssertFailed();
return VERR_INVALID_PARAMETER;
if (*pcbBuffer == 0)
return rc;
return rc;
if (pHandle == 0)
AssertFailed();
return VERR_INVALID_HANDLE;
return rc;
int vbsfDirList(SHFLCLIENTDATA *pClient, SHFLROOT root, SHFLHANDLE Handle, SHFLSTRING *pPath, uint32_t flags, uint32_t *pcbBuffer, uint8_t *pBuffer,
bool fUtf8;
AssertFailed();
return VERR_INVALID_PARAMETER;
if (pDirEntry == 0)
AssertFailed();
return VERR_NO_MEMORY;
*pcbBuffer = 0;
*pcFiles = 0;
if (pPath)
goto end;
goto end;
while(cbBufferOrg)
AssertFailed();
if (fUtf8)
if (*pcFiles == 0)
AssertFailed();
if (fUtf8)
end:
if (pDirEntry)
return rc;
int vbsfQueryFileInfo(SHFLCLIENTDATA *pClient, SHFLROOT root, SHFLHANDLE Handle, uint32_t flags, uint32_t *pcbBuffer, uint8_t *pBuffer)
SHFLFILEHANDLE *pHandle = (SHFLFILEHANDLE *)vbsfQueryHandle(Handle, SHFL_HF_TYPE_DIR|SHFL_HF_TYPE_FILE);
AssertFailed();
return VERR_INVALID_PARAMETER;
*pcbBuffer = 0;
AssertFailed();
return rc;
int vbsfSetFileInfo(SHFLCLIENTDATA *pClient, SHFLROOT root, SHFLHANDLE Handle, uint32_t flags, uint32_t *pcbBuffer, uint8_t *pBuffer)
SHFLFILEHANDLE *pHandle = (SHFLFILEHANDLE *)vbsfQueryHandle(Handle, SHFL_HF_TYPE_DIR|SHFL_HF_TYPE_FILE);
AssertFailed();
return VERR_INVALID_PARAMETER;
*pcbBuffer = 0;
rc = vbsfQueryFileInfo(pClient, root, Handle, SHFL_INFO_GET|SHFL_INFO_FILE, &bufsize, (uint8_t *)pSFDEntry);
AssertFailed();
return rc;
int vbsfSetEndOfFile(SHFLCLIENTDATA *pClient, SHFLROOT root, SHFLHANDLE Handle, uint32_t flags, uint32_t *pcbBuffer, uint8_t *pBuffer)
AssertFailed();
return VERR_INVALID_PARAMETER;
*pcbBuffer = 0;
AssertFailed();
AssertFailed();
AssertFailed();
return rc;
int vbsfQueryVolumeInfo(SHFLCLIENTDATA *pClient, SHFLROOT root, SHFLHANDLE Handle, uint32_t flags, uint32_t *pcbBuffer, uint8_t *pBuffer)
SHFLFILEHANDLE *pHandle = (SHFLFILEHANDLE *)vbsfQueryHandle(Handle, SHFL_HF_TYPE_DIR|SHFL_HF_TYPE_FILE|SHFL_HF_TYPE_VOLUME);
AssertFailed();
return VERR_INVALID_PARAMETER;
*pcbBuffer = 0;
rc = RTFsQuerySizes(pszFullPath, &pSFDEntry->ullTotalAllocationBytes, &pSFDEntry->ullAvailableAllocationBytes, &pSFDEntry->ulBytesPerAllocationUnit, &pSFDEntry->ulBytesPerSector);
goto exit;
goto exit;
goto exit;
else AssertFailed();
exit:
return rc;
int vbsfQueryFSInfo(SHFLCLIENTDATA *pClient, SHFLROOT root, SHFLHANDLE Handle, uint32_t flags, uint32_t *pcbBuffer, uint8_t *pBuffer)
SHFLFILEHANDLE *pHandle = (SHFLFILEHANDLE *)vbsfQueryHandle(Handle, SHFL_HF_TYPE_DIR|SHFL_HF_TYPE_FILE|SHFL_HF_TYPE_VOLUME);
AssertFailed();
return VERR_INVALID_PARAMETER;
AssertFailed();
return VERR_INVALID_PARAMETER;
int vbsfSetFSInfo(SHFLCLIENTDATA *pClient, SHFLROOT root, SHFLHANDLE Handle, uint32_t flags, uint32_t *pcbBuffer, uint8_t *pBuffer)
SHFLFILEHANDLE *pHandle = (SHFLFILEHANDLE *)vbsfQueryHandle(Handle, SHFL_HF_TYPE_DIR|SHFL_HF_TYPE_FILE|SHFL_HF_TYPE_VOLUME);
AssertFailed();
return VERR_INVALID_PARAMETER;
AssertFailed();
return VERR_INVALID_PARAMETER;
int vbsfLock(SHFLCLIENTDATA *pClient, SHFLROOT root, SHFLHANDLE Handle, uint64_t offset, uint64_t length, uint32_t flags)
int rc;
if (pHandle == 0)
AssertFailed();
return VERR_INVALID_HANDLE;
AssertFailed();
return VERR_INVALID_PARAMETER;
case SHFL_LOCK_SHARED:
case SHFL_LOCK_EXCLUSIVE:
AssertFailed();
return VERR_INVALID_PARAMETER;
Log(("RTFileUnlock %RTfile %RX64 %RX64 failed with %Rrc\n", pHandle->file.Handle, offset, length, rc));
return rc;
int vbsfUnlock(SHFLCLIENTDATA *pClient, SHFLROOT root, SHFLHANDLE Handle, uint64_t offset, uint64_t length, uint32_t flags)
int rc;
if (pHandle == 0)
return VERR_INVALID_HANDLE;
return VERR_INVALID_PARAMETER;
Log(("RTFileUnlock %RTfile %RX64 %RTX64 failed with %Rrc\n", pHandle->file.Handle, offset, length, rc));
return rc;
int vbsfRemove(SHFLCLIENTDATA *pClient, SHFLROOT root, SHFLSTRING *pPath, uint32_t cbPath, uint32_t flags)
|| cbPath == 0
|| pPath == 0)
AssertFailed();
return VERR_INVALID_PARAMETER;
return rc;
int vbsfRename(SHFLCLIENTDATA *pClient, SHFLROOT root, SHFLSTRING *pSrc, SHFLSTRING *pDest, uint32_t flags)
|| pSrc == 0
|| pDest == 0)
AssertFailed();
return VERR_INVALID_PARAMETER;
return rc;
rc = RTFileMove(pszFullPathSrc, pszFullPathDest, (flags & SHFL_RENAME_REPLACE_IF_EXISTS) ? RTFILEMOVE_FLAGS_REPLACE : 0);
rc = RTDirRename(pszFullPathSrc, pszFullPathDest, (flags & SHFL_RENAME_REPLACE_IF_EXISTS) ? RTPATHRENAME_FLAGS_REPLACE : 0);
return rc;
for (int i=0;i<SHFLHANDLE_MAX;i++)
if (pHandle)
return VINF_SUCCESS;