27 |
# define FUSE_CONTEXT_PRE |
# define FUSE_CONTEXT_PRE |
28 |
# define FUSE_CONTEXT_POST |
# define FUSE_CONTEXT_POST |
29 |
#endif |
#endif |
30 |
#include <fuse/fuse.h> |
#include <fuse.h> |
31 |
|
|
32 |
#undef DEBUGf |
#undef DEBUGf |
33 |
#if 1 |
#if 0 |
34 |
#define DEBUGf(f, a...) fprintf(stderr, "%s:%d (%i): " f,__BASE_FILE__,__LINE__,sp-PL_stack_base ,##a ) |
#define DEBUGf(f, a...) fprintf(stderr, "%s:%d (%i): " f,__BASE_FILE__,__LINE__,sp-PL_stack_base ,##a ) |
35 |
#else |
#else |
36 |
#define DEBUGf(a...) |
#define DEBUGf(a...) |
119 |
return rv; |
return rv; |
120 |
} |
} |
121 |
|
|
122 |
|
#if 0 |
123 |
|
/* |
124 |
|
* This doesn't yet work... we alwas get ENOSYS when trying to use readdir(). |
125 |
|
* Well, of course, getdir() is fine as well. |
126 |
|
*/ |
127 |
|
int _PLfuse_readdir(const char *file, void *dirh, fuse_fill_dir_t dirfil, off_t off, struct fuse_file_info *fi) { |
128 |
|
#endif |
129 |
int _PLfuse_getdir(const char *file, fuse_dirh_t dirh, fuse_dirfil_t dirfil) { |
int _PLfuse_getdir(const char *file, fuse_dirh_t dirh, fuse_dirfil_t dirfil) { |
130 |
int prv, rv; |
int prv, rv; |
131 |
FUSE_CONTEXT_PRE; |
FUSE_CONTEXT_PRE; |
141 |
if(prv) { |
if(prv) { |
142 |
rv = POPi; |
rv = POPi; |
143 |
while(--prv) |
while(--prv) |
144 |
dirfil(dirh,POPp,0); |
dirfil(dirh,POPp,0,0); |
145 |
} else { |
} else { |
146 |
fprintf(stderr,"getdir() handler returned nothing!\n"); |
fprintf(stderr,"getdir() handler returned nothing!\n"); |
147 |
rv = -ENOSYS; |
rv = -ENOSYS; |
453 |
return rv; |
return rv; |
454 |
} |
} |
455 |
|
|
456 |
int _PLfuse_open (const char *file, int flags) { |
int _PLfuse_open (const char *file, struct fuse_file_info *fi) { |
457 |
int rv; |
int rv; |
458 |
SV *rvsv; |
SV *rvsv; |
459 |
char *rvstr; |
char *rvstr; |
460 |
|
int flags = fi->flags; |
461 |
FUSE_CONTEXT_PRE; |
FUSE_CONTEXT_PRE; |
462 |
dSP; |
dSP; |
463 |
DEBUGf("open begin\n"); |
DEBUGf("open begin\n"); |
481 |
return rv; |
return rv; |
482 |
} |
} |
483 |
|
|
484 |
int _PLfuse_read (const char *file, char *buf, size_t buflen, off_t off) { |
int _PLfuse_read (const char *file, char *buf, size_t buflen, off_t off, struct fuse_file_info *fi) { |
485 |
int rv; |
int rv; |
486 |
char *rvstr; |
char *rvstr; |
487 |
FUSE_CONTEXT_PRE; |
FUSE_CONTEXT_PRE; |
522 |
return rv; |
return rv; |
523 |
} |
} |
524 |
|
|
525 |
int _PLfuse_write (const char *file, const char *buf, size_t buflen, off_t off) { |
int _PLfuse_write (const char *file, const char *buf, size_t buflen, off_t off, struct fuse_file_info *fi) { |
526 |
int rv; |
int rv; |
527 |
char *rvstr; |
char *rvstr; |
528 |
FUSE_CONTEXT_PRE; |
FUSE_CONTEXT_PRE; |
549 |
return rv; |
return rv; |
550 |
} |
} |
551 |
|
|
|
/* FIXME check for old fuse API (< 21?) and use statfs here */ |
|
552 |
int _PLfuse_statfs (const char *file, struct statvfs *st) { |
int _PLfuse_statfs (const char *file, struct statvfs *st) { |
553 |
int rv; |
int rv; |
554 |
char *rvstr; |
char *rvstr; |
563 |
SPAGAIN; |
SPAGAIN; |
564 |
DEBUGf("statfs got %i params\n",rv); |
DEBUGf("statfs got %i params\n",rv); |
565 |
if(rv == 6 || rv == 7) { |
if(rv == 6 || rv == 7) { |
566 |
st->f_bsize = POPi; |
st->f_bsize = POPi; |
567 |
st->f_bfree = st->f_bavail = POPi; |
st->f_bfree = POPi; |
568 |
st->f_blocks = POPi; |
st->f_blocks = POPi; |
569 |
st->f_ffree = st->f_favail = POPi; |
st->f_ffree = POPi; |
570 |
st->f_files = POPi; |
st->f_files = POPi; |
571 |
st->f_namemax = POPi; |
st->f_namemax = POPi; |
572 |
/* zero all other */ |
/* zero and fill-in other */ |
|
st->f_frsize = 4096; |
|
573 |
st->f_fsid = 0; |
st->f_fsid = 0; |
574 |
|
st->f_frsize = 4096; |
575 |
st->f_flag = 0; |
st->f_flag = 0; |
576 |
|
st->f_bavail = st->f_bfree; |
577 |
|
st->f_favail = st->f_ffree; |
578 |
|
|
579 |
if(rv == 7) |
if(rv == 7) |
580 |
rv = POPi; |
rv = POPi; |
596 |
return rv; |
return rv; |
597 |
} |
} |
598 |
|
|
599 |
int _PLfuse_flush (const char *file) { |
int _PLfuse_flush (const char *file, struct fuse_file_info *fi) { |
600 |
int rv; |
int rv; |
601 |
char *rvstr; |
char *rvstr; |
602 |
FUSE_CONTEXT_PRE; |
FUSE_CONTEXT_PRE; |
621 |
return rv; |
return rv; |
622 |
} |
} |
623 |
|
|
624 |
int _PLfuse_release (const char *file, int flags) { |
int _PLfuse_release (const char *file, struct fuse_file_info *fi) { |
625 |
int rv; |
int rv; |
626 |
char *rvstr; |
char *rvstr; |
627 |
|
int flags = fi->flags; |
628 |
FUSE_CONTEXT_PRE; |
FUSE_CONTEXT_PRE; |
629 |
dSP; |
dSP; |
630 |
DEBUGf("release begin\n"); |
DEBUGf("release begin\n"); |
648 |
return rv; |
return rv; |
649 |
} |
} |
650 |
|
|
651 |
int _PLfuse_fsync (const char *file, int flags) { |
int _PLfuse_fsync (const char *file, int datasync, struct fuse_file_info *fi) { |
652 |
int rv; |
int rv; |
653 |
char *rvstr; |
char *rvstr; |
654 |
|
int flags = fi->flags; |
655 |
FUSE_CONTEXT_PRE; |
FUSE_CONTEXT_PRE; |
656 |
dSP; |
dSP; |
657 |
DEBUGf("fsync begin\n"); |
DEBUGf("fsync begin\n"); |
845 |
getattr: _PLfuse_getattr, |
getattr: _PLfuse_getattr, |
846 |
readlink: _PLfuse_readlink, |
readlink: _PLfuse_readlink, |
847 |
getdir: _PLfuse_getdir, |
getdir: _PLfuse_getdir, |
848 |
|
#if 0 |
849 |
|
readdir: _PLfuse_readdir, |
850 |
|
#endif |
851 |
mknod: _PLfuse_mknod, |
mknod: _PLfuse_mknod, |
852 |
mkdir: _PLfuse_mkdir, |
mkdir: _PLfuse_mkdir, |
853 |
unlink: _PLfuse_unlink, |
unlink: _PLfuse_unlink, |
884 |
int i, fd, varnum = 0, debug, threaded, have_mnt; |
int i, fd, varnum = 0, debug, threaded, have_mnt; |
885 |
char *mountpoint; |
char *mountpoint; |
886 |
char *mountopts; |
char *mountopts; |
887 |
|
struct fuse_args margs = FUSE_ARGS_INIT(0, NULL); |
888 |
|
struct fuse_args fargs = FUSE_ARGS_INIT(0, NULL); |
889 |
STRLEN n_a; |
STRLEN n_a; |
890 |
STRLEN l; |
STRLEN l; |
891 |
INIT: |
INIT: |
927 |
i+4,SvPVbyte_nolen(var)); |
i+4,SvPVbyte_nolen(var)); |
928 |
} |
} |
929 |
} |
} |
930 |
/* FIXME: need to pass fusermount arguments */ |
/* |
931 |
fd = fuse_mount(mountpoint,mountopts); |
* XXX: What comes here is just a ridiculous use of the option parsing API |
932 |
|
* to hack on compatibility with other parts of the new API. First and |
933 |
|
* foremost, real C argc/argv would be good to get at... |
934 |
|
*/ |
935 |
|
if (mountopts && |
936 |
|
(fuse_opt_add_arg(&margs, "") == -1 || |
937 |
|
fuse_opt_add_arg(&margs, "-o") == -1 || |
938 |
|
fuse_opt_add_arg(&margs, mountopts) == -1)) { |
939 |
|
fuse_opt_free_args(&margs); |
940 |
|
croak("out of memory\n"); |
941 |
|
} |
942 |
|
fd = fuse_mount(mountpoint,&margs); |
943 |
|
fuse_opt_free_args(&margs); |
944 |
if(fd < 0) |
if(fd < 0) |
945 |
croak("could not mount fuse filesystem!"); |
croak("could not mount fuse filesystem!"); |
946 |
|
if (debug && |
947 |
|
(fuse_opt_add_arg(&fargs, "") == -1 || |
948 |
|
fuse_opt_add_arg(&fargs, "-d") == -1)) { |
949 |
|
fuse_opt_free_args(&fargs); |
950 |
|
croak("out of memory\n"); |
951 |
|
} |
952 |
if(threaded) { |
if(threaded) { |
953 |
fuse_loop_mt(fuse_new(fd,debug ? "debug" : NULL,&fops)); |
fuse_loop_mt(fuse_new(fd,&fargs,&fops,sizeof(fops)/sizeof(void*))); |
954 |
} else |
} else |
955 |
fuse_loop(fuse_new(fd,debug ? "debug" : NULL,&fops)); |
fuse_loop(fuse_new(fd,&fargs,&fops,sizeof(fops)/sizeof(void*))); |
956 |
|
fuse_opt_free_args(&fargs); |