diff options
| author | Mike Buland <eichlan@xagasoft.com> | 2011-02-20 07:19:44 +0000 |
|---|---|---|
| committer | Mike Buland <eichlan@xagasoft.com> | 2011-02-20 07:19:44 +0000 |
| commit | 9af80a223128dd465aabdd311fdf529e97b40e13 (patch) | |
| tree | 062288ceb5816a50aa95bf77715395b76b5a12ae /src/tools | |
| parent | 3bb19feba42174a08842e035d21edd424ce9ced1 (diff) | |
| download | libbu++-9af80a223128dd465aabdd311fdf529e97b40e13.tar.gz libbu++-9af80a223128dd465aabdd311fdf529e97b40e13.tar.bz2 libbu++-9af80a223128dd465aabdd311fdf529e97b40e13.tar.xz libbu++-9af80a223128dd465aabdd311fdf529e97b40e13.zip | |
Well, unlink, mkHardLink, setFileSize, and more are freshly implemented, as is
rename, but there seems to be a problem, rename uses mkHardLink, and if the
target exists, hey, it adds another one...not quite ideal...
Diffstat (limited to '')
| -rw-r--r-- | src/tools/myriadfs.cpp | 115 |
1 files changed, 107 insertions, 8 deletions
diff --git a/src/tools/myriadfs.cpp b/src/tools/myriadfs.cpp index 8db59d7..3e4599b 100644 --- a/src/tools/myriadfs.cpp +++ b/src/tools/myriadfs.cpp | |||
| @@ -24,9 +24,14 @@ typedef Bu::Hash<int64_t, Bu::MyriadStream> FileHash; | |||
| 24 | FileHash hOpenFiles; | 24 | FileHash hOpenFiles; |
| 25 | int64_t iNextFileId = 0; | 25 | int64_t iNextFileId = 0; |
| 26 | 26 | ||
| 27 | #define TRACE | ||
| 28 | |||
| 27 | extern "C" { | 29 | extern "C" { |
| 28 | static int myriadfs_getattr( const char *sPath, struct stat *stbuf ) | 30 | static int myriadfs_getattr( const char *sPath, struct stat *stbuf ) |
| 29 | { | 31 | { |
| 32 | #ifdef TRACE | ||
| 33 | printf("myriadfs_getattr(\"%s\", ... );\n", sPath ); | ||
| 34 | #endif | ||
| 30 | try | 35 | try |
| 31 | { | 36 | { |
| 32 | Bu::MyriadFs::Stat st; | 37 | Bu::MyriadFs::Stat st; |
| @@ -53,6 +58,9 @@ extern "C" { | |||
| 53 | static int myriadfs_readdir( const char *sPath, void *buf, | 58 | static int myriadfs_readdir( const char *sPath, void *buf, |
| 54 | fuse_fill_dir_t filler, off_t offset, struct fuse_file_info *fi ) | 59 | fuse_fill_dir_t filler, off_t offset, struct fuse_file_info *fi ) |
| 55 | { | 60 | { |
| 61 | #ifdef TRACE | ||
| 62 | printf("myriadfs_readdir(\"%s\", ... );\n", sPath ); | ||
| 63 | #endif | ||
| 56 | Bu::MyriadFs::Dir lDir = pFs->readDir( sPath ); | 64 | Bu::MyriadFs::Dir lDir = pFs->readDir( sPath ); |
| 57 | filler( buf, ".", NULL, 0 ); | 65 | filler( buf, ".", NULL, 0 ); |
| 58 | filler( buf, "..", NULL, 0 ); | 66 | filler( buf, "..", NULL, 0 ); |
| @@ -66,19 +74,25 @@ extern "C" { | |||
| 66 | 74 | ||
| 67 | static int myriadfs_mkdir( const char *sPath, mode_t uMode ) | 75 | static int myriadfs_mkdir( const char *sPath, mode_t uMode ) |
| 68 | { | 76 | { |
| 77 | #ifdef TRACE | ||
| 78 | printf("myriadfs_mkdir(\"%s\", 0%o );\n", sPath, uMode ); | ||
| 79 | #endif | ||
| 69 | pFs->mkDir( sPath, uMode ); | 80 | pFs->mkDir( sPath, uMode ); |
| 70 | return 0; | 81 | return 0; |
| 71 | } | 82 | } |
| 72 | 83 | ||
| 73 | static int myriadfs_open( const char *sPath, struct fuse_file_info *fi ) | 84 | static int myriadfs_open( const char *sPath, struct fuse_file_info *fi ) |
| 74 | { | 85 | { |
| 86 | #ifdef TRACE | ||
| 87 | printf("myriadfs_open(\"%s\", ... );\n", sPath ); | ||
| 88 | #endif | ||
| 75 | try | 89 | try |
| 76 | { | 90 | { |
| 77 | Bu::MyriadStream ms = pFs->open( sPath, 0 ); | 91 | Bu::MyriadStream ms = pFs->open( sPath, 0 ); |
| 78 | fi->fh = iNextFileId; | 92 | fi->fh = iNextFileId; |
| 79 | hOpenFiles.insert( iNextFileId++, ms ); | 93 | hOpenFiles.insert( iNextFileId++, ms ); |
| 80 | printf("File '%s' opened, %d files open now.\n", | 94 | // printf("File '%s' opened, %d files open now.\n", |
| 81 | sPath, hOpenFiles.getSize() ); | 95 | // sPath, hOpenFiles.getSize() ); |
| 82 | return 0; | 96 | return 0; |
| 83 | } | 97 | } |
| 84 | catch(...) | 98 | catch(...) |
| @@ -90,6 +104,10 @@ extern "C" { | |||
| 90 | static int myriadfs_read( const char *sPath, char *buf, size_t iSize, | 104 | static int myriadfs_read( const char *sPath, char *buf, size_t iSize, |
| 91 | off_t iOffset, struct fuse_file_info *fi ) | 105 | off_t iOffset, struct fuse_file_info *fi ) |
| 92 | { | 106 | { |
| 107 | #ifdef TRACE | ||
| 108 | printf("myriadfs_read(\"%s\", ..., %d, %d, ... );\n", sPath, iSize, | ||
| 109 | iOffset ); | ||
| 110 | #endif | ||
| 93 | Bu::MyriadStream &ms = hOpenFiles.get( fi->fh ); | 111 | Bu::MyriadStream &ms = hOpenFiles.get( fi->fh ); |
| 94 | ms.setPos( iOffset ); | 112 | ms.setPos( iOffset ); |
| 95 | return ms.read( buf, iSize ); | 113 | return ms.read( buf, iSize ); |
| @@ -98,6 +116,10 @@ extern "C" { | |||
| 98 | static int myriadfs_write( const char *sPath, const char *buf, size_t iSize, | 116 | static int myriadfs_write( const char *sPath, const char *buf, size_t iSize, |
| 99 | off_t iOffset, struct fuse_file_info *fi ) | 117 | off_t iOffset, struct fuse_file_info *fi ) |
| 100 | { | 118 | { |
| 119 | #ifdef TRACE | ||
| 120 | printf("myriadfs_write(\"%s\", ..., %d, %d, ... );\n", sPath, iSize, | ||
| 121 | iOffset ); | ||
| 122 | #endif | ||
| 101 | Bu::MyriadStream &ms = hOpenFiles.get( fi->fh ); | 123 | Bu::MyriadStream &ms = hOpenFiles.get( fi->fh ); |
| 102 | ms.setPos( iOffset ); | 124 | ms.setPos( iOffset ); |
| 103 | return ms.write( buf, iSize ); | 125 | return ms.write( buf, iSize ); |
| @@ -106,13 +128,16 @@ extern "C" { | |||
| 106 | static int myriadfs_create( const char *sPath, mode_t uPerms, | 128 | static int myriadfs_create( const char *sPath, mode_t uPerms, |
| 107 | struct fuse_file_info *fi ) | 129 | struct fuse_file_info *fi ) |
| 108 | { | 130 | { |
| 131 | #ifdef TRACE | ||
| 132 | printf("myriadfs_create(\"%s\", 0%o, ... );\n", sPath, uPerms ); | ||
| 133 | #endif | ||
| 109 | try | 134 | try |
| 110 | { | 135 | { |
| 111 | Bu::MyriadStream ms = pFs->open( sPath, 0, uPerms ); | 136 | Bu::MyriadStream ms = pFs->open( sPath, 0, uPerms ); |
| 112 | fi->fh = iNextFileId; | 137 | fi->fh = iNextFileId; |
| 113 | hOpenFiles.insert( iNextFileId++, ms ); | 138 | hOpenFiles.insert( iNextFileId++, ms ); |
| 114 | printf("File '%s' created, %d files open now.\n", | 139 | // printf("File '%s' created, %d files open now.\n", |
| 115 | sPath, hOpenFiles.getSize() ); | 140 | // sPath, hOpenFiles.getSize() ); |
| 116 | return 0; | 141 | return 0; |
| 117 | } | 142 | } |
| 118 | catch(...) | 143 | catch(...) |
| @@ -123,6 +148,9 @@ extern "C" { | |||
| 123 | 148 | ||
| 124 | static int myriadfs_mknod( const char *sPath, mode_t uPerms, dev_t Dev ) | 149 | static int myriadfs_mknod( const char *sPath, mode_t uPerms, dev_t Dev ) |
| 125 | { | 150 | { |
| 151 | #ifdef TRACE | ||
| 152 | printf("myriadfs_mknod(\"%s\", 0%o, %x );\n", sPath, uPerms, Dev ); | ||
| 153 | #endif | ||
| 126 | try | 154 | try |
| 127 | { | 155 | { |
| 128 | pFs->create( sPath, uPerms, Bu::MyriadFs::sysToDev( Dev ) ); | 156 | pFs->create( sPath, uPerms, Bu::MyriadFs::sysToDev( Dev ) ); |
| @@ -136,9 +164,12 @@ extern "C" { | |||
| 136 | 164 | ||
| 137 | static int myriadfs_release( const char *sPath, struct fuse_file_info *fi ) | 165 | static int myriadfs_release( const char *sPath, struct fuse_file_info *fi ) |
| 138 | { | 166 | { |
| 167 | #ifdef TRACE | ||
| 168 | printf("myriadfs_release(\"%s\", ... );\n", sPath ); | ||
| 169 | #endif | ||
| 139 | hOpenFiles.erase( fi->fh ); | 170 | hOpenFiles.erase( fi->fh ); |
| 140 | printf("File '%s' released, %d files open now.\n", | 171 | // printf("File '%s' released, %d files open now.\n", |
| 141 | sPath, hOpenFiles.getSize() ); | 172 | // sPath, hOpenFiles.getSize() ); |
| 142 | 173 | ||
| 143 | return 0; | 174 | return 0; |
| 144 | } | 175 | } |
| @@ -146,6 +177,9 @@ extern "C" { | |||
| 146 | static int myriadfs_utimens( const char *sPath, | 177 | static int myriadfs_utimens( const char *sPath, |
| 147 | const struct timespec tv[2] ) | 178 | const struct timespec tv[2] ) |
| 148 | { | 179 | { |
| 180 | #ifdef TRACE | ||
| 181 | printf("myriadfs_utimens(\"%s\", ... );\n", sPath ); | ||
| 182 | #endif | ||
| 149 | try | 183 | try |
| 150 | { | 184 | { |
| 151 | pFs->setTimes( sPath, tv[0].tv_sec, tv[1].tv_sec ); | 185 | pFs->setTimes( sPath, tv[0].tv_sec, tv[1].tv_sec ); |
| @@ -159,6 +193,9 @@ extern "C" { | |||
| 159 | 193 | ||
| 160 | static int myriadfs_unlink( const char *sPath ) | 194 | static int myriadfs_unlink( const char *sPath ) |
| 161 | { | 195 | { |
| 196 | #ifdef TRACE | ||
| 197 | printf("myriadfs_unlink(\"%s\");\n", sPath ); | ||
| 198 | #endif | ||
| 162 | try | 199 | try |
| 163 | { | 200 | { |
| 164 | pFs->unlink( sPath ); | 201 | pFs->unlink( sPath ); |
| @@ -173,10 +210,12 @@ extern "C" { | |||
| 173 | 210 | ||
| 174 | static int myriadfs_symlink( const char *sTarget, const char *sPath ) | 211 | static int myriadfs_symlink( const char *sTarget, const char *sPath ) |
| 175 | { | 212 | { |
| 213 | #ifdef TRACE | ||
| 214 | printf("myriadfs_symlink(\"%s\", \"%s\");\n", sTarget, sPath ); | ||
| 215 | #endif | ||
| 176 | try | 216 | try |
| 177 | { | 217 | { |
| 178 | printf("Path = '%s', Target = '%s'\n", sPath, sTarget ); | 218 | pFs->mkSymLink( sTarget, sPath ); |
| 179 | pFs->mkSymLink( sPath, sTarget ); | ||
| 180 | } | 219 | } |
| 181 | catch( Bu::MyriadFsException &e ) | 220 | catch( Bu::MyriadFsException &e ) |
| 182 | { | 221 | { |
| @@ -188,6 +227,9 @@ extern "C" { | |||
| 188 | 227 | ||
| 189 | static int myriadfs_readlink( const char *sPath, char *sOut, size_t s ) | 228 | static int myriadfs_readlink( const char *sPath, char *sOut, size_t s ) |
| 190 | { | 229 | { |
| 230 | #ifdef TRACE | ||
| 231 | printf("myriadfs_readlink(\"%s\", ... );\n", sPath ); | ||
| 232 | #endif | ||
| 191 | try | 233 | try |
| 192 | { | 234 | { |
| 193 | Bu::String sTrg = pFs->readSymLink( sPath ); | 235 | Bu::String sTrg = pFs->readSymLink( sPath ); |
| @@ -203,6 +245,60 @@ extern "C" { | |||
| 203 | return 0; | 245 | return 0; |
| 204 | } | 246 | } |
| 205 | 247 | ||
| 248 | static int myriadfs_truncate( const char *sPath, off_t iSize ) | ||
| 249 | { | ||
| 250 | #ifdef TRACE | ||
| 251 | printf("myriadfs_truncate(\"%s\", %d );\n", sPath, iSize ); | ||
| 252 | #endif | ||
| 253 | |||
| 254 | try | ||
| 255 | { | ||
| 256 | pFs->setFileSize( sPath, iSize ); | ||
| 257 | } | ||
| 258 | catch( Bu::MyriadFsException &e ) | ||
| 259 | { | ||
| 260 | printf("MyriadFsException: %s\n", e.what() ); | ||
| 261 | return -ENOENT; | ||
| 262 | } | ||
| 263 | return 0; | ||
| 264 | } | ||
| 265 | |||
| 266 | static int myriadfs_link( const char *sTarget, const char *sPath ) | ||
| 267 | { | ||
| 268 | #ifdef TRACE | ||
| 269 | printf("myriadfs_link(\"%s\", \"%s\");\n", sTarget, sPath ); | ||
| 270 | #endif | ||
| 271 | |||
| 272 | try | ||
| 273 | { | ||
| 274 | pFs->mkHardLink( sTarget, sPath ); | ||
| 275 | } | ||
| 276 | catch( Bu::MyriadFsException &e ) | ||
| 277 | { | ||
| 278 | printf("MyriadFsException: %s\n", e.what() ); | ||
| 279 | return -EACCES; | ||
| 280 | } | ||
| 281 | return 0; | ||
| 282 | } | ||
| 283 | |||
| 284 | static int myriadfs_rename( const char *sFrom, const char *sTo ) | ||
| 285 | { | ||
| 286 | #ifdef TRACE | ||
| 287 | printf("myriadfs_rename(\"%s\", \"%s\");\n", sFrom, sTo ); | ||
| 288 | #endif | ||
| 289 | |||
| 290 | try | ||
| 291 | { | ||
| 292 | pFs->rename( sFrom, sTo ); | ||
| 293 | } | ||
| 294 | catch( Bu::MyriadFsException &e ) | ||
| 295 | { | ||
| 296 | printf("MyriadFsException: %s\n", e.what() ); | ||
| 297 | return -EACCES; | ||
| 298 | } | ||
| 299 | return 0; | ||
| 300 | } | ||
| 301 | |||
| 206 | static struct fuse_operations myriadfs_oper; | 302 | static struct fuse_operations myriadfs_oper; |
| 207 | 303 | ||
| 208 | int main( int argc, char *argv[] ) | 304 | int main( int argc, char *argv[] ) |
| @@ -224,6 +320,9 @@ extern "C" { | |||
| 224 | myriadfs_oper.rmdir = myriadfs_unlink; | 320 | myriadfs_oper.rmdir = myriadfs_unlink; |
| 225 | myriadfs_oper.symlink = myriadfs_symlink; | 321 | myriadfs_oper.symlink = myriadfs_symlink; |
| 226 | myriadfs_oper.readlink = myriadfs_readlink; | 322 | myriadfs_oper.readlink = myriadfs_readlink; |
| 323 | myriadfs_oper.truncate = myriadfs_truncate; | ||
| 324 | myriadfs_oper.link = myriadfs_link; | ||
| 325 | myriadfs_oper.rename = myriadfs_rename; | ||
| 227 | printf("Starting fuse_main.\n"); | 326 | printf("Starting fuse_main.\n"); |
| 228 | int iRet = fuse_main( argc, argv, &myriadfs_oper, NULL ); | 327 | int iRet = fuse_main( argc, argv, &myriadfs_oper, NULL ); |
| 229 | printf("Done with fuse_main.\n"); | 328 | printf("Done with fuse_main.\n"); |
