Changeset 3169 for trunk/src/kmk/dir-nt-bird.c
- Timestamp:
- Mar 21, 2018, 12:27:47 PM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kmk/dir-nt-bird.c
r3167 r3169 483 483 void nt_fullpath_cached(const char *pszPath, char *pszFull, size_t cbFull) 484 484 { 485 KFSLOOKUPERROR enmError; 486 PKFSOBJ pPathObj = kFsCacheLookupA(g_pFsCache, pszPath, &enmError); 487 assert(GetCurrentThreadId() == g_idMainThread); 488 if (pPathObj) 489 { 490 KSIZE off = pPathObj->cchParent; 491 if (off > 0) 492 { 493 KSIZE offEnd = off + pPathObj->cchName; 494 if (offEnd < cbFull) 495 { 496 PKFSDIR pAncestor; 497 498 pszFull[offEnd] = '\0'; 499 memcpy(&pszFull[off], pPathObj->pszName, pPathObj->cchName); 500 501 for (pAncestor = pPathObj->pParent; off > 0; pAncestor = pAncestor->Obj.pParent) 485 if (GetCurrentThreadId() == g_idMainThread) 486 { 487 KFSLOOKUPERROR enmError; 488 PKFSOBJ pPathObj = kFsCacheLookupA(g_pFsCache, pszPath, &enmError); 489 if (pPathObj) 490 { 491 KSIZE off = pPathObj->cchParent; 492 if (off > 0) 493 { 494 KSIZE offEnd = off + pPathObj->cchName; 495 if (offEnd < cbFull) 502 496 { 503 kHlpAssert(off > 1); 504 kHlpAssert(pAncestor != NULL); 505 kHlpAssert(pAncestor->Obj.cchName > 0); 506 pszFull[--off] = '/'; 497 PKFSDIR pAncestor; 498 499 pszFull[offEnd] = '\0'; 500 memcpy(&pszFull[off], pPathObj->pszName, pPathObj->cchName); 501 502 for (pAncestor = pPathObj->pParent; off > 0; pAncestor = pAncestor->Obj.pParent) 503 { 504 kHlpAssert(off > 1); 505 kHlpAssert(pAncestor != NULL); 506 kHlpAssert(pAncestor->Obj.cchName > 0); 507 pszFull[--off] = '/'; 507 508 #ifdef KFSCACHE_CFG_SHORT_NAMES 508 if ( pAncestor->Obj.pszName == pAncestor->Obj.pszShortName509 || memchr(pAncestor->Obj.pszName, ' ', pAncestor->Obj.cchName) == NULL)509 if ( pAncestor->Obj.pszName == pAncestor->Obj.pszShortName 510 || memchr(pAncestor->Obj.pszName, ' ', pAncestor->Obj.cchName) == NULL) 510 511 #endif 511 { 512 off -= pAncestor->Obj.cchName; 513 kHlpAssert(pAncestor->Obj.cchParent == off); 514 memcpy(&pszFull[off], pAncestor->Obj.pszName, pAncestor->Obj.cchName); 512 { 513 off -= pAncestor->Obj.cchName; 514 kHlpAssert(pAncestor->Obj.cchParent == off); 515 memcpy(&pszFull[off], pAncestor->Obj.pszName, pAncestor->Obj.cchName); 516 } 517 #ifdef KFSCACHE_CFG_SHORT_NAMES 518 else 519 { 520 /* 521 * The long name constains a space, so use the alternative name instead. 522 * Most likely the alternative name differs in length, usually it's shorter, 523 * so we have to shift the part of the path we've already assembled 524 * accordingly. 525 */ 526 KSSIZE cchDelta = (KSSIZE)pAncestor->Obj.cchShortName - (KSSIZE)pAncestor->Obj.cchName; 527 if (cchDelta != 0) 528 { 529 if ((KSIZE)(offEnd + cchDelta) >= cbFull) 530 goto l_fallback; 531 memmove(&pszFull[off + cchDelta], &pszFull[off], offEnd + 1 - off); 532 off += cchDelta; 533 offEnd += cchDelta; 534 } 535 off -= pAncestor->Obj.cchShortName; 536 kHlpAssert(pAncestor->Obj.cchParent == off); 537 memcpy(&pszFull[off], pAncestor->Obj.pszShortName, pAncestor->Obj.cchShortName); 538 } 539 #endif 515 540 } 516 #ifdef KFSCACHE_CFG_SHORT_NAMES 517 else 518 { 519 /* 520 * The long name constains a space, so use the alternative name instead. 521 * Most likely the alternative name differs in length, usually it's shorter, 522 * so we have to shift the part of the path we've already assembled 523 * accordingly. 524 */ 525 KSSIZE cchDelta = (KSSIZE)pAncestor->Obj.cchShortName - (KSSIZE)pAncestor->Obj.cchName; 526 if (cchDelta != 0) 527 { 528 if ((KSIZE)(offEnd + cchDelta) >= cbFull) 529 goto l_fallback; 530 memmove(&pszFull[off + cchDelta], &pszFull[off], offEnd + 1 - off); 531 off += cchDelta; 532 offEnd += cchDelta; 533 } 534 off -= pAncestor->Obj.cchShortName; 535 kHlpAssert(pAncestor->Obj.cchParent == off); 536 memcpy(&pszFull[off], pAncestor->Obj.pszShortName, pAncestor->Obj.cchShortName); 537 } 538 #endif 541 kFsCacheObjRelease(g_pFsCache, pPathObj); 542 return; 539 543 } 540 kFsCacheObjRelease(g_pFsCache, pPathObj); 541 return; 542 } 543 } 544 else 545 { 546 if ((size_t)pPathObj->cchName + 1 < cbFull) 547 { 548 /* Assume no spaces here. */ 549 memcpy(pszFull, pPathObj->pszName, pPathObj->cchName); 550 pszFull[pPathObj->cchName] = '/'; 551 pszFull[pPathObj->cchName + 1] = '\0'; 552 553 kFsCacheObjRelease(g_pFsCache, pPathObj); 554 return; 555 } 556 } 557 558 /* do fallback. */ 544 } 545 else 546 { 547 if ((size_t)pPathObj->cchName + 1 < cbFull) 548 { 549 /* Assume no spaces here. */ 550 memcpy(pszFull, pPathObj->pszName, pPathObj->cchName); 551 pszFull[pPathObj->cchName] = '/'; 552 pszFull[pPathObj->cchName + 1] = '\0'; 553 554 kFsCacheObjRelease(g_pFsCache, pPathObj); 555 return; 556 } 557 } 558 559 /* do fallback. */ 559 560 #ifdef KFSCACHE_CFG_SHORT_NAMES 560 561 l_fallback: 561 562 #endif 562 kHlpAssertFailed(); 563 kFsCacheObjRelease(g_pFsCache, pPathObj); 563 kHlpAssertFailed(); 564 kFsCacheObjRelease(g_pFsCache, pPathObj); 565 } 564 566 } 565 567
Note:
See TracChangeset
for help on using the changeset viewer.