rfuse-ng 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG.txt +18 -1
- data/README.ng +28 -0
- data/Rakefile +1 -1
- data/THANKS +2 -0
- data/ext/helper.c +43 -18
- data/ext/helper.h +3 -0
- data/ext/intern_rfuse.c +1 -0
- data/ext/rfuse.c +331 -35
- data/sample/test-ruby.rb +78 -28
- metadata +2 -2
    
        data/CHANGELOG.txt
    CHANGED
    
    | @@ -1,3 +1,20 @@ | |
| 1 | 
            +
            2010-06-20
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            Only poll() and ioctl() are missing. Fixed compilation error
         | 
| 4 | 
            +
            on 64 bit systems and random segfault because of uninicialized
         | 
| 5 | 
            +
            memory
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            2010-05-03: 0.3.0
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            Fixed read() and write() bugs, updated example. Implemented
         | 
| 10 | 
            +
            truncate() in the example.
         | 
| 11 | 
            +
             | 
| 12 | 
            +
            Fuse operation fields are filled only, when the class respond_to the
         | 
| 13 | 
            +
            particular method.
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            The example filesystem was tested with several hundred big files and
         | 
| 16 | 
            +
            all came back intact.
         | 
| 17 | 
            +
             | 
| 1 18 | 
             
            2010-05-01: 0.2.0
         | 
| 2 19 |  | 
| 3 20 | 
             
            Switched to Fuse API 26 from 22. Fixed incompatibilities.
         | 
| @@ -7,4 +24,4 @@ functions. | |
| 7 24 |  | 
| 8 25 | 
             
            2010-05-01: 0.1
         | 
| 9 26 |  | 
| 10 | 
            -
             | 
| 27 | 
            +
            Forked from rfuse, fixed compile warnings, gemified.
         | 
    
        data/README.ng
    CHANGED
    
    | @@ -17,6 +17,34 @@ DEPENDENCIES | |
| 17 17 | 
             
            ruby 1.8
         | 
| 18 18 | 
             
            fuse 2.8
         | 
| 19 19 |  | 
| 20 | 
            +
            INSTALLING
         | 
| 21 | 
            +
            ==========
         | 
| 22 | 
            +
             | 
| 23 | 
            +
            To install it with rubygems:
         | 
| 24 | 
            +
             | 
| 25 | 
            +
            $ sudo gem install rfuse-ng
         | 
| 26 | 
            +
             | 
| 27 | 
            +
            To build from the source, install libfuse-dev, and:
         | 
| 28 | 
            +
             | 
| 29 | 
            +
            $ ruby ext/extconf.rb
         | 
| 30 | 
            +
            $ make
         | 
| 31 | 
            +
             | 
| 32 | 
            +
            ...and there should be a rfuse_ng.so in the project root directory.
         | 
| 33 | 
            +
             | 
| 34 | 
            +
            USING
         | 
| 35 | 
            +
            =====
         | 
| 36 | 
            +
             | 
| 37 | 
            +
            Sorry, no docs here, see sample/test-ruby.rb
         | 
| 38 | 
            +
             | 
| 39 | 
            +
            To run the example:
         | 
| 40 | 
            +
             | 
| 41 | 
            +
            $ sudo mkdir /tmp/fuse
         | 
| 42 | 
            +
            $ sudo sample/test-ruby.rb
         | 
| 43 | 
            +
             | 
| 44 | 
            +
            ..and there should be a filesystem mounted at /tmp/fuse.
         | 
| 45 | 
            +
             | 
| 46 | 
            +
            Umount should stop the example example filesystem program.
         | 
| 47 | 
            +
             | 
| 20 48 | 
             
            AUTHOR
         | 
| 21 49 | 
             
            ======
         | 
| 22 50 |  | 
    
        data/Rakefile
    CHANGED
    
    | @@ -5,7 +5,7 @@ begin | |
| 5 5 | 
             
              require 'jeweler'
         | 
| 6 6 | 
             
              Jeweler::Tasks.new do |gem|
         | 
| 7 7 | 
             
                gem.name = "rfuse-ng"
         | 
| 8 | 
            -
                gem.version = "0. | 
| 8 | 
            +
                gem.version = "0.4.0"
         | 
| 9 9 | 
             
                gem.summary = 'Ruby language binding for FUSE'
         | 
| 10 10 | 
             
                gem.description = 'Ruby language binding for FUSE. It was forked from rfuse'
         | 
| 11 11 | 
             
                gem.rubyforge_project = 'rfuse-ng'
         | 
    
        data/THANKS
    CHANGED
    
    
    
        data/ext/helper.c
    CHANGED
    
    | @@ -1,23 +1,48 @@ | |
| 1 1 | 
             
            #include "helper.h"
         | 
| 2 2 |  | 
| 3 | 
            -
            void rstat2stat(VALUE rstat, struct stat *statbuf) | 
| 4 | 
            -
             | 
| 5 | 
            -
             | 
| 6 | 
            -
             | 
| 7 | 
            -
             | 
| 8 | 
            -
             | 
| 9 | 
            -
             | 
| 10 | 
            -
             | 
| 11 | 
            -
             | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 15 | 
            -
             | 
| 16 | 
            -
                 | 
| 17 | 
            -
             | 
| 18 | 
            -
                 | 
| 19 | 
            -
             | 
| 20 | 
            -
             | 
| 3 | 
            +
            void rstat2stat(VALUE rstat, struct stat *statbuf)
         | 
| 4 | 
            +
            {
         | 
| 5 | 
            +
              statbuf->st_dev     = FIX2ULONG(rb_funcall(rstat,rb_intern("dev"),0));
         | 
| 6 | 
            +
              statbuf->st_ino     = FIX2ULONG(rb_funcall(rstat,rb_intern("ino"),0));
         | 
| 7 | 
            +
              statbuf->st_mode    = FIX2UINT(rb_funcall(rstat,rb_intern("mode"),0));
         | 
| 8 | 
            +
              statbuf->st_nlink   = FIX2UINT(rb_funcall(rstat,rb_intern("nlink"),0));
         | 
| 9 | 
            +
              statbuf->st_uid     = FIX2UINT(rb_funcall(rstat,rb_intern("uid"),0));
         | 
| 10 | 
            +
              statbuf->st_gid     = FIX2UINT(rb_funcall(rstat,rb_intern("gid"),0));
         | 
| 11 | 
            +
              statbuf->st_rdev    = FIX2ULONG(rb_funcall(rstat,rb_intern("rdev"),0));
         | 
| 12 | 
            +
              statbuf->st_size    = FIX2ULONG(rb_funcall(rstat,rb_intern("size"),0));
         | 
| 13 | 
            +
              statbuf->st_blksize = NUM2ULONG(rb_funcall(rstat,rb_intern("blksize"),0));
         | 
| 14 | 
            +
              statbuf->st_blocks  = NUM2ULONG(rb_funcall(rstat,rb_intern("blocks"),0));
         | 
| 15 | 
            +
              statbuf->st_atime   =
         | 
| 16 | 
            +
                NUM2ULONG(rb_funcall(rb_funcall(rstat,rb_intern("atime"),0),rb_intern("to_i"),0));
         | 
| 17 | 
            +
              statbuf->st_mtime   =
         | 
| 18 | 
            +
                NUM2ULONG(rb_funcall(rb_funcall(rstat,rb_intern("mtime"),0),rb_intern("to_i"),0));
         | 
| 19 | 
            +
              statbuf->st_ctime   =
         | 
| 20 | 
            +
                NUM2ULONG(rb_funcall(rb_funcall(rstat,rb_intern("ctime"),0),rb_intern("to_i"),0));
         | 
| 21 | 
            +
            }
         | 
