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

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

unix.superglobalmegacorp.com

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