30 |
#include <fuse/fuse.h> |
#include <fuse/fuse.h> |
31 |
|
|
32 |
#undef DEBUGf |
#undef DEBUGf |
33 |
#if 0 |
#if 1 |
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...) |
501 |
rv = 0; |
rv = 0; |
502 |
} |
} |
503 |
if(rv > buflen) |
if(rv > buflen) |
504 |
croak("%i: read() handler returned more than buflen! (%i > %i)",getpid(),rv,buflen); |
croak("read() handler returned more than buflen! (%i > %i)",rv,buflen); |
505 |
if(rv) |
if(rv) |
506 |
memcpy(buf,SvPV_nolen(mysv),rv); |
memcpy(buf,SvPV_nolen(mysv),rv); |
507 |
} |
} |
541 |
return rv; |
return rv; |
542 |
} |
} |
543 |
|
|
544 |
int _PLfuse_statfs (const char *file, struct statfs *st) { |
/* FIXME check for old fuse API (< 21?) and use statfs here */ |
545 |
|
#ifdef __FreeBSD__ |
546 |
|
#define _fuse_statvfs statfs |
547 |
|
#else |
548 |
|
#define _fuse_statvfs statvfs |
549 |
|
#endif |
550 |
|
int _PLfuse_statfs (const char *file, struct _fuse_statvfs *st) { |
551 |
|
|
552 |
int rv; |
int rv; |
553 |
char *rvstr; |
char *rvstr; |
554 |
FUSE_CONTEXT_PRE; |
FUSE_CONTEXT_PRE; |
560 |
PUTBACK; |
PUTBACK; |
561 |
rv = call_sv(_PLfuse_callbacks[17],G_ARRAY); |
rv = call_sv(_PLfuse_callbacks[17],G_ARRAY); |
562 |
SPAGAIN; |
SPAGAIN; |
563 |
if(rv > 5) { |
DEBUGf("statfs got %i params\n",rv); |
564 |
st->f_bsize = POPi; |
if(rv == 6 || rv == 7) { |
565 |
st->f_bfree = POPi; |
st->f_bsize = POPi; |
566 |
st->f_blocks = POPi; |
st->f_bfree = POPi; |
567 |
st->f_ffree = POPi; |
st->f_blocks = POPi; |
568 |
st->f_files = POPi; |
st->f_ffree = POPi; |
569 |
st->f_namelen = POPi; |
st->f_files = POPi; |
570 |
if(rv > 6) |
st->f_namemax = POPi; |
571 |
|
#ifndef __FreeBSD__ |
572 |
|
/* zero and fill-in other */ |
573 |
|
st->f_fsid = 0; |
574 |
|
st->f_frsize = 4096; |
575 |
|
st->f_flag = 0; |
576 |
|
st->f_bavail = st->f_bfree; |
577 |
|
st->f_favail = st->f_ffree; |
578 |
|
#endif |
579 |
|
|
580 |
|
if(rv == 7) |
581 |
rv = POPi; |
rv = POPi; |
582 |
else |
else |
583 |
rv = 0; |
rv = 0; |
874 |
void |
void |
875 |
perl_fuse_main(...) |
perl_fuse_main(...) |
876 |
PREINIT: |
PREINIT: |
877 |
struct fuse_operations fops = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL}; |
struct fuse_operations fops = |
878 |
|
{NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, |
879 |
|
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL}; |
880 |
int i, fd, varnum = 0, debug, threaded, have_mnt; |
int i, fd, varnum = 0, debug, threaded, have_mnt; |
881 |
char *mountpoint; |
char *mountpoint; |
882 |
char *mountopts; |
char *mountopts; |
904 |
mountopts = SvPV_nolen(ST(3)); |
mountopts = SvPV_nolen(ST(3)); |
905 |
for(i=0;i<N_CALLBACKS;i++) { |
for(i=0;i<N_CALLBACKS;i++) { |
906 |
SV *var = ST(i+4); |
SV *var = ST(i+4); |
907 |
/* allow symbolic references, or real code references. */ |
/* allow symbolic references, or real code references. */ |
908 |
if((var != &PL_sv_undef) && (SvPOK(var) || (SvROK(var) && SvTYPE(SvRV(var)) == SVt_PVCV))) { |
if(SvOK(var) && (SvPOK(var) || (SvROK(var) && SvTYPE(SvRV(var)) == SVt_PVCV))) { |
909 |
void **tmp1 = (void**)&_available_ops, **tmp2 = (void**)&fops; |
void **tmp1 = (void**)&_available_ops, **tmp2 = (void**)&fops; |
910 |
tmp2[i] = tmp1[i]; |
tmp2[i] = tmp1[i]; |
911 |
|
#ifdef FUSE_USE_ITHREADS |
912 |
if(threaded) |
if(threaded) |
913 |
/* note: under 5.8.7, this croaks for code references. */ |
/* note: under 5.8.7, this croaks for code references. */ |
914 |
SvSHARE(var); |
SvSHARE(var); |
915 |
|
#endif |
916 |
_PLfuse_callbacks[i] = var; |
_PLfuse_callbacks[i] = var; |
917 |
|
} else |
918 |
|
if(SvOK(var)) { |
919 |
|
croak("invalid callback passed to perl_fuse_main " |
920 |
|
"(%s is not a string, code ref, or undef).\n", |
921 |
|
i+4,SvPVbyte_nolen(var)); |
922 |
} |
} |
923 |
} |
} |
924 |
/* FIXME: need to pass fusermount arguments */ |
/* FIXME: need to pass fusermount arguments */ |