Mount directories read-only where possible

This commit is contained in:
Martin Natano
2022-02-23 21:42:10 +01:00
parent d8b6d36a78
commit 168877f6a8
11 changed files with 97 additions and 119 deletions
+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. */