Mount directories read-only where possible

This commit is contained in:
Martin Natano
2022-03-12 22:30:54 +01:00
parent d8b6d36a78
commit 168877f6a8
11 changed files with 97 additions and 119 deletions
+23 -3
View File
@@ -264,9 +264,15 @@ PrefsManager::PrefsManager() :
m_CourseSortOrder ( "CourseSortOrder", COURSE_SORT_SONGS ),
m_bSubSortByNumSteps ( "SubSortByNumSteps", false ),
m_GetRankingName ( "GetRankingName", RANKING_ON ),
m_sAdditionalSongFolders ( "AdditionalSongFolders", "", nullptr, PreferenceType::Immutable ),
m_sAdditionalCourseFolders ( "AdditionalCourseFolders", "", nullptr, PreferenceType::Immutable ),
m_sAdditionalFolders ( "AdditionalFolders", "", nullptr, PreferenceType::Immutable ),
m_sAdditionalSongFoldersReadOnly( "AdditionalSongFoldersReadOnly", "", nullptr, PreferenceType::Immutable ),
m_sAdditionalSongFoldersWritable( "AdditionalSongFoldersWritable", "", nullptr, PreferenceType::Immutable ),
m_sAdditionalCourseFoldersReadOnly( "AdditionalCourseFoldersReadOnly", "", nullptr, PreferenceType::Immutable ),
m_sAdditionalCourseFoldersWritable( "AdditionalCourseFoldersWritable", "", nullptr, PreferenceType::Immutable ),
m_sAdditionalFoldersReadOnly ( "AdditionalFoldersReadOnly", "", nullptr, PreferenceType::Immutable ),
m_sAdditionalFoldersWritable ( "AdditionalFoldersWritable", "", nullptr, PreferenceType::Immutable ),
m_sAdditionalSongFolders ( "AdditionalSongFolders", "", nullptr, PreferenceType::Deprecated ),
m_sAdditionalCourseFolders ( "AdditionalCourseFolders", "", nullptr, PreferenceType::Deprecated ),
m_sAdditionalFolders ( "AdditionalFolders", "", nullptr, PreferenceType::Deprecated ),
m_sDefaultTheme ( "DefaultTheme", "default" ),
m_sLastSeenVideoDriver ( "LastSeenVideoDriver", "" ),
m_sVideoRenderers ( "VideoRenderers", "" ), // StepMania.cpp sets these on first run:
@@ -405,6 +411,8 @@ void PrefsManager::ReadPrefsFromDisk()
ReadGamePrefsFromIni( SpecialFiles::PREFERENCES_INI_PATH );
ReadPrefsFromFile( SpecialFiles::STATIC_INI_PATH, GetPreferencesSection(), true );
TranslateDeprecatedFlags();
if( !m_sCurrentGame.Get().empty() )
RestoreGamePrefs();
}
@@ -416,6 +424,8 @@ void PrefsManager::ResetToFactoryDefaults()
IPreference::LoadAllDefaults();
ReadPrefsFromFile( SpecialFiles::STATIC_INI_PATH, GetPreferencesSection(), true );
TranslateDeprecatedFlags();
SavePrefsToDisk();
}
@@ -500,6 +510,16 @@ void PrefsManager::ReadDefaultsFromIni( const IniFile &ini, const RString &sSect
IPreference::ReadAllDefaultsFromNode( ini.GetChild(sSection) );
}
void PrefsManager::TranslateDeprecatedFlags()
{
if(!m_sAdditionalFolders.Get().empty())
m_sAdditionalFoldersReadOnly.Set(m_sAdditionalFolders.Get());
if(!m_sAdditionalSongFolders.Get().empty())
m_sAdditionalSongFoldersReadOnly.Set(m_sAdditionalSongFolders.Get());
if(!m_sAdditionalCourseFolders.Get().empty())
m_sAdditionalCourseFoldersReadOnly.Set(m_sAdditionalCourseFolders.Get());
}
void PrefsManager::SavePrefsToDisk()
{
IniFile ini;
+11 -3
View File
@@ -275,9 +275,12 @@ public:
Preference<bool> m_bSubSortByNumSteps;
Preference<GetRankingName> m_GetRankingName;
Preference<RString> m_sAdditionalSongFolders;
Preference<RString> m_sAdditionalCourseFolders;
Preference<RString> m_sAdditionalFolders;
Preference<RString> m_sAdditionalSongFoldersReadOnly;
Preference<RString> m_sAdditionalSongFoldersWritable;
Preference<RString> m_sAdditionalCourseFoldersReadOnly;
Preference<RString> m_sAdditionalCourseFoldersWritable;
Preference<RString> m_sAdditionalFoldersReadOnly;
Preference<RString> m_sAdditionalFoldersWritable;
// failsafe
Preference<RString> m_sDefaultTheme;
@@ -352,6 +355,11 @@ public:
protected:
void ReadPrefsFromFile( const RString &sIni, const RString &sSection, bool bIsStatic );
void ReadDefaultsFromFile( const RString &sIni, const RString &sSection );
void TranslateDeprecatedFlags();
Preference<RString> m_sAdditionalSongFolders; // deprecated
Preference<RString> m_sAdditionalCourseFolders; // deprecated
Preference<RString> m_sAdditionalFolders; // deprecated
};
/* This is global, because it can be accessed by crash handlers and error handlers
+4 -22
View File
@@ -22,7 +22,6 @@ RageFileManager *FILEMAN = nullptr;
/* Lock this before touching any of these globals (except FILEMAN itself). */
static RageEvent *g_Mutex;
RString RageFileManagerUtil::sInitialWorkingDirectory;
RString RageFileManagerUtil::sDirOfExecutable;
struct LoadedDriver
@@ -276,7 +275,6 @@ static RString GetDirOfExecutable( RString argv0 )
static void ChangeToDirOfExecutable( const RString &argv0 )
{
RageFileManagerUtil::sInitialWorkingDirectory = GetCwd();
RageFileManagerUtil::sDirOfExecutable = GetDirOfExecutable( argv0 );
/* Set the CWD. Any effects of this is platform-specific; most files are read and
@@ -545,15 +543,15 @@ static void AdjustMountpoint( RString &sMountPoint )
}
static void AddFilesystemDriver( LoadedDriver *pLoadedDriver, bool bAddToEnd )
static void AddFilesystemDriver( LoadedDriver *pLoadedDriver )
{
g_Mutex->Lock();
g_pDrivers.insert( bAddToEnd? g_pDrivers.end():g_pDrivers.begin(), pLoadedDriver );
g_pDrivers.push_back(pLoadedDriver);
g_Mountpoints->LoadFromDrivers( g_pDrivers );
g_Mutex->Unlock();
}
bool RageFileManager::Mount( const RString &sType, const RString &sRoot_, const RString &sMountPoint_, bool bAddToEnd )
bool RageFileManager::Mount( const RString &sType, const RString &sRoot_, const RString &sMountPoint_ )
{
RString sRoot = sRoot_;
RString sMountPoint = sMountPoint_;
@@ -593,26 +591,10 @@ bool RageFileManager::Mount( const RString &sType, const RString &sRoot_, const
pLoadedDriver->m_sRoot = sRoot;
pLoadedDriver->m_sMountPoint = sMountPoint;
AddFilesystemDriver( pLoadedDriver, bAddToEnd );
AddFilesystemDriver( pLoadedDriver );
return true;
}
/* Mount a custom filesystem. */
void RageFileManager::Mount( RageFileDriver *pDriver, const RString &sMountPoint_, bool bAddToEnd )
{
RString sMountPoint = sMountPoint_;
AdjustMountpoint( sMountPoint );
LoadedDriver *pLoadedDriver = new LoadedDriver;
pLoadedDriver->m_pDriver = pDriver;
pLoadedDriver->m_sType = "";
pLoadedDriver->m_sRoot = "";
pLoadedDriver->m_sMountPoint = sMountPoint;
AddFilesystemDriver( pLoadedDriver, bAddToEnd );
}
void RageFileManager::Unmount( const RString &sType, const RString &sRoot_, const RString &sMountPoint_ )
{
RString sRoot = sRoot_;
+1 -3
View File
@@ -3,7 +3,6 @@
/** @brief Constants for working with the RageFileManager. */
namespace RageFileManagerUtil
{
extern RString sInitialWorkingDirectory;
extern RString sDirOfExecutable;
}
@@ -48,8 +47,7 @@ public:
* @return the absolute path. */
RString ResolvePath(const RString &path);
bool Mount( const RString &sType, const RString &sRealPath, const RString &sMountPoint, bool bAddToEnd = true );
void Mount( RageFileDriver *pDriver, const RString &sMountPoint, bool bAddToEnd = true );
bool Mount( const RString &sType, const RString &sRealPath, const RString &sMountPoint );
void Unmount( const RString &sType, const RString &sRoot, const RString &sMountPoint );
/* Change the root of a filesystem. Only a couple drivers support this; it's
-1
View File
@@ -1,7 +1,6 @@
#include "global.h"
#include "SpecialFiles.h"
const RString SpecialFiles::USER_PACKAGES_DIR = "UserPackages/";
const RString SpecialFiles::PACKAGES_DIR = "Packages/";
const RString SpecialFiles::KEYMAPS_PATH = "Save/Keymaps.ini";
const RString SpecialFiles::EDIT_MODE_KEYMAPS_PATH = "Save/EditMode_Keymaps.ini";
-10
View File
@@ -4,16 +4,6 @@
/** @brief The listing of the special files and directories in use. */
namespace SpecialFiles
{
/**
* @brief The user packages directory.
*
* This should be separate from system packages so that
* we can write to it (installing a package).
*/
extern const RString USER_PACKAGES_DIR;
/** @brief The system packages directory.
*
* This is not the user packages directory. */
extern const RString PACKAGES_DIR;
extern const RString KEYMAPS_PATH;
/** @brief Edit Mode keymaps are separate from standard keymaps because
+21 -26
View File
@@ -917,19 +917,30 @@ static void MountTreeOfZips( const RString &dir )
GetDirListing( path + "/*.zip", zips, false, true );
GetDirListing( path + "/*.smzip", zips, false, true );
for( unsigned i = 0; i < zips.size(); ++i )
for (const auto& zip : zips)
{
if( !IsAFile(zips[i]) )
if( !IsAFile(zip) )
continue;
LOG->Trace( "VFS: found %s", zips[i].c_str() );
FILEMAN->Mount( "zip", zips[i], "/" );
LOG->Trace( "VFS: found %s", zip.c_str() );
FILEMAN->Mount( "zip", zip, "/" );
}
GetDirListing( path + "/*", dirs, true, true );
}
}
static void MountFolders(const RString &type, const RString &realPathList, const RString &mountPoint)
{
if (!realPathList.empty())
{
vector<RString> dirs;
split(realPathList, ",", dirs, true);
for (const auto& dir : dirs)
FILEMAN->Mount(type, dir, mountPoint);
}
}
static void WriteLogHeader()
{
LOG->Info("%s%s", PRODUCT_FAMILY, product_version);
@@ -1022,30 +1033,14 @@ int sm_main(int argc, char* argv[])
WriteLogHeader();
// Set up alternative filesystem trees.
if( PREFSMAN->m_sAdditionalFolders.Get() != "" )
{
vector<RString> dirs;
split( PREFSMAN->m_sAdditionalFolders, ",", dirs, true );
for( unsigned i=0; i < dirs.size(); i++)
FILEMAN->Mount( "dir", dirs[i], "/" );
}
if( PREFSMAN->m_sAdditionalSongFolders.Get() != "" )
{
vector<RString> dirs;
split( PREFSMAN->m_sAdditionalSongFolders, ",", dirs, true );
for( unsigned i=0; i < dirs.size(); i++)
FILEMAN->Mount( "dir", dirs[i], "/Songs" );
}
if( PREFSMAN->m_sAdditionalCourseFolders.Get() != "" )
{
vector<RString> dirs;
split( PREFSMAN->m_sAdditionalCourseFolders, ",", dirs, true );
for( unsigned i=0; i < dirs.size(); i++)
FILEMAN->Mount( "dir", dirs[i], "/Courses" );
}
MountFolders("dirro", PREFSMAN->m_sAdditionalFoldersReadOnly.Get(), "/");
MountFolders("dir", PREFSMAN->m_sAdditionalFoldersWritable.Get(), "/");
MountFolders("dirro", PREFSMAN->m_sAdditionalSongFoldersReadOnly.Get(), "/Songs");
MountFolders("dir", PREFSMAN->m_sAdditionalSongFoldersWritable.Get(), "/Songs");
MountFolders("dirro", PREFSMAN->m_sAdditionalCourseFoldersReadOnly.Get(), "/Courses");
MountFolders("dir", PREFSMAN->m_sAdditionalCourseFoldersWritable.Get(), "/Courses");
MountTreeOfZips( SpecialFiles::PACKAGES_DIR );
MountTreeOfZips( SpecialFiles::USER_PACKAGES_DIR );
/* One of the above filesystems might contain files that affect preferences
* (e.g. Data/Static.ini). Re-read preferences. */
+26 -28
View File
@@ -4,10 +4,10 @@
#include "RageUtil.h"
#include "archutils/Unix/CrashHandler.h"
#include "archutils/Unix/SignalHandler.h"
#include "SpecialFiles.h"
#include "ProductInfo.h"
#include <CoreServices/CoreServices.h>
#include <ApplicationServices/ApplicationServices.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/sysctl.h>
#include <mach/mach.h>
@@ -318,13 +318,15 @@ static void PathForFolderType( char dir[PATH_MAX], OSType folderType )
void ArchHooks::MountInitialFilesystems( const RString &sDirOfExecutable )
{
char dir[PATH_MAX];
struct stat st;
bool portable = !stat(sDirOfExecutable + "/Portable.ini", &st);
FILEMAN->Mount(portable ? "dir" : "dirro", sDirOfExecutable, "/");
CFURLRef dataUrl = CFBundleCopyResourceURL( CFBundleGetMainBundle(), CFSTR("StepMania"), CFSTR("smzip"), nil);
FILEMAN->Mount( "dir", sDirOfExecutable, "/" );
if( dataUrl )
{
char dir[PATH_MAX];
CFStringRef dataPath = CFURLCopyFileSystemPath( dataUrl, kCFURLPOSIXPathStyle );
CFStringGetCString( dataPath, dir, PATH_MAX, kCFStringEncodingUTF8 );
@@ -353,7 +355,7 @@ void ArchHooks::MountUserFilesystems( const RString &sDirOfExecutable )
FILEMAN->Mount( "dir", ssprintf("%s/" PRODUCT_ID "/Characters", dir), "/Characters" );
FILEMAN->Mount( "dir", ssprintf("%s/" PRODUCT_ID "/Courses", dir), "/Courses" );
FILEMAN->Mount( "dir", ssprintf("%s/" PRODUCT_ID "/NoteSkins", dir), "/NoteSkins" );
FILEMAN->Mount( "dir", ssprintf("%s/" PRODUCT_ID "/Packages", dir), "/" + SpecialFiles::USER_PACKAGES_DIR );
FILEMAN->Mount( "dir", ssprintf("%s/" PRODUCT_ID "/Packages", dir), "/Packages" );
FILEMAN->Mount( "dir", ssprintf("%s/" PRODUCT_ID "/Songs", dir), "/Songs" );
FILEMAN->Mount( "dir", ssprintf("%s/" PRODUCT_ID "/RandomMovies", dir), "/RandomMovies" );
FILEMAN->Mount( "dir", ssprintf("%s/" PRODUCT_ID "/Themes", dir), "/Themes" );
@@ -369,29 +371,25 @@ void ArchHooks::MountUserFilesystems( const RString &sDirOfExecutable )
// /Logs -> ~/Library/Logs/PRODUCT_ID
PathForFolderType( dir, kDomainLibraryFolderType );
FILEMAN->Mount( "dir", ssprintf("%s/Logs/" PRODUCT_ID, dir), "/Logs" );
NSString* resourcePath = [[NSBundle mainBundle] resourcePath];
if( resourcePath )
{
const char* resourcePathUTF8String = [resourcePath UTF8String];
FILEMAN->Mount( "dir", ssprintf("%s/Announcers", resourcePathUTF8String), "/Announcers" );
FILEMAN->Mount( "dir", ssprintf("%s/BGAnimations", resourcePathUTF8String), "/BGAnimations" );
FILEMAN->Mount( "dir", ssprintf("%s/BackgroundEffects", resourcePathUTF8String), "/BackgroundEffects" );
FILEMAN->Mount( "dir", ssprintf("%s/BackgroundTransitions", resourcePathUTF8String), "/BackgroundTransitions" );
FILEMAN->Mount( "dir", ssprintf("%s/CDTitles", resourcePathUTF8String), "/CDTitles" );
FILEMAN->Mount( "dir", ssprintf("%s/Characters", resourcePathUTF8String), "/Characters" );
FILEMAN->Mount( "dir", ssprintf("%s/Courses", resourcePathUTF8String), "/Courses" );
FILEMAN->Mount( "dir", ssprintf("%s/NoteSkins", resourcePathUTF8String), "/NoteSkins" );
FILEMAN->Mount( "dir", ssprintf("%s/Packages", resourcePathUTF8String), "/" + SpecialFiles::USER_PACKAGES_DIR );
FILEMAN->Mount( "dir", ssprintf("%s/Songs", resourcePathUTF8String), "/Songs" );
FILEMAN->Mount( "dir", ssprintf("%s/RandomMovies", resourcePathUTF8String), "/RandomMovies" );
FILEMAN->Mount( "dir", ssprintf("%s/Themes", resourcePathUTF8String), "/Themes" );
FILEMAN->Mount( "dir", ssprintf("%s/Data", resourcePathUTF8String), "/Data" );
}
// /Desktop -> /Users/<user>/Desktop/PRODUCT_ID
// PathForFolderType( dir, kDesktopFolderType );
// FILEMAN->Mount( "dir", ssprintf("%s/" PRODUCT_ID, dir), "/Desktop" );
NSString* resourcePath = [[NSBundle mainBundle] resourcePath];
if( resourcePath )
{
const char* resourcePathUTF8String = [resourcePath UTF8String];
FILEMAN->Mount( "dirro", ssprintf("%s/Announcers", resourcePathUTF8String), "/Announcers" );
FILEMAN->Mount( "dirro", ssprintf("%s/BGAnimations", resourcePathUTF8String), "/BGAnimations" );
FILEMAN->Mount( "dirro", ssprintf("%s/BackgroundEffects", resourcePathUTF8String), "/BackgroundEffects" );
FILEMAN->Mount( "dirro", ssprintf("%s/BackgroundTransitions", resourcePathUTF8String), "/BackgroundTransitions" );
FILEMAN->Mount( "dirro", ssprintf("%s/CDTitles", resourcePathUTF8String), "/CDTitles" );
FILEMAN->Mount( "dirro", ssprintf("%s/Characters", resourcePathUTF8String), "/Characters" );
FILEMAN->Mount( "dirro", ssprintf("%s/Courses", resourcePathUTF8String), "/Courses" );
FILEMAN->Mount( "dirro", ssprintf("%s/NoteSkins", resourcePathUTF8String), "/NoteSkins" );
FILEMAN->Mount( "dirro", ssprintf("%s/Packages", resourcePathUTF8String), "/Packages" );
FILEMAN->Mount( "dirro", ssprintf("%s/Songs", resourcePathUTF8String), "/Songs" );
FILEMAN->Mount( "dirro", ssprintf("%s/RandomMovies", resourcePathUTF8String), "/RandomMovies" );
FILEMAN->Mount( "dirro", ssprintf("%s/Themes", resourcePathUTF8String), "/Themes" );
FILEMAN->Mount( "dirro", ssprintf("%s/Data", resourcePathUTF8String), "/Data" );
}
}
static inline int GetIntValue( CFTypeRef r )
+5 -17
View File
@@ -1,11 +1,11 @@
#include "global.h"
#include "ArchHooks_Unix.h"
#include "ProductInfo.h"
#include "RageFileManager.h"
#include "RageLog.h"
#include "RageUtil.h"
#include "RageThreads.h"
#include "LocalizedString.h"
#include "SpecialFiles.h"
#include "archutils/Unix/SignalHandler.h"
#include "archutils/Unix/GetSysInfo.h"
#include "archutils/Common/PthreadHelpers.h"
@@ -15,6 +15,7 @@
#include <unistd.h>
#endif
#include <sys/time.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/wait.h>
@@ -380,24 +381,11 @@ RString ArchHooks_Unix::GetClipboard()
#endif
}
#include "RageFileManager.h"
#include <sys/stat.h>
static LocalizedString COULDNT_FIND_SONGS( "ArchHooks_Unix", "Couldn't find 'Songs'" );
void ArchHooks::MountInitialFilesystems( const RString &sDirOfExecutable )
{
RString Root;
struct stat st;
if( !stat(sDirOfExecutable + "/Packages", &st) && st.st_mode&S_IFDIR )
Root = sDirOfExecutable;
else if( !stat(sDirOfExecutable + "/Songs", &st) && st.st_mode&S_IFDIR )
Root = sDirOfExecutable;
else if( !stat(RageFileManagerUtil::sInitialWorkingDirectory + "/Songs", &st) && st.st_mode&S_IFDIR )
Root = RageFileManagerUtil::sInitialWorkingDirectory;
else
RageException::Throw( "%s", COULDNT_FIND_SONGS.GetValue().c_str() );
FILEMAN->Mount( "dir", Root, "/" );
bool portable = !stat(sDirOfExecutable + "/Portable.ini", &st);
FILEMAN->Mount(portable ? "dir" : "dirro", sDirOfExecutable, "/");
}
void ArchHooks::MountUserFilesystems( const RString &sDirOfExecutable )
@@ -417,7 +405,7 @@ void ArchHooks::MountUserFilesystems( const RString &sDirOfExecutable )
FILEMAN->Mount( "dir", sUserDataPath + "/Courses", "/Courses" );
FILEMAN->Mount( "dir", sUserDataPath + "/Logs", "/Logs" );
FILEMAN->Mount( "dir", sUserDataPath + "/NoteSkins", "/NoteSkins" );
FILEMAN->Mount( "dir", sUserDataPath + "/Packages", "/" + SpecialFiles::USER_PACKAGES_DIR );
FILEMAN->Mount( "dir", sUserDataPath + "/Packages", "/Packages" );
FILEMAN->Mount( "dir", sUserDataPath + "/Save", "/Save" );
FILEMAN->Mount( "dir", sUserDataPath + "/Screenshots", "/Screenshots" );
FILEMAN->Mount( "dir", sUserDataPath + "/Songs", "/Songs" );
+4 -4
View File
@@ -5,7 +5,6 @@
#include "archutils/Win32/SpecialDirs.h"
#include "ProductInfo.h"
#include "RageFileManager.h"
#include "SpecialFiles.h"
// for timeGetTime
#include <windows.h>
@@ -56,8 +55,9 @@ static RString GetMountDir( const RString &sDirOfExecutable )
void ArchHooks::MountInitialFilesystems( const RString &sDirOfExecutable )
{
RString sDir = GetMountDir( sDirOfExecutable );
FILEMAN->Mount( "dir", sDir, "/" );
bool portable = GetFileAttributes(sDir + "/Portable.ini", &st) != INVALID_FILE_ATTRIBUTES;
FILEMAN->Mount(portable ? "dir" : "dirro", sDir, "/");
}
void ArchHooks::MountUserFilesystems( const RString &sDirOfExecutable )
@@ -84,7 +84,7 @@ void ArchHooks::MountUserFilesystems( const RString &sDirOfExecutable )
FILEMAN->Mount( "dir", sAppDataDir + "/Courses", "/Courses" );
FILEMAN->Mount( "dir", sAppDataDir + "/Logs", "/Logs" );
FILEMAN->Mount( "dir", sAppDataDir + "/NoteSkins", "/NoteSkins" );
FILEMAN->Mount( "dir", sAppDataDir + "/Packages", "/" + SpecialFiles::USER_PACKAGES_DIR );
FILEMAN->Mount( "dir", sAppDataDir + "/Packages", "/Packages" );
FILEMAN->Mount( "dir", sAppDataDir + "/Save", "/Save" );
FILEMAN->Mount( "dir", sAppDataDir + "/Screenshots", "/Screenshots" );
FILEMAN->Mount( "dir", sAppDataDir + "/Songs", "/Songs" );
+2 -2
View File
@@ -122,9 +122,9 @@ bool MemoryCardDriver::DoOneUpdate( bool bMount, vector<UsbStorageDevice>& vStor
* and then unmount it until Mount() is called. */
d.m_State = UsbStorageDevice::STATE_READY;
FILEMAN->Mount( "dir", d.sOsMountDir, TEMP_MOUNT_POINT );
FILEMAN->Mount( "dirro", d.sOsMountDir, TEMP_MOUNT_POINT );
d.bIsNameAvailable = PROFILEMAN->FastLoadProfileNameFromMemoryCard( TEMP_MOUNT_POINT, d.sName );
FILEMAN->Unmount( "dir", d.sOsMountDir, TEMP_MOUNT_POINT );
FILEMAN->Unmount( "dirro", d.sOsMountDir, TEMP_MOUNT_POINT );
}
this->Unmount( &d );