rfuse-ng 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
|