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