diff options
-rw-r--r-- | default.bld | 16 | ||||
-rw-r--r-- | src/file.cpp | 1 | ||||
-rw-r--r-- | src/myriad.h | 2 | ||||
-rw-r--r-- | src/myriadfs.cpp | 72 | ||||
-rw-r--r-- | src/myriadfs.h | 20 | ||||
-rw-r--r-- | src/tools/myriadfs.cpp | 38 |
6 files changed, 143 insertions, 6 deletions
diff --git a/default.bld b/default.bld index 857e988..50baefb 100644 --- a/default.bld +++ b/default.bld | |||
@@ -82,6 +82,22 @@ target "viewcsv" | |||
82 | } | 82 | } |
83 | 83 | ||
84 | // | 84 | // |
85 | // This shouldn't be. Basically, if you set a property on a top level target | ||
86 | // that has children it seems like the items should apply to the children. | ||
87 | // I'm honestly not 100% sure what the policy should be yet, but this seems like | ||
88 | // I shouldn't have to do it this way. | ||
89 | // | ||
90 | target "src/tools/myriadfs.o" | ||
91 | { | ||
92 | CXXFLAGS += "-D_FILE_OFFSET_BITS=64"; | ||
93 | } | ||
94 | |||
95 | target "myriadfs" | ||
96 | { | ||
97 | LDFLAGS += "-lfuse"; | ||
98 | } | ||
99 | |||
100 | // | ||
85 | // General Tests | 101 | // General Tests |
86 | // | 102 | // |
87 | 103 | ||
diff --git a/src/file.cpp b/src/file.cpp index 0566ee8..008b88e 100644 --- a/src/file.cpp +++ b/src/file.cpp | |||
@@ -11,7 +11,6 @@ | |||
11 | #include <sys/stat.h> | 11 | #include <sys/stat.h> |
12 | #include <fcntl.h> | 12 | #include <fcntl.h> |
13 | #include <unistd.h> | 13 | #include <unistd.h> |
14 | #include <stdlib.h> // for mkstemp | ||
15 | #include <time.h> | 14 | #include <time.h> |
16 | 15 | ||
17 | #include "bu/config.h" | 16 | #include "bu/config.h" |
diff --git a/src/myriad.h b/src/myriad.h index 79c3cda..ed0ef53 100644 --- a/src/myriad.h +++ b/src/myriad.h | |||
@@ -46,7 +46,7 @@ namespace Bu | |||
46 | * Header format is as follows: | 46 | * Header format is as follows: |
47 | * | 47 | * |
48 | * MMMMvBssssSSSS* | 48 | * MMMMvBssssSSSS* |
49 | * M = Magic number (FFC399BD) | 49 | * M = Magic number (0AD3FA84) |
50 | * v = version number | 50 | * v = version number |
51 | * B = Bits per int | 51 | * B = Bits per int |
52 | * s = Blocksize in bytes | 52 | * s = Blocksize in bytes |
diff --git a/src/myriadfs.cpp b/src/myriadfs.cpp index bb72cd5..af60c08 100644 --- a/src/myriadfs.cpp +++ b/src/myriadfs.cpp | |||
@@ -1,7 +1,75 @@ | |||
1 | #include "myriadfs.h" | 1 | #include "bu/myriadfs.h" |
2 | #include "bu/myriadstream.h" | ||
2 | 3 | ||
3 | Bu::MyriadFs::MyriadFs() | 4 | #include <string.h> |
5 | #include <unistd.h> | ||
6 | |||
7 | namespace Bu { subExceptionDef( MyriadFsException ) } | ||
8 | |||
9 | #define Myriad_Fs_MAGIC_CODE ((char *)"\xa7\x18\x8b\x39") | ||
10 | |||
11 | Bu::MyriadFs::MyriadFs( Bu::Stream &rStore, int iBlockSize ) : | ||
12 | rStore( rStore ), | ||
13 | mStore( rStore, iBlockSize ) | ||
4 | { | 14 | { |
15 | if( mStore.hasStream( 1 ) ) | ||
16 | { | ||
17 | // Check to see if this is a MyriadFs stream. | ||
18 | Bu::MyriadStream ms = mStore.openStream( 1 ); | ||
19 | char sMagic[4]; | ||
20 | if( ms.read( sMagic, 4 ) < 4 ) | ||
21 | throw MyriadFsException("The provided stream does not appear to be " | ||
22 | "a MyriadFs stream."); | ||
23 | if( ::strncmp( sMagic, Myriad_Fs_MAGIC_CODE, 4 ) ) | ||
24 | throw MyriadFsException("The provided stream does not appear to be " | ||
25 | "a MyriadFs stream."); | ||
26 | |||
27 | int8_t iVer; | ||
28 | } | ||
29 | else | ||
30 | { | ||
31 | // Create initial header stream | ||
32 | { | ||
33 | mStore.createStream( 1 ); | ||
34 | Bu::MyriadStream ms = mStore.openStream( 1 ); | ||
35 | ms.write( Myriad_Fs_MAGIC_CODE, 4 ); | ||
36 | int8_t iVer = 1; | ||
37 | int32_t iTmp = 1; | ||
38 | ms.write( &iVer, 1 ); | ||
39 | ms.write( &iBlockSize, 4 ); | ||
40 | ms.write( &iTmp, 4 ); // iNumNodes | ||
41 | iTmp = 0; | ||
42 | ms.write( &iTmp, 4 ); // iInode | ||
43 | ms.write( &iTmp, 0 ); // iPosition | ||
44 | } | ||
45 | |||
46 | // Create initial inode stream, with one root node. | ||
47 | { | ||
48 | mStore.createStream( 2 ); | ||
49 | Bu::MyriadStream ms = mStore.openStream( 2 ); | ||
50 | int32_t iUser = 0, iGroup = 0; | ||
51 | #ifndef WIN32 | ||
52 | iUser = getuid(); | ||
53 | iGroup = getgid(); | ||
54 | #endif | ||
55 | int32_t iTmp32 = 0; | ||
56 | int16_t iTmp16 = 0; | ||
57 | ms.write( &iUser, 4 ); | ||
58 | ms.write( &iGroup, 4 ); | ||
59 | ms.write( &iTmp16, 2 ); | ||
60 | ms.write( &iTmp16, 2 ); | ||
61 | iTmp32 = 3; | ||
62 | ms.write( &iTmp32, 4 ); | ||
63 | iTmp32 = 0; | ||
64 | ms.write( &iTmp32, 4 ); | ||
65 | ms.write( &iTmp16, 2 ); | ||
66 | } | ||
67 | |||
68 | // Create inode 0's storage stream. | ||
69 | { | ||
70 | mStore.createStream( 3 ); | ||
71 | } | ||
72 | } | ||
5 | } | 73 | } |
6 | 74 | ||
7 | Bu::MyriadFs::~MyriadFs() | 75 | Bu::MyriadFs::~MyriadFs() |
diff --git a/src/myriadfs.h b/src/myriadfs.h index 687584b..42a3493 100644 --- a/src/myriadfs.h +++ b/src/myriadfs.h | |||
@@ -1,13 +1,20 @@ | |||
1 | #ifndef MYRIAD_FS_H | 1 | #ifndef MYRIAD_FS_H |
2 | #define MYRIAD_FS_H | 2 | #define MYRIAD_FS_H |
3 | 3 | ||
4 | #include "bu/myriad.h" | ||
5 | |||
4 | namespace Bu | 6 | namespace Bu |
5 | { | 7 | { |
8 | class Stream; | ||
9 | |||
10 | subExceptionDecl( MyriadFsException ); | ||
11 | |||
6 | /** | 12 | /** |
7 | * A POSIX compliant, node based filesystem built on top of Myriad. | 13 | * A POSIX compliant, node based filesystem built on top of Myriad. |
8 | * | 14 | * |
15 | * A header is placed into stream 1. | ||
9 | * Header format: | 16 | * Header format: |
10 | * int32_t iMagicHeader | 17 | * int32_t iMagicHeader (A7188B39) |
11 | * int8_t iVersion (1) | 18 | * int8_t iVersion (1) |
12 | * int32_t iNodeSize | 19 | * int32_t iNodeSize |
13 | * int32_t iNumNodes | 20 | * int32_t iNumNodes |
@@ -17,6 +24,11 @@ namespace Bu | |||
17 | * int32_t iInode | 24 | * int32_t iInode |
18 | * int32_t iPosition | 25 | * int32_t iPosition |
19 | * | 26 | * |
27 | * The node headers or inode structures have a base size of 22 bytes. | ||
28 | * Everything else in the block is used for the name. I.e. if you have | ||
29 | * a blocksize of 512 bytes then you wind up with a max name size of | ||
30 | * 512-22=490 characters, or a blocksize of 256 gives you 234 chraacters | ||
31 | * as a max. The node headers are all stored in stream 2. | ||
20 | * Basic node header format: | 32 | * Basic node header format: |
21 | * int32_t iUser | 33 | * int32_t iUser |
22 | * int32_t iGroup | 34 | * int32_t iGroup |
@@ -30,8 +42,12 @@ namespace Bu | |||
30 | class MyriadFs | 42 | class MyriadFs |
31 | { | 43 | { |
32 | public: | 44 | public: |
33 | MyriadFs(); | 45 | MyriadFs( Bu::Stream &rStore, int iBlockSize=512 ); |
34 | virtual ~MyriadFs(); | 46 | virtual ~MyriadFs(); |
47 | |||
48 | private: | ||
49 | Bu::Stream &rStore; | ||
50 | Bu::Myriad mStore; | ||
35 | }; | 51 | }; |
36 | }; | 52 | }; |
37 | 53 | ||
diff --git a/src/tools/myriadfs.cpp b/src/tools/myriadfs.cpp new file mode 100644 index 0000000..66955a5 --- /dev/null +++ b/src/tools/myriadfs.cpp | |||
@@ -0,0 +1,38 @@ | |||
1 | #define FUSE_USE_VERSION 26 | ||
2 | |||
3 | #include <fuse.h> | ||
4 | |||
5 | #include <string.h> | ||
6 | |||
7 | extern "C" { | ||
8 | static int myriadfs_getattr( const char *sPath, struct stat *stbuf ) | ||
9 | { | ||
10 | |||
11 | } | ||
12 | |||
13 | static int myriadfs_readdir( const char *sPath, void *buf, | ||
14 | fuse_fill_dir_t filler, off_t offset, struct fuse_file_info *fi ) | ||
15 | { | ||
16 | } | ||
17 | |||
18 | static int myriadfs_open( const char *sPath, struct fuse_file_info *fi ) | ||
19 | { | ||
20 | } | ||
21 | |||
22 | static int myriadfs_read( const char *sPath, char *buf, size_t iSize, | ||
23 | off_t iOffset, struct fuse_file_info *fi ) | ||
24 | { | ||
25 | } | ||
26 | |||
27 | static struct fuse_operations myriadfs_oper; | ||
28 | |||
29 | int main( int argc, char *argv[] ) | ||
30 | { | ||
31 | memset( &myriadfs_oper, sizeof(myriadfs_oper), 0 ); | ||
32 | myriadfs_oper.getattr = myriadfs_getattr; | ||
33 | myriadfs_oper.readdir = myriadfs_readdir; | ||
34 | myriadfs_oper.open = myriadfs_open; | ||
35 | myriadfs_oper.read = myriadfs_read; | ||
36 | return fuse_main( argc, argv, &myriadfs_oper, NULL ); | ||
37 | } | ||
38 | } | ||