|
|
1.1 ! root 1: // ! 2: // nono ! 3: // Copyright (C) 2020 nono project ! 4: // Licensed under nono-license.txt ! 5: // ! 6: ! 7: #pragma once ! 8: ! 9: #include "device.h" ! 10: #include "ffs_dinode.h" ! 11: #include "ffs_fs.h" ! 12: ! 13: // ディスクラベル (1セクタ目) ! 14: // svnweb.freebsd.org/csrg/sys/luna68k/stand/omron_disklabel.h ! 15: struct scd_dk_label ! 16: { ! 17: char asciilabel[128]; /* for compatibility */ ! 18: char pad[512 - (128 + 8*8 + 11*2 + 4)]; ! 19: uint16 badchk; /* checksum of bad track */ ! 20: uint32 maxblk; /* # of total logical block */ ! 21: uint16 dtype; /* disk drive type */ ! 22: uint16 ndisk; /* # of disk drives */ ! 23: uint16 ncyl; /* # of data cylinders */ ! 24: uint16 acyl; /* # of altenate cylinders */ ! 25: uint16 nhead; /* # of heads in this partition */ ! 26: uint16 nsect; /* # of 512 byte sectors per track */ ! 27: uint16 bhead; /* identifies proper label locations */ ! 28: uint16 ppart; /* physical partition # */ ! 29: struct { /* logical partitions */ ! 30: uint32 blkno; /* starting block */ ! 31: uint32 nblk; /* number of blocks */ ! 32: } map[8]; ! 33: uint16 magic; /* identifies this label format */ ! 34: uint16 cksum; /* xor checksum of sector */ ! 35: ! 36: static const uint16 DKL_MAGIC = 0xdabe; ! 37: }; ! 38: static_assert(sizeof(scd_dk_label) == 512, "size must be 512"); ! 39: ! 40: // オレオレ inode 情報クラス ! 41: class inodefile final ! 42: { ! 43: public: ! 44: inodefile(Device *parent_); ! 45: ~inodefile(); ! 46: ! 47: // ディレクトリエントリからファイルを検索 ! 48: uint32 FindFile(const std::string& name); ! 49: ! 50: uint32 ino {}; // inode 番号 ! 51: struct ufs1_dinode di {}; // disk inode 情報 (ゲストエンディアンで保持) ! 52: std::vector<uint8> data {}; // ファイル(またはディレクトリ)本文 ! 53: private: ! 54: Device *parent {}; // 親デバイス ! 55: }; ! 56: ! 57: // ファイルシステムハンドルっぽいもの ! 58: class Filesys final ! 59: { ! 60: public: ! 61: Filesys(Device *parent_); ! 62: ~Filesys(); ! 63: ! 64: // ファイルシステムをオープン ! 65: bool Mount(SCSIHD *hd_, uint32 start, uint32 size); ! 66: ! 67: // ファイル名からファイルを探す ! 68: bool OpenFile(inodefile& inode, const std::string& filename); ! 69: ! 70: // inode で示されるファイルかディレクトリの中身を読み込む ! 71: void ReadData(inodefile& inode); ! 72: ! 73: std::string errstr {}; // エラーメッセージ ! 74: ! 75: private: ! 76: // inode 情報を読み込む ! 77: void Readi(inodefile& inode); ! 78: ! 79: // 指定のブロックを読み出す ! 80: void PeekBlock(void *buf, uint32 b, uint32 len) const; ! 81: ! 82: Device *parent {}; // 親デバイス ! 83: SCSIHD *hd {}; // ターゲット SCSI HD ! 84: ! 85: // パーティション情報 ! 86: uint32 part_start {}; // パーティションの先頭セクタ ! 87: uint32 part_size {}; // パーティションのサイズ(セクタ数) ! 88: ! 89: // スーパーブロック情報 ! 90: // fs の(たぶんほとんどの)整数パラメータは読み込み時にホストエンディアン ! 91: // に変換してあるのでそのままアクセスしてよい。構造体とかまでは全部対応 ! 92: // してないので、必要になったら書き足すこと。 ! 93: struct fs *fs {}; // 体裁を揃えるためポインタを使いたい ! 94: struct fs fs0 {}; // こっちが実体 ! 95: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.