Annotation of nono/host/diskimage.h, revision 1.1.1.3

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"
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.2   root       19:        DiskImageDriver(const std::string& pathname_);
                     20:        virtual ~DiskImageDriver();
                     21: 
                     22:        virtual bool GetInfo(off_t *size, bool *w_ok) = 0;
                     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: 
                     50:        // このディスクイメージのサイズと書き込み可能かどうかを返す。
                     51:        // Open() 前でも動作する。
1.1.1.2   root       52:        // 成功すれば true、失敗なら errno をセットして false を返す。
                     53:        bool GetInfo(off_t *size, bool *w_ok);
1.1       root       54: 
                     55:        // このディスクイメージを実際のアクセス用にオープンする。
1.1.1.2   root       56:        // read_only == true なら、ディスクイメージを読み込み専用でオープンする。
                     57:        // is_cow == true なら、Copy-on-Write モードにする。
1.1       root       58:        // 失敗すれば warn() でエラーメッセージを表示して false を返す。
1.1.1.2   root       59:        bool Open(bool read_only, bool is_cow);
1.1       root       60: 
1.1.1.2   root       61:        // このディスクイメージをクローズする。
                     62:        void Close();
1.1       root       63: 
                     64:        // このディスクイメージのバイト数を返す。
                     65:        // オープン後のみ使用可能。
1.1.1.2   root       66:        off_t GetSize() const;
                     67: 
                     68:        // このディスクイメージの offset から size バイトを buf に読み出す。
                     69:        bool Read(void *buf, off_t offset, size_t size) const;
1.1       root       70: 
1.1.1.2   root       71:        // このディスクイメージの offset から size バイトに buf を書き込む。
                     72:        bool Write(const void *buf, off_t offset, size_t size);
1.1       root       73: 
1.1.1.2   root       74:        // このディスクイメージのパス名を返す。
1.1       root       75:        const std::string& GetPathName() const { return pathname; }
                     76: 
1.1.1.2   root       77:        // driver があれば true を返す。
                     78:        // unique_ptr の (bool) キャストと同じ。
                     79:        operator bool() const { return (bool)driver; }
                     80: 
                     81:  private:
                     82:        // map::find は分かりにくいので。C++20 には map::contains() がある
                     83:        bool map_contains(off_t x) const {
                     84:                return map.find(x) != map.end();
                     85:        }
1.1       root       86: 
                     87:        std::string pathname {};
1.1.1.2   root       88: 
                     89:        std::unique_ptr<DiskImageDriver> driver {};
                     90: 
                     91:        // Copy-on-Write モード
                     92:        bool cow_enable {};
                     93:        autofd cowfd {};
                     94:        std::string cowname {};                 // ファイルパス
                     95:        // map (連想配列)のキーはオリジナルファイル上のブロック番号(バイト
                     96:        // オフセットを BLKSIZE で割ったもの)、対応する値は CoW ファイル上の
                     97:        // バイトオフセット。
                     98:        std::map<off_t, off_t> map {};
1.1       root       99: };

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.