2009-04-20 00:13:21 +02:00
|
|
|
/*
|
2010-02-28 01:08:10 +01:00
|
|
|
* This file is a part of Winix
|
2009-04-20 00:13:21 +02:00
|
|
|
* and is not publicly distributed
|
|
|
|
*
|
|
|
|
* Copyright (c) 2009, Tomasz Sowa
|
|
|
|
* All rights reserved.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "mounts.h"
|
2009-04-21 22:50:55 +02:00
|
|
|
#include "request.h"
|
|
|
|
#include "log.h"
|
|
|
|
#include "mountparser.h"
|
2009-11-16 00:55:11 +01:00
|
|
|
#include "db.h"
|
2009-04-20 00:13:21 +02:00
|
|
|
|
|
|
|
|
2009-11-16 00:55:11 +01:00
|
|
|
|
2010-06-22 01:53:19 +02:00
|
|
|
|
2010-01-25 05:52:17 +01:00
|
|
|
Mounts::Mounts()
|
|
|
|
{
|
|
|
|
pmount = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-08-10 18:12:50 +02:00
|
|
|
void Mounts::SetDirs(Dirs * pdirs)
|
|
|
|
{
|
|
|
|
dirs = pdirs;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void Mounts::SetDb(Db * pdb)
|
|
|
|
{
|
|
|
|
db = pdb;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Mounts::SetRequest(Request * prequest)
|
|
|
|
{
|
|
|
|
request = prequest;
|
|
|
|
}
|
|
|
|
|
2010-01-25 05:52:17 +01:00
|
|
|
|
2010-06-22 01:53:19 +02:00
|
|
|
|
2009-11-16 00:55:11 +01:00
|
|
|
// reading from 'mounts'
|
2010-01-25 05:52:17 +01:00
|
|
|
Error Mounts::ReadMounts(const std::string & mounts)
|
2009-04-20 00:13:21 +02:00
|
|
|
{
|
|
|
|
MountParser mp;
|
2010-08-10 18:12:50 +02:00
|
|
|
mp.SetDirs(dirs);
|
2010-01-25 05:52:17 +01:00
|
|
|
Error err = mp.Parse(mounts, mount_tab);
|
|
|
|
|
2010-02-28 01:08:10 +01:00
|
|
|
if( err != WINIX_ERR_OK )
|
2009-11-16 00:55:11 +01:00
|
|
|
{
|
|
|
|
log << log1 << "M: some problems with mountpoints (mountpoints table will be empty)" << logend;
|
2010-01-25 05:52:17 +01:00
|
|
|
mount_tab.clear();
|
2009-11-16 00:55:11 +01:00
|
|
|
}
|
2010-01-25 05:52:17 +01:00
|
|
|
|
|
|
|
CalcCurMount();
|
|
|
|
|
|
|
|
return err;
|
2009-11-16 00:55:11 +01:00
|
|
|
}
|
2009-06-08 00:17:07 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
2009-11-16 00:55:11 +01:00
|
|
|
// reading from /etc/fstab
|
2010-01-25 05:52:17 +01:00
|
|
|
Error Mounts::ReadMounts()
|
2009-11-16 00:55:11 +01:00
|
|
|
{
|
|
|
|
static std::string file = "fstab";
|
|
|
|
|
2010-08-10 18:12:50 +02:00
|
|
|
Item * etc = dirs->GetEtcDir();
|
2009-11-16 00:55:11 +01:00
|
|
|
|
|
|
|
if( !etc )
|
|
|
|
{
|
|
|
|
log << log1 << "M: there is no /etc directory" << logend;
|
2010-02-28 01:08:10 +01:00
|
|
|
return WINIX_ERR_NO_ITEM;
|
2009-11-16 00:55:11 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
Item fstab;
|
2010-08-10 18:12:50 +02:00
|
|
|
Error err = db->GetItem(etc->id, file, fstab);
|
2009-11-16 00:55:11 +01:00
|
|
|
|
2010-02-28 01:08:10 +01:00
|
|
|
if( err == WINIX_ERR_NO_ITEM )
|
2009-11-16 00:55:11 +01:00
|
|
|
{
|
|
|
|
log << log1 << "M: there is no /etc/fstab file" << logend;
|
2010-01-25 05:52:17 +01:00
|
|
|
return err;
|
2009-11-16 00:55:11 +01:00
|
|
|
}
|
2009-06-08 00:17:07 +02:00
|
|
|
|
2010-02-28 01:08:10 +01:00
|
|
|
if( err != WINIX_ERR_OK )
|
2009-04-20 00:13:21 +02:00
|
|
|
{
|
2009-11-16 00:55:11 +01:00
|
|
|
log << log1 << "M: cannot read /etc/fstab" << logend;
|
2010-01-25 05:52:17 +01:00
|
|
|
return err;
|
2009-04-20 00:13:21 +02:00
|
|
|
}
|
2009-11-16 00:55:11 +01:00
|
|
|
|
2010-01-25 05:52:17 +01:00
|
|
|
return ReadMounts(fstab.content);
|
2009-06-05 22:29:06 +02:00
|
|
|
}
|
2009-04-20 00:13:21 +02:00
|
|
|
|
|
|
|
|
|
|
|
void Mounts::MountCmsForRoot()
|
|
|
|
{
|
2010-01-25 05:52:17 +01:00
|
|
|
Mount mount;
|
|
|
|
mount.type = Mount::cms;
|
2010-02-19 00:30:22 +01:00
|
|
|
mount.fs = Mount::simplefs;
|
|
|
|
|
2010-08-10 18:12:50 +02:00
|
|
|
Item * proot = dirs->GetRootDir();
|
2009-04-20 00:13:21 +02:00
|
|
|
|
|
|
|
if( proot )
|
2010-01-25 05:52:17 +01:00
|
|
|
mount.dir_id = proot->id;
|
2009-04-20 00:13:21 +02:00
|
|
|
else
|
|
|
|
{
|
2010-01-25 05:52:17 +01:00
|
|
|
mount.dir_id = -1;
|
2009-04-20 00:13:21 +02:00
|
|
|
log << log1 << "M: there is no a root dir" << logend;
|
|
|
|
}
|
2010-01-25 05:52:17 +01:00
|
|
|
|
|
|
|
std::pair<MountTab::iterator, bool> res = mount_tab.insert( std::make_pair(mount.dir_id, mount) );
|
|
|
|
pmount = &(res.first->second);
|
2009-04-20 00:13:21 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-01-25 05:52:17 +01:00
|
|
|
void Mounts::CalcCurMount()
|
2009-04-20 00:13:21 +02:00
|
|
|
{
|
|
|
|
std::vector<Item*>::reverse_iterator i;
|
|
|
|
|
2010-01-25 05:52:17 +01:00
|
|
|
// when the program starts (when the dir_table is empty()
|
|
|
|
// we don't want to call MountCmsForRoot()
|
2010-08-10 18:12:50 +02:00
|
|
|
if( request->dir_table.empty() )
|
2010-01-25 05:52:17 +01:00
|
|
|
return;
|
2009-04-20 00:13:21 +02:00
|
|
|
|
2010-08-10 18:12:50 +02:00
|
|
|
for(i = request->dir_table.rbegin() ; i!=request->dir_table.rend() ; ++i)
|
2009-04-20 00:13:21 +02:00
|
|
|
{
|
2010-01-25 05:52:17 +01:00
|
|
|
std::map<long, Mount>::iterator m = mount_tab.find( (*i)->id );
|
2009-04-20 00:13:21 +02:00
|
|
|
|
2010-01-25 05:52:17 +01:00
|
|
|
if( m != mount_tab.end() )
|
2009-04-20 00:13:21 +02:00
|
|
|
{
|
2010-01-25 05:52:17 +01:00
|
|
|
pmount = &(m->second);
|
2010-02-19 00:30:22 +01:00
|
|
|
log << log2 << "M: current mount point is: " << pmount->TypeToStr()
|
|
|
|
<< ", fs: " << pmount->FsToStr() << logend;
|
2009-04-20 00:13:21 +02:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-01-25 05:52:17 +01:00
|
|
|
// if nothing was found
|
2009-04-20 00:13:21 +02:00
|
|
|
// we assume that 'cms' mount point is used
|
|
|
|
MountCmsForRoot();
|
2010-02-19 00:30:22 +01:00
|
|
|
log << log2 << "M: current mount point is: " << pmount->TypeToStr() << " (default)"
|
|
|
|
<< ", fs: " << pmount->FsToStr() << logend;
|
2009-04-20 00:13:21 +02:00
|
|
|
}
|
2010-03-15 02:47:26 +01:00
|
|
|
|
|
|
|
|
|
|
|
// can return null pointer
|
|
|
|
// and we don't assume cms as a default mount point if nothing is found
|
|
|
|
Mount * Mounts::CalcMount(long dir_id)
|
|
|
|
{
|
|
|
|
while( true )
|
|
|
|
{
|
2010-08-10 18:12:50 +02:00
|
|
|
Item * pdir = dirs->GetDir(dir_id);
|
2010-03-15 02:47:26 +01:00
|
|
|
|
|
|
|
if( !pdir )
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
std::map<long, Mount>::iterator m = mount_tab.find( pdir->id );
|
|
|
|
|
|
|
|
if( m != mount_tab.end() )
|
|
|
|
return &(m->second);
|
|
|
|
|
|
|
|
dir_id = pdir->parent_id;
|
|
|
|
}
|
|
|
|
}
|
2010-06-22 01:53:19 +02:00
|
|
|
|
|
|
|
|
|
|
|
const Mounts::MountTab * Mounts::GetMountTab()
|
|
|
|
{
|
|
|
|
return &mount_tab;
|
|
|
|
}
|
|
|
|
|
|
|
|
|