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

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: };

unix.superglobalmegacorp.com

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