diff options
Diffstat (limited to 'src/unstable/myriadfs.h')
-rw-r--r-- | src/unstable/myriadfs.h | 203 |
1 files changed, 203 insertions, 0 deletions
diff --git a/src/unstable/myriadfs.h b/src/unstable/myriadfs.h new file mode 100644 index 0000000..cc9961a --- /dev/null +++ b/src/unstable/myriadfs.h | |||
@@ -0,0 +1,203 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2007-2011 Xagasoft, All rights reserved. | ||
3 | * | ||
4 | * This file is part of the libbu++ library and is released under the | ||
5 | * terms of the license contained in the file LICENSE. | ||
6 | */ | ||
7 | |||
8 | #ifndef MYRIAD_FS_H | ||
9 | #define MYRIAD_FS_H | ||
10 | |||
11 | #include <sys/types.h> | ||
12 | |||
13 | #include "bu/myriad.h" | ||
14 | |||
15 | namespace Bu | ||
16 | { | ||
17 | class Stream; | ||
18 | |||
19 | subExceptionDecl( MyriadFsException ); | ||
20 | |||
21 | /** | ||
22 | * A POSIX compliant, node based filesystem built on top of Myriad. | ||
23 | * | ||
24 | * A header is placed into stream 1. | ||
25 | * Header format: | ||
26 | * int32_t iMagicHeader (A7188B39) | ||
27 | * int8_t iVersion (1) | ||
28 | * int32_t iNumNodes | ||
29 | * NodeLookup[iNumNodes] nNode | ||
30 | * | ||
31 | * Node lookup: | ||
32 | * int32_t iInode | ||
33 | * int32_t iPosition | ||
34 | * | ||
35 | * The node headers or inode structures have a base size of 44 bytes. | ||
36 | * The name is stored in the directory format. | ||
37 | * Basic node header format: | ||
38 | * int32_t iNode | ||
39 | * int32_t iUser | ||
40 | * int32_t iGroup | ||
41 | * uint16_t uPerms | ||
42 | * int16_t iLinks | ||
43 | * uint32_t uStreamIndex | ||
44 | * int64_t iATime | ||
45 | * int64_t iMTime | ||
46 | * int64_t iCTime | ||
47 | * | ||
48 | * Some types get special formats for their assosiated data stream, or | ||
49 | * other special considerations, here's a list: | ||
50 | * | ||
51 | * - typeFifo: No stream, uStreamIndex unused (probably) | ||
52 | * - typeChrDev: No stream, uStreamIndex is device hi/lo | ||
53 | * - typeDir: The stream contains a directory contents listing, described | ||
54 | * below | ||
55 | * - typeBlkDev: No stream, uStreamIndex is device hi/lo | ||
56 | * - typeRegFile: The stream is the file data | ||
57 | * - typeSymLink: The stream is the destination of the symlink | ||
58 | * - typeSocket: No steram, uStreamIndex unused (probably) | ||
59 | * | ||
60 | * Directory streams have this simple listing format. They contain a list | ||
61 | * of all child elements, with no particular order at the moment. The . and | ||
62 | * .. entries are not listed, they are implicit: | ||
63 | * int32_t iNumNodes | ||
64 | * NodeTable[iNumNodes] nChildren | ||
65 | * | ||
66 | * NodeTable: | ||
67 | * int32_t iInode | ||
68 | * uint8_t uNameSize | ||
69 | * char[uNameSize] sName | ||
70 | */ | ||
71 | class MyriadFs | ||
72 | { | ||
73 | public: | ||
74 | MyriadFs( Bu::Stream &rStore, int iBlockSize=512 ); | ||
75 | virtual ~MyriadFs(); | ||
76 | |||
77 | enum | ||
78 | { | ||
79 | permOthX = 0000001, | ||
80 | permOthW = 0000002, | ||
81 | permOthR = 0000004, | ||
82 | permGrpX = 0000010, | ||
83 | permGrpW = 0000020, | ||
84 | permGrpR = 0000040, | ||
85 | permUsrX = 0000100, | ||
86 | permUsrW = 0000200, | ||
87 | permUsrR = 0000400, | ||
88 | permSticky = 0001000, | ||
89 | permSetGid = 0002000, | ||
90 | permSetUid = 0004000, | ||
91 | permMask = 0007777, | ||
92 | typeFifo = 0010000, | ||
93 | typeChrDev = 0020000, | ||
94 | typeDir = 0040000, | ||
95 | typeBlkDev = 0060000, | ||
96 | typeRegFile = 0100000, | ||
97 | typeSymLink = 0120000, | ||
98 | typeSocket = 0140000, | ||
99 | typeMask = 0170000 | ||
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 | uint32_t uDev; | ||
131 | Bu::String sName; | ||
132 | }; | ||
133 | typedef Bu::List<Stat> Dir; | ||
134 | |||
135 | void stat( const Bu::String &sPath, Stat &rBuf ); | ||
136 | MyriadStream open( const Bu::String &sPath, int iMode, | ||
137 | uint16_t uPerms=0664 ); | ||
138 | void create( const Bu::String &sPath, uint16_t iPerms ); | ||
139 | void create( const Bu::String &sPath, uint16_t iPerms, | ||
140 | uint16_t iDevHi, uint16_t iDevLo ); | ||
141 | void create( const Bu::String &sPath, uint16_t iPerms, | ||
142 | uint32_t uSpecial ); | ||
143 | void mkDir( const Bu::String &sPath, uint16_t iPerms ); | ||
144 | void mkSymLink( const Bu::String &sTarget, const Bu::String &sPath ); | ||
145 | void mkHardLink( const Bu::String &sTarget, const Bu::String &sPath ); | ||
146 | Bu::String readSymLink( const Bu::String &sPath ); | ||
147 | Dir readDir( const Bu::String &sPath ); | ||
148 | void setTimes( const Bu::String &sPath, int64_t iATime, | ||
149 | int64_t iMTime ); | ||
150 | void unlink( const Bu::String &sPath ); | ||
151 | void setFileSize( const Bu::String &sPath, int32_t iSize ); | ||
152 | void rename( const Bu::String &sFrom, const Bu::String &sTo ); | ||
153 | |||
154 | static dev_t devToSys( uint32_t uDev ); | ||
155 | static uint32_t sysToDev( dev_t uDev ); | ||
156 | |||
157 | private: | ||
158 | class RawStat | ||
159 | { | ||
160 | public: | ||
161 | int32_t iNode; | ||
162 | int32_t iUser; | ||
163 | int32_t iGroup; | ||
164 | uint16_t uPerms; | ||
165 | int16_t iLinks; | ||
166 | uint32_t uStreamIndex; | ||
167 | int64_t iATime; | ||
168 | int64_t iMTime; | ||
169 | int64_t iCTime; | ||
170 | }; | ||
171 | typedef Bu::Hash<int32_t, int32_t> NodeIndex; | ||
172 | |||
173 | private: | ||
174 | int32_t lookupInode( const Bu::String &sPath, int32_t &iParent ); | ||
175 | int32_t lookupInode( Bu::String::const_iterator iStart, | ||
176 | int32_t iNode, int32_t &iParent ); | ||
177 | void readInode( int32_t iNode, RawStat &rs, MyriadStream &rIs ); | ||
178 | void readInode( int32_t iNode, RawStat &rs ); | ||
179 | void writeInode( const RawStat &rs ); | ||
180 | void writeInode( const RawStat &rs, MyriadStream &rOs ); | ||
181 | Dir readDir( int32_t iNode ); | ||
182 | MyriadStream openByInode( int32_t iNode ); | ||
183 | void addToDir( int32_t iDir, int32_t iNode, const Bu::String &sName ); | ||
184 | int32_t create( int32_t iParent, const Bu::String &sName, | ||
185 | uint16_t uPerms, uint32_t uSpecial ); | ||
186 | int32_t allocInode( uint16_t uPerms, uint32_t uSpecial ); | ||
187 | void stat( int32_t iNode, Stat &rBuf, MyriadStream &rIs ); | ||
188 | void writeHeader(); | ||
189 | void setTimes( int32_t iNode, int64_t iATime, int64_t iMTime ); | ||
190 | void destroyNode( int32_t iNode ); | ||
191 | |||
192 | Bu::String filePart( const Bu::String &sPath ); | ||
193 | |||
194 | private: | ||
195 | Bu::Stream &rStore; | ||
196 | Bu::Myriad mStore; | ||
197 | NodeIndex hNodeIndex; | ||
198 | int32_t iUser; | ||
199 | int32_t iGroup; | ||
200 | }; | ||
201 | }; | ||
202 | |||
203 | #endif | ||