| 22 | 
            +
             | 
| 23 | 
            +
            void rstatvfs2statvfs(VALUE rstatvfs,struct statvfs *statvfsbuf) {
         | 
| 24 | 
            +
              statvfsbuf->f_bsize   = FIX2ULONG(rb_funcall(rstatvfs,rb_intern("f_bsize"),0));
         | 
| 25 | 
            +
              statvfsbuf->f_frsize  = FIX2ULONG(rb_funcall(rstatvfs,rb_intern("f_frsize"),0));
         | 
| 26 | 
            +
              statvfsbuf->f_blocks  = FIX2ULONG(rb_funcall(rstatvfs,rb_intern("f_blocks"),0));
         | 
| 27 | 
            +
              statvfsbuf->f_bfree   = FIX2ULONG(rb_funcall(rstatvfs,rb_intern("f_bfree"),0));
         | 
| 28 | 
            +
              statvfsbuf->f_bavail  = FIX2ULONG(rb_funcall(rstatvfs,rb_intern("f_bavail"),0));
         | 
| 29 | 
            +
              statvfsbuf->f_files   = FIX2ULONG(rb_funcall(rstatvfs,rb_intern("f_files"),0));
         | 
| 30 | 
            +
              statvfsbuf->f_ffree   = FIX2ULONG(rb_funcall(rstatvfs,rb_intern("f_ffree"),0));
         | 
| 31 | 
            +
              statvfsbuf->f_favail  = FIX2ULONG(rb_funcall(rstatvfs,rb_intern("f_favail"),0));
         | 
| 32 | 
            +
              statvfsbuf->f_fsid    = FIX2ULONG(rb_funcall(rstatvfs,rb_intern("f_fsid"),0));
         | 
| 33 | 
            +
              statvfsbuf->f_flag    = FIX2ULONG(rb_funcall(rstatvfs,rb_intern("f_flag"),0));
         | 
| 34 | 
            +
              statvfsbuf->f_namemax = FIX2ULONG(rb_funcall(rstatvfs,rb_intern("f_namemax"),0));
         | 
| 35 | 
            +
            }
         | 
| 36 | 
            +
             | 
| 37 | 
            +
            void rfuseconninfo2fuseconninfo(VALUE rfuseconninfo,struct fuse_conn_info *fuseconninfo) {
         | 
| 38 | 
            +
              fuseconninfo->proto_major   = FIX2UINT(rb_funcall(rfuseconninfo,rb_intern("proto_major"),0));
         | 
| 39 | 
            +
              fuseconninfo->proto_minor   = FIX2UINT(rb_funcall(rfuseconninfo,rb_intern("proto_minor"),0));
         | 
| 40 | 
            +
              fuseconninfo->async_read    = FIX2UINT(rb_funcall(rfuseconninfo,rb_intern("async_read"),0));
         | 
| 41 | 
            +
              fuseconninfo->max_write     = FIX2UINT(rb_funcall(rfuseconninfo,rb_intern("max_write"),0));
         | 
| 42 | 
            +
              fuseconninfo->max_readahead = FIX2UINT(rb_funcall(rfuseconninfo,rb_intern("max_readahead"),0));
         | 
| 43 | 
            +
              fuseconninfo->capable       = FIX2UINT(rb_funcall(rfuseconninfo,rb_intern("capable"),0));
         | 
| 44 | 
            +
              fuseconninfo->want          = FIX2UINT(rb_funcall(rfuseconninfo,rb_intern("want"),0));
         | 
| 45 | 
            +
            }
         | 
| 21 46 |  | 
| 22 47 | 
             
            struct fuse_args * rarray2fuseargs(VALUE rarray){
         | 
| 23 48 |  | 
    
        data/ext/helper.h
    CHANGED
    
    | @@ -1,4 +1,5 @@ | |
| 1 1 | 
             
            #include <sys/stat.h>
         | 
| 2 | 
            +
            #include <sys/statvfs.h>
         | 
| 2 3 | 
             
            #include <ruby.h>
         | 
| 3 4 | 
             
            #include <fuse.h>
         | 
| 4 5 |  | 
| @@ -6,6 +7,8 @@ | |
| 6 7 | 
             
            #define _RHUSE_HELPER_H
         | 
| 7 8 |  | 
| 8 9 | 
             
            void rstat2stat(VALUE rstat,struct stat *statbuf);
         | 
| 10 | 
            +
            void rstatvfs2statvfs(VALUE rstatvfs,struct statvfs *statvfsbuf);
         | 
| 11 | 
            +
            void rfuseconninfo2fuseconninfo(VALUE rfuseconninfo,struct fuse_conn_info *fuseconninfo);
         | 
| 9 12 | 
             
            struct fuse_args * rarray2fuseargs(VALUE rarray);
         | 
| 10 13 |  | 
| 11 14 | 
             
            #endif
         | 
    
        data/ext/intern_rfuse.c
    CHANGED
    
    
    
        data/ext/rfuse.c
    CHANGED
    
    | @@ -201,7 +201,6 @@ static VALUE unsafe_mknod(VALUE *args) | |
| 201 201 | 
             
              return rb_funcall(fuse_object,rb_intern("mknod"),4,wrap_context(ctx),path,mode,dev);
         | 
| 202 202 | 
             
            }
         | 
| 203 203 |  | 
| 204 | 
            -
            //calls getattr with path and expects something like FuseStat back
         | 
| 205 204 | 
             
            static int rf_mknod(const char *path, mode_t mode,dev_t dev)
         | 
| 206 205 | 
             
            {
         | 
| 207 206 | 
             
              VALUE args[3];
         | 
| @@ -345,10 +344,37 @@ static int rf_release(const char *path, struct fuse_file_info *ffi) | |
| 345 344 | 
             
            }
         | 
| 346 345 |  | 
| 347 346 | 
             
            //----------------------FSYNC
         | 
| 347 | 
            +
            static VALUE unsafe_fsync(VALUE *args) {
         | 
| 348 | 
            +
              VALUE path     = args[0];
         | 
| 349 | 
            +
              VALUE datasync = args[1];
         | 
| 350 | 
            +
              VALUE ffi      = args[2];
         | 
| 351 | 
            +
             | 
| 352 | 
            +
              struct fuse_context *ctx=fuse_get_context();
         | 
| 353 | 
            +
             | 
| 354 | 
            +
              return rb_funcall(fuse_object,rb_intern("fsync"), 4, wrap_context(ctx),
         | 
| 355 | 
            +
                path, datasync, ffi);
         | 
| 356 | 
            +
            }
         | 
