Changeset 66602 in vbox for trunk/src/VBox/Runtime/common/filesystem/fatvfs.cpp
- Timestamp:
- Apr 18, 2017 3:27:30 PM (8 years ago)
- svn:sync-xref-src-repo-rev:
- 114635
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Runtime/common/filesystem/fatvfs.cpp
r66574 r66602 463 463 * @interface_method_impl{RTVFSDIROPS,pfnOpenDir} 464 464 */ 465 static DECLCALLBACK(int) rtFsFatDir_OpenDir(void *pvThis, const char *pszSubDir, PRTVFSDIR phVfsDir)466 { 467 RT_NOREF(pvThis, pszSubDir, phVfsDir);465 static DECLCALLBACK(int) rtFsFatDir_OpenDir(void *pvThis, const char *pszSubDir, uint32_t fFlags, PRTVFSDIR phVfsDir) 466 { 467 RT_NOREF(pvThis, pszSubDir, fFlags, phVfsDir); 468 468 return VERR_NOT_IMPLEMENTED; 469 469 } … … 516 516 static DECLCALLBACK(int) rtFsFatDir_RewindDir(void *pvThis) 517 517 { 518 RT_NOREF(pvThis); 518 519 return VERR_NOT_IMPLEMENTED; 519 520 } … … 526 527 RTFSOBJATTRADD enmAddAttr) 527 528 { 529 RT_NOREF(pvThis, pDirEntry, pcbDirEntry, enmAddAttr); 528 530 return VERR_NOT_IMPLEMENTED; 529 531 } … … 571 573 static DECLCALLBACK(void) rtFsFatVol_Destroy(void *pvThis) 572 574 { 575 RT_NOREF(pvThis); 573 576 } 574 577 … … 579 582 static DECLCALLBACK(int) rtFsFatVol_OpenRoot(void *pvThis, PRTVFSDIR phVfsDir) 580 583 { 584 RT_NOREF(pvThis, phVfsDir); 581 585 return VERR_NOT_IMPLEMENTED; 582 586 } … … 604 608 }; 605 609 610 611 612 RTDECL(int) RTFsFatVolOpen(RTVFSFILE hVfsFileIn, bool fReadOnly, PRTVFS phVfs, PRTERRINFO pErrInfo) 613 { 614 RT_NOREF(hVfsFileIn, fReadOnly, pErrInfo, phVfs); 615 return VERR_NOT_IMPLEMENTED; 616 } 617 618 619 /** 620 * @interface_method_impl{RTVFSCHAINELEMENTREG,pfnValidate} 621 */ 622 static DECLCALLBACK(int) rtVfsChainFatVol_Validate(PCRTVFSCHAINELEMENTREG pProviderReg, PRTVFSCHAINSPEC pSpec, 623 PRTVFSCHAINELEMSPEC pElement, uint32_t *poffError, PRTERRINFO pErrInfo) 624 { 625 RT_NOREF(pProviderReg); 626 627 /* 628 * Basic checks. 629 */ 630 if (pElement->enmTypeIn != RTVFSOBJTYPE_FILE) 631 return pElement->enmTypeIn == RTVFSOBJTYPE_INVALID ? VERR_VFS_CHAIN_CANNOT_BE_FIRST_ELEMENT : VERR_VFS_CHAIN_TAKES_FILE; 632 if ( pElement->enmType != RTVFSOBJTYPE_VFS 633 && pElement->enmType != RTVFSOBJTYPE_DIR) 634 return VERR_VFS_CHAIN_ONLY_DIR_OR_VFS; 635 if (pElement->cArgs > 1) 636 return VERR_VFS_CHAIN_AT_MOST_ONE_ARG; 637 638 /* 639 * Parse the flag if present, save in pElement->uProvider. 640 */ 641 bool fReadOnly = (pSpec->fOpenFile & RTFILE_O_ACCESS_MASK) == RTFILE_O_READ; 642 if (pElement->cArgs > 0) 643 { 644 const char *psz = pElement->paArgs[0].psz; 645 if (*psz) 646 { 647 if (!strcmp(psz, "ro")) 648 fReadOnly = true; 649 else if (!strcmp(psz, "rw")) 650 fReadOnly = false; 651 else 652 { 653 *poffError = pElement->paArgs[0].offSpec; 654 return RTErrInfoSet(pErrInfo, VERR_VFS_CHAIN_INVALID_ARGUMENT, "Expected 'ro' or 'rw' as argument"); 655 } 656 } 657 } 658 659 pElement->uProvider = fReadOnly; 660 return VINF_SUCCESS; 661 } 662 663 664 /** 665 * @interface_method_impl{RTVFSCHAINELEMENTREG,pfnInstantiate} 666 */ 667 static DECLCALLBACK(int) rtVfsChainFatVol_Instantiate(PCRTVFSCHAINELEMENTREG pProviderReg, PCRTVFSCHAINSPEC pSpec, 668 PCRTVFSCHAINELEMSPEC pElement, RTVFSOBJ hPrevVfsObj, 669 PRTVFSOBJ phVfsObj, uint32_t *poffError, PRTERRINFO pErrInfo) 670 { 671 RT_NOREF(pProviderReg, pSpec, poffError); 672 673 int rc; 674 RTVFSFILE hVfsFileIn = RTVfsObjToFile(hPrevVfsObj); 675 if (hVfsFileIn != NIL_RTVFSFILE) 676 { 677 RTVFS hVfs; 678 rc = RTFsFatVolOpen(hVfsFileIn, pElement->uProvider != false, &hVfs, pErrInfo); 679 RTVfsFileRelease(hVfsFileIn); 680 if (RT_SUCCESS(rc)) 681 { 682 *phVfsObj = RTVfsObjFromVfs(hVfs); 683 RTVfsRelease(hVfs); 684 if (*phVfsObj != NIL_RTVFSOBJ) 685 return VINF_SUCCESS; 686 rc = VERR_VFS_CHAIN_CAST_FAILED; 687 } 688 } 689 else 690 rc = VERR_VFS_CHAIN_CAST_FAILED; 691 return rc; 692 } 693 694 695 /** 696 * @interface_method_impl{RTVFSCHAINELEMENTREG,pfnCanReuseElement} 697 */ 698 static DECLCALLBACK(bool) rtVfsChainFatVol_CanReuseElement(PCRTVFSCHAINELEMENTREG pProviderReg, 699 PCRTVFSCHAINSPEC pSpec, PCRTVFSCHAINELEMSPEC pElement, 700 PCRTVFSCHAINSPEC pReuseSpec, PCRTVFSCHAINELEMSPEC pReuseElement) 701 { 702 RT_NOREF(pProviderReg, pSpec, pReuseSpec); 703 if ( pElement->paArgs[0].uProvider == pReuseElement->paArgs[0].uProvider 704 || !pReuseElement->paArgs[0].uProvider) 705 return true; 706 return false; 707 } 708 709 710 /** VFS chain element 'file'. */ 711 static RTVFSCHAINELEMENTREG g_rtVfsChainFatVolReg = 712 { 713 /* uVersion = */ RTVFSCHAINELEMENTREG_VERSION, 714 /* fReserved = */ 0, 715 /* pszName = */ "fat", 716 /* ListEntry = */ { NULL, NULL }, 717 /* pszHelp = */ "Open a FAT file system, requires a file object on the left side.\n" 718 "First argument is an optional 'ro' (read-only) or 'rw' (read-write) flag.\n", 719 /* pfnValidate = */ rtVfsChainFatVol_Validate, 720 /* pfnInstantiate = */ rtVfsChainFatVol_Instantiate, 721 /* pfnCanReuseElement = */ rtVfsChainFatVol_CanReuseElement, 722 /* uEndMarker = */ RTVFSCHAINELEMENTREG_VERSION 723 }; 724 725 RTVFSCHAIN_AUTO_REGISTER_ELEMENT_PROVIDER(&g_rtVfsChainFatVolReg, rtVfsChainFatVolReg); 726
Note:
See TracChangeset
for help on using the changeset viewer.