rfuse 1.0.2 → 1.0.3
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/CHANGES.md +12 -3
- data/README.md +1 -1
- data/ext/rfuse/context.c +0 -1
- data/ext/rfuse/file_info.c +7 -6
- data/ext/rfuse/filler.c +5 -4
- data/ext/rfuse/helper.c +20 -16
- data/ext/rfuse/helper.h +2 -10
- data/ext/rfuse/intern_rfuse.c +5 -10
- data/ext/rfuse/rfuse.c +110 -188
- data/lib/rfuse/version.rb +1 -1
- data/lib/rfuse.rb +87 -3
- data/spec/basic_spec.rb +2 -28
- data/spec/fuse_file_info_spec.rb +41 -12
- data/spec/options_spec.rb +112 -0
- metadata +3 -2
data/ext/rfuse/rfuse.c
CHANGED
@@ -10,9 +10,9 @@
|
|
10
10
|
#include <fuse.h>
|
11
11
|
#include <errno.h>
|
12
12
|
#include <sys/statfs.h>
|
13
|
-
|
13
|
+
#ifdef HAVE_SETXATTR
|
14
14
|
#include <sys/xattr.h>
|
15
|
-
|
15
|
+
#endif
|
16
16
|
|
17
17
|
#include "helper.h"
|
18
18
|
#include "intern_rfuse.h"
|
@@ -23,6 +23,7 @@
|
|
23
23
|
#include "pollhandle.h"
|
24
24
|
#include "bufferwrapper.h"
|
25
25
|
|
26
|
+
// Ruby 1.8 compatibility
|
26
27
|
#ifdef HAVE_RUBY_ENCODING_H
|
27
28
|
#include <ruby/encoding.h>
|
28
29
|
#endif
|
@@ -34,9 +35,6 @@ static VALUE rb_errinfo()
|
|
34
35
|
}
|
35
36
|
#endif
|
36
37
|
|
37
|
-
static VALUE mRFuse;
|
38
|
-
static VALUE eRFuse_Error;
|
39
|
-
|
40
38
|
static VALUE rb_filesystem_encode(VALUE str)
|
41
39
|
{
|
42
40
|
#ifdef HAVE_RUBY_ENCODING_H
|
@@ -45,6 +43,10 @@ static VALUE rb_filesystem_encode(VALUE str)
|
|
45
43
|
return str;
|
46
44
|
#endif
|
47
45
|
}
|
46
|
+
//end 1.8 compat
|
47
|
+
|
48
|
+
static VALUE mRFuse;
|
49
|
+
static VALUE eRFuse_Error;
|
48
50
|
|
49
51
|
static int unsafe_return_error(VALUE *args)
|
50
52
|
{
|
@@ -54,13 +56,16 @@ static int unsafe_return_error(VALUE *args)
|
|
54
56
|
return rb_funcall(rb_errinfo(),rb_intern("errno"),0);
|
55
57
|
} else {
|
56
58
|
VALUE info;
|
59
|
+
VALUE bt_ary;
|
60
|
+
int c;
|
61
|
+
|
57
62
|
info = rb_inspect(rb_errinfo());
|
58
|
-
printf ("ERROR: Exception %s not an Errno:: !respond_to?(:errno) \n",
|
63
|
+
printf ("ERROR: Exception %s not an Errno:: !respond_to?(:errno) \n",StringValueCStr(info));
|
59
64
|
//We need the ruby_errinfo backtrace not fuse.loop ... rb_backtrace();
|
60
|
-
|
61
|
-
|
65
|
+
bt_ary = rb_funcall(rb_errinfo(), rb_intern("backtrace"),0);
|
66
|
+
|
62
67
|
for (c=0;c<RARRAY_LEN(bt_ary);c++) {
|
63
|
-
printf("%s\n",
|
68
|
+
printf("%s\n",StringValueCStr(RARRAY_PTR(bt_ary)[c]));
|
64
69
|
}
|
65
70
|
return Qnil;
|
66
71
|
}
|
@@ -88,7 +93,7 @@ static int return_error(int def_error)
|
|
88
93
|
//Every call needs this stuff
|
89
94
|
static void init_context_path_args(VALUE *args,struct fuse_context *ctx,const char *path)
|
90
95
|
{
|
91
|
-
args[0] = ctx->private_data;
|
96
|
+
args[0] = (VALUE) ctx->private_data;
|
92
97
|
args[1] = wrap_context(ctx);
|
93
98
|
args[2] = rb_str_new2(path);
|
94
99
|
rb_filesystem_encode(args[2]);
|
@@ -107,6 +112,7 @@ static void init_context_path_args(VALUE *args,struct fuse_context *ctx,const ch
|
|
107
112
|
|
108
113
|
@return [void]
|
109
114
|
@raise [Errno]
|
115
|
+
@todo the API for the filler could be more ruby like - eg yield
|
110
116
|
*/
|
111
117
|
static VALUE unsafe_readdir(VALUE *args)
|
112
118
|
{
|
@@ -121,7 +127,6 @@ static int rf_readdir(const char *path, void *buf,
|
|
121
127
|
VALUE rfiller_instance;
|
122
128
|
struct filler_t *fillerc;
|
123
129
|
VALUE args[6];
|
124
|
-
VALUE res;
|
125
130
|
int error = 0;
|
126
131
|
|
127
132
|
struct fuse_context *ctx=fuse_get_context();
|
@@ -133,13 +138,13 @@ static int rf_readdir(const char *path, void *buf,
|
|
133
138
|
rfiller_instance=rb_funcall(rfiller_class,rb_intern("new"),0);
|
134
139
|
Data_Get_Struct(rfiller_instance,struct filler_t,fillerc);
|
135
140
|
|
136
|
-
fillerc->filler=filler
|
141
|
+
fillerc->filler=filler;
|
137
142
|
fillerc->buffer=buf;
|
138
143
|
args[3]=rfiller_instance;
|
139
144
|
args[4]=INT2NUM(offset);
|
140
145
|
args[5]=get_file_info(ffi);
|
141
146
|
|
142
|
-
|
147
|
+
rb_protect((VALUE (*)())unsafe_readdir,(VALUE)args,&error);
|
143
148
|
return error ? -(return_error(ENOENT)) : 0 ;
|
144
149
|
}
|
145
150
|
|
@@ -164,12 +169,12 @@ static int rf_readlink(const char *path, char *buf, size_t size)
|
|
164
169
|
VALUE args[4];
|
165
170
|
VALUE res;
|
166
171
|
int error = 0;
|
172
|
+
char *rbuf;
|
167
173
|
|
168
174
|
struct fuse_context *ctx=fuse_get_context();
|
169
175
|
init_context_path_args(args,ctx,path);
|
170
176
|
|
171
177
|
args[3]=INT2NUM(size);
|
172
|
-
char *rbuf;
|
173
178
|
res=rb_protect((VALUE (*)())unsafe_readlink,(VALUE)args,&error);
|
174
179
|
if (error)
|
175
180
|
{
|
@@ -177,7 +182,7 @@ static int rf_readlink(const char *path, char *buf, size_t size)
|
|
177
182
|
}
|
178
183
|
else
|
179
184
|
{
|
180
|
-
rbuf=
|
185
|
+
rbuf=StringValueCStr(res);
|
181
186
|
strncpy(buf,rbuf,size);
|
182
187
|
return 0;
|
183
188
|
}
|
@@ -199,7 +204,6 @@ static int rf_getdir(const char *path, fuse_dirh_t dh, fuse_dirfil_t df)
|
|
199
204
|
VALUE rfiller_class;
|
200
205
|
VALUE rfiller_instance;
|
201
206
|
VALUE args[4];
|
202
|
-
VALUE res;
|
203
207
|
struct filler_t *fillerc;
|
204
208
|
int error = 0;
|
205
209
|
|
@@ -218,7 +222,7 @@ static int rf_getdir(const char *path, fuse_dirh_t dh, fuse_dirfil_t df)
|
|
218
222
|
|
219
223
|
args[3]=rfiller_instance;
|
220
224
|
|
221
|
-
|
225
|
+
rb_protect((VALUE (*)())unsafe_getdir, (VALUE)args, &error);
|
222
226
|
|
223
227
|
return error ? -(return_error(ENOENT)) : 0 ;
|
224
228
|
}
|
@@ -247,21 +251,20 @@ static VALUE unsafe_mknod(VALUE *args)
|
|
247
251
|
static int rf_mknod(const char *path, mode_t mode,dev_t dev)
|
248
252
|
{
|
249
253
|
VALUE args[6];
|
250
|
-
VALUE res;
|
251
254
|
int error = 0;
|
252
255
|
struct fuse_context *ctx=fuse_get_context();
|
253
|
-
init_context_path_args(args,ctx,path);
|
254
|
-
|
255
256
|
int major;
|
256
257
|
int minor;
|
257
258
|
|
259
|
+
init_context_path_args(args,ctx,path);
|
260
|
+
|
258
261
|
major = MAJOR(dev);
|
259
262
|
minor = MINOR(dev);
|
260
263
|
|
261
264
|
args[3]=INT2FIX(mode);
|
262
265
|
args[4]=INT2FIX(major);
|
263
266
|
args[5]=INT2FIX(minor);
|
264
|
-
|
267
|
+
rb_protect((VALUE (*)())unsafe_mknod,(VALUE) args,&error);
|
265
268
|
return error ? -(return_error(ENOENT)) : 0 ;
|
266
269
|
}
|
267
270
|
|
@@ -330,23 +333,15 @@ static VALUE unsafe_mkdir(VALUE *args)
|
|
330
333
|
static int rf_mkdir(const char *path, mode_t mode)
|
331
334
|
{
|
332
335
|
VALUE args[4];
|
333
|
-
VALUE res;
|
334
336
|
int error = 0;
|
335
337
|
|
336
338
|
struct fuse_context *ctx=fuse_get_context();
|
337
339
|
init_context_path_args(args,ctx,path);
|
338
340
|
|
339
341
|
args[3]=INT2FIX(mode);
|
340
|
-
|
342
|
+
rb_protect((VALUE (*)())unsafe_mkdir,(VALUE) args,&error);
|
341
343
|
|
342
|
-
|
343
|
-
{
|
344
|
-
return -(return_error(ENOENT));
|
345
|
-
}
|
346
|
-
else
|
347
|
-
{
|
348
|
-
return 0;
|
349
|
-
}
|
344
|
+
return error ? -(return_error(ENOENT)) : 0 ;
|
350
345
|
}
|
351
346
|
|
352
347
|
/*
|
@@ -373,7 +368,6 @@ static VALUE unsafe_open(VALUE *args)
|
|
373
368
|
static int rf_open(const char *path,struct fuse_file_info *ffi)
|
374
369
|
{
|
375
370
|
VALUE args[4];
|
376
|
-
VALUE res;
|
377
371
|
int error = 0;
|
378
372
|
|
379
373
|
struct fuse_context *ctx=fuse_get_context();
|
@@ -381,15 +375,9 @@ static int rf_open(const char *path,struct fuse_file_info *ffi)
|
|
381
375
|
|
382
376
|
args[3]=wrap_file_info(ctx,ffi);
|
383
377
|
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
return -(return_error(ENOENT));
|
388
|
-
}
|
389
|
-
else
|
390
|
-
{
|
391
|
-
return 0;
|
392
|
-
}
|
378
|
+
rb_protect((VALUE (*)())unsafe_open,(VALUE) args,&error);
|
379
|
+
|
380
|
+
return error ? -(return_error(ENOENT)) : 0;
|
393
381
|
}
|
394
382
|
|
395
383
|
//This method is registered as a default for release in the case when
|
@@ -401,6 +389,7 @@ static int rf_release_ffi(const char *path, struct fuse_file_info *ffi)
|
|
401
389
|
|
402
390
|
release_file_info(ctx,ffi);
|
403
391
|
|
392
|
+
return 0;
|
404
393
|
}
|
405
394
|
|
406
395
|
/*
|
@@ -426,7 +415,6 @@ static VALUE unsafe_release(VALUE *args)
|
|
426
415
|
static int rf_release(const char *path, struct fuse_file_info *ffi)
|
427
416
|
{
|
428
417
|
VALUE args[4];
|
429
|
-
VALUE res;
|
430
418
|
int error = 0;
|
431
419
|
|
432
420
|
struct fuse_context *ctx=fuse_get_context();
|
@@ -434,16 +422,9 @@ static int rf_release(const char *path, struct fuse_file_info *ffi)
|
|
434
422
|
|
435
423
|
args[3]=release_file_info(ctx,ffi);
|
436
424
|
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
{
|
441
|
-
return -(return_error(ENOENT));
|
442
|
-
}
|
443
|
-
else
|
444
|
-
{
|
445
|
-
return 0;
|
446
|
-
}
|
425
|
+
rb_protect((VALUE (*)())unsafe_release,(VALUE) args,&error);
|
426
|
+
|
427
|
+
return error ? -(return_error(ENOENT)) : 0;
|
447
428
|
}
|
448
429
|
|
449
430
|
/*
|
@@ -467,7 +448,6 @@ static VALUE unsafe_fsync(VALUE *args) {
|
|
467
448
|
static int rf_fsync(const char *path, int datasync, struct fuse_file_info *ffi)
|
468
449
|
{
|
469
450
|
VALUE args[5];
|
470
|
-
VALUE res;
|
471
451
|
int error = 0;
|
472
452
|
|
473
453
|
struct fuse_context *ctx=fuse_get_context();
|
@@ -476,16 +456,9 @@ static int rf_fsync(const char *path, int datasync, struct fuse_file_info *ffi)
|
|
476
456
|
args[3] = INT2NUM(datasync);
|
477
457
|
args[4] = get_file_info(ffi);
|
478
458
|
|
479
|
-
|
459
|
+
rb_protect((VALUE (*)())unsafe_fsync,(VALUE) args,&error);
|
480
460
|
|
481
|
-
|
482
|
-
{
|
483
|
-
return -(return_error(ENOENT));
|
484
|
-
}
|
485
|
-
else
|
486
|
-
{
|
487
|
-
return 0;
|
488
|
-
}
|
461
|
+
return error ? -(return_error(ENOENT)) : 0;
|
489
462
|
}
|
490
463
|
|
491
464
|
|
@@ -519,12 +492,11 @@ static VALUE unsafe_flush(VALUE *args)
|
|
519
492
|
static int rf_flush(const char *path,struct fuse_file_info *ffi)
|
520
493
|
{
|
521
494
|
VALUE args[4];
|
522
|
-
VALUE res;
|
523
495
|
int error = 0;
|
524
496
|
struct fuse_context *ctx=fuse_get_context();
|
525
497
|
init_context_path_args(args,ctx,path);
|
526
498
|
args[3]=get_file_info(ffi);
|
527
|
-
|
499
|
+
rb_protect((VALUE (*)())unsafe_flush,(VALUE) args,&error);
|
528
500
|
|
529
501
|
return error ? -(return_error(ENOENT)) : 0;
|
530
502
|
}
|
@@ -550,12 +522,11 @@ static VALUE unsafe_truncate(VALUE *args)
|
|
550
522
|
static int rf_truncate(const char *path,off_t offset)
|
551
523
|
{
|
552
524
|
VALUE args[4];
|
553
|
-
VALUE res;
|
554
525
|
int error = 0;
|
555
526
|
struct fuse_context *ctx=fuse_get_context();
|
556
527
|
init_context_path_args(args,ctx,path);
|
557
528
|
args[3]=INT2FIX(offset);
|
558
|
-
|
529
|
+
rb_protect((VALUE (*)())unsafe_truncate,(VALUE) args,&error);
|
559
530
|
|
560
531
|
return error ? -(return_error(ENOENT)) : 0;
|
561
532
|
}
|
@@ -584,7 +555,6 @@ static VALUE unsafe_utime(VALUE *args)
|
|
584
555
|
static int rf_utime(const char *path,struct utimbuf *utim)
|
585
556
|
{
|
586
557
|
VALUE args[5];
|
587
|
-
VALUE res;
|
588
558
|
int error = 0;
|
589
559
|
|
590
560
|
struct fuse_context *ctx=fuse_get_context();
|
@@ -592,7 +562,7 @@ static int rf_utime(const char *path,struct utimbuf *utim)
|
|
592
562
|
|
593
563
|
args[3]=INT2NUM(utim->actime);
|
594
564
|
args[4]=INT2NUM(utim->modtime);
|
595
|
-
|
565
|
+
rb_protect((VALUE (*)())unsafe_utime,(VALUE) args,&error);
|
596
566
|
|
597
567
|
return error ? -(return_error(ENOENT)) : 0;
|
598
568
|
}
|
@@ -620,13 +590,12 @@ static VALUE unsafe_chown(VALUE *args)
|
|
620
590
|
static int rf_chown(const char *path,uid_t uid,gid_t gid)
|
621
591
|
{
|
622
592
|
VALUE args[5];
|
623
|
-
VALUE res;
|
624
593
|
int error = 0;
|
625
594
|
struct fuse_context *ctx=fuse_get_context();
|
626
595
|
init_context_path_args(args,ctx,path);
|
627
596
|
args[3]=INT2FIX(uid);
|
628
597
|
args[4]=INT2FIX(gid);
|
629
|
-
|
598
|
+
rb_protect((VALUE (*)())unsafe_chown,(VALUE) args,&error);
|
630
599
|
|
631
600
|
return error ? -(return_error(ENOENT)) : 0;
|
632
601
|
}
|
@@ -653,12 +622,11 @@ static VALUE unsafe_chmod(VALUE *args)
|
|
653
622
|
static int rf_chmod(const char *path,mode_t mode)
|
654
623
|
{
|
655
624
|
VALUE args[4];
|
656
|
-
VALUE res;
|
657
625
|
int error = 0;
|
658
626
|
struct fuse_context *ctx=fuse_get_context();
|
659
627
|
init_context_path_args(args,ctx,path);
|
660
628
|
args[3]=INT2FIX(mode);
|
661
|
-
|
629
|
+
rb_protect((VALUE (*)())unsafe_chmod,(VALUE) args,&error);
|
662
630
|
|
663
631
|
return error ? -(return_error(ENOENT)) : 0;
|
664
632
|
}
|
@@ -684,11 +652,10 @@ static VALUE unsafe_unlink(VALUE *args)
|
|
684
652
|
static int rf_unlink(const char *path)
|
685
653
|
{
|
686
654
|
VALUE args[3];
|
687
|
-
VALUE res;
|
688
655
|
int error = 0;
|
689
656
|
struct fuse_context *ctx=fuse_get_context();
|
690
657
|
init_context_path_args(args,ctx,path);
|
691
|
-
|
658
|
+
rb_protect((VALUE (*)())unsafe_unlink,(VALUE) args,&error);
|
692
659
|
|
693
660
|
return error ? -(return_error(ENOENT)) : 0;
|
694
661
|
}
|
@@ -714,11 +681,10 @@ static VALUE unsafe_rmdir(VALUE *args)
|
|
714
681
|
static int rf_rmdir(const char *path)
|
715
682
|
{
|
716
683
|
VALUE args[3];
|
717
|
-
VALUE res;
|
718
684
|
int error = 0;
|
719
685
|
struct fuse_context *ctx=fuse_get_context();
|
720
686
|
init_context_path_args(args,ctx,path);
|
721
|
-
|
687
|
+
rb_protect((VALUE (*)())unsafe_rmdir, (VALUE) args ,&error);
|
722
688
|
|
723
689
|
return error ? -(return_error(ENOENT)) : 0;
|
724
690
|
}
|
@@ -746,7 +712,6 @@ static VALUE unsafe_symlink(VALUE *args){
|
|
746
712
|
static int rf_symlink(const char *path,const char *as)
|
747
713
|
{
|
748
714
|
VALUE args[4];
|
749
|
-
VALUE res;
|
750
715
|
int error = 0;
|
751
716
|
struct fuse_context *ctx=fuse_get_context();
|
752
717
|
init_context_path_args(args,ctx,path);
|
@@ -754,7 +719,7 @@ static int rf_symlink(const char *path,const char *as)
|
|
754
719
|
args[3]=rb_str_new2(as);
|
755
720
|
rb_filesystem_encode(args[3]);
|
756
721
|
|
757
|
-
|
722
|
+
rb_protect((VALUE (*)())unsafe_symlink,(VALUE) args,&error);
|
758
723
|
|
759
724
|
return error ? -(return_error(ENOENT)) : 0;
|
760
725
|
}
|
@@ -781,7 +746,6 @@ static VALUE unsafe_rename(VALUE *args)
|
|
781
746
|
static int rf_rename(const char *path,const char *as)
|
782
747
|
{
|
783
748
|
VALUE args[4];
|
784
|
-
VALUE res;
|
785
749
|
int error = 0;
|
786
750
|
struct fuse_context *ctx=fuse_get_context();
|
787
751
|
init_context_path_args(args,ctx,path);
|
@@ -789,7 +753,7 @@ static int rf_rename(const char *path,const char *as)
|
|
789
753
|
args[3]=rb_str_new2(as);
|
790
754
|
rb_filesystem_encode(args[3]);
|
791
755
|
|
792
|
-
|
756
|
+
rb_protect((VALUE (*)())unsafe_rename,(VALUE) args,&error);
|
793
757
|
|
794
758
|
return error ? -(return_error(ENOENT)) : 0;
|
795
759
|
}
|
@@ -816,13 +780,12 @@ static VALUE unsafe_link(VALUE *args)
|
|
816
780
|
static int rf_link(const char *path,const char * as)
|
817
781
|
{
|
818
782
|
VALUE args[4];
|
819
|
-
VALUE res;
|
820
783
|
int error = 0;
|
821
784
|
struct fuse_context *ctx=fuse_get_context();
|
822
785
|
init_context_path_args(args,ctx,path);
|
823
786
|
args[3]=rb_str_new2(as);
|
824
787
|
rb_filesystem_encode(args[3]);
|
825
|
-
|
788
|
+
rb_protect((VALUE (*)())unsafe_link,(VALUE) args,&error);
|
826
789
|
|
827
790
|
return error ? -(return_error(ENOENT)) : 0;
|
828
791
|
}
|
@@ -873,7 +836,6 @@ static int rf_read(const char *path,char * buf, size_t size,off_t offset,struct
|
|
873
836
|
VALUE res;
|
874
837
|
int error = 0;
|
875
838
|
long length=0;
|
876
|
-
char* rbuf;
|
877
839
|
|
878
840
|
struct fuse_context *ctx=fuse_get_context();
|
879
841
|
init_context_path_args(args,ctx,path);
|
@@ -971,7 +933,7 @@ static VALUE unsafe_statfs(VALUE *args)
|
|
971
933
|
|
972
934
|
static int rf_statfs(const char * path, struct statvfs * vfsinfo)
|
973
935
|
{
|
974
|
-
VALUE args[
|
936
|
+
VALUE args[3];
|
975
937
|
VALUE res;
|
976
938
|
int error = 0;
|
977
939
|
|
@@ -1016,7 +978,6 @@ static int rf_setxattr(const char *path,const char *name,
|
|
1016
978
|
const char *value, size_t size, int flags)
|
1017
979
|
{
|
1018
980
|
VALUE args[6];
|
1019
|
-
VALUE res;
|
1020
981
|
int error = 0;
|
1021
982
|
|
1022
983
|
struct fuse_context *ctx=fuse_get_context();
|
@@ -1026,7 +987,7 @@ static int rf_setxattr(const char *path,const char *name,
|
|
1026
987
|
args[4]=rb_str_new(value,size);
|
1027
988
|
args[5]=INT2NUM(flags);
|
1028
989
|
|
1029
|
-
|
990
|
+
rb_protect((VALUE (*)())unsafe_setxattr,(VALUE) args,&error);
|
1030
991
|
|
1031
992
|
return error ? -(return_error(ENOENT)) : 0;
|
1032
993
|
}
|
@@ -1058,8 +1019,6 @@ static int rf_getxattr(const char *path,const char *name,char *buf,
|
|
1058
1019
|
{
|
1059
1020
|
VALUE args[4];
|
1060
1021
|
VALUE res;
|
1061
|
-
char *rbuf;
|
1062
|
-
long length = 0;
|
1063
1022
|
int error = 0;
|
1064
1023
|
|
1065
1024
|
struct fuse_context *ctx=fuse_get_context();
|
@@ -1103,8 +1062,6 @@ static int rf_listxattr(const char *path,char *buf, size_t size)
|
|
1103
1062
|
{
|
1104
1063
|
VALUE args[3];
|
1105
1064
|
VALUE res;
|
1106
|
-
char *rbuf;
|
1107
|
-
size_t length =0;
|
1108
1065
|
int error = 0;
|
1109
1066
|
|
1110
1067
|
struct fuse_context *ctx=fuse_get_context();
|
@@ -1112,11 +1069,9 @@ static int rf_listxattr(const char *path,char *buf, size_t size)
|
|
1112
1069
|
|
1113
1070
|
res=rb_protect((VALUE (*)())unsafe_listxattr,(VALUE) args,&error);
|
1114
1071
|
|
1115
|
-
if (error)
|
1116
|
-
{
|
1072
|
+
if (error) {
|
1117
1073
|
return -(return_error(ENOENT));
|
1118
|
-
}
|
1119
|
-
else {
|
1074
|
+
} else {
|
1120
1075
|
return rb_strcpy(res,buf,size);
|
1121
1076
|
}
|
1122
1077
|
}
|
@@ -1142,12 +1097,11 @@ static VALUE unsafe_removexattr(VALUE *args)
|
|
1142
1097
|
static int rf_removexattr(const char *path,const char *name)
|
1143
1098
|
{
|
1144
1099
|
VALUE args[4];
|
1145
|
-
VALUE res;
|
1146
1100
|
int error = 0;
|
1147
1101
|
struct fuse_context *ctx=fuse_get_context();
|
1148
1102
|
init_context_path_args(args,ctx,path);
|
1149
1103
|
args[3]=rb_str_new2(name);
|
1150
|
-
|
1104
|
+
rb_protect((VALUE (*)())unsafe_removexattr,(VALUE) args,&error);
|
1151
1105
|
|
1152
1106
|
return error ? -(return_error(ENOENT)) : 0 ;
|
1153
1107
|
}
|
@@ -1177,14 +1131,13 @@ static VALUE unsafe_opendir(VALUE *args)
|
|
1177
1131
|
static int rf_opendir(const char *path,struct fuse_file_info *ffi)
|
1178
1132
|
{
|
1179
1133
|
VALUE args[4];
|
1180
|
-
VALUE res;
|
1181
1134
|
int error = 0;
|
1182
1135
|
struct fuse_context *ctx=fuse_get_context();
|
1183
1136
|
init_context_path_args(args,ctx,path);
|
1184
1137
|
|
1185
1138
|
args[3]=wrap_file_info(ctx,ffi);
|
1186
1139
|
|
1187
|
-
|
1140
|
+
rb_protect((VALUE (*)())unsafe_opendir,(VALUE) args,&error);
|
1188
1141
|
|
1189
1142
|
return error ? -(return_error(ENOENT)) : 0 ;
|
1190
1143
|
}
|
@@ -1210,14 +1163,13 @@ static VALUE unsafe_releasedir(VALUE *args)
|
|
1210
1163
|
static int rf_releasedir(const char *path,struct fuse_file_info *ffi)
|
1211
1164
|
{
|
1212
1165
|
VALUE args[4];
|
1213
|
-
VALUE res;
|
1214
1166
|
int error = 0;
|
1215
1167
|
|
1216
1168
|
struct fuse_context *ctx=fuse_get_context();
|
1217
1169
|
init_context_path_args(args,ctx,path);
|
1218
1170
|
args[3]=release_file_info(ctx,ffi);
|
1219
1171
|
|
1220
|
-
|
1172
|
+
rb_protect((VALUE (*)())unsafe_releasedir,(VALUE) args,&error);
|
1221
1173
|
|
1222
1174
|
return error ? -(return_error(ENOENT)) : 0 ;
|
1223
1175
|
}
|
@@ -1245,13 +1197,12 @@ static VALUE unsafe_fsyncdir(VALUE *args)
|
|
1245
1197
|
static int rf_fsyncdir(const char *path,int meta,struct fuse_file_info *ffi)
|
1246
1198
|
{
|
1247
1199
|
VALUE args[5];
|
1248
|
-
VALUE res;
|
1249
1200
|
int error = 0;
|
1250
1201
|
struct fuse_context *ctx=fuse_get_context();
|
1251
1202
|
init_context_path_args(args,ctx,path);
|
1252
1203
|
args[3]=INT2NUM(meta);
|
1253
1204
|
args[4]=get_file_info(ffi);
|
1254
|
-
|
1205
|
+
rb_protect((VALUE (*)())unsafe_fsyncdir,(VALUE) args,&error);
|
1255
1206
|
|
1256
1207
|
return error ? -(return_error(ENOENT)) : 0 ;
|
1257
1208
|
}
|
@@ -1275,20 +1226,22 @@ static VALUE unsafe_init(VALUE* args)
|
|
1275
1226
|
static void *rf_init(struct fuse_conn_info *conn)
|
1276
1227
|
{
|
1277
1228
|
VALUE args[3];
|
1278
|
-
VALUE res;
|
1279
1229
|
int error = 0;
|
1280
|
-
|
1281
|
-
|
1230
|
+
struct fuse_context *ctx;
|
1231
|
+
|
1232
|
+
VALUE self, s, fci, fcio;
|
1233
|
+
|
1234
|
+
ctx = fuse_get_context();
|
1282
1235
|
|
1283
|
-
|
1236
|
+
self = (VALUE) ctx->private_data;
|
1284
1237
|
|
1285
1238
|
args[0] = self;
|
1286
1239
|
args[1] = wrap_context(ctx);
|
1287
1240
|
|
1288
1241
|
//Create a struct for the conn_info
|
1289
1242
|
//TODO - some of these are writable!
|
1290
|
-
|
1291
|
-
|
1243
|
+
s = rb_const_get(rb_cObject,rb_intern("Struct"));
|
1244
|
+
fci = rb_funcall(s,rb_intern("new"),7,
|
1292
1245
|
ID2SYM(rb_intern("proto_major")),
|
1293
1246
|
ID2SYM(rb_intern("proto_minor")),
|
1294
1247
|
ID2SYM(rb_intern("async_read")),
|
@@ -1298,7 +1251,7 @@ static void *rf_init(struct fuse_conn_info *conn)
|
|
1298
1251
|
ID2SYM(rb_intern("want"))
|
1299
1252
|
);
|
1300
1253
|
|
1301
|
-
|
1254
|
+
fcio = rb_funcall(fci,rb_intern("new"),7,
|
1302
1255
|
UINT2NUM(conn->proto_major),
|
1303
1256
|
UINT2NUM(conn->proto_minor),
|
1304
1257
|
UINT2NUM(conn->async_read),
|
@@ -1310,50 +1263,13 @@ static void *rf_init(struct fuse_conn_info *conn)
|
|
1310
1263
|
|
1311
1264
|
args[2] = fcio;
|
1312
1265
|
|
1313
|
-
|
1266
|
+
rb_protect((VALUE (*)())unsafe_init,(VALUE) args,&error);
|
1314
1267
|
|
1315
|
-
|
1316
|
-
|
1317
|
-
|
1318
|
-
|
1319
|
-
|
1320
|
-
{
|
1321
|
-
//This previously was the result of the init call (res)
|
1322
|
-
//but it was never made available to any of the file operations
|
1323
|
-
//and nothing was done to prevent it from being GC'd so
|
1324
|
-
//filesystems would need to have stored it separately anyway
|
1325
|
-
return (void *) self;
|
1326
|
-
}
|
1327
|
-
}
|
1328
|
-
|
1329
|
-
/*
|
1330
|
-
Cleanup filesystem
|
1331
|
-
|
1332
|
-
@overload destroy()
|
1333
|
-
@abstract Fuse Operation {http://fuse.sourceforge.net/doxygen/structfuse__operations.html#c41d37ab860204fe4bd7612f9fb036c5 destroy}
|
1334
|
-
|
1335
|
-
@param [Context] context
|
1336
|
-
|
1337
|
-
@return [void]
|
1338
|
-
|
1339
|
-
Called at filesystem exit - which itself is triggered when this fuse object
|
1340
|
-
is garbage collected, so not sure it is actually safe to call this
|
1341
|
-
*/
|
1342
|
-
static VALUE unsafe_destroy(VALUE* args)
|
1343
|
-
{
|
1344
|
-
return rb_funcall3(args[0],rb_intern("destroy"),1,&args[1]);
|
1345
|
-
}
|
1346
|
-
|
1347
|
-
static void rf_destroy(void *user_data)
|
1348
|
-
{
|
1349
|
-
VALUE args[2];
|
1350
|
-
int error = 0;
|
1351
|
-
|
1352
|
-
struct fuse_context *ctx = fuse_get_context();
|
1353
|
-
args[0] = ctx->private_data;
|
1354
|
-
args[1] = wrap_context(ctx);
|
1355
|
-
|
1356
|
-
rb_protect((VALUE (*)())unsafe_destroy,(VALUE) args,&error);
|
1268
|
+
//This previously was the result of the init call (res)
|
1269
|
+
//but it was never made available to any of the file operations
|
1270
|
+
//and nothing was done to prevent it from being GC'd so
|
1271
|
+
//filesystems would need to have stored it separately anyway
|
1272
|
+
return error ? NULL : (void *) self;
|
1357
1273
|
}
|
1358
1274
|
|
1359
1275
|
/*
|
@@ -1377,12 +1293,11 @@ static VALUE unsafe_access(VALUE* args)
|
|
1377
1293
|
static int rf_access(const char *path, int mask)
|
1378
1294
|
{
|
1379
1295
|
VALUE args[4];
|
1380
|
-
VALUE res;
|
1381
1296
|
int error = 0;
|
1382
1297
|
struct fuse_context *ctx=fuse_get_context();
|
1383
1298
|
init_context_path_args(args,ctx,path);
|
1384
1299
|
args[3] = INT2NUM(mask);
|
1385
|
-
|
1300
|
+
rb_protect((VALUE (*)())unsafe_access,(VALUE) args,&error);
|
1386
1301
|
|
1387
1302
|
return error ? -(return_error(ENOENT)) : 0 ;
|
1388
1303
|
}
|
@@ -1412,7 +1327,6 @@ static VALUE unsafe_create(VALUE* args)
|
|
1412
1327
|
static int rf_create(const char *path, mode_t mode, struct fuse_file_info *ffi)
|
1413
1328
|
{
|
1414
1329
|
VALUE args[5];
|
1415
|
-
VALUE res;
|
1416
1330
|
int error = 0;
|
1417
1331
|
|
1418
1332
|
struct fuse_context *ctx = fuse_get_context();
|
@@ -1420,7 +1334,7 @@ static int rf_create(const char *path, mode_t mode, struct fuse_file_info *ffi)
|
|
1420
1334
|
args[3] = INT2NUM(mode);
|
1421
1335
|
args[4] = wrap_file_info(ctx,ffi);
|
1422
1336
|
|
1423
|
-
|
1337
|
+
rb_protect((VALUE (*)())unsafe_create,(VALUE) args,&error);
|
1424
1338
|
|
1425
1339
|
return error ? -(return_error(ENOENT)) : 0 ;
|
1426
1340
|
|
@@ -1450,7 +1364,6 @@ static int rf_ftruncate(const char *path, off_t size,
|
|
1450
1364
|
struct fuse_file_info *ffi)
|
1451
1365
|
{
|
1452
1366
|
VALUE args[5];
|
1453
|
-
VALUE res;
|
1454
1367
|
int error = 0;
|
1455
1368
|
|
1456
1369
|
struct fuse_context *ctx = fuse_get_context();
|
@@ -1458,7 +1371,7 @@ static int rf_ftruncate(const char *path, off_t size,
|
|
1458
1371
|
args[3] = INT2NUM(size);
|
1459
1372
|
args[4] = get_file_info(ffi);
|
1460
1373
|
|
1461
|
-
|
1374
|
+
rb_protect((VALUE (*)())unsafe_ftruncate,(VALUE) args,&error);
|
1462
1375
|
|
1463
1376
|
return error ? -(return_error(ENOENT)) : 0 ;
|
1464
1377
|
}
|
@@ -1517,7 +1430,8 @@ static int rf_fgetattr(const char *path, struct stat *stbuf, struct fuse_file_in
|
|
1517
1430
|
@param [Struct] flock
|
1518
1431
|
|
1519
1432
|
@return [void]
|
1520
|
-
@raise [Errno]
|
1433
|
+
@raise [Errno]
|
1434
|
+
@todo Some of the attributes of the flock struct should be writable
|
1521
1435
|
|
1522
1436
|
The cmd argument will be either F_GETLK, F_SETLK or F_SETLKW.
|
1523
1437
|
|
@@ -1540,17 +1454,19 @@ static int rf_lock(const char *path, struct fuse_file_info *ffi,
|
|
1540
1454
|
int cmd, struct flock *lock)
|
1541
1455
|
{
|
1542
1456
|
VALUE args[6];
|
1543
|
-
VALUE res;
|
1544
1457
|
int error = 0;
|
1545
1458
|
|
1459
|
+
VALUE cStruct;
|
1460
|
+
VALUE lockc;
|
1461
|
+
VALUE locko;
|
1462
|
+
|
1546
1463
|
struct fuse_context *ctx = fuse_get_context();
|
1547
1464
|
init_context_path_args(args,ctx,path);
|
1548
1465
|
|
1549
|
-
//TODO Wrap the struct flock so these attributes can be set
|
1550
1466
|
|
1551
1467
|
//Create a struct for the lock structure
|
1552
|
-
|
1553
|
-
|
1468
|
+
cStruct = rb_const_get(rb_cObject,rb_intern("Struct"));
|
1469
|
+
lockc = rb_funcall(cStruct,rb_intern("new"),5,
|
1554
1470
|
ID2SYM(rb_intern("l_type")),
|
1555
1471
|
ID2SYM(rb_intern("l_whence")),
|
1556
1472
|
ID2SYM(rb_intern("l_start")),
|
@@ -1558,7 +1474,7 @@ static int rf_lock(const char *path, struct fuse_file_info *ffi,
|
|
1558
1474
|
ID2SYM(rb_intern("l_pid"))
|
1559
1475
|
);
|
1560
1476
|
|
1561
|
-
|
1477
|
+
locko = rb_funcall(lockc,rb_intern("new"),5,
|
1562
1478
|
UINT2NUM(lock->l_type),
|
1563
1479
|
UINT2NUM(lock->l_whence),
|
1564
1480
|
UINT2NUM(lock->l_start),
|
@@ -1570,7 +1486,7 @@ static int rf_lock(const char *path, struct fuse_file_info *ffi,
|
|
1570
1486
|
args[4] = INT2NUM(cmd);
|
1571
1487
|
args[5] = locko;
|
1572
1488
|
|
1573
|
-
|
1489
|
+
rb_protect((VALUE (*)())unsafe_lock,(VALUE) args,&error);
|
1574
1490
|
|
1575
1491
|
return error ? -(return_error(ENOENT)) : 0 ;
|
1576
1492
|
}
|
@@ -1598,7 +1514,6 @@ static VALUE unsafe_utimens(VALUE *args)
|
|
1598
1514
|
static int rf_utimens(const char * path, const struct timespec tv[2])
|
1599
1515
|
{
|
1600
1516
|
VALUE args[5];
|
1601
|
-
VALUE res;
|
1602
1517
|
int error = 0;
|
1603
1518
|
|
1604
1519
|
struct fuse_context *ctx = fuse_get_context();
|
@@ -1619,7 +1534,7 @@ static int rf_utimens(const char * path, const struct timespec tv[2])
|
|
1619
1534
|
rb_intern("+"), 1, INT2NUM(tv[1].tv_nsec)
|
1620
1535
|
);
|
1621
1536
|
|
1622
|
-
|
1537
|
+
rb_protect((VALUE (*)())unsafe_utimens,(VALUE) args, &error);
|
1623
1538
|
return error ? -(return_error(ENOENT)) : 0 ;
|
1624
1539
|
}
|
1625
1540
|
|
@@ -1670,7 +1585,7 @@ static int rf_bmap(const char *path, size_t blocksize, uint64_t *idx)
|
|
1670
1585
|
}
|
1671
1586
|
|
1672
1587
|
//----------------------IOCTL
|
1673
|
-
|
1588
|
+
#ifdef RFUSE_BROKEN
|
1674
1589
|
static VALUE unsafe_ioctl(VALUE *args)
|
1675
1590
|
{
|
1676
1591
|
VALUE path = args[0];
|
@@ -1682,7 +1597,7 @@ static VALUE unsafe_ioctl(VALUE *args)
|
|
1682
1597
|
|
1683
1598
|
struct fuse_context *ctx = fuse_get_context();
|
1684
1599
|
|
1685
|
-
return rb_funcall( ctx->private_data, rb_intern("ioctl"), 7, wrap_context(ctx),
|
1600
|
+
return rb_funcall((VALUE) ctx->private_data, rb_intern("ioctl"), 7, wrap_context(ctx),
|
1686
1601
|
path, cmd, arg, ffi, flags, data);
|
1687
1602
|
}
|
1688
1603
|
|
@@ -1710,9 +1625,10 @@ static int rf_ioctl(const char *path, int cmd, void *arg,
|
|
1710
1625
|
|
1711
1626
|
return 0;
|
1712
1627
|
}
|
1628
|
+
#endif
|
1713
1629
|
|
1714
1630
|
//----------------------POLL
|
1715
|
-
|
1631
|
+
#ifdef RFUSE_BROKEN
|
1716
1632
|
static VALUE unsafe_poll(VALUE *args)
|
1717
1633
|
{
|
1718
1634
|
VALUE path = args[0];
|
@@ -1751,6 +1667,7 @@ static int rf_poll(const char *path, struct fuse_file_info *ffi,
|
|
1751
1667
|
}
|
1752
1668
|
return 0;
|
1753
1669
|
}
|
1670
|
+
#endif
|
1754
1671
|
|
1755
1672
|
/*
|
1756
1673
|
Is the filesystem successfully mounted
|
@@ -1794,8 +1711,11 @@ VALUE rf_unmount(VALUE self)
|
|
1794
1711
|
VALUE rf_mountname(VALUE self)
|
1795
1712
|
{
|
1796
1713
|
struct intern_fuse *inf;
|
1714
|
+
VALUE result;
|
1715
|
+
|
1797
1716
|
Data_Get_Struct(self,struct intern_fuse,inf);
|
1798
|
-
|
1717
|
+
|
1718
|
+
result = rb_str_new2(inf->mountpoint);
|
1799
1719
|
rb_filesystem_encode(result);
|
1800
1720
|
|
1801
1721
|
return result;
|
@@ -1808,7 +1728,7 @@ VALUE rf_invalidate(VALUE self,VALUE path)
|
|
1808
1728
|
{
|
1809
1729
|
struct intern_fuse *inf;
|
1810
1730
|
Data_Get_Struct(self,struct intern_fuse,inf);
|
1811
|
-
return fuse_invalidate(inf->fuse,
|
1731
|
+
return fuse_invalidate(inf->fuse,StringValueCStr(path));
|
1812
1732
|
}
|
1813
1733
|
|
1814
1734
|
/*
|
@@ -1853,6 +1773,7 @@ VALUE rf_process(VALUE self)
|
|
1853
1773
|
|
1854
1774
|
/*
|
1855
1775
|
* initialize and mount the filesystem
|
1776
|
+
* @overload initialize(mountpoint,*options)
|
1856
1777
|
* @param [String] mountpoint The mountpoint
|
1857
1778
|
* @param [Array<String>] options fuse arguments (-h to see a list)
|
1858
1779
|
*/
|
@@ -1862,14 +1783,20 @@ static VALUE rf_initialize(
|
|
1862
1783
|
VALUE opts)
|
1863
1784
|
{
|
1864
1785
|
|
1786
|
+
VALUE mountpoint;
|
1787
|
+
struct intern_fuse *inf;
|
1788
|
+
int init_result;
|
1789
|
+
struct fuse_args *args;
|
1790
|
+
|
1865
1791
|
//Allow things like Pathname to be sent as a mountpoint
|
1866
|
-
|
1792
|
+
mountpoint = rb_obj_as_string(mountpoint_obj);
|
1867
1793
|
Check_Type(opts, T_ARRAY);
|
1868
1794
|
|
1869
|
-
struct intern_fuse *inf;
|
1870
1795
|
Data_Get_Struct(self,struct intern_fuse,inf);
|
1871
1796
|
|
1872
1797
|
inf->mountpoint = strdup(StringValueCStr(mountpoint));
|
1798
|
+
|
1799
|
+
args = rarray2fuseargs(opts);
|
1873
1800
|
|
1874
1801
|
if (RESPOND_TO(self,"getattr"))
|
1875
1802
|
inf->fuse_op.getattr = rf_getattr;
|
@@ -1939,8 +1866,6 @@ static VALUE rf_initialize(
|
|
1939
1866
|
inf->fuse_op.fsyncdir = rf_fsyncdir;
|
1940
1867
|
if (RESPOND_TO(self,"init"))
|
1941
1868
|
inf->fuse_op.init = rf_init;
|
1942
|
-
// if (RESPOND_TO(self,"destroy"))
|
1943
|
-
// inf->fuse_op.destroy = rf_destroy;
|
1944
1869
|
if (RESPOND_TO(self,"access"))
|
1945
1870
|
inf->fuse_op.access = rf_access;
|
1946
1871
|
if (RESPOND_TO(self,"ftruncate"))
|
@@ -1953,29 +1878,23 @@ static VALUE rf_initialize(
|
|
1953
1878
|
inf->fuse_op.utimens = rf_utimens;
|
1954
1879
|
if (RESPOND_TO(self,"bmap"))
|
1955
1880
|
inf->fuse_op.bmap = rf_bmap;
|
1956
|
-
|
1881
|
+
#ifdef RFUSE_BROKEN
|
1957
1882
|
if (RESPOND_TO(self,"ioctl"))
|
1958
1883
|
inf->fuse_op.ioctl = rf_ioctl;
|
1959
1884
|
if (RESPOND_TO(self,"poll"))
|
1960
1885
|
inf->fuse_op.poll = rf_poll;
|
1961
|
-
|
1962
|
-
|
1963
|
-
struct fuse_args *args = rarray2fuseargs(opts);
|
1964
|
-
|
1965
|
-
//Store our fuse object in user_data, this will be returned to use in the
|
1966
|
-
//session context
|
1967
|
-
void* user_data = self;
|
1886
|
+
#endif
|
1968
1887
|
|
1969
|
-
int init_result;
|
1970
1888
|
|
1971
1889
|
// init_result indicates not mounted, but so does inf->fuse == NULL
|
1972
1890
|
// raise exceptions only if we try to use the mount
|
1973
1891
|
// can test with mounted?
|
1974
|
-
|
1892
|
+
// Note we are storing this Ruby object as the FUSE user_data
|
1893
|
+
init_result = intern_fuse_init(inf, args, (void *) self);
|
1975
1894
|
|
1976
1895
|
//Create the open files hash where we cache FileInfo objects
|
1977
|
-
VALUE open_files_hash;
|
1978
1896
|
if (init_result == 0) {
|
1897
|
+
VALUE open_files_hash;
|
1979
1898
|
open_files_hash=rb_hash_new();
|
1980
1899
|
rb_iv_set(self,"@open_files",open_files_hash);
|
1981
1900
|
rb_funcall(self,rb_intern("ruby_initialize"),0);
|
@@ -2008,8 +1927,11 @@ void rfuse_init(VALUE module)
|
|
2008
1927
|
//Trick Yardoc
|
2009
1928
|
mRFuse = rb_define_mRFuse("RFuse");
|
2010
1929
|
#endif
|
1930
|
+
VALUE cFuse;
|
1931
|
+
|
2011
1932
|
mRFuse = module;
|
2012
|
-
|
1933
|
+
|
1934
|
+
cFuse = rb_define_class_under(mRFuse,"Fuse",rb_cObject);
|
2013
1935
|
|
2014
1936
|
rb_define_alloc_func(cFuse,rf_new);
|
2015
1937
|
|