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
|
|