Ignore:
Timestamp:
Nov 6, 2016, 5:46:43 PM (9 years ago)
Author:
bird
Message:

lib/nt: Deal better with NTFS mount points.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/lib/nt/ntdir.c

    r3005 r3007  
    293293
    294294
     295/**
     296 * Deals with mount points.
     297 *
     298 * @param   pDir        The directory handle.
     299 * @param   pInfo       The NT entry information.
     300 * @param   pEntryStat  The stats for the mount point directory that needs
     301 *                      updating (a d_stat member).
     302 */
     303static void birdDirUpdateMountPointInfo(BirdDir_T *pDir, MY_FILE_ID_FULL_DIR_INFORMATION *pInfo,
     304                                        BirdStat_T *pEntryStat)
     305{
     306    /*
     307     * Try open the root directory of the mount.
     308     * (Can't use birdStatAtW here because the name isn't terminated.)
     309     */
     310    HANDLE              hRoot = INVALID_HANDLE_VALUE;
     311    MY_NTSTATUS         rcNt;
     312    MY_UNICODE_STRING   Name;
     313    Name.Buffer = pInfo->FileName;
     314    Name.Length = Name.MaximumLength = (USHORT)pInfo->FileNameLength;
     315
     316    rcNt = birdOpenFileUniStr((HANDLE)pDir->pvHandle, &Name,
     317                              FILE_READ_ATTRIBUTES,
     318                              FILE_ATTRIBUTE_NORMAL,
     319                              FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
     320                              FILE_OPEN,
     321                              FILE_OPEN_FOR_BACKUP_INTENT,
     322                              OBJ_CASE_INSENSITIVE,
     323                              &hRoot);
     324    if (MY_NT_SUCCESS(rcNt))
     325    {
     326        int         iSavedErrno = errno;
     327        BirdStat_T  RootStat;
     328        if (birdStatHandle(hRoot, &RootStat, NULL) == 0)
     329        {
     330            RootStat.st_ismountpoint = 2;
     331            *pEntryStat = RootStat;
     332        }
     333        birdCloseFile(hRoot);
     334        errno = iSavedErrno;
     335    }
     336    /* else: don't mind failures, we've got some info. */
     337}
     338
    295339
    296340/**
     
    372416                if (birdDirCopyNameToEntry(pInfo->FileName, pInfo->FileNameLength, pEntry) != 0)
    373417                    fSkipEntry = 1;
    374                 birdStatFillFromFileIdFullDirInfo(&pEntry->d_stat, pInfo, pEntry->d_name);
     418                birdStatFillFromFileIdFullDirInfo(&pEntry->d_stat, pInfo);
    375419                pEntry->d_stat.st_dev   = pDir->uDev;
    376420                switch (pEntry->d_stat.st_mode & S_IFMT)
     
    389433                }
    390434
     435                if (pEntry->d_stat.st_ismountpoint != 1)
     436                { /* likely. */ }
     437                else
     438                    birdDirUpdateMountPointInfo(pDir, pInfo, &pEntry->d_stat);
     439
    391440                cbMinCur = MIN_SIZEOF_MY_FILE_ID_FULL_DIR_INFORMATION + pInfo->FileNameLength;
    392441                offNext  = pInfo->NextEntryOffset;
     
    526575                if (birdDirCopyNameToEntryW(pInfo->FileName, pInfo->FileNameLength, pEntry) != 0)
    527576                    fSkipEntry = 1;
    528                 birdStatFillFromFileIdFullDirInfo(&pEntry->d_stat, pInfo, NULL);
     577                birdStatFillFromFileIdFullDirInfo(&pEntry->d_stat, pInfo);
    529578                pEntry->d_stat.st_dev   = pDir->uDev;
    530579                switch (pEntry->d_stat.st_mode & S_IFMT)
     
    543592                }
    544593
     594                if (pEntry->d_stat.st_ismountpoint != 1)
     595                { /* likely. */ }
     596                else
     597                    birdDirUpdateMountPointInfo(pDir, pInfo, &pEntry->d_stat);
     598
    545599                cbMinCur = MIN_SIZEOF_MY_FILE_ID_FULL_DIR_INFORMATION + pInfo->FileNameLength;
    546600                offNext  = pInfo->NextEntryOffset;
Note: See TracChangeset for help on using the changeset viewer.