diff options
author | Mike Buland <eichlan@xagasoft.com> | 2011-02-18 17:41:24 +0000 |
---|---|---|
committer | Mike Buland <eichlan@xagasoft.com> | 2011-02-18 17:41:24 +0000 |
commit | 26bb069c535e3fd5b0e0fb28fb54a2a540b60a84 (patch) | |
tree | 9eab7637e5fa1d881c775a6f0611b74e385196f1 /src | |
parent | 80c8dd155a164c186fd11e3e3f66e8f3cfdf19fe (diff) | |
download | libbu++-26bb069c535e3fd5b0e0fb28fb54a2a540b60a84.tar.gz libbu++-26bb069c535e3fd5b0e0fb28fb54a2a540b60a84.tar.bz2 libbu++-26bb069c535e3fd5b0e0fb28fb54a2a540b60a84.tar.xz libbu++-26bb069c535e3fd5b0e0fb28fb54a2a540b60a84.zip |
Some Uuid tweaks, not much, just figuring out the format. MyriadFs is coming
along quite nicely. It looks like it works great for normal programs, but there
need to be some tweaks made to a few things before it's working 100% via fuse.
Also, the fuse module won't let you specify a file, a little odd.
Diffstat (limited to 'src')
-rw-r--r-- | src/myriadfs.cpp | 144 | ||||
-rw-r--r-- | src/myriadfs.h | 32 | ||||
-rw-r--r-- | src/tests/myriadfs.cpp | 24 | ||||
-rw-r--r-- | src/tests/uuid.cpp | 1 | ||||
-rw-r--r-- | src/tools/myriadfs.cpp | 124 | ||||
-rw-r--r-- | src/uuid.cpp | 10 | ||||
-rw-r--r-- | src/uuid.h | 3 |
7 files changed, 309 insertions, 29 deletions
diff --git a/src/myriadfs.cpp b/src/myriadfs.cpp index 4e2a0f6..8312bce 100644 --- a/src/myriadfs.cpp +++ b/src/myriadfs.cpp | |||
@@ -45,7 +45,17 @@ Bu::MyriadFs::MyriadFs( Bu::Stream &rStore, int iBlockSize ) : | |||
45 | 45 | ||
46 | int8_t iVer; | 46 | int8_t iVer; |
47 | ms.read( &iVer, 1 ); | 47 | ms.read( &iVer, 1 ); |
48 | throw MyriadFsException("You totally have a MyriadFs stream, version %d, but they can't be loaded yet.", iVer ); | 48 | |
49 | int32_t iNumNodes; | ||
50 | ms.read( &iNumNodes, 4 ); | ||
51 | for( int32_t j = 0; j < iNumNodes; j++ ) | ||
52 | { | ||
53 | int32_t iNode; | ||
54 | int32_t iPos; | ||
55 | ms.read( &iNode, 4 ); | ||
56 | ms.read( &iPos, 4 ); | ||
57 | hNodeIndex.insert( iNode, iPos ); | ||
58 | } | ||
49 | } | 59 | } |
50 | else | 60 | else |
51 | { | 61 | { |
@@ -125,26 +135,103 @@ Bu::MyriadStream Bu::MyriadFs::open( const Bu::String &sPath, int iMode ) | |||
125 | if( iParent < 0 ) | 135 | if( iParent < 0 ) |
126 | throw; | 136 | throw; |
127 | 137 | ||
138 | // This means that an intermediate path component couldn't be found | ||
139 | if( e.getErrorCode() == 1 ) | ||
140 | throw; | ||
141 | |||
128 | // The file wasn't found, but the path leading up to it was. | 142 | // The file wasn't found, but the path leading up to it was. |
129 | // first, figure out the final path element... | 143 | // first, figure out the final path element... |
130 | Bu::String::const_iterator iStart = sPath.begin(); | 144 | Bu::String::const_iterator iStart = sPath.begin(); |
131 | if( *iStart == '/' ) | 145 | if( *iStart == '/' ) |
132 | iStart++; | 146 | iStart++; |
133 | sio << "Scanning for filename:" << sio.nl; | 147 | sio << "Scanning for filename:" << sio.nl; |
134 | for( Bu::String::const_iterator iEnd = iStart.find('/')+1; iEnd; iStart = iEnd ) { } | 148 | for( Bu::String::const_iterator iEnd = iStart.find('/'); iEnd; |
149 | iStart = iEnd+1, iEnd = iStart.find('/') ) { } | ||
135 | Bu::String sName( iStart, sPath.end() ); | 150 | Bu::String sName( iStart, sPath.end() ); |
136 | sio << "End filename: " << sName << sio.nl; | 151 | sio << "End filename: " << sName << sio.nl; |
137 | sio << "Parent inode: " << iParent << sio.nl; | 152 | sio << "Parent inode: " << iParent << sio.nl; |
138 | iNode = create( iParent, sName, 0664|typeRegFile ); | 153 | iNode = create( iParent, sName, 0664|typeRegFile, 0 ); |
139 | sio << "New iNode: " << iNode << sio.nl; | 154 | sio << "New iNode: " << iNode << sio.nl; |
140 | return openByInode( iNode ); | 155 | return openByInode( iNode ); |
141 | } | 156 | } |
157 | } | ||
158 | |||
159 | void Bu::MyriadFs::create( const Bu::String &sPath, uint16_t iPerms ) | ||
160 | { | ||
161 | create( sPath, iPerms, 0 ); | ||
162 | } | ||
142 | 163 | ||
143 | return mStore.openStream( 2 ); | 164 | void Bu::MyriadFs::create( const Bu::String &sPath, uint16_t iPerms, |
165 | uint16_t iDevHi, uint16_t iDevLo ) | ||
166 | { | ||
167 | create( sPath, iPerms, ((uint32_t)iDevHi<<16)|(uint32_t)iDevLo ); | ||
168 | } | ||
169 | |||
170 | void Bu::MyriadFs::create( const Bu::String &sPath, uint16_t iPerms, | ||
171 | uint32_t uSpecial ) | ||
172 | { | ||
173 | int32_t iParent = -1; | ||
174 | int32_t iNode; | ||
175 | try | ||
176 | { | ||
177 | iNode = lookupInode( sPath, iParent ); | ||
178 | sio << "File found." << sio.nl; | ||
179 | // The file was found | ||
180 | throw Bu::MyriadFsException("Path already exists."); | ||
181 | } | ||
182 | catch( Bu::MyriadFsException &e ) | ||
183 | { | ||
184 | if( iParent < 0 ) | ||
185 | throw; | ||
186 | |||
187 | // This means that an intermediate path component couldn't be found | ||
188 | if( e.getErrorCode() == 1 ) | ||
189 | throw; | ||
190 | |||
191 | // The file wasn't found, but the path leading up to it was. | ||
192 | // first, figure out the final path element... | ||
193 | Bu::String::const_iterator iStart = sPath.begin(); | ||
194 | if( *iStart == '/' ) | ||
195 | iStart++; | ||
196 | sio << "Scanning for filename:" << sio.nl; | ||
197 | for( Bu::String::const_iterator iEnd = iStart.find('/'); iEnd; | ||
198 | iStart = iEnd+1, iEnd = iStart.find('/') ) { } | ||
199 | Bu::String sName( iStart, sPath.end() ); | ||
200 | sio << "End filename: " << sName << sio.nl; | ||
201 | sio << "Parent inode: " << iParent << sio.nl; | ||
202 | iNode = create( iParent, sName, iPerms, uSpecial ); | ||
203 | sio << "New iNode: " << iNode << sio.nl; | ||
204 | } | ||
205 | } | ||
206 | |||
207 | void Bu::MyriadFs::mkDir( const Bu::String &sPath, uint16_t iPerms ) | ||
208 | { | ||
209 | create( sPath, (iPerms&permMask)|typeDir, 0 ); | ||
210 | } | ||
211 | |||
212 | Bu::MyriadFs::Dir Bu::MyriadFs::readDir( const Bu::String &sPath ) | ||
213 | { | ||
214 | int32_t iParent = -1; | ||
215 | int32_t iNode = lookupInode( sPath, iParent ); | ||
216 | return readDir( iNode ); | ||
217 | } | ||
218 | |||
219 | dev_t Bu::MyriadFs::devToSys( uint32_t uDev ) | ||
220 | { | ||
221 | return (((uDev&0xFFFF0000)>>8)&0xFF00) | ((uDev&0xFF)); | ||
222 | } | ||
223 | |||
224 | uint32_t Bu::MyriadFs::sysToDev( dev_t uDev ) | ||
225 | { | ||
226 | return (((uint32_t)uDev&0xFF00)<<8) | ((uint32_t)uDev&0xFF); | ||
144 | } | 227 | } |
145 | 228 | ||
146 | int32_t Bu::MyriadFs::lookupInode( const Bu::String &sPath, int32_t &iParent ) | 229 | int32_t Bu::MyriadFs::lookupInode( const Bu::String &sPath, int32_t &iParent ) |
147 | { | 230 | { |
231 | if( sPath == "/" ) | ||
232 | { | ||
233 | return 0; | ||
234 | } | ||
148 | if( sPath[0] == '/' ) | 235 | if( sPath[0] == '/' ) |
149 | { | 236 | { |
150 | // Absolute lookup | 237 | // Absolute lookup |
@@ -185,7 +272,7 @@ int32_t Bu::MyriadFs::lookupInode( Bu::String::const_iterator iStart, | |||
185 | // Not the last one in our path, double check it's a dir | 272 | // Not the last one in our path, double check it's a dir |
186 | if( ((*i).uPerms&typeMask) == typeDir ) | 273 | if( ((*i).uPerms&typeMask) == typeDir ) |
187 | { | 274 | { |
188 | return lookupInode( iEnd+1, (*i).iNode ); | 275 | return lookupInode( iEnd+1, (*i).iNode, iParent ); |
189 | } | 276 | } |
190 | else | 277 | else |
191 | { | 278 | { |
@@ -198,13 +285,16 @@ int32_t Bu::MyriadFs::lookupInode( Bu::String::const_iterator iStart, | |||
198 | } | 285 | } |
199 | } | 286 | } |
200 | 287 | ||
201 | throw Bu::MyriadFsException( 1, "Path not found"); | 288 | if( iEnd ) |
289 | throw Bu::MyriadFsException( 1, "Path not found"); | ||
290 | else | ||
291 | throw Bu::MyriadFsException( 2, "Path not found"); | ||
202 | } | 292 | } |
203 | 293 | ||
204 | Bu::MyriadFs::Dir Bu::MyriadFs::readDir( int32_t iNode ) | 294 | Bu::MyriadFs::Dir Bu::MyriadFs::readDir( int32_t iNode ) |
205 | { | 295 | { |
206 | Bu::MyriadStream ms = openByInode( iNode ); | 296 | Bu::MyriadStream ms = openByInode( iNode ); |
207 | int32_t iNumChildren; | 297 | int32_t iNumChildren = 0; |
208 | ms.read( &iNumChildren, 4 ); | 298 | ms.read( &iNumChildren, 4 ); |
209 | 299 | ||
210 | Bu::MyriadStream is = mStore.openStream( 2 ); | 300 | Bu::MyriadStream is = mStore.openStream( 2 ); |
@@ -236,7 +326,7 @@ Bu::MyriadStream Bu::MyriadFs::openByInode( int32_t iNode ) | |||
236 | case typeDir: | 326 | case typeDir: |
237 | case typeSymLink: | 327 | case typeSymLink: |
238 | case typeRegFile: | 328 | case typeRegFile: |
239 | return mStore.openStream( rs.iStreamIndex ); | 329 | return mStore.openStream( rs.uStreamIndex ); |
240 | 330 | ||
241 | default: | 331 | default: |
242 | throw Bu::MyriadFsException( | 332 | throw Bu::MyriadFsException( |
@@ -245,22 +335,22 @@ Bu::MyriadStream Bu::MyriadFs::openByInode( int32_t iNode ) | |||
245 | } | 335 | } |
246 | 336 | ||
247 | int32_t Bu::MyriadFs::create( int32_t iParent, const Bu::String &sName, | 337 | int32_t Bu::MyriadFs::create( int32_t iParent, const Bu::String &sName, |
248 | uint16_t uPerms ) | 338 | uint16_t uPerms, uint32_t uSpecial ) |
249 | { | 339 | { |
250 | Bu::MyriadStream ms = openByInode( iParent ); | 340 | Bu::MyriadStream ms = openByInode( iParent ); |
251 | int32_t iNumChildren; | 341 | int32_t iNumChildren = 0; |
252 | ms.read( &iNumChildren, 4 ); | 342 | ms.read( &iNumChildren, 4 ); |
253 | iNumChildren++; | 343 | iNumChildren++; |
254 | ms.setPos( 0 ); | 344 | ms.setPos( 0 ); |
255 | ms.write( &iNumChildren, 4 ); | 345 | ms.write( &iNumChildren, 4 ); |
256 | ms.setPos( iNumChildren*4 ); // Actually 4+(iNumChildren-1)*4 :-P | 346 | ms.setPos( iNumChildren*4 ); // Actually 4+(iNumChildren-1)*4 :-P |
257 | int32_t iNode = allocInode( sName, iParent, uPerms ); | 347 | int32_t iNode = allocInode( sName, iParent, uPerms, uSpecial ); |
258 | ms.write( &iNode, 4 ); | 348 | ms.write( &iNode, 4 ); |
259 | return iNode; | 349 | return iNode; |
260 | } | 350 | } |
261 | 351 | ||
262 | int32_t Bu::MyriadFs::allocInode( const Bu::String &sName, int32_t iParent, | 352 | int32_t Bu::MyriadFs::allocInode( const Bu::String &sName, int32_t iParent, |
263 | uint16_t uPerms ) | 353 | uint16_t uPerms, uint32_t uSpecial ) |
264 | { | 354 | { |
265 | int32_t iNode = 0; | 355 | int32_t iNode = 0; |
266 | for(; iNode < 0xfffffff; iNode++ ) | 356 | for(; iNode < 0xfffffff; iNode++ ) |
@@ -279,14 +369,29 @@ int32_t Bu::MyriadFs::allocInode( const Bu::String &sName, int32_t iParent, | |||
279 | rs.iLinks = 1; | 369 | rs.iLinks = 1; |
280 | switch( (uPerms&typeMask) ) | 370 | switch( (uPerms&typeMask) ) |
281 | { | 371 | { |
282 | case typeDir: | ||
283 | case typeRegFile: | 372 | case typeRegFile: |
284 | case typeSymLink: | 373 | case typeSymLink: |
285 | rs.iStreamIndex = mStore.createStream(); | 374 | rs.uStreamIndex = mStore.createStream(); |
375 | break; | ||
376 | |||
377 | case typeDir: | ||
378 | rs.uStreamIndex = mStore.createStream(); | ||
379 | { | ||
380 | Bu::MyriadStream msDir = mStore.openStream( | ||
381 | rs.uStreamIndex | ||
382 | ); | ||
383 | uint32_t uSize = 0; | ||
384 | msDir.write( &uSize, 4 ); | ||
385 | } | ||
386 | break; | ||
387 | |||
388 | case typeChrDev: | ||
389 | case typeBlkDev: | ||
390 | rs.uStreamIndex = uSpecial; | ||
286 | break; | 391 | break; |
287 | 392 | ||
288 | default: | 393 | default: |
289 | rs.iStreamIndex = 0; | 394 | rs.uStreamIndex = 0; |
290 | break; | 395 | break; |
291 | } | 396 | } |
292 | rs.iParentNode = iParent; | 397 | rs.iParentNode = iParent; |
@@ -320,11 +425,18 @@ void Bu::MyriadFs::stat( int32_t iNode, Stat &rBuf, MyriadStream &rIs ) | |||
320 | rBuf.iATime = rs.iATime; | 425 | rBuf.iATime = rs.iATime; |
321 | rBuf.iMTime = rs.iMTime; | 426 | rBuf.iMTime = rs.iMTime; |
322 | rBuf.iCTime = rs.iCTime; | 427 | rBuf.iCTime = rs.iCTime; |
428 | rBuf.uDev = 0; | ||
429 | rBuf.iSize = 0; | ||
323 | switch( (rBuf.uPerms&typeMask) ) | 430 | switch( (rBuf.uPerms&typeMask) ) |
324 | { | 431 | { |
325 | case typeRegFile: | 432 | case typeRegFile: |
326 | case typeSymLink: | 433 | case typeSymLink: |
327 | rBuf.iSize = mStore.getStreamSize( rs.iStreamIndex ); | 434 | rBuf.iSize = mStore.getStreamSize( rs.uStreamIndex ); |
435 | break; | ||
436 | |||
437 | case typeChrDev: | ||
438 | case typeBlkDev: | ||
439 | rBuf.uDev = rs.uStreamIndex; | ||
328 | break; | 440 | break; |
329 | 441 | ||
330 | default: | 442 | default: |
diff --git a/src/myriadfs.h b/src/myriadfs.h index 808444b..3eecca5 100644 --- a/src/myriadfs.h +++ b/src/myriadfs.h | |||
@@ -8,6 +8,8 @@ | |||
8 | #ifndef MYRIAD_FS_H | 8 | #ifndef MYRIAD_FS_H |
9 | #define MYRIAD_FS_H | 9 | #define MYRIAD_FS_H |
10 | 10 | ||
11 | #include <sys/types.h> | ||
12 | |||
11 | #include "bu/myriad.h" | 13 | #include "bu/myriad.h" |
12 | 14 | ||
13 | namespace Bu | 15 | namespace Bu |
@@ -38,9 +40,9 @@ namespace Bu | |||
38 | * Basic node header format: | 40 | * Basic node header format: |
39 | * int32_t iUser | 41 | * int32_t iUser |
40 | * int32_t iGroup | 42 | * int32_t iGroup |
41 | * int16_t iPerms | 43 | * uint16_t uPerms |
42 | * int16_t iLinks | 44 | * int16_t iLinks |
43 | * int32_t iStreamIndex | 45 | * uint32_t uStreamIndex |
44 | * int32_t iParentNode | 46 | * int32_t iParentNode |
45 | * int64_t iATime | 47 | * int64_t iATime |
46 | * int64_t iMTime | 48 | * int64_t iMTime |
@@ -51,14 +53,14 @@ namespace Bu | |||
51 | * Some types get special formats for their assosiated data stream, or | 53 | * Some types get special formats for their assosiated data stream, or |
52 | * other special considerations, here's a list: | 54 | * other special considerations, here's a list: |
53 | * | 55 | * |
54 | * - typeFifo: No stream, iStreamIndex unused (probably) | 56 | * - typeFifo: No stream, uStreamIndex unused (probably) |
55 | * - typeChrDev: No stream, iStreamIndex is device hi/lo | 57 | * - typeChrDev: No stream, uStreamIndex is device hi/lo |
56 | * - typeDir: The stream contains a directory contents listing, described | 58 | * - typeDir: The stream contains a directory contents listing, described |
57 | * below | 59 | * below |
58 | * - typeBlkDev: No stream, iStreamIndex is device hi/lo | 60 | * - typeBlkDev: No stream, uStreamIndex is device hi/lo |
59 | * - typeRegFile: The stream is the file data | 61 | * - typeRegFile: The stream is the file data |
60 | * - typeSymLink: The stream is the destination of the symlink | 62 | * - typeSymLink: The stream is the destination of the symlink |
61 | * - typeSocket: No steram, iStreamIndex unused (probably) | 63 | * - typeSocket: No steram, uStreamIndex unused (probably) |
62 | * | 64 | * |
63 | * Directory streams have this simple listing format. They contain a list | 65 | * 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 | 66 | * of all child elements, with no particular order at the moment. The . and |
@@ -89,6 +91,7 @@ namespace Bu | |||
89 | permSticky = 0001000, | 91 | permSticky = 0001000, |
90 | permSetGid = 0002000, | 92 | permSetGid = 0002000, |
91 | permSetUid = 0004000, | 93 | permSetUid = 0004000, |
94 | permMask = 0007777, | ||
92 | typeFifo = 0010000, | 95 | typeFifo = 0010000, |
93 | typeChrDev = 0020000, | 96 | typeChrDev = 0020000, |
94 | typeDir = 0040000, | 97 | typeDir = 0040000, |
@@ -127,14 +130,23 @@ namespace Bu | |||
127 | int64_t iMTime; | 130 | int64_t iMTime; |
128 | int64_t iCTime; | 131 | int64_t iCTime; |
129 | int32_t iSize; | 132 | int32_t iSize; |
133 | uint32_t uDev; | ||
130 | Bu::String sName; | 134 | Bu::String sName; |
131 | }; | 135 | }; |
132 | typedef Bu::List<Stat> Dir; | 136 | typedef Bu::List<Stat> Dir; |
133 | 137 | ||
134 | void stat( const Bu::String &sPath, Stat &rBuf ); | 138 | void stat( const Bu::String &sPath, Stat &rBuf ); |
135 | MyriadStream open( const Bu::String &sPath, int iMode ); | 139 | MyriadStream open( const Bu::String &sPath, int iMode ); |
136 | // void create( const Bu::String &sPath, uint16_t iPerms ); | 140 | void create( const Bu::String &sPath, uint16_t iPerms ); |
141 | void create( const Bu::String &sPath, uint16_t iPerms, | ||
142 | uint16_t iDevHi, uint16_t iDevLo ); | ||
143 | void create( const Bu::String &sPath, uint16_t iPerms, | ||
144 | uint32_t uSpecial ); | ||
145 | void mkDir( const Bu::String &sPath, uint16_t iPerms ); | ||
146 | Dir readDir( const Bu::String &sPath ); | ||
137 | 147 | ||
148 | static dev_t devToSys( uint32_t uDev ); | ||
149 | static uint32_t sysToDev( dev_t uDev ); | ||
138 | 150 | ||
139 | private: | 151 | private: |
140 | class RawStat | 152 | class RawStat |
@@ -144,7 +156,7 @@ namespace Bu | |||
144 | int32_t iGroup; | 156 | int32_t iGroup; |
145 | uint16_t uPerms; | 157 | uint16_t uPerms; |
146 | int16_t iLinks; | 158 | int16_t iLinks; |
147 | int32_t iStreamIndex; | 159 | uint32_t uStreamIndex; |
148 | int32_t iParentNode; | 160 | int32_t iParentNode; |
149 | int64_t iATime; | 161 | int64_t iATime; |
150 | int64_t iMTime; | 162 | int64_t iMTime; |
@@ -160,9 +172,9 @@ namespace Bu | |||
160 | Dir readDir( int32_t iNode ); | 172 | Dir readDir( int32_t iNode ); |
161 | MyriadStream openByInode( int32_t iNode ); | 173 | MyriadStream openByInode( int32_t iNode ); |
162 | int32_t create( int32_t iParent, const Bu::String &sName, | 174 | int32_t create( int32_t iParent, const Bu::String &sName, |
163 | uint16_t uPerms ); | 175 | uint16_t uPerms, uint32_t uSpecial ); |
164 | int32_t allocInode( const Bu::String &sName, int32_t iParent, | 176 | int32_t allocInode( const Bu::String &sName, int32_t iParent, |
165 | uint16_t uPerms ); | 177 | uint16_t uPerms, uint32_t uSpecial ); |
166 | void stat( int32_t iNode, Stat &rBuf, MyriadStream &rIs ); | 178 | void stat( int32_t iNode, Stat &rBuf, MyriadStream &rIs ); |
167 | void writeHeader(); | 179 | void writeHeader(); |
168 | 180 | ||
diff --git a/src/tests/myriadfs.cpp b/src/tests/myriadfs.cpp index fd96c02..5946b27 100644 --- a/src/tests/myriadfs.cpp +++ b/src/tests/myriadfs.cpp | |||
@@ -8,19 +8,41 @@ using namespace Bu; | |||
8 | 8 | ||
9 | int main( int argc, char *argv[] ) | 9 | int main( int argc, char *argv[] ) |
10 | { | 10 | { |
11 | Bu::MemBuf mb; | 11 | // Bu::MemBuf mb; |
12 | Bu::File mb("store.myr", File::Read|File::Write|File::Create ); | ||
12 | Bu::MyriadFs mfs( mb, 512 ); | 13 | Bu::MyriadFs mfs( mb, 512 ); |
13 | 14 | ||
15 | sio << "Creating dirs..." << sio.nl; | ||
16 | mfs.create("/etc", Bu::MyriadFs::typeDir|0755 ); | ||
17 | mfs.create("/dev", Bu::MyriadFs::typeDir|0755 ); | ||
18 | mfs.create("/usr", Bu::MyriadFs::typeDir|0755 ); | ||
19 | |||
20 | mfs.create("/dev/null", Bu::MyriadFs::typeChrDev|0666, 1, 3 ); | ||
21 | mfs.create("/dev/zero", Bu::MyriadFs::typeChrDev|0666, 1, 5 ); | ||
22 | mfs.create("/dev/sda", Bu::MyriadFs::typeBlkDev|0660, 8, 0 ); | ||
23 | |||
24 | sio << "Creating files..." << sio.nl; | ||
14 | { | 25 | { |
15 | Bu::MyriadStream ms = mfs.open("/hello", Bu::MyriadFs::Read ); | 26 | Bu::MyriadStream ms = mfs.open("/hello", Bu::MyriadFs::Read ); |
16 | ms.write("world!"); | 27 | ms.write("world!"); |
17 | } | 28 | } |
29 | { | ||
30 | Bu::MyriadStream ms = mfs.open("/etc/hello", Bu::MyriadFs::Read ); | ||
31 | ms.write("world, again!"); | ||
32 | } | ||
18 | 33 | ||
34 | sio << "Reading files..." << sio.nl; | ||
19 | { | 35 | { |
20 | Bu::MyriadStream ms = mfs.open("/hello", Bu::MyriadFs::Read ); | 36 | Bu::MyriadStream ms = mfs.open("/hello", Bu::MyriadFs::Read ); |
21 | char buf[512]; | 37 | char buf[512]; |
22 | buf[ms.read( buf, 512 )] = '\0'; | 38 | buf[ms.read( buf, 512 )] = '\0'; |
23 | sio << "read: '" << buf << "'" << sio.nl; | 39 | sio << "read: '" << buf << "'" << sio.nl; |
24 | } | 40 | } |
41 | { | ||
42 | Bu::MyriadStream ms = mfs.open("/etc/hello", Bu::MyriadFs::Read ); | ||
43 | char buf[512]; | ||
44 | buf[ms.read( buf, 512 )] = '\0'; | ||
45 | sio << "read: '" << buf << "'" << sio.nl; | ||
46 | } | ||
25 | } | 47 | } |
26 | 48 | ||
diff --git a/src/tests/uuid.cpp b/src/tests/uuid.cpp index b6470fa..d2f67b1 100644 --- a/src/tests/uuid.cpp +++ b/src/tests/uuid.cpp | |||
@@ -15,6 +15,7 @@ int main() | |||
15 | Uuid i = Uuid::gen(); | 15 | Uuid i = Uuid::gen(); |
16 | 16 | ||
17 | sio << i.toString() << sio.nl; | 17 | sio << i.toString() << sio.nl; |
18 | sio << "Version: " << i.getVersion() << sio.nl; | ||
18 | 19 | ||
19 | return 0; | 20 | return 0; |
20 | } | 21 | } |
diff --git a/src/tools/myriadfs.cpp b/src/tools/myriadfs.cpp index 88db0c0..3956311 100644 --- a/src/tools/myriadfs.cpp +++ b/src/tools/myriadfs.cpp | |||
@@ -10,36 +10,156 @@ | |||
10 | #include <fuse.h> | 10 | #include <fuse.h> |
11 | 11 | ||
12 | #include <string.h> | 12 | #include <string.h> |
13 | #include <errno.h> | ||
14 | |||
15 | #include <bu/file.h> | ||
16 | #include <bu/myriadfs.h> | ||
17 | #include <bu/myriadstream.h> | ||
18 | #include <bu/hash.h> | ||
19 | |||
20 | Bu::File *pF = NULL; | ||
21 | Bu::MyriadFs *pFs = NULL; | ||
22 | |||
23 | typedef Bu::Hash<int64_t, Bu::MyriadStream> FileHash; | ||
24 | FileHash hOpenFiles; | ||
25 | int64_t iNextFileId = 0; | ||
13 | 26 | ||
14 | extern "C" { | 27 | extern "C" { |
15 | static int myriadfs_getattr( const char *sPath, struct stat *stbuf ) | 28 | static int myriadfs_getattr( const char *sPath, struct stat *stbuf ) |
16 | { | 29 | { |
17 | 30 | try | |
31 | { | ||
32 | printf("myriadfs_getattr: Statting file: %s\n", sPath ); | ||
33 | Bu::MyriadFs::Stat st; | ||
34 | pFs->stat( sPath, st ); | ||
35 | stbuf->st_ino = st.iNode; | ||
36 | stbuf->st_mode = st.uPerms; | ||
37 | stbuf->st_nlink = st.iLinks; | ||
38 | stbuf->st_uid = st.iUser; | ||
39 | stbuf->st_gid = st.iGroup; | ||
40 | stbuf->st_rdev = Bu::MyriadFs::devToSys( st.uDev ); | ||
41 | stbuf->st_size = st.iSize; | ||
42 | stbuf->st_blocks = 8; | ||
43 | stbuf->st_atime = st.iATime; | ||
44 | stbuf->st_mtime = st.iMTime; | ||
45 | stbuf->st_ctime = st.iCTime; | ||
46 | return 0; | ||
47 | } | ||
48 | catch(...) | ||
49 | { | ||
50 | return -ENOENT; | ||
51 | } | ||
18 | } | 52 | } |
19 | 53 | ||
20 | static int myriadfs_readdir( const char *sPath, void *buf, | 54 | static int myriadfs_readdir( const char *sPath, void *buf, |
21 | fuse_fill_dir_t filler, off_t offset, struct fuse_file_info *fi ) | 55 | fuse_fill_dir_t filler, off_t offset, struct fuse_file_info *fi ) |
22 | { | 56 | { |
57 | fprintf( stderr, "Reading dir...\n"); | ||
58 | Bu::MyriadFs::Dir lDir = pFs->readDir( sPath ); | ||
59 | filler( buf, ".", NULL, 0 ); | ||
60 | filler( buf, "..", NULL, 0 ); | ||
61 | for( Bu::MyriadFs::Dir::iterator i = lDir.begin(); i; i++ ) | ||
62 | { | ||
63 | fprintf( stderr, "Adding file: '%s'\n", (*i).sName.getStr() ); | ||
64 | filler( buf, (*i).sName.getStr(), NULL, 0 ); | ||
65 | } | ||
66 | |||
67 | return 0; | ||
68 | } | ||
69 | |||
70 | static int myriadfs_mkdir( const char *sPath, mode_t uMode ) | ||
71 | { | ||
72 | pFs->mkDir( sPath, uMode ); | ||
73 | return 0; | ||
23 | } | 74 | } |
24 | 75 | ||
25 | static int myriadfs_open( const char *sPath, struct fuse_file_info *fi ) | 76 | static int myriadfs_open( const char *sPath, struct fuse_file_info *fi ) |
26 | { | 77 | { |
78 | try | ||
79 | { | ||
80 | Bu::MyriadStream ms = pFs->open( sPath, 0 ); | ||
81 | fi->fh = iNextFileId; | ||
82 | hOpenFiles.insert( iNextFileId++, ms ); | ||
83 | return 0; | ||
84 | } | ||
85 | catch(...) | ||
86 | { | ||
87 | return -EACCES; | ||
88 | } | ||
27 | } | 89 | } |
28 | 90 | ||
29 | static int myriadfs_read( const char *sPath, char *buf, size_t iSize, | 91 | static int myriadfs_read( const char *sPath, char *buf, size_t iSize, |
30 | off_t iOffset, struct fuse_file_info *fi ) | 92 | off_t iOffset, struct fuse_file_info *fi ) |
31 | { | 93 | { |
94 | Bu::MyriadStream &ms = hOpenFiles.get( fi->fh ); | ||
95 | ms.setPos( iOffset ); | ||
96 | return ms.read( buf, iSize ); | ||
97 | } | ||
98 | |||
99 | static int myriadfs_write( const char *sPath, const char *buf, size_t iSize, | ||
100 | off_t iOffset, struct fuse_file_info *fi ) | ||
101 | { | ||
102 | Bu::MyriadStream &ms = hOpenFiles.get( fi->fh ); | ||
103 | ms.setPos( iOffset ); | ||
104 | return ms.write( buf, iSize ); | ||
105 | } | ||
106 | |||
107 | static int myriadfs_create( const char *sPath, mode_t uPerms, | ||
108 | struct fuse_file_info *fi ) | ||
109 | { | ||
110 | try | ||
111 | { | ||
112 | Bu::MyriadStream ms = pFs->open( sPath, 0 ); | ||
113 | fi->fh = iNextFileId; | ||
114 | hOpenFiles.insert( iNextFileId++, ms ); | ||
115 | return 0; | ||
116 | } | ||
117 | catch(...) | ||
118 | { | ||
119 | return -EACCES; | ||
120 | } | ||
121 | } | ||
122 | |||
123 | static int myriadfs_mknod( const char *sPath, mode_t uPerms, dev_t Dev ) | ||
124 | { | ||
125 | try | ||
126 | { | ||
127 | pFs->create( sPath, uPerms, Bu::MyriadFs::sysToDev( Dev ) ); | ||
128 | return 0; | ||
129 | } | ||
130 | catch(...) | ||
131 | { | ||
132 | return -EACCES; | ||
133 | } | ||
134 | } | ||
135 | |||
136 | static int myriadfs_release( const char *sPath, struct fuse_file_info *fi ) | ||
137 | { | ||
138 | hOpenFiles.erase( fi->fh ); | ||
139 | |||
140 | return 0; | ||
32 | } | 141 | } |
33 | 142 | ||
34 | static struct fuse_operations myriadfs_oper; | 143 | static struct fuse_operations myriadfs_oper; |
35 | 144 | ||
36 | int main( int argc, char *argv[] ) | 145 | int main( int argc, char *argv[] ) |
37 | { | 146 | { |
147 | pF = new Bu::File("store.myr", Bu::File::Read|Bu::File::Write|Bu::File::Create ); | ||
148 | pFs = new Bu::MyriadFs( *pF, 512 ); | ||
38 | memset( &myriadfs_oper, sizeof(myriadfs_oper), 0 ); | 149 | memset( &myriadfs_oper, sizeof(myriadfs_oper), 0 ); |
39 | myriadfs_oper.getattr = myriadfs_getattr; | 150 | myriadfs_oper.getattr = myriadfs_getattr; |
40 | myriadfs_oper.readdir = myriadfs_readdir; | 151 | myriadfs_oper.readdir = myriadfs_readdir; |
152 | myriadfs_oper.mkdir = myriadfs_mkdir; | ||
41 | myriadfs_oper.open = myriadfs_open; | 153 | myriadfs_oper.open = myriadfs_open; |
42 | myriadfs_oper.read = myriadfs_read; | 154 | myriadfs_oper.read = myriadfs_read; |
43 | return fuse_main( argc, argv, &myriadfs_oper, NULL ); | 155 | myriadfs_oper.write = myriadfs_write; |
156 | myriadfs_oper.create = myriadfs_create; | ||
157 | myriadfs_oper.mknod = myriadfs_mknod; | ||
158 | printf("Starting fuse_main.\n"); | ||
159 | int iRet = fuse_main( argc, argv, &myriadfs_oper, NULL ); | ||
160 | printf("Done with fuse_main.\n"); | ||
161 | delete pFs; | ||
162 | delete pF; | ||
163 | return iRet; | ||
44 | } | 164 | } |
45 | } | 165 | } |
diff --git a/src/uuid.cpp b/src/uuid.cpp index 69af5b4..d34a989 100644 --- a/src/uuid.cpp +++ b/src/uuid.cpp | |||
@@ -45,6 +45,16 @@ Bu::String Bu::Uuid::toString() | |||
45 | return mb.getString(); | 45 | return mb.getString(); |
46 | } | 46 | } |
47 | 47 | ||
48 | Bu::String Bu::Uuid::toUrn() | ||
49 | { | ||
50 | return "urn:uuid:" + toString(); | ||
51 | } | ||
52 | |||
53 | int Bu::Uuid::getVersion() | ||
54 | { | ||
55 | return (data[6]&((8|4|2|1)<<4))>>4; | ||
56 | } | ||
57 | |||
48 | #define msb( i ) (1<<(7-i)) | 58 | #define msb( i ) (1<<(7-i)) |
49 | 59 | ||
50 | void Bu::Uuid::clear() | 60 | void Bu::Uuid::clear() |
@@ -21,6 +21,9 @@ namespace Bu | |||
21 | 21 | ||
22 | Bu::String toRawString(); | 22 | Bu::String toRawString(); |
23 | Bu::String toString(); | 23 | Bu::String toString(); |
24 | Bu::String toUrn(); | ||
25 | |||
26 | int getVersion(); | ||
24 | 27 | ||
25 | static Uuid gen(); | 28 | static Uuid gen(); |
26 | static Uuid genV1(); | 29 | static Uuid genV1(); |