| 357 | 
            +
             | 
| 348 358 | 
             
            static int rf_fsync(const char *path, int datasync, struct fuse_file_info *ffi)
         | 
| 349 359 | 
             
            {
         | 
| 350 | 
            -
               | 
| 351 | 
            -
               | 
| 360 | 
            +
              VALUE args[3];
         | 
| 361 | 
            +
              VALUE res;
         | 
| 362 | 
            +
              int error = 0;
         | 
| 363 | 
            +
             | 
| 364 | 
            +
              args[0] = rb_str_new2(path);
         | 
| 365 | 
            +
              args[1] = INT2NUM(datasync);
         | 
| 366 | 
            +
              args[2] = wrap_file_info(ffi);
         | 
| 367 | 
            +
             | 
| 368 | 
            +
              res = rb_protect((VALUE (*)())unsafe_fsync,(VALUE) args,&error);
         | 
| 369 | 
            +
             | 
| 370 | 
            +
              if (error)
         | 
| 371 | 
            +
              {
         | 
| 372 | 
            +
                return -(return_error(ENOENT));
         | 
| 373 | 
            +
              }
         | 
| 374 | 
            +
              else
         | 
| 375 | 
            +
              {
         | 
| 376 | 
            +
                return 0;
         | 
| 377 | 
            +
              }
         | 
| 352 378 | 
             
            }
         | 
| 353 379 |  | 
| 354 380 | 
             
            //----------------------FLUSH
         | 
| @@ -751,10 +777,35 @@ static int rf_write(const char *path,const char *buf,size_t size, | |
| 751 777 | 
             
            }
         | 
| 752 778 |  | 
| 753 779 | 
             
            //----------------------STATFS
         | 
| 780 | 
            +
            static VALUE unsafe_statfs(VALUE *args)
         | 
| 781 | 
            +
            {
         | 
| 782 | 
            +
              VALUE path = args[0];
         | 
| 783 | 
            +
             | 
| 784 | 
            +
              struct fuse_context *ctx = fuse_get_context();
         | 
| 785 | 
            +
             | 
| 786 | 
            +
              return rb_funcall(fuse_object,rb_intern("statfs"),2,
         | 
| 787 | 
            +
                    wrap_context(ctx),path);
         | 
| 788 | 
            +
            }
         | 
| 789 | 
            +
             | 
| 754 790 | 
             
            static int rf_statfs(const char * path, struct statvfs * vfsinfo)
         | 
| 755 791 | 
             
            {
         | 
| 756 | 
            -
               | 
| 757 | 
            -
               | 
| 792 | 
            +
              VALUE args[1];
         | 
| 793 | 
            +
              VALUE res;
         | 
| 794 | 
            +
              int error = 0;
         | 
| 795 | 
            +
             | 
| 796 | 
            +
              args[0] = rb_str_new2(path);
         | 
| 797 | 
            +
             | 
| 798 | 
            +
              res = rb_protect((VALUE (*)())unsafe_statfs,(VALUE) args,&error);
         | 
| 799 | 
            +
             | 
| 800 | 
            +
              if (error || (res == Qnil))
         | 
| 801 | 
            +
              {
         | 
| 802 | 
            +
                return -(return_error(ENOENT));
         | 
| 803 | 
            +
              }
         | 
| 804 | 
            +
              else
         | 
| 805 | 
            +
              {
         | 
| 806 | 
            +
                rstatvfs2statvfs(res,vfsinfo);
         | 
| 807 | 
            +
                return 0;
         | 
| 808 | 
            +
              }
         | 
| 758 809 | 
             
            }
         | 
| 759 810 |  | 
| 760 811 | 
             
            //----------------------SETXATTR
         | 
