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