summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--default.bld16
-rw-r--r--src/file.cpp1
-rw-r--r--src/myriad.h2
-rw-r--r--src/myriadfs.cpp72
-rw-r--r--src/myriadfs.h20
-rw-r--r--src/tools/myriadfs.cpp38
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//
90target "src/tools/myriadfs.o"
91{
92 CXXFLAGS += "-D_FILE_OFFSET_BITS=64";
93}
94
95target "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
3Bu::MyriadFs::MyriadFs() 4#include <string.h>
5#include <unistd.h>
6
7namespace Bu { subExceptionDef( MyriadFsException ) }
8
9#define Myriad_Fs_MAGIC_CODE ((char *)"\xa7\x18\x8b\x39")
10
11Bu::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
7Bu::MyriadFs::~MyriadFs() 75Bu::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
4namespace Bu 6namespace 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
7extern "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}