On Tue, Dec 29, 2020 at 05:57:11AM +0000, Dimitri Karamazov wrote:
> 
> Apart from this, the following code is giving me grief.
> I see no way but to circumvent it's use, or is there?
> This code tries to get a file Name from a file Pointer.
> 

first, it isn't supported on OpenBSD. You can't get a filename from a
file descriptor.

So, you will need to figure if it is possible to not use
ArchGetFileName().

I can't really comment on your error. I am not enough familiar with
C++ or with this code.

> string
> ArchGetFileName(FILE *file)
> {
> #if defined (ARCH_OS_LINUX)
>     string result;
>     char buf[PATH_MAX];
>     ssize_t r = readlink(
>         ArchStringPrintf("/proc/self/fd/%d", fileno(file)).c_str(),
>         buf, sizeof(buf));
>     if (r != -1) {
>         result.assign(buf, buf + r);
>     }
>     return result;
> #elif defined (ARCH_OS_DARWIN)
>     string result;
>     char buf[MAXPATHLEN];
>     if (fcntl(fileno(file), F_GETPATH, buf) != -1) {
>         result = buf;
>     }
>     return result;
> #elif defined (ARCH_OS_WINDOWS)
>     static constexpr DWORD bufSize =
>         sizeof(FILE_NAME_INFO) + sizeof(WCHAR) * 4096;
>     HANDLE hfile = _FileToWinHANDLE(file);
>     auto fileNameInfo = reinterpret_cast<PFILE_NAME_INFO>(malloc(bufSize));
>     string result;
>     if (GetFileInformationByHandleEx(
>             hfile, FileNameInfo, static_cast<void *>(fileNameInfo), bufSize)) 
> {
>         size_t outSize = WideCharToMultiByte(
>             CP_UTF8, 0, fileNameInfo->FileName,
>             fileNameInfo->FileNameLength/sizeof(WCHAR),
>             NULL, 0, NULL, NULL);
>         result.resize(outSize);
>         WideCharToMultiByte(
>             CP_UTF8, 0, fileNameInfo->FileName,
>             fileNameInfo->FileNameLength/sizeof(WCHAR),
>             &result.front(), outSize, NULL, NULL);
>     }
>     free(fileNameInfo);
>     return result;                                        
> #else
> #error Unknown system architecture
> #endif
> }
> 
> And it is referenced here or see the attached file for better context.
> 
> /* static */
> std::unique_ptr<CrateFile>
> CrateFile::Open(string const &assetPath)
> {
>     TfAutoMallocTag tag2("Usd_CrateFile::CrateFile::Open");
> 
>     std::unique_ptr<CrateFile> result;
> 
>     // Fetch the asset from Ar.
>     auto asset = ArGetResolver().OpenAsset(assetPath);
>     if (!asset) {
>         TF_RUNTIME_ERROR("Failed to open asset '%s'", assetPath.c_str());
>         return result;
>     }
> 
>     // See if we can get an underlying FILE * for the asset.
>     FILE *file; size_t offset;
>     std::tie(file, offset) = asset->GetFileUnsafe();
>     if (file) {
>         // If so, then we'll either mmap it or use pread() on it.
>         if (!TfGetenvBool("USDC_USE_PREAD", false)) {
>             // Try to memory-map the file.
>             auto mapping = _MmapAsset(assetPath.c_str(), asset);
>             result.reset(new CrateFile(assetPath, ArchGetFileName(file),
>                                        std::move(mapping), asset));
>         } else {
>             // Use pread with the asset's file.
>             result.reset(new CrateFile(
>                              assetPath, ArchGetFileName(file),
>                              _FileRange(
>                                  file, offset, asset->GetSize(),
>                                  /*hasOwnership=*/ false),
>                              asset));
>         }
>     }
>     else {
>         // With no underlying FILE *, we'll go through ArAsset::Read() 
> directly.
>         result.reset(new CrateFile(assetPath, asset));
>     }
>     
>     // If the resulting CrateFile has no asset path, reading failed.
>     if (result->GetAssetPath().empty())
>         result.reset();
>     
>    return result;
> }
> 
> I think the fileName variable which is referenced a lot in the file is
> what the ArchGetFileName tries to get but indirectly (probably as a
> check?). But I fail to alter this by just adding another argument
> as below so as to directly refer to it.
> 
> --- pxr/usd/usd/crateFile.cpp.orig    Wed Oct 14 23:55:19 2020
> +++ pxr/usd/usd/crateFile.cpp Sun Dec 27 10:28:48 2020
> @@ -2105,7 +2105,7 @@ CrateFile::_MmapFile(char const *fileName, FILE *file)
>  
>  /* static */
>  std::unique_ptr<CrateFile>
> -CrateFile::Open(string const &assetPath)
> +CrateFile::Open(string const &assetPath,string const &fileName)
>  {
>      TfAutoMallocTag tag2("Usd_CrateFile::CrateFile::Open");
>  
> @@ -2126,12 +2126,12 @@ CrateFile::Open(string const &assetPath)
>          if (!TfGetenvBool("USDC_USE_PREAD", false)) {
>              // Try to memory-map the file.
>              auto mapping = _MmapAsset(assetPath.c_str(), asset);
> -            result.reset(new CrateFile(assetPath, ArchGetFileName(file),
> +            result.reset(new CrateFile(assetPath, fileName,
>                                         std::move(mapping), asset));
>          } else {
>              // Use pread with the asset's file.
>              result.reset(new CrateFile(
> -                             assetPath, ArchGetFileName(file),
> +                             assetPath, fileName,
>                               _FileRange(
>                                   file, offset, asset->GetSize(),
>                                   /*hasOwnership=*/ false),
> @@ -2369,7 +2369,7 @@ CrateFile::CanPackTo(string const &fileName) const
>      // Try to open \p fileName and get its filename.
>      bool result = false;
>      if (FILE *f = ArchOpenFile(fileName.c_str(), "rb")) {
> -        if (ArchGetFileName(f) == _fileReadFrom) {
> +        if (fileName == _fileReadFrom) {
>              result = true;
>          }
>          fclose(f);
> @@ -2450,7 +2450,7 @@ CrateFile::Packer::Close()
>      }
>  
>      // Reset the filename we've read content from.
> -    _crate->_fileReadFrom = ArchGetFileName(fileRange.file);
> +    _crate->_fileReadFrom = _crate->_packCtx->fileName;
>  
>      // Reset the mapping or file so we can read values from the newly
>      // written file.
> 
> The build ultimately fails. I would like to know if this approach is
> right and if it is what am I missing over here.
> 
> ===>  Building for usd-20.11
> [1/211] /usr/ports/pobj/usd-20.11/bin/c++  -DARCH_EXPORTS=1 -DAR_EXPORTS=1 
> -DBOOST_PYTHON_NO_PY_SIGNATURES -DGF_EXPORTS=1 -DGLX_GLXEXT_PROTOTYPES 
> -DGL_GLEXT_PROTOTYPES -DJS_EXPORTS=1 -DKIND_EXPORTS=1 
> -DMFB_ALT_PACKAGE_NAME=usd -DMFB_PACKAGE_MODULE=Usd -DMFB_PACKAGE_NAME=usd 
> -DNDR_EXPORTS=1 -DPCP_EXPORTS=1 -DPLUG_EXPORTS=1 -DPXR_BUILD_LOCATION=usd 
> -DPXR_PLUGIN_BUILD_LOCATION=../plugin/usd -DPXR_PYTHON_ENABLED=1 
> -DPXR_PYTHON_MODULES_ENABLED=1 -DSDF_EXPORTS=1 -DSDR_EXPORTS=1 -DTF_EXPORTS=1 
> -DTRACE_EXPORTS=1 -DUSDGEOM_EXPORTS=1 -DUSDHYDRA_EXPORTS=1 -DUSDLUX_EXPORTS=1 
> -DUSDMEDIA_EXPORTS=1 -DUSDRENDER_EXPORTS=1 -DUSDRI_EXPORTS=1 
> -DUSDSHADE_EXPORTS=1 -DUSDSKEL_EXPORTS=1 -DUSDUI_EXPORTS=1 
> -DUSDUTILS_EXPORTS=1 -DUSDVOL_EXPORTS=1 -DUSD_EXPORTS=1 -DVT_EXPORTS=1 
> -DWORK_EXPORTS=1 -Ipxr/usd/usd 
> -I/usr/ports/pobj/usd-20.11/USD-20.11/pxr/usd/usd -Iinclude -isystem 
> /usr/local/include -Wall -pthread -Wno-deprecated 
> -Wno-deprecated-declarations -Wno-unused-local-typedefs 
> -Wno-unused-command-line-argument -O2 -pipe -DNDEBUG -fPIC   -std=c++14 -MD 
> -MT pxr/usd/usd/CMakeFiles/usd.dir/crateFile.cpp.o -MF 
> pxr/usd/usd/CMakeFiles/usd.dir/crateFile.cpp.o.d -o 
> pxr/usd/usd/CMakeFiles/usd.dir/crateFile.cpp.o -c 
> /usr/ports/pobj/usd-20.11/USD-20.11/pxr/usd/usd/crateFile.cpp
> FAILED: pxr/usd/usd/CMakeFiles/usd.dir/crateFile.cpp.o 
> /usr/ports/pobj/usd-20.11/bin/c++  -DARCH_EXPORTS=1 -DAR_EXPORTS=1 
> -DBOOST_PYTHON_NO_PY_SIGNATURES -DGF_EXPORTS=1 -DGLX_GLXEXT_PROTOTYPES 
> -DGL_GLEXT_PROTOTYPES -DJS_EXPORTS=1 -DKIND_EXPORTS=1 
> -DMFB_ALT_PACKAGE_NAME=usd -DMFB_PACKAGE_MODULE=Usd -DMFB_PACKAGE_NAME=usd 
> -DNDR_EXPORTS=1 -DPCP_EXPORTS=1 -DPLUG_EXPORTS=1 -DPXR_BUILD_LOCATION=usd 
> -DPXR_PLUGIN_BUILD_LOCATION=../plugin/usd -DPXR_PYTHON_ENABLED=1 
> -DPXR_PYTHON_MODULES_ENABLED=1 -DSDF_EXPORTS=1 -DSDR_EXPORTS=1 -DTF_EXPORTS=1 
> -DTRACE_EXPORTS=1 -DUSDGEOM_EXPORTS=1 -DUSDHYDRA_EXPORTS=1 -DUSDLUX_EXPORTS=1 
> -DUSDMEDIA_EXPORTS=1 -DUSDRENDER_EXPORTS=1 -DUSDRI_EXPORTS=1 
> -DUSDSHADE_EXPORTS=1 -DUSDSKEL_EXPORTS=1 -DUSDUI_EXPORTS=1 
> -DUSDUTILS_EXPORTS=1 -DUSDVOL_EXPORTS=1 -DUSD_EXPORTS=1 -DVT_EXPORTS=1 
> -DWORK_EXPORTS=1 -Ipxr/usd/usd 
> -I/usr/ports/pobj/usd-20.11/USD-20.11/pxr/usd/usd -Iinclude -isystem 
> /usr/local/include -Wall -pthread -Wno-deprecated 
> -Wno-deprecated-declarations -Wno-unused-local-typedefs 
> -Wno-unused-command-line-argument -O2 -pipe -DNDEBUG -fPIC   -std=c++14 -MD 
> -MT pxr/usd/usd/CMakeFiles/usd.dir/crateFile.cpp.o -MF 
> pxr/usd/usd/CMakeFiles/usd.dir/crateFile.cpp.o.d -o 
> pxr/usd/usd/CMakeFiles/usd.dir/crateFile.cpp.o -c 
> /usr/ports/pobj/usd-20.11/USD-20.11/pxr/usd/usd/crateFile.cpp
> /usr/ports/pobj/usd-20.11/USD-20.11/pxr/usd/usd/crateFile.cpp:2108:12: error: 
> out-of-line definition of 'Open' does not match any declaration in 
> 'pxrInternal_v0_20__pxrReserved__::Usd_CrateFile::CrateFile'
> CrateFile::Open(string const &assetPath,string const &fileName)
>            ^~~~


-- 
Sebastien Marie

Reply via email to