|
|
1.1 root 1: //
2: // nono
3: // Copyright (C) 2021 nono project
4: // Licensed under nono-license.txt
5: //
6:
7: #pragma once
8:
1.1.1.5 ! root 9: #include "object.h"
1.1.1.2 root 10: #include "autofd.h"
1.1.1.3 root 11: #include <array>
1.1.1.2 root 12: #include <map>
1.1 root 13:
1.1.1.5 ! root 14: class DiskImageDriver;
1.1.1.2 root 15:
16: // ディスクイメージ
1.1.1.5 ! root 17: class DiskImage : public Object
1.1.1.2 root 18: {
19: private:
1.1.1.5 ! root 20: using inherited = Object;
! 21:
1.1.1.2 root 22: // Copy-on-Write キャッシュのブロックサイズ
23: static const uint BLKSIZE = 4096;
24:
25: using SectBuf = std::array<uint8, BLKSIZE>;
1.1 root 26:
27: public:
1.1.1.2 root 28: DiskImage();
1.1.1.5 ! root 29: ~DiskImage() override;
! 30:
! 31: // ログ名を設定する。
! 32: // 歴史的経緯により、コンストラクタではなく後から設定する。
! 33: // Object::SetName() は protected だがここでは public にする。
! 34: void SetName(const std::string& name) override;
! 35:
! 36: void SetLogLevel(int loglevel_) override;
1.1 root 37:
1.1.1.2 root 38: // パス名を指定して、下位ドライバをオープン。
39: // コンストラクタ後最初に実行すること。
40: bool CreateHandler(const std::string& pathname_);
1.1 root 41:
1.1.1.4 root 42: // このディスクイメージが書き込み可能かどうかを返す。
1.1 root 43: // Open() 前でも動作する。
1.1.1.4 root 44: // 書き込み可能なら 1、不可なら 0 を返す。
45: // 失敗なら errno をセットして -1 を返す。
46: int IsWriteable() const;
1.1 root 47:
48: // このディスクイメージを実際のアクセス用にオープンする。
1.1.1.2 root 49: // read_only == true なら、ディスクイメージを読み込み専用でオープンする。
50: // is_cow == true なら、Copy-on-Write モードにする。
1.1 root 51: // 失敗すれば warn() でエラーメッセージを表示して false を返す。
1.1.1.2 root 52: bool Open(bool read_only, bool is_cow);
1.1 root 53:
1.1.1.2 root 54: // このディスクイメージをクローズする。
55: void Close();
1.1 root 56:
57: // このディスクイメージのバイト数を返す。
58: // オープン後のみ使用可能。
1.1.1.2 root 59: off_t GetSize() const;
60:
61: // このディスクイメージの offset から size バイトを buf に読み出す。
62: bool Read(void *buf, off_t offset, size_t size) const;
1.1 root 63:
1.1.1.2 root 64: // このディスクイメージの offset から size バイトに buf を書き込む。
65: bool Write(const void *buf, off_t offset, size_t size);
1.1 root 66:
1.1.1.2 root 67: // このディスクイメージのパス名を返す。
1.1 root 68: const std::string& GetPathName() const { return pathname; }
69:
1.1.1.2 root 70: // driver があれば true を返す。
71: // unique_ptr の (bool) キャストと同じ。
72: operator bool() const { return (bool)driver; }
73:
74: private:
75: // map::find は分かりにくいので。C++20 には map::contains() がある
76: bool map_contains(off_t x) const {
77: return map.find(x) != map.end();
78: }
1.1 root 79:
80: std::string pathname {};
1.1.1.2 root 81:
1.1.1.5 ! root 82: std::unique_ptr<DiskImageDriver> driver /*{}*/;
1.1.1.2 root 83:
84: // Copy-on-Write モード
85: bool cow_enable {};
86: autofd cowfd {};
87: std::string cowname {}; // ファイルパス
88: // map (連想配列)のキーはオリジナルファイル上のブロック番号(バイト
89: // オフセットを BLKSIZE で割ったもの)、対応する値は CoW ファイル上の
90: // バイトオフセット。
91: std::map<off_t, off_t> map {};
1.1 root 92: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.