devicemanager.cc

class DeviceManager {
    std::list<DeviceNode> m_node_list;
    std::list<DeviceNode*> m_optical_device;
    std::list<DeviceNode*> m_hdd_device;
    std::list<PhysicalDevice> m_known_device;
clas DeviceNode {
    major_t m_major
    minor_t m_minor
    std::vector<const char*> m_not_tested_fstype;
    std::string testMout(void);

ブロックデバイス(/dev/hda1とか/dev/hdcとか)を全部走査して、m_node_listに登録。
登録するときに、さらに「光学デバイスっぽい」ならm_optical_deviceに収録。「HDDっぽい」ならm_hdd_deviceに収録する。
「光学デバイスっぽい」場合は、m_not_tested_fstypeにiso9600、udf、ext2、hfs、vfat、ntfs、…と登録。
「HDDっぽい」場合は、m_not_tested_fstypeにntfs、vfat、ext3、reiserfs、hfsplus、xfs、…と登録。
DeviceNode::testMout()は、m_not_tested_fstypeの先頭から一つファイルシステムタイプを取り出して、マウントを試みる。成功したらマウントポイントへのパスを返す。m_not_tested_fstypeはstd::vectorではなくてstd::queueでも良いかもしれない。


ブートディスクを見つけるときは、m_optical_device全部にtestMout()を仕掛けて、成功するまで繰り返す(2回繰り返しくらいで一端中断した方が良いかもしれない)。成功したらそのDeviceNodeをm_node_listから削除して、m_known_deviceに登録する。それでダメならm_hdd_deviceを探す。
ShadowScreenを探すときは、m_hdd_deviceから探す。m_optical_deviceは、マウントできたところで読み取り専用でしかマウントできなかったりするだろうから、後回し。


…ふむ。これでそこそこ効率よく目的のデバイスを発見できるのでは無かろうか。一回試したファイルシステムタイプを2回繰り返さないで済むのが良い。version 0.2はブートディスクを探すときとShadowScreenを探すときで同じファイルシステムタイプを試していたので、無駄が多かった。(それでも「/dev/hdcでiso9660だ!」のヤマが結構当たるので、意外と処理は早かったりする…)