| @@ -784,7 +835,7 @@ static int rf_setxattr(const char *path,const char *name, | |
| 784 835 | 
             
              args[0]=rb_str_new2(path);
         | 
| 785 836 | 
             
              args[1]=rb_str_new2(name);
         | 
| 786 837 | 
             
              args[2]=rb_str_new(value,size);
         | 
| 787 | 
            -
              args[3]=INT2NUM(size); | 
| 838 | 
            +
              args[3]=INT2NUM(size);
         | 
| 788 839 | 
             
              args[4]=INT2NUM(flags);
         | 
| 789 840 |  | 
| 790 841 | 
             
              res=rb_protect((VALUE (*)())unsafe_setxattr,(VALUE) args,&error);
         | 
| @@ -882,14 +933,14 @@ static int rf_listxattr(const char *path,char *buf, | |
| 882 933 | 
             
                  } else {
         | 
| 883 934 | 
             
                    return -ERANGE;
         | 
| 884 935 | 
             
                  }
         | 
| 885 | 
            -
                  printf("destination: %s,% | 
| 886 | 
            -
                  printf("source:      %s,% | 
| 936 | 
            +
                  printf("destination: %s,%zd\n",buf,size);
         | 
| 937 | 
            +
                  printf("source:      %s,%zd\n",rbuf,length);
         | 
| 887 938 | 
             
                  return length;
         | 
| 888 939 | 
             
                  //TODO optimize,check lenght
         | 
| 889 940 | 
             
                }
         | 
| 890 941 | 
             
                else
         | 
| 891 942 | 
             
                {
         | 
| 892 | 
            -
                  printf ("not copied: %s, % | 
| 943 | 
            +
                  printf ("not copied: %s, %zd\n",buf,length);
         | 
| 893 944 | 
             
                  return length;
         | 
| 894 945 | 
             
                }
         | 
| 895 946 | 
             
              }
         | 
| @@ -999,7 +1050,7 @@ static VALUE unsafe_fsyncdir(VALUE *args) | |
| 999 1050 |  | 
| 1000 1051 | 
             
              struct fuse_context *ctx=fuse_get_context();
         | 
| 1001 1052 |  | 
| 1002 | 
            -
              return rb_funcall(fuse_object,rb_intern("fsyncdir"), | 
| 1053 | 
            +
              return rb_funcall(fuse_object,rb_intern("fsyncdir"),4,wrap_context(ctx),path,
         | 
| 1003 1054 | 
             
                    meta,ffi);
         | 
| 1004 1055 | 
             
            }
         | 
| 1005 1056 |  | 
| @@ -1024,62 +1075,278 @@ static int rf_fsyncdir(const char *path,int meta,struct fuse_file_info *ffi) | |
| 1024 1075 | 
             
            }
         | 
| 1025 1076 |  | 
| 1026 1077 | 
             
            //----------------------INIT
         | 
| 1078 | 
            +
            static VALUE unsafe_init(VALUE* args)
         | 
| 1079 | 
            +
            {
         | 
| 1080 | 
            +
              VALUE rfuseconninfo = args[0];
         | 
| 1081 | 
            +
             | 
| 1082 | 
            +
              struct fuse_context *ctx = fuse_get_context();
         | 
| 1083 | 
            +
             | 
| 1084 | 
            +
              return rb_funcall(fuse_object,rb_intern("init"),2,wrap_context(ctx),
         | 
| 1085 | 
            +
                rfuseconninfo);
         | 
| 1086 | 
            +
            }
         | 
| 1027 1087 |  | 
| 1028 1088 | 
             
            static void *rf_init(struct fuse_conn_info *conn)
         | 
| 1029 1089 | 
             
            {
         | 
| 1030 | 
            -
               | 
| 1031 | 
            -
               | 
| 1090 | 
            +
              VALUE args[1];
         | 
| 1091 | 
            +
              VALUE res;
         | 
| 1092 | 
            +
              int error = 0;
         | 
| 1093 | 
            +
             | 
| 1094 | 
            +
              //Create a struct for the conn_info
         | 
| 1095 | 
            +
              VALUE s  = rb_const_get(rb_cObject,rb_intern("Struct"));
         | 
| 1096 | 
            +
              VALUE fci = rb_funcall(s,rb_intern("new"),7,
         | 
| 1097 | 
            +
                ID2SYM(rb_intern("proto_major")),
         | 
| 1098 | 
            +
                ID2SYM(rb_intern("proto_minor")),
         | 
| 1099 | 
            +
                ID2SYM(rb_intern("async_read")),
         | 
| 1100 | 
            +
                ID2SYM(rb_intern("max_write")),
         | 
| 1101 | 
            +
                ID2SYM(rb_intern("max_readahead")),
         | 
| 1102 | 
            +
                ID2SYM(rb_intern("capable")),
         | 
| 1103 | 
            +
                ID2SYM(rb_intern("want"))
         | 
| 1104 | 
            +
              );
         | 
| 1105 | 
            +
             | 
| 1106 | 
            +
              VALUE fcio = rb_funcall(fci,rb_intern("new"),7,
         | 
| 1107 | 
            +
                UINT2NUM(conn->proto_major),
         | 
| 1108 | 
            +
                UINT2NUM(conn->proto_minor),
         | 
| 1109 | 
            +
                UINT2NUM(conn->async_read),
         | 
| 1110 | 
            +
                UINT2NUM(conn->max_write),
         | 
| 1111 | 
            +
                UINT2NUM(conn->max_readahead),
         | 
| 1112 | 
            +
                UINT2NUM(conn->capable),
         | 
| 1113 | 
            +
                UINT2NUM(conn->want)
         | 
| 1114 | 
            +
              );
         | 
| 1115 | 
            +
             | 
| 1116 | 
            +
              args[0] = fcio;
         | 
| 1117 | 
            +
             | 
| 1118 | 
            +
              res = rb_protect((VALUE (*)())unsafe_init,(VALUE) args,&error);
         | 
| 1119 | 
            +
             | 
| 1120 | 
            +
              if (error)
         | 
| 1121 | 
            +
              {
         | 
| 1122 | 
            +
                return NULL;
         | 
| 1123 | 
            +
              }
         | 
| 1124 | 
            +
              else
         | 
| 1125 | 
            +
              {
         | 
| 1126 | 
            +
                return (void *)res;
         | 
| 1127 | 
            +
              }
         | 
| 1032 1128 | 
             
            }
         | 
| 1033 1129 |  | 
| 1034 1130 | 
             
            //----------------------DESTROY
         | 
| 1035 1131 |  | 
| 1132 | 
            +
            static VALUE unsafe_destroy(VALUE* args)
         | 
| 1133 | 
            +
            {
         | 
| 1134 | 
            +
              VALUE user_data = args[0];
         | 
| 1135 | 
            +
             | 
| 1136 | 
            +
              struct fuse_context *ctx = fuse_get_context();
         | 
| 1137 | 
            +
             | 
| 1138 | 
            +
              return rb_funcall(fuse_object,rb_intern("destroy"),2,wrap_context(ctx),
         | 
| 1139 | 
            +
                user_data);
         | 
| 1140 | 
            +
            }
         | 
| 1141 | 
            +
             | 
| 1036 1142 | 
             
            static void rf_destroy(void *user_data)
         | 
| 1037 1143 | 
             
            {
         | 
| 1038 | 
            -
               | 
| 1144 | 
            +
              VALUE args[1];
         | 
| 1145 | 
            +
              int error = 0;
         | 
| 1146 | 
            +
             | 
| 1147 | 
            +
              args[0] = (VALUE)user_data;
         | 
| 1148 | 
            +
             | 
| 1149 | 
            +
              rb_protect((VALUE (*)())unsafe_destroy,(VALUE) args,&error);
         | 
| 1150 | 
            +
              // TODO: some kind of logging would be nice here.
         | 
| 1039 1151 | 
             
            }
         | 
| 1040 1152 |  | 
| 1041 1153 | 
             
            //----------------------ACCESS
         | 
| 1042 1154 |  | 
| 1155 | 
            +
            static VALUE unsafe_access(VALUE* args)
         | 
| 1156 | 
            +
            {
         | 
| 1157 | 
            +
              VALUE path = args[0];
         | 
| 1158 | 
            +
              VALUE mask = args[1];
         | 
| 1159 | 
            +
             | 
| 1160 | 
            +
              struct fuse_context *ctx = fuse_get_context();
         | 
| 1161 | 
            +
             | 
| 1162 | 
            +
              return rb_funcall(fuse_object,rb_intern("access"),3,wrap_context(ctx),
         | 
| 1163 | 
            +
                path, mask);
         | 
| 1164 | 
            +
            }
         | 
| 1165 | 
            +
             | 
| 1043 1166 | 
             
            static int rf_access(const char *path, int mask)
         | 
| 1044 1167 | 
             
            {
         | 
| 1045 | 
            -
               | 
| 1046 | 
            -
               | 
| 1168 | 
            +
              VALUE args[2];
         | 
| 1169 | 
            +
              VALUE res;
         | 
| 1170 | 
            +
              int error = 0;
         | 
| 1171 | 
            +
              args[0] = rb_str_new2(path);
         | 
| 1172 | 
            +
              args[1] = INT2NUM(mask);
         | 
| 1173 | 
            +
              res = rb_protect((VALUE (*)())unsafe_access,(VALUE) args,&error);
         | 
| 1174 | 
            +
             | 
| 1175 | 
            +
              if (error)
         | 
| 1176 | 
            +
              {
         | 
| 1177 | 
            +
                return -(return_error(ENOENT));
         | 
| 1178 | 
            +
              }
         | 
| 1179 | 
            +
              else
         | 
| 1180 | 
            +
              {
         | 
| 1181 | 
            +
                return 0;
         | 
| 1182 | 
            +
              }
         | 
| 1047 1183 | 
             
            }
         | 
| 1048 1184 |  | 
| 1049 1185 | 
             
            //----------------------CREATE
         | 
| 1050 1186 |  | 
| 1187 | 
            +
            static VALUE unsafe_create(VALUE* args)
         | 
| 1188 | 
            +
            {
         | 
| 1189 | 
            +
              VALUE path = args[0];
         | 
| 1190 | 
            +
              VALUE mode = args[1];
         | 
| 1191 | 
            +
              VALUE ffi  = args[2];
         | 
| 1192 | 
            +
             | 
| 1193 | 
            +
              struct fuse_context *ctx = fuse_get_context();
         | 
| 1194 | 
            +
             | 
| 1195 | 
            +
              return rb_funcall(fuse_object,rb_intern("create"),4,wrap_context(ctx),
         | 
| 1196 | 
            +
                path, mode, ffi);
         | 
| 1197 | 
            +
            }
         | 
| 1198 | 
            +
             | 
| 1051 1199 | 
             
            static int rf_create(const char *path, mode_t mode,
         | 
| 1052 1200 | 
             
              struct fuse_file_info *ffi)
         | 
| 1053 1201 | 
             
            {
         | 
| 1054 | 
            -
               | 
| 1055 | 
            -
               | 
| 1202 | 
            +
              VALUE args[3];
         | 
| 1203 | 
            +
              VALUE res;
         | 
| 1204 | 
            +
              int error = 0;
         | 
| 1205 | 
            +
             | 
| 1206 | 
            +
              args[0] = rb_str_new2(path);
         | 
| 1207 | 
            +
              args[1] = INT2NUM(mode);
         | 
| 1208 | 
            +
              args[2] = wrap_file_info(ffi);
         | 
| 1209 | 
            +
             | 
| 1210 | 
            +
              res = rb_protect((VALUE (*)())unsafe_create,(VALUE) args,&error);
         | 
| 1211 | 
            +
             | 
| 1212 | 
            +
              if (error)
         | 
| 1213 | 
            +
              {
         | 
| 1214 | 
            +
                return -(return_error(ENOENT));
         | 
| 1215 | 
            +
              }
         | 
| 1216 | 
            +
              else
         | 
| 1217 | 
            +
              {
         | 
| 1218 | 
            +
                return 0;
         | 
| 1219 | 
            +
              }
         | 
| 1056 1220 | 
             
            }
         | 
| 1057 1221 |  | 
| 1058 1222 | 
             
            //----------------------FTRUNCATE
         | 
| 1059 1223 |  | 
| 1224 | 
            +
            static VALUE unsafe_ftruncate(VALUE* args)
         | 
| 1225 | 
            +
            {
         | 
| 1226 | 
            +
              VALUE path = args[0];
         | 
| 1227 | 
            +
              VALUE size = args[1];
         | 
| 1228 | 
            +
              VALUE ffi  = args[2];
         | 
| 1229 | 
            +
             | 
| 1230 | 
            +
              struct fuse_context *ctx = fuse_get_context();
         | 
| 1231 | 
            +
             | 
| 1232 | 
            +
              return rb_funcall(fuse_object,rb_intern("ftruncate"),4,wrap_context(ctx),
         | 
| 1233 | 
            +
                path, size, ffi);
         | 
| 1234 | 
            +
            }
         | 
| 1235 | 
            +
             | 
| 1060 1236 | 
             
            static int rf_ftruncate(const char *path, off_t size,
         | 
| 1061 1237 | 
             
              struct fuse_file_info *ffi)
         | 
| 1062 1238 | 
             
            {
         | 
| 1063 | 
            -
               | 
| 1064 | 
            -
               | 
| 1239 | 
            +
              VALUE args[3];
         | 
| 1240 | 
            +
              VALUE res;
         | 
| 1241 | 
            +
              int error = 0;
         | 
| 1242 | 
            +
             | 
| 1243 | 
            +
              args[0] = rb_str_new2(path);
         | 
| 1244 | 
            +
              args[1] = INT2NUM(size);
         | 
| 1245 | 
            +
              args[2] = wrap_file_info(ffi);
         | 
| 1246 | 
            +
             | 
| 1247 | 
            +
              res = rb_protect((VALUE (*)())unsafe_ftruncate,(VALUE) args,&error);
         | 
| 1248 | 
            +
             | 
| 1249 | 
            +
              if (error)
         | 
| 1250 | 
            +
              {
         | 
| 1251 | 
            +
                return -(return_error(ENOENT));
         | 
| 1252 | 
            +
              }
         | 
| 1253 | 
            +
              else
         | 
| 1254 | 
            +
              {
         | 
| 1255 | 
            +
                return 0;
         | 
| 1256 | 
            +
              }
         | 
| 1065 1257 | 
             
            }
         | 
| 1066 1258 |  | 
| 1067 1259 | 
             
            //----------------------FGETATTR
         | 
| 1068 1260 |  | 
| 1261 | 
            +
            static VALUE unsafe_fgetattr(VALUE *args)
         | 
| 1262 | 
            +
            {
         | 
| 1263 | 
            +
              VALUE path = args[0];
         | 
| 1264 | 
            +
              VALUE ffi  = args[1];
         | 
| 1265 | 
            +
             | 
| 1266 | 
            +
              struct fuse_context *ctx = fuse_get_context();
         | 
| 1267 | 
            +
             | 
| 1268 | 
            +
              return rb_funcall(fuse_object,rb_intern("fgetattr"),3,wrap_context(ctx),
         | 
| 1269 | 
            +
                path,ffi);
         | 
| 1270 | 
            +
            }
         | 
| 1271 | 
            +
             | 
| 1069 1272 | 
             
            static int rf_fgetattr(const char *path, struct stat *stbuf,
         | 
| 1070 1273 | 
             
              struct fuse_file_info *ffi)
         | 
| 1071 1274 | 
             
            {
         | 
| 1072 | 
            -
               | 
| 1073 | 
            -
               | 
| 1275 | 
            +
              VALUE args[2];
         | 
| 1276 | 
            +
              VALUE res;
         | 
| 1277 | 
            +
              int error = 0;
         | 
| 1278 | 
            +
             | 
| 1279 | 
            +
              args[0] = rb_str_new2(path);
         | 
| 1280 | 
            +
              args[1] = wrap_file_info(ffi);
         | 
| 1281 | 
            +
             | 
| 1282 | 
            +
              res=rb_protect((VALUE (*)())unsafe_fgetattr,(VALUE) args,&error);
         | 
| 1283 | 
            +
             | 
| 1284 | 
            +
              if (error || (res == Qnil))
         | 
| 1285 | 
            +
              {
         | 
| 1286 | 
            +
                return -(return_error(ENOENT));
         | 
| 1287 | 
            +
              }
         | 
| 1288 | 
            +
              else
         | 
| 1289 | 
            +
              {
         | 
| 1290 | 
            +
                rstat2stat(res,stbuf);
         | 
| 1291 | 
            +
                return 0;
         | 
| 1292 | 
            +
              }
         | 
| 1074 1293 | 
             
            }
         | 
| 1075 1294 |  | 
| 1076 1295 | 
             
            //----------------------LOCK
         | 
| 1077 1296 |  | 
| 1297 | 
            +
            static VALUE unsafe_lock(VALUE *args)
         | 
| 1298 | 
            +
            {
         | 
| 1299 | 
            +
              VALUE path = args[0];
         | 
| 1300 | 
            +
              VALUE ffi  = args[1];
         | 
| 1301 | 
            +
              VALUE cmd  = args[2];
         | 
| 1302 | 
            +
              VALUE lock = args[3];
         | 
| 1303 | 
            +
             | 
| 1304 | 
            +
              struct fuse_context *ctx = fuse_get_context();
         | 
| 1305 | 
            +
             | 
| 1306 | 
            +
              return rb_funcall(fuse_object,rb_intern("lock"),5,wrap_context(ctx),
         | 
| 1307 | 
            +
                path,ffi,cmd,lock);
         | 
| 1308 | 
            +
            }
         | 
| 1309 | 
            +
             | 
| 1078 1310 | 
             
            static int rf_lock(const char *path, struct fuse_file_info *ffi,
         | 
| 1079 1311 | 
             
              int cmd, struct flock *lock)
         | 
| 1080 1312 | 
             
            {
         | 
| 1081 | 
            -
               | 
| 1082 | 
            -
               | 
| 1313 | 
            +
              VALUE args[4];
         | 
| 1314 | 
            +
              VALUE res;
         | 
| 1315 | 
            +
              int error = 0;
         | 
| 1316 | 
            +
             | 
| 1317 | 
            +
              //Create a struct for the lock structure
         | 
| 1318 | 
            +
              VALUE s  = rb_const_get(rb_cObject,rb_intern("Struct"));
         | 
| 1319 | 
            +
              VALUE lockc = rb_funcall(s,rb_intern("new"),5,
         | 
| 1320 | 
            +
                ID2SYM(rb_intern("l_type")),
         | 
| 1321 | 
            +
                ID2SYM(rb_intern("l_whence")),
         | 
| 1322 | 
            +
                ID2SYM(rb_intern("l_start")),
         | 
| 1323 | 
            +
                ID2SYM(rb_intern("l_len")),
         | 
| 1324 | 
            +
                ID2SYM(rb_intern("l_pid"))
         | 
| 1325 | 
            +
              );
         | 
| 1326 | 
            +
             | 
| 1327 | 
            +
              VALUE locko = rb_funcall(lockc,rb_intern("new"),5,
         | 
| 1328 | 
            +
                UINT2NUM(lock->l_type),
         | 
| 1329 | 
            +
                UINT2NUM(lock->l_whence),
         | 
| 1330 | 
            +
                UINT2NUM(lock->l_start),
         | 
| 1331 | 
            +
                UINT2NUM(lock->l_len),
         | 
| 1332 | 
            +
                UINT2NUM(lock->l_pid)
         | 
| 1333 | 
            +
              );
         | 
| 1334 | 
            +
             | 
| 1335 | 
            +
              args[0] = rb_str_new2(path);
         | 
| 1336 | 
            +
              args[1] = wrap_file_info(ffi);
         | 
| 1337 | 
            +
              args[2] = INT2NUM(cmd);
         | 
| 1338 | 
            +
              args[3] = locko;
         | 
| 1339 | 
            +
             | 
| 1340 | 
            +
              res = rb_protect((VALUE (*)())unsafe_lock,(VALUE) args,&error);
         | 
| 1341 | 
            +
             | 
| 1342 | 
            +
              if (error)
         | 
| 1343 | 
            +
              {
         | 
| 1344 | 
            +
                return -(return_error(ENOENT));
         | 
| 1345 | 
            +
              }
         | 
| 1346 | 
            +
              else
         | 
| 1347 | 
            +
              {
         | 
| 1348 | 
            +
                return 0;
         | 
| 1349 | 
            +
              }
         | 
| 1083 1350 | 
             
            }
         | 
| 1084 1351 |  | 
| 1085 1352 | 
             
            //----------------------UTIMENS
         | 
| @@ -1138,10 +1405,39 @@ static int rf_utimens(const char * path, const struct timespec tv[2]) | |
| 1138 1405 |  | 
| 1139 1406 | 
             
            //----------------------BMAP
         | 
| 1140 1407 |  | 
| 1408 | 
            +
            static VALUE unsafe_bmap(VALUE *args)
         | 
| 1409 | 
            +
            {
         | 
| 1410 | 
            +
              VALUE path      = args[0];
         | 
| 1411 | 
            +
              VALUE blocksize = args[1];
         | 
| 1412 | 
            +
              VALUE idx       = args[2];
         | 
| 1413 | 
            +
             | 
| 1414 | 
            +
              struct fuse_context *ctx = fuse_get_context();
         | 
| 1415 | 
            +
             | 
| 1416 | 
            +
              return rb_funcall( fuse_object, rb_intern("bmap"), 4, wrap_context(ctx),
         | 
| 1417 | 
            +
                path, blocksize, idx);
         | 
| 1418 | 
            +
            }
         | 
| 1419 | 
            +
             | 
| 1141 1420 | 
             
            static int rf_bmap(const char *path, size_t blocksize, uint64_t *idx)
         | 
| 1142 1421 | 
             
            {
         | 
| 1143 | 
            -
               | 
| 1144 | 
            -
               | 
| 1422 | 
            +
              VALUE args[3];
         | 
| 1423 | 
            +
              VALUE res;
         | 
| 1424 | 
            +
              int   error = 0;
         | 
| 1425 | 
            +
             | 
| 1426 | 
            +
              args[0] = rb_str_new2(path);
         | 
| 1427 | 
            +
              args[1] = INT2NUM(blocksize);
         | 
| 1428 | 
            +
              args[2] = LL2NUM(*idx);
         | 
| 1429 | 
            +
             | 
| 1430 | 
            +
              res = rb_protect((VALUE (*)())unsafe_bmap,(VALUE) args, &error);
         | 
| 1431 | 
            +
             | 
| 1432 | 
            +
              if (error)
         | 
| 1433 | 
            +
              {
         | 
| 1434 | 
            +
                return -(return_error(ENOENT));
         | 
| 1435 | 
            +
              }
         | 
| 1436 | 
            +
              else
         | 
| 1437 | 
            +
              {
         | 
| 1438 | 
            +
                *idx = NUM2LL(args[2]);
         | 
| 1439 | 
            +
                return 0;
         | 
| 1440 | 
            +
              }
         | 
| 1145 1441 | 
             
            }
         | 
| 1146 1442 |  | 
| 1147 1443 | 
             
            //----------------------IOCTL
         | 
| @@ -1275,13 +1571,13 @@ static VALUE rf_initialize( | |
| 1275 1571 | 
             
              if (RESPOND_TO(self,"write"))
         | 
| 1276 1572 | 
             
                inf->fuse_op.write       = rf_write;
         | 
| 1277 1573 | 
             
              if (RESPOND_TO(self,"statfs"))
         | 
| 1278 | 
            -
                inf->fuse_op.statfs      = rf_statfs; | 
| 1574 | 
            +
                inf->fuse_op.statfs      = rf_statfs;
         | 
| 1279 1575 | 
             
              if (RESPOND_TO(self,"flush"))
         | 
| 1280 1576 | 
             
                inf->fuse_op.flush       = rf_flush;
         | 
| 1281 1577 | 
             
              if (RESPOND_TO(self,"release"))
         | 
| 1282 1578 | 
             
                inf->fuse_op.release     = rf_release;
         | 
| 1283 1579 | 
             
              if (RESPOND_TO(self,"fsync"))
         | 
| 1284 | 
            -
                inf->fuse_op.fsync       = rf_fsync; | 
| 1580 | 
            +
                inf->fuse_op.fsync       = rf_fsync;
         | 
| 1285 1581 | 
             
              if (RESPOND_TO(self,"setxattr"))
         | 
| 1286 1582 | 
             
                inf->fuse_op.setxattr    = rf_setxattr;
         | 
| 1287 1583 | 
             
              if (RESPOND_TO(self,"getxattr"))
         | 
| @@ -1299,23 +1595,23 @@ static VALUE rf_initialize( | |
| 1299 1595 | 
             
              if (RESPOND_TO(self,"fsyncdir"))
         | 
| 1300 1596 | 
             
                inf->fuse_op.fsyncdir    = rf_fsyncdir;
         | 
| 1301 1597 | 
             
              if (RESPOND_TO(self,"init"))
         | 
| 1302 | 
            -
                inf->fuse_op.init        = rf_init; | 
| 1598 | 
            +
                inf->fuse_op.init        = rf_init;
         | 
| 1303 1599 | 
             
              if (RESPOND_TO(self,"destroy"))
         | 
| 1304 | 
            -
                inf->fuse_op.destroy     = rf_destroy; | 
| 1600 | 
            +
                inf->fuse_op.destroy     = rf_destroy;
         | 
| 1305 1601 | 
             
              if (RESPOND_TO(self,"access"))
         | 
| 1306 | 
            -
                inf->fuse_op.access      = rf_access; | 
| 1602 | 
            +
                inf->fuse_op.access      = rf_access;
         | 
| 1307 1603 | 
             
              if (RESPOND_TO(self,"create"))
         | 
| 1308 | 
            -
                inf->fuse_op.create      = rf_create; | 
| 1604 | 
            +
                inf->fuse_op.create      = rf_create;
         | 
| 1309 1605 | 
             
              if (RESPOND_TO(self,"ftruncate"))
         | 
| 1310 | 
            -
                inf->fuse_op.ftruncate   = rf_ftruncate; | 
| 1606 | 
            +
                inf->fuse_op.ftruncate   = rf_ftruncate;
         | 
| 1311 1607 | 
             
              if (RESPOND_TO(self,"fgetattr"))
         | 
| 1312 | 
            -
                inf->fuse_op.fgetattr    = rf_fgetattr; | 
| 1608 | 
            +
                inf->fuse_op.fgetattr    = rf_fgetattr;
         | 
| 1313 1609 | 
             
              if (RESPOND_TO(self,"lock"))
         | 
| 1314 | 
            -
                inf->fuse_op.lock        = rf_lock; | 
| 1610 | 
            +
                inf->fuse_op.lock        = rf_lock;
         | 
| 1315 1611 | 
             
              if (RESPOND_TO(self,"utimens"))
         | 
| 1316 1612 | 
             
                inf->fuse_op.utimens     = rf_utimens;
         | 
| 1317 1613 | 
             
              if (RESPOND_TO(self,"bmap"))
         | 
| 1318 | 
            -
                inf->fuse_op.bmap        = rf_bmap; | 
| 1614 | 
            +
                inf->fuse_op.bmap        = rf_bmap;
         | 
| 1319 1615 | 
             
              if (RESPOND_TO(self,"ioctl"))
         | 
| 1320 1616 | 
             
                inf->fuse_op.ioctl       = rf_ioctl;     // TODO
         | 
| 1321 1617 | 
             
              if (RESPOND_TO(self,"poll"))
         | 
    
        data/sample/test-ruby.rb
    CHANGED
    
    | @@ -1,4 +1,4 @@ | |
| 1 | 
            -
            #!/usr/bin/ruby | 
| 1 | 
            +
            #!/usr/bin/ruby
         | 
| 2 2 |  | 
| 3 3 | 
             
            # TestFS for RFuse-ng
         | 
| 4 4 |  | 
| @@ -122,26 +122,43 @@ class MyFile | |
| 122 122 | 
             
              end
         | 
| 123 123 | 
             
            end
         | 
| 124 124 |  | 
| 125 | 
            -
            #TODO: atime,mtime,ctime...nicer classes not only fixnums
         | 
| 126 125 | 
             
            class Stat
         | 
| 127 126 | 
             
              attr_accessor :uid,:gid,:mode,:size,:atime,:mtime,:ctime 
         | 
| 128 127 | 
             
              attr_accessor :dev,:ino,:nlink,:rdev,:blksize,:blocks
         | 
| 129 | 
            -
              def initialize | 
| 130 | 
            -
                @uid= | 
| 131 | 
            -
                @gid= | 
| 132 | 
            -
                @mode= | 
| 133 | 
            -
                @size= | 
| 134 | 
            -
                @atime= | 
| 135 | 
            -
                @mtime= | 
| 136 | 
            -
                @ctime= | 
| 137 | 
            -
                @dev= | 
| 138 | 
            -
                @ino= | 
| 139 | 
            -
                @nlink= | 
| 140 | 
            -
                @rdev= | 
| 141 | 
            -
                @blksize= | 
| 142 | 
            -
                @blocks= | 
| 143 | 
            -
              end
         | 
| 144 | 
            -
            end | 
| 128 | 
            +
              def initialize
         | 
| 129 | 
            +
                @uid     = 0
         | 
| 130 | 
            +
                @gid     = 0
         | 
| 131 | 
            +
                @mode    = 0
         | 
| 132 | 
            +
                @size    = 0
         | 
| 133 | 
            +
                @atime   = 0
         | 
| 134 | 
            +
                @mtime   = 0
         | 
| 135 | 
            +
                @ctime   = 0
         | 
| 136 | 
            +
                @dev     = 0
         | 
| 137 | 
            +
                @ino     = 0
         | 
| 138 | 
            +
                @nlink   = 0
         | 
| 139 | 
            +
                @rdev    = 0
         | 
| 140 | 
            +
                @blksize = 0
         | 
| 141 | 
            +
                @blocks  = 0
         | 
| 142 | 
            +
              end
         | 
| 143 | 
            +
            end
         | 
| 144 | 
            +
             | 
| 145 | 
            +
            class StatVfs
         | 
| 146 | 
            +
              attr_accessor :f_bsize,:f_frsize,:f_blocks,:f_bfree,:f_bavail
         | 
| 147 | 
            +
              attr_accessor :f_files,:f_ffree,:f_favail,:f_fsid,:f_flag,:f_namemax
         | 
| 148 | 
            +
              def initialize
         | 
| 149 | 
            +
                @f_bsize    = 0
         | 
| 150 | 
            +
                @f_frsize   = 0
         | 
| 151 | 
            +
                @f_blocks   = 0
         | 
| 152 | 
            +
                @f_bfree    = 0
         | 
| 153 | 
            +
                @f_bavail   = 0
         | 
| 154 | 
            +
                @f_files    = 0
         | 
| 155 | 
            +
                @f_ffree    = 0
         | 
| 156 | 
            +
                @f_favail   = 0
         | 
| 157 | 
            +
                @f_fsid     = 0
         | 
| 158 | 
            +
                @f_flag     = 0
         | 
| 159 | 
            +
                @f_namemax  = 0
         | 
| 160 | 
            +
              end
         | 
| 161 | 
            +
            end
         | 
| 145 162 |  | 
| 146 163 | 
             
            class MyFuse < RFuse::Fuse
         | 
| 147 164 |  | 
| @@ -168,8 +185,13 @@ class MyFuse < RFuse::Fuse | |
| 168 185 | 
             
                d=@root.search(path)
         | 
| 169 186 | 
             
                if d.isdir then
         | 
| 170 187 | 
             
                  d.each {|name,obj| 
         | 
| 171 | 
            -
                    stat=Stat.new | 
| 172 | 
            -
                     | 
| 188 | 
            +
                    stat = Stat.new
         | 
| 189 | 
            +
                    stat.uid   = obj.uid
         | 
| 190 | 
            +
                    stat.gid   = obj.gid
         | 
| 191 | 
            +
                    stat.mode  = obj.mode
         | 
| 192 | 
            +
                    stat.size  = obj.size
         | 
| 193 | 
            +
                    stat.atime = obj.actime
         | 
| 194 | 
            +
                    stat.mtime = obj.modtime
         | 
| 173 195 | 
             
                    filler.push(name,stat,0)
         | 
| 174 196 | 
             
                  }
         | 
| 175 197 | 
             
                else
         | 
| @@ -178,9 +200,14 @@ class MyFuse < RFuse::Fuse | |
| 178 200 | 
             
              end
         | 
| 179 201 |  | 
| 180 202 | 
             
              def getattr(ctx,path)
         | 
| 181 | 
            -
                d | 
| 182 | 
            -
                stat=Stat.new | 
| 183 | 
            -
             | 
| 203 | 
            +
                d = @root.search(path)
         | 
| 204 | 
            +
                stat = Stat.new
         | 
| 205 | 
            +
                stat.uid   = d.uid
         | 
| 206 | 
            +
                stat.gid   = d.gid
         | 
| 207 | 
            +
                stat.mode  = d.mode
         | 
| 208 | 
            +
                stat.size  = d.size
         | 
| 209 | 
            +
                stat.atime = d.actime
         | 
| 210 | 
            +
                stat.mtime = d.modtime
         | 
| 184 211 | 
             
                return stat
         | 
| 185 212 | 
             
              end #getattr
         | 
| 186 213 |  | 
| @@ -192,8 +219,8 @@ class MyFuse < RFuse::Fuse | |
| 192 219 | 
             
                @root.insert_obj(MyFile.new(File.basename(path),mode,ctx.uid,ctx.gid),path)
         | 
| 193 220 | 
             
              end #mknod
         | 
| 194 221 |  | 
| 195 | 
            -
               | 
| 196 | 
            -
               | 
| 222 | 
            +
              def open(ctx,path,ffi)
         | 
| 223 | 
            +
              end
         | 
| 197 224 |  | 
| 198 225 | 
             
              #def release(ctx,path,fi)
         | 
| 199 226 | 
             
              #end
         | 
| @@ -303,6 +330,31 @@ class MyFuse < RFuse::Fuse | |
| 303 330 | 
             
              #def fsyncdir(ctx,path,meta,ffi)
         | 
| 304 331 | 
             
              #end
         | 
| 305 332 |  | 
| 333 | 
            +
              # Some random numbers to show with df command
         | 
| 334 | 
            +
              def statfs(ctx,path)
         | 
| 335 | 
            +
                s = StatVfs.new
         | 
| 336 | 
            +
                s.f_bsize    = 1024
         | 
| 337 | 
            +
                s.f_frsize   = 1024
         | 
| 338 | 
            +
                s.f_blocks   = 1000000
         | 
| 339 | 
            +
                s.f_bfree    = 500000
         | 
| 340 | 
            +
                s.f_bavail   = 990000
         | 
| 341 | 
            +
                s.f_files    = 10000
         | 
| 342 | 
            +
                s.f_ffree    = 9900
         | 
| 343 | 
            +
                s.f_favail   = 9900
         | 
| 344 | 
            +
                s.f_fsid     = 23423
         | 
| 345 | 
            +
                s.f_flag     = 0
         | 
| 346 | 
            +
                s.f_namemax  = 10000
         | 
| 347 | 
            +
                return s
         | 
| 348 | 
            +
              end
         | 
| 349 | 
            +
             | 
| 350 | 
            +
              def init(ctx,rfuseconninfo)
         | 
| 351 | 
            +
                print "init called\n"
         | 
| 352 | 
            +
                print "proto_major: "
         | 
| 353 | 
            +
                print rfuseconninfo.proto_major
         | 
| 354 | 
            +
                print "\n"
         | 
| 355 | 
            +
                return nil
         | 
| 356 | 
            +
              end
         | 
| 357 | 
            +
             | 
| 306 358 | 
             
            end #class Fuse
         | 
| 307 359 |  | 
| 308 360 | 
             
            fo = MyFuse.new("/tmp/fuse",["allow_other"],["debug"], MyDir.new("",493));
         | 
| @@ -318,7 +370,5 @@ end | |
| 318 370 | 
             
            begin
         | 
| 319 371 | 
             
              fo.loop
         | 
| 320 372 | 
             
            rescue
         | 
| 321 | 
            -
               | 
| 322 | 
            -
              f.puts "Error:" + $!
         | 
| 323 | 
            -
              f.close
         | 
| 373 | 
            +
              print "Error:" + $!
         | 
| 324 374 | 
             
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification 
         | 
| 2 2 | 
             
            name: rfuse-ng
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version 
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.4.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors: 
         | 
| 7 7 | 
             
            - !binary |
         | 
| @@ -11,7 +11,7 @@ autorequire: | |
| 11 11 | 
             
            bindir: bin
         | 
| 12 12 | 
             
            cert_chain: []
         | 
| 13 13 |  | 
| 14 | 
            -
            date: 2010- | 
| 14 | 
            +
            date: 2010-06-20 00:00:00 +02:00
         | 
| 15 15 | 
             
            default_executable: 
         | 
| 16 16 | 
             
            dependencies: []
         | 
| 17 17 |  |