Changeset 3007 for trunk/src/lib/nt/ntdir.c
- Timestamp:
- Nov 6, 2016, 5:46:43 PM (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/lib/nt/ntdir.c
r3005 r3007 293 293 294 294 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 */ 303 static 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 295 339 296 340 /** … … 372 416 if (birdDirCopyNameToEntry(pInfo->FileName, pInfo->FileNameLength, pEntry) != 0) 373 417 fSkipEntry = 1; 374 birdStatFillFromFileIdFullDirInfo(&pEntry->d_stat, pInfo , pEntry->d_name);418 birdStatFillFromFileIdFullDirInfo(&pEntry->d_stat, pInfo); 375 419 pEntry->d_stat.st_dev = pDir->uDev; 376 420 switch (pEntry->d_stat.st_mode & S_IFMT) … … 389 433 } 390 434 435 if (pEntry->d_stat.st_ismountpoint != 1) 436 { /* likely. */ } 437 else 438 birdDirUpdateMountPointInfo(pDir, pInfo, &pEntry->d_stat); 439 391 440 cbMinCur = MIN_SIZEOF_MY_FILE_ID_FULL_DIR_INFORMATION + pInfo->FileNameLength; 392 441 offNext = pInfo->NextEntryOffset; … … 526 575 if (birdDirCopyNameToEntryW(pInfo->FileName, pInfo->FileNameLength, pEntry) != 0) 527 576 fSkipEntry = 1; 528 birdStatFillFromFileIdFullDirInfo(&pEntry->d_stat, pInfo , NULL);577 birdStatFillFromFileIdFullDirInfo(&pEntry->d_stat, pInfo); 529 578 pEntry->d_stat.st_dev = pDir->uDev; 530 579 switch (pEntry->d_stat.st_mode & S_IFMT) … … 543 592 } 544 593 594 if (pEntry->d_stat.st_ismountpoint != 1) 595 { /* likely. */ } 596 else 597 birdDirUpdateMountPointInfo(pDir, pInfo, &pEntry->d_stat); 598 545 599 cbMinCur = MIN_SIZEOF_MY_FILE_ID_FULL_DIR_INFORMATION + pInfo->FileNameLength; 546 600 offNext = pInfo->NextEntryOffset;
Note:
See TracChangeset
for help on using the changeset viewer.