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_CourseSortOrder ( "CourseSortOrder", COURSE_SORT_SONGS ),
m_bSubSortByNumSteps ( "SubSortByNumSteps", false ), m_bSubSortByNumSteps ( "SubSortByNumSteps", false ),
m_GetRankingName ( "GetRankingName", RANKING_ON ), m_GetRankingName ( "GetRankingName", RANKING_ON ),
m_sAdditionalSongFolders ( "AdditionalSongFolders", "", nullptr, PreferenceType::Immutable ), m_sAdditionalSongFoldersReadOnly( "AdditionalSongFoldersReadOnly", "", nullptr, PreferenceType::Immutable ),
m_sAdditionalCourseFolders ( "AdditionalCourseFolders", "", nullptr, PreferenceType::Immutable ), m_sAdditionalSongFoldersWritable( "AdditionalSongFoldersWritable", "", nullptr, PreferenceType::Immutable ),
m_sAdditionalFolders ( "AdditionalFolders", "", 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_sDefaultTheme ( "DefaultTheme", "default" ),
m_sLastSeenVideoDriver ( "LastSeenVideoDriver", "" ), m_sLastSeenVideoDriver ( "LastSeenVideoDriver", "" ),
m_sVideoRenderers ( "VideoRenderers", "" ), // StepMania.cpp sets these on first run: m_sVideoRenderers ( "VideoRenderers", "" ), // StepMania.cpp sets these on first run:
@@ -405,6 +411,8 @@ void PrefsManager::ReadPrefsFromDisk()
ReadGamePrefsFromIni( SpecialFiles::PREFERENCES_INI_PATH ); ReadGamePrefsFromIni( SpecialFiles::PREFERENCES_INI_PATH );
ReadPrefsFromFile( SpecialFiles::STATIC_INI_PATH, GetPreferencesSection(), true ); ReadPrefsFromFile( SpecialFiles::STATIC_INI_PATH, GetPreferencesSection(), true );
TranslateDeprecatedFlags();
if( !m_sCurrentGame.Get().empty() ) if( !m_sCurrentGame.Get().empty() )
RestoreGamePrefs(); RestoreGamePrefs();
} }
@@ -416,6 +424,8 @@ void PrefsManager::ResetToFactoryDefaults()
IPreference::LoadAllDefaults(); IPreference::LoadAllDefaults();
ReadPrefsFromFile( SpecialFiles::STATIC_INI_PATH, GetPreferencesSection(), true ); ReadPrefsFromFile( SpecialFiles::STATIC_INI_PATH, GetPreferencesSection(), true );
TranslateDeprecatedFlags();
SavePrefsToDisk(); SavePrefsToDisk();
} }
@@ -500,6 +510,16 @@ void PrefsManager::ReadDefaultsFromIni( const IniFile &ini, const RString &sSect
IPreference::ReadAllDefaultsFromNode( ini.GetChild(sSection) ); 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() void PrefsManager::SavePrefsToDisk()
{ {
IniFile ini; IniFile ini;
+11 -3
View File
@@ -275,9 +275,12 @@ public:
Preference<bool> m_bSubSortByNumSteps; Preference<bool> m_bSubSortByNumSteps;
Preference<GetRankingName> m_GetRankingName; Preference<GetRankingName> m_GetRankingName;
Preference<RString> m_sAdditionalSongFolders; Preference<RString> m_sAdditionalSongFoldersReadOnly;
Preference<RString> m_sAdditionalCourseFolders; Preference<RString> m_sAdditionalSongFoldersWritable;
Preference<RString> m_sAdditionalFolders; Preference<RString> m_sAdditionalCourseFoldersReadOnly;
Preference<RString> m_sAdditionalCourseFoldersWritable;
Preference<RString> m_sAdditionalFoldersReadOnly;
Preference<RString> m_sAdditionalFoldersWritable;
// failsafe // failsafe
Preference<RString> m_sDefaultTheme; Preference<RString> m_sDefaultTheme;
@@ -352,6 +355,11 @@ public:
protected: protected:
void ReadPrefsFromFile( const RString &sIni, const RString &sSection, bool bIsStatic ); void ReadPrefsFromFile( const RString &sIni, const RString &sSection, bool bIsStatic );
void ReadDefaultsFromFile( const RString &sIni, const RString &sSection ); 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 /* 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). */ /* Lock this before touching any of these globals (except FILEMAN itself). */
static RageEvent *g_Mutex; static RageEvent *g_Mutex;
RString RageFileManagerUtil::sInitialWorkingDirectory;
RString RageFileManagerUtil::sDirOfExecutable; RString RageFileManagerUtil::sDirOfExecutable;
struct LoadedDriver struct LoadedDriver
@@ -276,7 +275,6 @@ static RString GetDirOfExecutable( RString argv0 )
static void ChangeToDirOfExecutable( const RString &argv0 ) static void ChangeToDirOfExecutable( const RString &argv0 )
{ {
RageFileManagerUtil::sInitialWorkingDirectory = GetCwd();
RageFileManagerUtil::sDirOfExecutable = GetDirOfExecutable( argv0 ); RageFileManagerUtil::sDirOfExecutable = GetDirOfExecutable( argv0 );
/* Set the CWD. Any effects of this is platform-specific; most files are read and /* 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_Mutex->Lock();
g_pDrivers.insert( bAddToEnd? g_pDrivers.end():g_pDrivers.begin(), pLoadedDriver ); g_pDrivers.push_back(pLoadedDriver);
g_Mountpoints->LoadFromDrivers( g_pDrivers ); g_Mountpoints->LoadFromDrivers( g_pDrivers );
g_Mutex->Unlock(); 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 sRoot = sRoot_;
RString sMountPoint = sMountPoint_; RString sMountPoint = sMountPoint_;
@@ -593,26 +591,10 @@ bool RageFileManager::Mount( const RString &sType, const RString &sRoot_, const
pLoadedDriver->m_sRoot = sRoot; pLoadedDriver->m_sRoot = sRoot;
pLoadedDriver->m_sMountPoint = sMountPoint; pLoadedDriver->m_sMountPoint = sMountPoint;
AddFilesystemDriver( pLoadedDriver, bAddToEnd ); AddFilesystemDriver( pLoadedDriver );
return true; 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_ ) void RageFileManager::Unmount( const RString &sType, const RString &sRoot_, const RString &sMountPoint_ )
{ {
RString sRoot = sRoot_; RString sRoot = sRoot_;
+1 -3
View File
@@ -3,7 +3,6 @@
/** @brief Constants for working with the RageFileManager. */ /** @brief Constants for working with the RageFileManager. */
namespace RageFileManagerUtil namespace RageFileManagerUtil
{ {
extern RString sInitialWorkingDirectory;
extern RString sDirOfExecutable; extern RString sDirOfExecutable;
} }
@@ -48,8 +47,7 @@ public:
* @return the absolute path. */ * @return the absolute path. */
RString ResolvePath(const RString &path); RString ResolvePath(const RString &path);
bool Mount( const RString &sType, const RString &sRealPath, const RString &sMountPoint, bool bAddToEnd = true ); bool Mount( const RString &sType, const RString &sRealPath, const RString &sMountPoint );
void Mount( RageFileDriver *pDriver, const RString &sMountPoint, bool bAddToEnd = true );
void Unmount( const RString &sType, const RString &sRoot, 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 /* 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 "global.h"
#include "SpecialFiles.h" #include "SpecialFiles.h"
const RString SpecialFiles::USER_PACKAGES_DIR = "UserPackages/";
const RString SpecialFiles::PACKAGES_DIR = "Packages/"; const RString SpecialFiles::PACKAGES_DIR = "Packages/";
const RString SpecialFiles::KEYMAPS_PATH = "Save/Keymaps.ini"; const RString SpecialFiles::KEYMAPS_PATH = "Save/Keymaps.ini";
const RString SpecialFiles::EDIT_MODE_KEYMAPS_PATH = "Save/EditMode_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. */ /** @brief The listing of the special files and directories in use. */
namespace SpecialFiles 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 PACKAGES_DIR;
extern const RString KEYMAPS_PATH; extern const RString KEYMAPS_PATH;
/** @brief Edit Mode keymaps are separate from standard keymaps because /** @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 + "/*.zip", zips, false, true );
GetDirListing( path + "/*.smzip", 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; continue;
LOG->Trace( "VFS: found %s", zips[i].c_str() ); LOG->Trace( "VFS: found %s", zip.c_str() );
FILEMAN->Mount( "zip", zips[i], "/" ); FILEMAN->Mount( "zip", zip, "/" );
} }
GetDirListing( path + "/*", dirs, true, true ); 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() static void WriteLogHeader()
{ {
LOG->Info("%s%s", PRODUCT_FAMILY, product_version); LOG->Info("%s%s", PRODUCT_FAMILY, product_version);
@@ -1022,30 +1033,14 @@ int sm_main(int argc, char* argv[])
WriteLogHeader(); WriteLogHeader();
// Set up alternative filesystem trees. // Set up alternative filesystem trees.
if( PREFSMAN->m_sAdditionalFolders.Get() != "" ) MountFolders("dirro", PREFSMAN->m_sAdditionalFoldersReadOnly.Get(), "/");
{ MountFolders("dir", PREFSMAN->m_sAdditionalFoldersWritable.Get(), "/");
vector<RString> dirs; MountFolders("dirro", PREFSMAN->m_sAdditionalSongFoldersReadOnly.Get(), "/Songs");
split( PREFSMAN->m_sAdditionalFolders, ",", dirs, true ); MountFolders("dir", PREFSMAN->m_sAdditionalSongFoldersWritable.Get(), "/Songs");
for( unsigned i=0; i < dirs.size(); i++) MountFolders("dirro", PREFSMAN->m_sAdditionalCourseFoldersReadOnly.Get(), "/Courses");
FILEMAN->Mount( "dir", dirs[i], "/" ); MountFolders("dir", PREFSMAN->m_sAdditionalCourseFoldersWritable.Get(), "/Courses");
}
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" );
}
MountTreeOfZips( SpecialFiles::PACKAGES_DIR ); MountTreeOfZips( SpecialFiles::PACKAGES_DIR );
MountTreeOfZips( SpecialFiles::USER_PACKAGES_DIR );
/* One of the above filesystems might contain files that affect preferences /* One of the above filesystems might contain files that affect preferences
* (e.g. Data/Static.ini). Re-read preferences. */ * (e.g. Data/Static.ini). Re-read preferences. */
+26 -28
View File
@@ -4,10 +4,10 @@
#include "RageUtil.h" #include "RageUtil.h"
#include "archutils/Unix/CrashHandler.h" #include "archutils/Unix/CrashHandler.h"
#include "archutils/Unix/SignalHandler.h" #include "archutils/Unix/SignalHandler.h"
#include "SpecialFiles.h"
#include "ProductInfo.h" #include "ProductInfo.h"
#include <CoreServices/CoreServices.h> #include <CoreServices/CoreServices.h>
#include <ApplicationServices/ApplicationServices.h> #include <ApplicationServices/ApplicationServices.h>
#include <sys/stat.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/sysctl.h> #include <sys/sysctl.h>
#include <mach/mach.h> #include <mach/mach.h>
@@ -318,13 +318,15 @@ static void PathForFolderType( char dir[PATH_MAX], OSType folderType )
void ArchHooks::MountInitialFilesystems( const RString &sDirOfExecutable ) 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); CFURLRef dataUrl = CFBundleCopyResourceURL( CFBundleGetMainBundle(), CFSTR("StepMania"), CFSTR("smzip"), nil);
FILEMAN->Mount( "dir", sDirOfExecutable, "/" );
if( dataUrl ) if( dataUrl )
{ {
char dir[PATH_MAX];
CFStringRef dataPath = CFURLCopyFileSystemPath( dataUrl, kCFURLPOSIXPathStyle ); CFStringRef dataPath = CFURLCopyFileSystemPath( dataUrl, kCFURLPOSIXPathStyle );
CFStringGetCString( dataPath, dir, PATH_MAX, kCFStringEncodingUTF8 ); 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 "/Characters", dir), "/Characters" );
FILEMAN->Mount( "dir", ssprintf("%s/" PRODUCT_ID "/Courses", dir), "/Courses" ); 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 "/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 "/Songs", dir), "/Songs" );
FILEMAN->Mount( "dir", ssprintf("%s/" PRODUCT_ID "/RandomMovies", dir), "/RandomMovies" ); FILEMAN->Mount( "dir", ssprintf("%s/" PRODUCT_ID "/RandomMovies", dir), "/RandomMovies" );
FILEMAN->Mount( "dir", ssprintf("%s/" PRODUCT_ID "/Themes", dir), "/Themes" ); FILEMAN->Mount( "dir", ssprintf("%s/" PRODUCT_ID "/Themes", dir), "/Themes" );
@@ -370,28 +372,24 @@ void ArchHooks::MountUserFilesystems( const RString &sDirOfExecutable )
PathForFolderType( dir, kDomainLibraryFolderType ); PathForFolderType( dir, kDomainLibraryFolderType );
FILEMAN->Mount( "dir", ssprintf("%s/Logs/" PRODUCT_ID, dir), "/Logs" ); FILEMAN->Mount( "dir", ssprintf("%s/Logs/" PRODUCT_ID, dir), "/Logs" );
NSString* resourcePath = [[NSBundle mainBundle] resourcePath]; NSString* resourcePath = [[NSBundle mainBundle] resourcePath];
if( resourcePath ) if( resourcePath )
{ {
const char* resourcePathUTF8String = [resourcePath UTF8String]; const char* resourcePathUTF8String = [resourcePath UTF8String];
FILEMAN->Mount( "dir", ssprintf("%s/Announcers", resourcePathUTF8String), "/Announcers" ); FILEMAN->Mount( "dirro", ssprintf("%s/Announcers", resourcePathUTF8String), "/Announcers" );
FILEMAN->Mount( "dir", ssprintf("%s/BGAnimations", resourcePathUTF8String), "/BGAnimations" ); FILEMAN->Mount( "dirro", ssprintf("%s/BGAnimations", resourcePathUTF8String), "/BGAnimations" );
FILEMAN->Mount( "dir", ssprintf("%s/BackgroundEffects", resourcePathUTF8String), "/BackgroundEffects" ); FILEMAN->Mount( "dirro", ssprintf("%s/BackgroundEffects", resourcePathUTF8String), "/BackgroundEffects" );
FILEMAN->Mount( "dir", ssprintf("%s/BackgroundTransitions", resourcePathUTF8String), "/BackgroundTransitions" ); FILEMAN->Mount( "dirro", ssprintf("%s/BackgroundTransitions", resourcePathUTF8String), "/BackgroundTransitions" );
FILEMAN->Mount( "dir", ssprintf("%s/CDTitles", resourcePathUTF8String), "/CDTitles" ); FILEMAN->Mount( "dirro", ssprintf("%s/CDTitles", resourcePathUTF8String), "/CDTitles" );
FILEMAN->Mount( "dir", ssprintf("%s/Characters", resourcePathUTF8String), "/Characters" ); FILEMAN->Mount( "dirro", ssprintf("%s/Characters", resourcePathUTF8String), "/Characters" );
FILEMAN->Mount( "dir", ssprintf("%s/Courses", resourcePathUTF8String), "/Courses" ); FILEMAN->Mount( "dirro", ssprintf("%s/Courses", resourcePathUTF8String), "/Courses" );
FILEMAN->Mount( "dir", ssprintf("%s/NoteSkins", resourcePathUTF8String), "/NoteSkins" ); FILEMAN->Mount( "dirro", ssprintf("%s/NoteSkins", resourcePathUTF8String), "/NoteSkins" );
FILEMAN->Mount( "dir", ssprintf("%s/Packages", resourcePathUTF8String), "/" + SpecialFiles::USER_PACKAGES_DIR ); FILEMAN->Mount( "dirro", ssprintf("%s/Packages", resourcePathUTF8String), "/Packages" );
FILEMAN->Mount( "dir", ssprintf("%s/Songs", resourcePathUTF8String), "/Songs" ); FILEMAN->Mount( "dirro", ssprintf("%s/Songs", resourcePathUTF8String), "/Songs" );
FILEMAN->Mount( "dir", ssprintf("%s/RandomMovies", resourcePathUTF8String), "/RandomMovies" ); FILEMAN->Mount( "dirro", ssprintf("%s/RandomMovies", resourcePathUTF8String), "/RandomMovies" );
FILEMAN->Mount( "dir", ssprintf("%s/Themes", resourcePathUTF8String), "/Themes" ); FILEMAN->Mount( "dirro", ssprintf("%s/Themes", resourcePathUTF8String), "/Themes" );
FILEMAN->Mount( "dir", ssprintf("%s/Data", resourcePathUTF8String), "/Data" ); FILEMAN->Mount( "dirro", ssprintf("%s/Data", resourcePathUTF8String), "/Data" );
} }
// /Desktop -> /Users/<user>/Desktop/PRODUCT_ID
// PathForFolderType( dir, kDesktopFolderType );
// FILEMAN->Mount( "dir", ssprintf("%s/" PRODUCT_ID, dir), "/Desktop" );
} }
static inline int GetIntValue( CFTypeRef r ) static inline int GetIntValue( CFTypeRef r )
+5 -17
View File
@@ -1,11 +1,11 @@
#include "global.h" #include "global.h"
#include "ArchHooks_Unix.h" #include "ArchHooks_Unix.h"
#include "ProductInfo.h" #include "ProductInfo.h"
#include "RageFileManager.h"
#include "RageLog.h" #include "RageLog.h"
#include "RageUtil.h" #include "RageUtil.h"
#include "RageThreads.h" #include "RageThreads.h"
#include "LocalizedString.h" #include "LocalizedString.h"
#include "SpecialFiles.h"
#include "archutils/Unix/SignalHandler.h" #include "archutils/Unix/SignalHandler.h"
#include "archutils/Unix/GetSysInfo.h" #include "archutils/Unix/GetSysInfo.h"
#include "archutils/Common/PthreadHelpers.h" #include "archutils/Common/PthreadHelpers.h"
@@ -15,6 +15,7 @@
#include <unistd.h> #include <unistd.h>
#endif #endif
#include <sys/time.h> #include <sys/time.h>
#include <sys/stat.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/wait.h> #include <sys/wait.h>
@@ -380,24 +381,11 @@ RString ArchHooks_Unix::GetClipboard()
#endif #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 ) void ArchHooks::MountInitialFilesystems( const RString &sDirOfExecutable )
{ {
RString Root;
struct stat st; struct stat st;
if( !stat(sDirOfExecutable + "/Packages", &st) && st.st_mode&S_IFDIR ) bool portable = !stat(sDirOfExecutable + "/Portable.ini", &st);
Root = sDirOfExecutable; FILEMAN->Mount(portable ? "dir" : "dirro", 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, "/" );
} }
void ArchHooks::MountUserFilesystems( const RString &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 + "/Courses", "/Courses" );
FILEMAN->Mount( "dir", sUserDataPath + "/Logs", "/Logs" ); FILEMAN->Mount( "dir", sUserDataPath + "/Logs", "/Logs" );
FILEMAN->Mount( "dir", sUserDataPath + "/NoteSkins", "/NoteSkins" ); 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 + "/Save", "/Save" );
FILEMAN->Mount( "dir", sUserDataPath + "/Screenshots", "/Screenshots" ); FILEMAN->Mount( "dir", sUserDataPath + "/Screenshots", "/Screenshots" );
FILEMAN->Mount( "dir", sUserDataPath + "/Songs", "/Songs" ); FILEMAN->Mount( "dir", sUserDataPath + "/Songs", "/Songs" );
+3 -3
View File
@@ -5,7 +5,6 @@
#include "archutils/Win32/SpecialDirs.h" #include "archutils/Win32/SpecialDirs.h"
#include "ProductInfo.h" #include "ProductInfo.h"
#include "RageFileManager.h" #include "RageFileManager.h"
#include "SpecialFiles.h"
// for timeGetTime // for timeGetTime
#include <windows.h> #include <windows.h>
@@ -57,7 +56,8 @@ void ArchHooks::MountInitialFilesystems( const RString &sDirOfExecutable )
{ {
RString sDir = GetMountDir( 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 ) 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 + "/Courses", "/Courses" );
FILEMAN->Mount( "dir", sAppDataDir + "/Logs", "/Logs" ); FILEMAN->Mount( "dir", sAppDataDir + "/Logs", "/Logs" );
FILEMAN->Mount( "dir", sAppDataDir + "/NoteSkins", "/NoteSkins" ); 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 + "/Save", "/Save" );
FILEMAN->Mount( "dir", sAppDataDir + "/Screenshots", "/Screenshots" ); FILEMAN->Mount( "dir", sAppDataDir + "/Screenshots", "/Screenshots" );
FILEMAN->Mount( "dir", sAppDataDir + "/Songs", "/Songs" ); 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. */ * and then unmount it until Mount() is called. */
d.m_State = UsbStorageDevice::STATE_READY; 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 ); 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 ); this->Unmount( &d );