diff options
author | Mike Buland <eichlan@xagasoft.com> | 2011-02-17 18:02:24 +0000 |
---|---|---|
committer | Mike Buland <eichlan@xagasoft.com> | 2011-02-17 18:02:24 +0000 |
commit | bcfb40dde37a69139ef7ea2748ccfa642d3bee53 (patch) | |
tree | c8862b8fe4e354a7b4d022eee4e3bb25c19ee7a4 /src/myriadfs.h | |
parent | 5c1dfe87cb4021c905529451e5ff7718c6c94b2f (diff) | |
download | libbu++-bcfb40dde37a69139ef7ea2748ccfa642d3bee53.tar.gz libbu++-bcfb40dde37a69139ef7ea2748ccfa642d3bee53.tar.bz2 libbu++-bcfb40dde37a69139ef7ea2748ccfa642d3bee53.tar.xz libbu++-bcfb40dde37a69139ef7ea2748ccfa642d3bee53.zip |
Wow, MyriadFs is actually getting workable. You can create files, read, write,
etc. Next up is creating directories, and other special file types.
Diffstat (limited to '')
-rw-r--r-- | src/myriadfs.h | 100 |
1 files changed, 94 insertions, 6 deletions
diff --git a/src/myriadfs.h b/src/myriadfs.h index 856137c..808444b 100644 --- a/src/myriadfs.h +++ b/src/myriadfs.h | |||
@@ -19,13 +19,10 @@ namespace Bu | |||
19 | /** | 19 | /** |
20 | * A POSIX compliant, node based filesystem built on top of Myriad. | 20 | * A POSIX compliant, node based filesystem built on top of Myriad. |
21 | * | 21 | * |
22 | * Think about putting this all in one stream, on block boundaries. | ||
23 | * | ||
24 | * A header is placed into stream 1. | 22 | * A header is placed into stream 1. |
25 | * Header format: | 23 | * Header format: |
26 | * int32_t iMagicHeader (A7188B39) | 24 | * int32_t iMagicHeader (A7188B39) |
27 | * int8_t iVersion (1) | 25 | * int8_t iVersion (1) |
28 | * int32_t iNodeSize | ||
29 | * int32_t iNumNodes | 26 | * int32_t iNumNodes |
30 | * NodeLookup[iNumNodes] nNode | 27 | * NodeLookup[iNumNodes] nNode |
31 | * | 28 | * |
@@ -33,10 +30,10 @@ namespace Bu | |||
33 | * int32_t iInode | 30 | * int32_t iInode |
34 | * int32_t iPosition | 31 | * int32_t iPosition |
35 | * | 32 | * |
36 | * The node headers or inode structures have a base size of 22 bytes. | 33 | * The node headers or inode structures have a base size of 46 bytes. |
37 | * Everything else in the block is used for the name. I.e. if you have | 34 | * Everything else in the block is used for the name. I.e. if you have |
38 | * a blocksize of 512 bytes then you wind up with a max name size of | 35 | * a blocksize of 512 bytes then you wind up with a max name size of |
39 | * 512-22=490 characters, or a blocksize of 256 gives you 234 chraacters | 36 | * 512-46=466 characters, or a blocksize of 256 gives you 210 chraacters |
40 | * as a max. The node headers are all stored in stream 2. | 37 | * as a max. The node headers are all stored in stream 2. |
41 | * Basic node header format: | 38 | * Basic node header format: |
42 | * int32_t iUser | 39 | * int32_t iUser |
@@ -50,6 +47,27 @@ namespace Bu | |||
50 | * int64_t iCTime | 47 | * int64_t iCTime |
51 | * int16_t iNameSize | 48 | * int16_t iNameSize |
52 | * char[iNameSize] sName | 49 | * char[iNameSize] sName |
50 | * | ||
51 | * Some types get special formats for their assosiated data stream, or | ||
52 | * other special considerations, here's a list: | ||
53 | * | ||
54 | * - typeFifo: No stream, iStreamIndex unused (probably) | ||
55 | * - typeChrDev: No stream, iStreamIndex is device hi/lo | ||
56 | * - typeDir: The stream contains a directory contents listing, described | ||
57 | * below | ||
58 | * - typeBlkDev: No stream, iStreamIndex is device hi/lo | ||
59 | * - typeRegFile: The stream is the file data | ||
60 | * - typeSymLink: The stream is the destination of the symlink | ||
61 | * - typeSocket: No steram, iStreamIndex unused (probably) | ||
62 | * | ||
63 | * Directory streams have this simple listing format. They contain a list | ||
64 | * of all child elements, with no particular order at the moment. The . and | ||
65 | * .. entries are not listed, they are implicit: | ||
66 | * int32_t iNumNodes | ||
67 | * NodeTable[iNumNodes] nChildren | ||
68 | * | ||
69 | * NodeTable: | ||
70 | * int32_t iInode | ||
53 | */ | 71 | */ |
54 | class MyriadFs | 72 | class MyriadFs |
55 | { | 73 | { |
@@ -79,11 +97,81 @@ namespace Bu | |||
79 | typeSymLink = 0120000, | 97 | typeSymLink = 0120000, |
80 | typeSocket = 0140000, | 98 | typeSocket = 0140000, |
81 | typeMask = 0170000 | 99 | typeMask = 0170000 |
82 | } | 100 | }; |
101 | |||
102 | enum | ||
103 | { | ||
104 | Read = 0x01, ///< Open file for reading | ||
105 | Write = 0x02, ///< Open file for writing | ||
106 | Create = 0x04, ///< Create file if it doesn't exist | ||
107 | Truncate = 0x08, ///< Truncate file if it does exist | ||
108 | Append = 0x10, ///< Always append on every write | ||
109 | NonBlock = 0x20, ///< Open file in non-blocking mode | ||
110 | Exclusive = 0x44, ///< Create file, if it exists then fail | ||
111 | |||
112 | // Helpful mixes | ||
113 | ReadWrite = 0x03, ///< Open for reading and writing | ||
114 | WriteNew = 0x0E ///< Create a file (or truncate) for writing. | ||
115 | /// Same as Write|Create|Truncate | ||
116 | }; | ||
117 | |||
118 | class Stat | ||
119 | { | ||
120 | public: | ||
121 | int32_t iNode; | ||
122 | int32_t iUser; | ||
123 | int32_t iGroup; | ||
124 | uint16_t uPerms; | ||
125 | int16_t iLinks; | ||
126 | int64_t iATime; | ||
127 | int64_t iMTime; | ||
128 | int64_t iCTime; | ||
129 | int32_t iSize; | ||
130 | Bu::String sName; | ||
131 | }; | ||
132 | typedef Bu::List<Stat> Dir; | ||
133 | |||
134 | void stat( const Bu::String &sPath, Stat &rBuf ); | ||
135 | MyriadStream open( const Bu::String &sPath, int iMode ); | ||
136 | // void create( const Bu::String &sPath, uint16_t iPerms ); | ||
137 | |||
138 | |||
139 | private: | ||
140 | class RawStat | ||
141 | { | ||
142 | public: | ||
143 | int32_t iUser; | ||
144 | int32_t iGroup; | ||
145 | uint16_t uPerms; | ||
146 | int16_t iLinks; | ||
147 | int32_t iStreamIndex; | ||
148 | int32_t iParentNode; | ||
149 | int64_t iATime; | ||
150 | int64_t iMTime; | ||
151 | int64_t iCTime; | ||
152 | int16_t iNameSize; | ||
153 | }; | ||
154 | typedef Bu::Hash<int32_t, int32_t> NodeIndex; | ||
155 | |||
156 | private: | ||
157 | int32_t lookupInode( const Bu::String &sPath, int32_t &iParent ); | ||
158 | int32_t lookupInode( Bu::String::const_iterator iStart, | ||
159 | int32_t iNode, int32_t &iParent ); | ||
160 | Dir readDir( int32_t iNode ); | ||
161 | MyriadStream openByInode( int32_t iNode ); | ||
162 | int32_t create( int32_t iParent, const Bu::String &sName, | ||
163 | uint16_t uPerms ); | ||
164 | int32_t allocInode( const Bu::String &sName, int32_t iParent, | ||
165 | uint16_t uPerms ); | ||
166 | void stat( int32_t iNode, Stat &rBuf, MyriadStream &rIs ); | ||
167 | void writeHeader(); | ||
83 | 168 | ||
84 | private: | 169 | private: |
85 | Bu::Stream &rStore; | 170 | Bu::Stream &rStore; |
86 | Bu::Myriad mStore; | 171 | Bu::Myriad mStore; |
172 | NodeIndex hNodeIndex; | ||
173 | int32_t iUser; | ||
174 | int32_t iGroup; | ||
87 | }; | 175 | }; |
88 | }; | 176 | }; |
89 | 177 | ||