VirtualBox

Ignore:
Timestamp:
Nov 24, 2017 3:50:00 PM (7 years ago)
Author:
vboxsync
Message:

IPRT/VFS: More path parsing work. Symlinks should work better now.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/common/vfs/vfsstddir.cpp

    r69818 r69826  
    255255 */
    256256static DECLCALLBACK(int) rtVfsStdDir_Open(void *pvThis, const char *pszEntry, uint64_t fFileOpen,
    257                                           uint32_t fVfsFlags, PRTVFSOBJ phVfsObj)
     257                                          uint32_t fObjFlags, PRTVFSOBJ phVfsObj)
    258258{
    259259    PRTVFSSTDDIR pThis = (PRTVFSSTDDIR)pvThis;
     
    270270        {
    271271            case RTFS_TYPE_DIRECTORY:
    272                 if (!(fVfsFlags & RTVFSOBJ_F_OPEN_DIRECTORY))
     272                if (fObjFlags & RTVFSOBJ_F_OPEN_DIRECTORY)
    273273                {
    274274                    if (   (fFileOpen & RTFILE_O_ACTION_MASK) == RTFILE_O_OPEN
     
    277277                    {
    278278                        RTDIR hSubDir;
    279                         rc = RTDirRelDirOpenFiltered(pThis->hDir, pszEntry, RTDIRFILTER_NONE, fVfsFlags, &hSubDir);
     279                        rc = RTDirRelDirOpenFiltered(pThis->hDir, pszEntry, RTDIRFILTER_NONE, 0 /*fFlags*/, &hSubDir);
    280280                        if (RT_SUCCESS(rc))
    281281                        {
     
    307307                {
    308308                    case RTFS_TYPE_FILE:
    309                         rc = fVfsFlags & RTVFSOBJ_F_OPEN_FILE      ? VINF_SUCCESS : VERR_IS_A_FILE;
     309                        rc = fObjFlags & RTVFSOBJ_F_OPEN_FILE      ? VINF_SUCCESS : VERR_IS_A_FILE;
    310310                        break;
    311311                    case RTFS_TYPE_DEV_BLOCK:
    312                         rc = fVfsFlags & RTVFSOBJ_F_OPEN_DEV_BLOCK ? VINF_SUCCESS : VERR_IS_A_BLOCK_DEVICE;
     312                        rc = fObjFlags & RTVFSOBJ_F_OPEN_DEV_BLOCK ? VINF_SUCCESS : VERR_IS_A_BLOCK_DEVICE;
    313313                        break;
    314314                    case RTFS_TYPE_DEV_CHAR:
    315                         rc = fVfsFlags & RTVFSOBJ_F_OPEN_DEV_CHAR  ? VINF_SUCCESS : VERR_IS_A_CHAR_DEVICE;
     315                        rc = fObjFlags & RTVFSOBJ_F_OPEN_DEV_CHAR  ? VINF_SUCCESS : VERR_IS_A_CHAR_DEVICE;
    316316                        break;
    317317                    /** @todo These two types should not result in files, but pure I/O streams.
    318318                     *        possibly char device too.  */
    319319                    case RTFS_TYPE_FIFO:
    320                         rc = fVfsFlags & RTVFSOBJ_F_OPEN_FIFO      ? VINF_SUCCESS : VERR_IS_A_FIFO;
     320                        rc = fObjFlags & RTVFSOBJ_F_OPEN_FIFO      ? VINF_SUCCESS : VERR_IS_A_FIFO;
    321321                        break;
    322322                    case RTFS_TYPE_SOCKET:
    323                         rc = fVfsFlags & RTVFSOBJ_F_OPEN_SOCKET    ? VINF_SUCCESS : VERR_IS_A_SOCKET;
     323                        rc = fObjFlags & RTVFSOBJ_F_OPEN_SOCKET    ? VINF_SUCCESS : VERR_IS_A_SOCKET;
    324324                        break;
    325325                    default:
     
    355355
    356356            case RTFS_TYPE_SYMLINK:
    357                 if (fVfsFlags & RTVFSOBJ_F_OPEN_SYMLINK)
     357                if (fObjFlags & RTVFSOBJ_F_OPEN_SYMLINK)
    358358                {
    359359                    uint32_t cRefs = RTVfsDirRetain(pThis->hSelf);
     
    398398                || (fFileOpen & RTFILE_O_ACTION_MASK) == RTFILE_O_OPEN_CREATE
    399399                || (fFileOpen & RTFILE_O_ACTION_MASK) == RTFILE_O_CREATE_REPLACE)
    400             && (fVfsFlags & RTVFSOBJ_F_CREATE_MASK) != RTVFSOBJ_F_CREATE_NOTHING)
     400            && (fObjFlags & RTVFSOBJ_F_CREATE_MASK) != RTVFSOBJ_F_CREATE_NOTHING)
    401401        {
    402402
    403             if ((fVfsFlags & RTVFSOBJ_F_CREATE_MASK) == RTVFSOBJ_F_CREATE_FILE)
     403            if ((fObjFlags & RTVFSOBJ_F_CREATE_MASK) == RTVFSOBJ_F_CREATE_FILE)
    404404            {
    405405                RTFILE hFile;
     
    419419                }
    420420            }
    421             else if ((fVfsFlags & RTVFSOBJ_F_CREATE_MASK) == RTVFSOBJ_F_CREATE_DIRECTORY)
     421            else if ((fObjFlags & RTVFSOBJ_F_CREATE_MASK) == RTVFSOBJ_F_CREATE_DIRECTORY)
    422422            {
    423423                RTDIR hSubDir;
    424424                rc = RTDirRelDirCreate(pThis->hDir, pszEntry, (fFileOpen & RTFILE_O_CREATE_MODE_MASK) >> RTFILE_O_CREATE_MODE_SHIFT,
    425                                        0 /* fVfsFlags */, &hSubDir);
     425                                       0 /* fFlags */, &hSubDir);
    426426                if (RT_SUCCESS(rc))
    427427                {
     
    449449
    450450/**
     451 * @interface_method_impl{RTVFSDIROPS,pfnFollowAbsoluteSymlink}
     452 */
     453static DECLCALLBACK(int) rtVfsStdDir_FollowAbsoluteSymlink(void *pvThis, const char *pszRoot, PRTVFSDIR phVfsDir)
     454{
     455    //PRTVFSSTDDIR pThis = (PRTVFSSTDDIR)pvThis;
     456    RT_NOREF(pvThis);
     457    /** @todo walking restriction. */
     458    return RTVfsDirOpenNormal(pszRoot, 0 /*fFlags*/, phVfsDir);
     459}
     460
     461
     462/**
    451463 * @interface_method_impl{RTVFSDIROPS,pfnOpenFile}
    452464 */
     
    668680    },
    669681    rtVfsStdDir_Open,
     682    rtVfsStdDir_FollowAbsoluteSymlink,
    670683    rtVfsStdDir_OpenFile,
    671684    rtVfsStdDir_OpenDir,
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette