@ -112,10 +112,11 @@ ResultCode DiskArchive::RenameDirectory(const Path& src_path, const Path& dest_p
ResultVal < std : : unique_ptr < DirectoryBackend > > DiskArchive : : OpenDirectory ( const Path & path ) const {
ResultVal < std : : unique_ptr < DirectoryBackend > > DiskArchive : : OpenDirectory ( const Path & path ) const {
LOG_DEBUG ( Service_FS , " called path=%s " , path . DebugStr ( ) . c_str ( ) ) ;
LOG_DEBUG ( Service_FS , " called path=%s " , path . DebugStr ( ) . c_str ( ) ) ;
auto directory = std : : make_unique < DiskDirectory > ( * this , path ) ;
auto full_path = mount_point + path . AsString ( ) ;
if ( ! directory- > Open ( ) )
if ( ! FileUtil: : IsDirectory ( full_path ) )
return ResultCode ( ErrorDescription : : FS_NotFound , ErrorModule : : FS , ErrorSummary : : NotFound ,
return ResultCode ( ErrorDescription : : FS_NotFound , ErrorModule : : FS , ErrorSummary : : NotFound ,
ErrorLevel : : Permanent ) ;
ErrorLevel : : Permanent ) ;
auto directory = std : : make_unique < DiskDirectory > ( full_path ) ;
return MakeResult < std : : unique_ptr < DirectoryBackend > > ( std : : move ( directory ) ) ;
return MakeResult < std : : unique_ptr < DirectoryBackend > > ( std : : move ( directory ) ) ;
}
}
@ -211,21 +212,11 @@ bool DiskFile::Close() const {
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
DiskDirectory : : DiskDirectory ( const DiskArchive & archive , const Path & path ) : directory ( ) {
DiskDirectory : : DiskDirectory ( const std : : string & path ) : directory ( ) {
// TODO(Link Mauve): normalize path into an absolute path without "..", it can currently bypass
// the root directory we set while opening the archive.
// For example, opening /../../usr/bin can give the emulated program your installed programs.
this - > path = archive . mount_point + path . AsString ( ) ;
}
bool DiskDirectory : : Open ( ) {
if ( ! FileUtil : : IsDirectory ( path ) )
return false ;
unsigned size = FileUtil : : ScanDirectoryTree ( path , directory ) ;
unsigned size = FileUtil : : ScanDirectoryTree ( path , directory ) ;
directory . size = size ;
directory . size = size ;
directory . isDirectory = true ;
directory . isDirectory = true ;
children_iterator = directory . children . begin ( ) ;
children_iterator = directory . children . begin ( ) ;
return true ;
}
}
u32 DiskDirectory : : Read ( const u32 count , Entry * entries ) {
u32 DiskDirectory : : Read ( const u32 count , Entry * entries ) {