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