--- nono/host/diskimage.cpp 2026/04/29 17:05:11 1.1.1.3 +++ nono/host/diskimage.cpp 2026/04/29 17:06:02 1.1.1.8 @@ -9,17 +9,17 @@ // #include "diskimage.h" -#include "diskimage_raw.h" +#include "diskdriver_qcow2.h" +#include "diskdriver_raw.h" #include "mainapp.h" #include -// -// ディスクイメージクラス (外部向け) -// - // コンストラクタ DiskImage::DiskImage() + : inherited(OBJ_NONE) { + // ログ名は SetName() で設定するのと、 + // このオブジェクトを ID で検索することはないので、OBJ_NONE でいい。 } // デストラクタ @@ -28,6 +28,26 @@ DiskImage::~DiskImage() Close(); } +// このディスクイメージのログ表示名とログ指定名を設定する。 +// 歴史的経緯によりコンストラクタで指定できないので、ここで指定する。 +void +DiskImage::SetName(const std::string& name) +{ + // 名前は長いけどもうしょうがない。しょっちゅう指定するわけじゃないし…。 + inherited::SetName("HostImage-" + name); + ClearAlias(); + AddAlias(GetName()); +} + +void +DiskImage::SetLogLevel(int loglevel_) +{ + inherited::SetLogLevel(loglevel_); + if ((bool)driver) { + driver->SetLogLevel(loglevel_); + } +} + // パス名を指定して、下位ドライバをオープン bool DiskImage::CreateHandler(const std::string& pathname_) @@ -35,24 +55,43 @@ DiskImage::CreateHandler(const std::stri pathname = pathname_; cow_enable = false; - // 今の所 Raw しかない + // ドライバを順に試す。 + std::string errmsg; try { - driver.reset(new DiskImageRaw(pathname)); - return true; - } catch (...) { + driver.reset(new DiskDriverQcow2(GetName(), pathname)); + } catch (...) { } + if ((bool)driver && driver->Match()) { + goto match; + } + + try { + driver.reset(new DiskDriverRaw(GetName(), pathname)); + } catch (...) { } + if ((bool)driver && driver->Match()) { + goto match; } return false; -} + match: + // 初期ログレベルをセット。 + driver->SetLogLevel(loglevel); + + if (driver->Attach(errmsg) == false) { + warn("%s: %s", pathname.c_str(), errmsg.c_str()); + return false; + } + + return true; +} -// このディスクイメージのサイズと書き込み可能かどうかを返す。 +// このディスクイメージが書き込み可能かどうかを返す。 // Open() 前でも動作する。 -bool -DiskImage::GetInfo(off_t *sizep, bool *w_ok) +int +DiskImage::IsWriteable() const { assert((bool)driver); - return driver->GetInfo(sizep, w_ok); + return driver->IsWriteable(); } // オープン @@ -91,7 +130,7 @@ DiskImage::Open(bool read_only, bool cow assert(cowname.empty() == false); cowname = gMainApp.GetVMDir() + "/." + cowname + ".cow"; - cowfd = open(cowname.c_str(), O_RDWR | O_CREAT | O_TRUNC, 0644); + cowfd = open(cowname.c_str(), O_RDWR | O_CREAT | O_TRUNC, 0600); if (cowfd < 0) { return false; } @@ -231,19 +270,3 @@ DiskImage::Write(const void *buf, off_t return true; } - - -// -// ディスクイメージドライバの基本クラス -// - -// コンストラクタ -DiskImageDriver::DiskImageDriver(const std::string& pathname_) - : pathname(pathname_) -{ -} - -// デストラクタ -DiskImageDriver::~DiskImageDriver() -{ -}