VirtualBox

Ignore:
Timestamp:
Oct 25, 2010 10:08:21 AM (14 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
66998
Message:

Shared folders: introduced SHFL_FN_READLINK, SHFL_FN_SYMLINK, SHFL_FN_SET_SYMLINKS

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

Legend:

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

    r31052 r33409  
    780780        }
    781781
     782        /* Read symlink destination */
     783        case SHFL_FN_READLINK:
     784        {
     785            Log(("svcCall: SHFL_FN_READLINK\n"));
     786
     787            /* Verify parameter count and types. */
     788            if (cParms != SHFL_CPARMS_READLINK)
     789            {
     790                rc = VERR_INVALID_PARAMETER;
     791            }
     792            else
     793            if (   paParms[0].type != VBOX_HGCM_SVC_PARM_32BIT   /* root */
     794                || paParms[1].type != VBOX_HGCM_SVC_PARM_PTR     /* path */
     795                || paParms[2].type != VBOX_HGCM_SVC_PARM_PTR     /* buffer */
     796                    )
     797            {
     798                rc = VERR_INVALID_PARAMETER;
     799            }
     800            else
     801            {
     802                /* Fetch parameters. */
     803                SHFLROOT  root     = (SHFLROOT)paParms[0].u.uint32;
     804                SHFLSTRING *pPath  = (SHFLSTRING *)paParms[1].u.pointer.addr;
     805                uint32_t cbPath    = paParms[1].u.pointer.size;
     806                uint8_t   *pBuffer = (uint8_t *)paParms[2].u.pointer.addr;
     807                uint32_t  cbBuffer = paParms[2].u.pointer.size;
     808
     809                /* Verify parameters values. */
     810                if (!ShflStringIsValidOrNull(pPath, paParms[1].u.pointer.size))
     811                {
     812                    rc = VERR_INVALID_PARAMETER;
     813                }
     814                else
     815                {
     816                    /* Execute the function. */
     817                    rc = vbsfReadLink (pClient, root, pPath, cbPath, pBuffer, cbBuffer);
     818
     819                    if (RT_SUCCESS(rc))
     820                    {
     821                        /* Update parameters.*/
     822                        ; /* none */
     823                    }
     824                }
     825            }
     826
     827            break;
     828        }
     829
    782830        /* Legacy interface */
    783831        case SHFL_FN_MAP_FOLDER_OLD:
     
    11131161            break;
    11141162        }
     1163
     1164        case SHFL_FN_SYMLINK:
     1165        {
     1166            Log(("svnCall: SHFL_FN_SYMLINK\n"));
     1167            /* Verify parameter count and types. */
     1168            if (cParms != SHFL_CPARMS_SYMLINK)
     1169            {
     1170                rc = VERR_INVALID_PARAMETER;
     1171            }
     1172            else
     1173            if (   paParms[0].type != VBOX_HGCM_SVC_PARM_32BIT   /* root */
     1174                || paParms[1].type != VBOX_HGCM_SVC_PARM_PTR     /* newPath */
     1175                || paParms[2].type != VBOX_HGCM_SVC_PARM_PTR     /* oldPath */
     1176                || paParms[3].type != VBOX_HGCM_SVC_PARM_PTR     /* info */
     1177                    )
     1178            {
     1179                rc = VERR_INVALID_PARAMETER;
     1180            }
     1181            else
     1182            {
     1183                /* Fetch parameters. */
     1184                SHFLROOT     root     = (SHFLROOT)paParms[0].u.uint32;
     1185                SHFLSTRING  *pNewPath = (SHFLSTRING *)paParms[1].u.pointer.addr;
     1186                SHFLSTRING  *pOldPath = (SHFLSTRING *)paParms[2].u.pointer.addr;
     1187                RTFSOBJINFO *pInfo    = (RTFSOBJINFO *)paParms[3].u.pointer.addr;
     1188                uint32_t     cbInfo   = paParms[3].u.pointer.size;
     1189
     1190                /* Verify parameters values. */
     1191                if (    !ShflStringIsValid(pNewPath, paParms[1].u.pointer.size)
     1192                    ||  !ShflStringIsValid(pOldPath, paParms[2].u.pointer.size)
     1193                    ||  (cbInfo != sizeof(RTFSOBJINFO))
     1194                   )
     1195                {
     1196                    rc = VERR_INVALID_PARAMETER;
     1197                }
     1198                else
     1199                {
     1200                    /* Execute the function. */
     1201                    rc = vbsfSymlink (pClient, root, pNewPath, pOldPath, pInfo);
     1202                    if (RT_SUCCESS(rc))
     1203                    {
     1204                        /* Update parameters.*/
     1205                        ; /* none */
     1206                    }
     1207                }
     1208            }
     1209        }
     1210        break;
     1211
     1212#if defined(RT_OS_DARWIN) || defined(RT_OS_FREEBSD) || defined(RT_OS_LINUX) || defined(RT_OS_SOLARIS)
     1213        case SHFL_FN_SET_SYMLINKS:
     1214        {
     1215            pClient->fu32Flags |= SHFL_CF_SYMLINKS;
     1216            rc = VINF_SUCCESS;
     1217            break;
     1218        }
     1219#endif
    11151220
    11161221        default:
  • trunk/src/VBox/HostServices/SharedFolders/shfl.h

    r31052 r33409  
    4040#define SHFL_CF_UTF8             (0x00000004)
    4141
     42/** Client both supports and wants to use symlinks. */
     43#define SHFL_CF_SYMLINKS         (0x00000008)
     44
    4245/** @} */
    4346
  • trunk/src/VBox/HostServices/SharedFolders/vbsf.cpp

    r32689 r33409  
    3737#define LogFlow Log
    3838
     39#define SHFL_RT_LINK(pClient) ((pClient)->fu32Flags & SHFL_CF_SYMLINKS ? RTPATH_F_ON_LINK : RTPATH_F_FOLLOW_LINK)
     40
    3941/**
    4042 * @todo find a better solution for supporting the execute bit for non-windows
     
    100102}
    101103
    102 static int vbsfCorrectCasing(char *pszFullPath, char *pszStartComponent)
     104static int vbsfCorrectCasing(SHFLCLIENTDATA *pClient, char *pszFullPath, char *pszStartComponent)
    103105{
    104106    PRTDIRENTRYEX  pDirEntry = NULL;
     
    139141        size_t cbDirEntrySize = cbDirEntry;
    140142
    141         rc = RTDirReadEx(hSearch, pDirEntry, &cbDirEntrySize, RTFSOBJATTRADD_NOTHING, RTPATH_F_FOLLOW_LINK);
     143        rc = RTDirReadEx(hSearch, pDirEntry, &cbDirEntrySize, RTFSOBJATTRADD_NOTHING, SHFL_RT_LINK(pClient));
    142144        if (rc == VERR_NO_MORE_FILES)
    143145            break;
     
    494496
    495497            /** @todo don't check when creating files or directories; waste of time */
    496             rc = RTPathQueryInfoEx(pszFullPath, &info, RTFSOBJATTRADD_NOTHING, RTPATH_F_FOLLOW_LINK);
     498            rc = RTPathQueryInfoEx(pszFullPath, &info, RTFSOBJATTRADD_NOTHING, SHFL_RT_LINK(pClient));
    497499            if (rc == VERR_FILE_NOT_FOUND || rc == VERR_PATH_NOT_FOUND)
    498500            {
     
    508510                    {
    509511                        *src = 0;
    510                         rc = RTPathQueryInfoEx(pszFullPath, &info, RTFSOBJATTRADD_NOTHING, RTPATH_F_FOLLOW_LINK);
     512                        rc = RTPathQueryInfoEx(pszFullPath, &info, RTFSOBJATTRADD_NOTHING, SHFL_RT_LINK(pClient));
    511513                        *src = RTPATH_DELIMITER;
    512514                        if (rc == VINF_SUCCESS)
     
    544546                            fEndOfString = false;
    545547                            *end = 0;
    546                             rc = RTPathQueryInfoEx(src, &info, RTFSOBJATTRADD_NOTHING, RTPATH_F_FOLLOW_LINK);
     548                            rc = RTPathQueryInfoEx(src, &info, RTFSOBJATTRADD_NOTHING, SHFL_RT_LINK(pClient));
    547549                            Assert(rc == VINF_SUCCESS || rc == VERR_FILE_NOT_FOUND || rc == VERR_PATH_NOT_FOUND);
    548550                        }
     
    556558                        {
    557559                            /* path component is invalid; try to correct the casing */
    558                             rc = vbsfCorrectCasing(pszFullPath, src);
     560                            rc = vbsfCorrectCasing(pClient, pszFullPath, src);
    559561                            if (RT_FAILURE(rc))
    560562                            {
     
    826828 *
    827829 * @returns IPRT status code
     830 * @param  pClient               Data structure describing the client accessing the shared folder
    828831 * @param  pszPath               Path to the file or folder on the host.
    829832 * @param  pParms->CreateFlags   Creation or open parameters, see include/VBox/shflsvc.h
     
    836839 * @retval pParms->Info          On success the parameters of the file opened or created
    837840 */
    838 static int vbsfOpenFile (const char *pszPath, SHFLCREATEPARMS *pParms)
     841static int vbsfOpenFile (SHFLCLIENTDATA *pClient, const char *pszPath, SHFLCREATEPARMS *pParms)
    839842{
    840843    LogFlow(("vbsfOpenFile: pszPath = %s, pParms = %p\n", pszPath, pParms));
     
    884887
    885888            /** @todo Possible race left here. */
    886             if (RT_SUCCESS(RTPathQueryInfoEx(pszPath, &info, RTFSOBJATTRADD_NOTHING, RTPATH_F_FOLLOW_LINK)))
     889            if (RT_SUCCESS(RTPathQueryInfoEx(pszPath, &info, RTFSOBJATTRADD_NOTHING, SHFL_RT_LINK(pClient))))
    887890            {
    888891#ifdef RT_OS_WINDOWS
     
    11521155 * @retval  pParms->Info   On success, information returned about the file
    11531156 */
    1154 static int vbsfLookupFile(char *pszPath, SHFLCREATEPARMS *pParms)
     1157static int vbsfLookupFile(SHFLCLIENTDATA *pClient, char *pszPath, SHFLCREATEPARMS *pParms)
    11551158{
    11561159    RTFSOBJINFO info;
    11571160    int rc;
    11581161
    1159     rc = RTPathQueryInfoEx(pszPath, &info, RTFSOBJATTRADD_NOTHING, RTPATH_F_FOLLOW_LINK);
     1162    rc = RTPathQueryInfoEx(pszPath, &info, RTFSOBJATTRADD_NOTHING, SHFL_RT_LINK(pClient));
    11601163    LogFlow(("SHFL_CF_LOOKUP\n"));
    11611164    /* Client just wants to know if the object exists. */
     
    12421245        if (BIT_FLAG(pParms->CreateFlags, SHFL_CF_LOOKUP))
    12431246        {
    1244             rc = vbsfLookupFile(pszFullPath, pParms);
     1247            rc = vbsfLookupFile(pClient, pszFullPath, pParms);
    12451248        }
    12461249        else
     
    12491252            RTFSOBJINFO info;
    12501253
    1251             rc = RTPathQueryInfoEx(pszFullPath, &info, RTFSOBJATTRADD_NOTHING, RTPATH_F_FOLLOW_LINK);
     1254            rc = RTPathQueryInfoEx(pszFullPath, &info, RTFSOBJATTRADD_NOTHING, SHFL_RT_LINK(pClient));
    12521255            LogFlow(("RTPathQueryInfoEx returned %Rrc\n", rc));
    12531256
     
    13081311                else
    13091312                {
    1310                     rc = vbsfOpenFile (pszFullPath, pParms);
     1313                    rc = vbsfOpenFile (pClient, pszFullPath, pParms);
    13111314                }
    13121315            }
     
    15281531            pDirEntry = pDirEntryOrg;
    15291532
    1530             rc = RTDirReadEx(DirHandle, pDirEntry, &cbDirEntrySize, RTFSOBJATTRADD_NOTHING, RTPATH_F_FOLLOW_LINK);
     1533            rc = RTDirReadEx(DirHandle, pDirEntry, &cbDirEntrySize, RTFSOBJATTRADD_NOTHING, SHFL_RT_LINK(pClient));
    15311534            if (rc == VERR_NO_MORE_FILES)
    15321535            {
     
    16471650    if (pDirEntry)
    16481651        RTMemFree(pDirEntry);
     1652
     1653    return rc;
     1654}
     1655
     1656int vbsfReadLink(SHFLCLIENTDATA *pClient, SHFLROOT root, SHFLSTRING *pPath, uint32_t cbPath, uint8_t *pBuffer, uint32_t cbBuffer)
     1657{
     1658    int rc = VINF_SUCCESS;
     1659
     1660    if (pPath == 0 || pBuffer == 0)
     1661    {
     1662        AssertFailed();
     1663        return VERR_INVALID_PARAMETER;
     1664    }
     1665
     1666    /* Build a host full path for the given path, handle file name case issues
     1667     * (if the guest expects case-insensitive paths but the host is
     1668     * case-sensitive) and convert ucs2 to utf8 if necessary.
     1669     */
     1670    char *pszFullPath = NULL;
     1671    uint32_t cbFullPathRoot = 0;
     1672
     1673    rc = vbsfBuildFullPath (pClient, root, pPath, cbPath, &pszFullPath, &cbFullPathRoot);
     1674
     1675    if (RT_SUCCESS (rc))
     1676    {
     1677        rc = RTReadLink(pszFullPath, (char *) pBuffer, cbBuffer);
     1678
     1679        /* free the path string */
     1680        vbsfFreeFullPath(pszFullPath);
     1681    }
    16491682
    16501683    return rc;
     
    21072140}
    21082141
     2142int vbsfSymlink(SHFLCLIENTDATA *pClient, SHFLROOT root, SHFLSTRING *pNewPath, SHFLSTRING *pOldPath, RTFSOBJINFO *pInfo)
     2143{
     2144    int rc = VINF_SUCCESS;
     2145
     2146    char *pszFullNewPath = NULL;
     2147    char *pszOldPath = NULL;
     2148
     2149    /* XXX: no support for UCS2 at the moment. */
     2150    if (!BIT_FLAG(pClient->fu32Flags, SHFL_CF_UTF8))
     2151        return VERR_NOT_IMPLEMENTED;
     2152
     2153    rc = vbsfBuildFullPath (pClient, root, pNewPath, pNewPath->u16Size, &pszFullNewPath, NULL);
     2154    if (rc != VINF_SUCCESS)
     2155        return rc;
     2156
     2157    rc = RTSymlink(pszFullNewPath, (const char *)pOldPath->String.utf8);
     2158    if (RT_SUCCESS (rc))
     2159        rc = RTPathQueryInfoEx(pszFullNewPath, pInfo, RTFSOBJATTRADD_NOTHING, SHFL_RT_LINK(pClient));
     2160
     2161    vbsfFreeFullPath(pszFullNewPath);
     2162
     2163    return rc;
     2164}
     2165
    21092166/*
    21102167 * Clean up our mess by freeing all handles that are still valid.
  • trunk/src/VBox/HostServices/SharedFolders/vbsf.h

    r28800 r33409  
    3838int vbsfDisconnect(SHFLCLIENTDATA *pClient);
    3939int vbsfQueryFileInfo(SHFLCLIENTDATA *pClient, SHFLROOT root, SHFLHANDLE Handle, uint32_t flags, uint32_t *pcbBuffer, uint8_t *pBuffer);
     40int vbsfReadLink(SHFLCLIENTDATA *pClient, SHFLROOT root, SHFLSTRING *pPath, uint32_t cbPath, uint8_t *pBuffer, uint32_t cbBuffer);
     41int vbsfSymlink(SHFLCLIENTDATA *pClient, SHFLROOT root, SHFLSTRING *pNewPath, SHFLSTRING *pOldPath, RTFSOBJINFO *pInfo);
    4042
    4143#endif /* __VBSF__H */
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