|
|
nono 1.7.0
//
// nono
// Copyright (C) 2021 nono project
// Licensed under nono-license.txt
//
//
// ディスクイメージのドライバ (基本クラス)。
//
// Driver クラスとは無関係。
#pragma once
#include "object.h"
class DiskImageDriver : public Object
{
using inherited = Object;
public:
DiskImageDriver(const std::string& objname_, const std::string& pathname_);
~DiskImageDriver() override;
// このドライバが知っているファイルフォーマットなら true を返す。
// 知らないファイルフォーマットなら黙って false を返す。
virtual bool Match() = 0;
// このイメージがサポートしている形式なら true を返す。
// サポートしていない形式 (例えば未知のバージョンや機能等) なら
// errmsg にエラーメッセージをセットして (pathname の接頭は不要)
// false を返す。
virtual bool Attach(std::string& errmsg) = 0;
// このイメージが書き込み可能かどうかを返す。
// 書き込み可能なら 1、不可なら 0 を返す。
// エラーなら (errno をセットして?) -1 を返す。
int IsWriteable() const;
// イメージをオープンする。
// 実際にはこの時点では書き込み禁止でオープンされており、
// read_only == false が指定されたらオープンし直す、となっている。
// 成功すれば true を返す。
// 失敗すれば warn 系でエラーを表示して false を返す。
virtual bool Open(bool read_only) = 0;
// イメージをクローズする。
virtual void Close() = 0;
// イメージのサイズを返す。
// オープンされてなければ 0 を返す。
off_t GetSize() const { return filesize; }
// イメージの offset から size バイトを buf に読み出す。
// 成功すれば true を返す。失敗すれば false を返す。
virtual bool Read(void *buf, off_t offset, size_t size) = 0;
// イメージの offset 以降に buf から size バイトを書き込む。
// 成功すれば true を返す。失敗すれば false を返す。
virtual bool Write(const void *buf, off_t offset, size_t size) = 0;
protected:
// fd から dst に size バイト読んでポインタを進める。
// 必ず size バイト読み込むため成功すれば戻り値は size。
// エラーなら errno をセットして -1 を返す。EOF を超えるのもエラー扱い。
static ssize_t readimg(int fd, void *dst, size_t size);
// fd に src に size バイト書いてポインタを進める。
// 必ず size バイト書き出すため成功すれば戻り値は size。
// エラーなら errno をセットして -1 を返す。
static ssize_t writeimg(int fd, const void *src, size_t size);
// fd の offset から dst に size バイト読み込む。ポインタは移動しない。
// 必ず size バイト読み込むため成功すれば戻り値は size。
// エラーなら errno をセットして -1 を返す。EOF を超えるのもエラー扱い。
static ssize_t readpos(int fd, void *dst, size_t size, off_t offset);
// fd の offset に src から size バイト書き出す。ポインタは移動しない。
// 必ず size バイト書き出すため成功すれば戻り値は size。
// エラーなら errno をセットして -1 を返す。
static ssize_t writepos(int fd, const void *src, size_t size, off_t offset);
const std::string& pathname;
// イメージサイズ。オープンされなければ 0。
off_t filesize {};
};
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.