|
|
1.1 root 1: //
2: // nono
3: // Copyright (C) 2021 nono project
4: // Licensed under nono-license.txt
5: //
6:
7: //
8: // ディスクイメージのドライバ (基本クラス)。
9: //
10:
11: // Driver クラスとは無関係。
12:
13: #pragma once
14:
15: #include "object.h"
16:
17: class DiskImageDriver : public Object
18: {
19: using inherited = Object;
20:
21: public:
22: DiskImageDriver(const std::string& objname_, const std::string& pathname_);
23: ~DiskImageDriver() override;
24:
25: // このドライバが知っているファイルフォーマットなら true を返す。
26: // 知らないファイルフォーマットなら黙って false を返す。
27: virtual bool Match() = 0;
28:
29: // このイメージがサポートしている形式なら true を返す。
30: // サポートしていない形式 (例えば未知のバージョンや機能等) なら
31: // errmsg にエラーメッセージをセットして (pathname の接頭は不要)
32: // false を返す。
33: virtual bool Attach(std::string& errmsg) = 0;
34:
35: // このイメージが書き込み可能かどうかを返す。
36: // 書き込み可能なら 1、不可なら 0 を返す。
37: // エラーなら (errno をセットして?) -1 を返す。
38: int IsWriteable() const;
39:
40: // イメージをオープンする。
41: // 実際にはこの時点では書き込み禁止でオープンされており、
42: // read_only == false が指定されたらオープンし直す、となっている。
43: // 成功すれば true を返す。
44: // 失敗すれば warn 系でエラーを表示して false を返す。
45: virtual bool Open(bool read_only) = 0;
46:
47: // イメージをクローズする。
48: virtual void Close() = 0;
49:
50: // イメージのサイズを返す。
51: // オープンされてなければ 0 を返す。
52: off_t GetSize() const { return filesize; }
53:
54: // イメージの offset から size バイトを buf に読み出す。
55: // 成功すれば true を返す。失敗すれば false を返す。
56: virtual bool Read(void *buf, off_t offset, size_t size) = 0;
57:
58: // イメージの offset 以降に buf から size バイトを書き込む。
59: // 成功すれば true を返す。失敗すれば false を返す。
60: virtual bool Write(const void *buf, off_t offset, size_t size) = 0;
61:
62: protected:
63: // fd から dst に size バイト読んでポインタを進める。
64: // 必ず size バイト読み込むため成功すれば戻り値は size。
65: // エラーなら errno をセットして -1 を返す。EOF を超えるのもエラー扱い。
66: static ssize_t readimg(int fd, void *dst, size_t size);
67:
68: // fd に src に size バイト書いてポインタを進める。
69: // 必ず size バイト書き出すため成功すれば戻り値は size。
70: // エラーなら errno をセットして -1 を返す。
71: static ssize_t writeimg(int fd, const void *src, size_t size);
72:
73: // fd の offset から dst に size バイト読み込む。ポインタは移動しない。
74: // 必ず size バイト読み込むため成功すれば戻り値は size。
75: // エラーなら errno をセットして -1 を返す。EOF を超えるのもエラー扱い。
76: static ssize_t readpos(int fd, void *dst, size_t size, off_t offset);
77:
78: // fd の offset に src から size バイト書き出す。ポインタは移動しない。
79: // 必ず size バイト書き出すため成功すれば戻り値は size。
80: // エラーなら errno をセットして -1 を返す。
81: static ssize_t writepos(int fd, const void *src, size_t size, off_t offset);
82:
83: const std::string& pathname;
84:
85: // イメージサイズ。オープンされなければ 0。
86: off_t filesize {};
87: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.