in source/code/scxsystemlib/disk/staticphysicaldiskenumeration.cpp [91:209]
void StaticPhysicalDiskEnumeration::FindPhysicalDisks(std::wstring device, size_t *pos)
{
bool deviceFound=false;
deviceFound=deviceFound; //Dummy Entry to fix build issue "variable ‘deviceFound’ set but not used" on redhat ppc
for (EntityIterator iter=Begin(); iter!=End(); iter++)
{
SCXCoreLib::SCXHandle<StaticPhysicalDiskInstance> disk = *iter;
if ( device != L"" && disk->m_device != device ) continue;
disk->m_online = false;
if ( device != L"" ) break;
}
#if defined(linux)
// First detect optical devices so later we can just skip the mount points which we determined are optical disks.
// Various projects may or may not require optical drive detection. We check if iso9660 file system is to be
// ignored to determine if optical drives should be detected.
std::vector<std::wstring> drives;
if ( ! m_deps->FileSystemIgnored(L"iso9660") )
{
// Get CD-ROM and DVD drives directly from the kernel interface in /proc.
SCXCoreLib::SCXHandle<std::wistream> cdStrm = m_deps->GetWIStream("/proc/sys/dev/cdrom/info");
std::vector<std::wstring> cdStrmLines;
SCXCoreLib::SCXStream::NLFs nlfs;
// /proc/sys/dev/cdrom/info format:
// CD-ROM information, Id: cdrom.c 3.20 2003/12/17
//
// drive name: sr0 hdc
// drive speed: 0 0
// drive # of slots: 1 1
// ...
SCXCoreLib::SCXStream::ReadAllLines(*cdStrm, cdStrmLines, nlfs);
std::wstring lineID(L"drive name:");
size_t i;
for (i = 0; i < cdStrmLines.size(); i++)
{
if (cdStrmLines[i].substr(0, lineID.size()) == lineID)
{
std::wstring drivesLine = cdStrmLines[i].substr(lineID.size(), std::wstring::npos);
SCXCoreLib::StrTokenize(drivesLine, drives, L" \t");
size_t d;
for (d = 0; d < drives.size(); d++)
{
AddDiskInstance(L"/dev/" + drives[d], L"/dev/" + drives[d], true);
}
break;
}
}
}
#endif
RefreshMNTTabParam *param = NULL;
if ( device != L"" ) param = new RefreshMNTTabParam(RefreshMNTTabParam::DEVICE, device);
m_deps->RefreshMNTTab(param);
if ( param ) free(param);
#if defined(aix) || defined(hpux)
std::map<std::wstring, std::wstring> devices = m_deps->GetPhysicalDevices(L"");
#endif
for (std::vector<MntTabEntry>::const_iterator it = m_deps->GetMNTTab().begin();
it != m_deps->GetMNTTab().end(); it++)
{
#if defined(linux)
// It this is an optical device just skip it. We already processed it.
size_t d;
bool found = false;
for (d = 0; d < drives.size(); d++)
{
if ((L"/dev/" + drives[d]) == it->device)
{
found = true;
break;
}
}
if (found)
{
continue;
}
#endif
if ( ! m_deps->FileSystemIgnored(it->fileSystem) &&
! m_deps->DeviceIgnored(it->device) &&
m_deps->LinkToPhysicalExists(it->fileSystem, it->device, it->mountPoint) )
{
#if defined(linux) || defined(sun)
std::map<std::wstring, std::wstring> devices = m_deps->GetPhysicalDevices(it->device);
if (devices.size() == 0)
{
static SCXCoreLib::LogSuppressor suppressor(SCXCoreLib::eError, SCXCoreLib::eTrace);
std::wstringstream out;
out << L"Unable to locate physical devices for: " << it->device;
SCX_LOG(m_log, suppressor.GetSeverity(out.str()), out.str());
continue;
}
#endif
for (std::map<std::wstring, std::wstring>::const_iterator dev_it = devices.begin();
dev_it != devices.end(); dev_it++)
{
if( device != L"" && dev_it->first != device ) continue;
SCXCoreLib::SCXHandle<StaticPhysicalDiskInstance> disk = AddDiskInstance(dev_it->first, dev_it->second
#if defined(linux)
, false
#endif
, pos);
if ( device != L"" ) {
deviceFound=true;
break;
}
}
}
}
#if defined(sun)
if ( !deviceFound )
this->UpdateSolarisHelper(device, pos);
#endif
}