#include <fuse/fuse.h>
#undef DEBUGf
-#if 0
+#if 1
#define DEBUGf(f, a...) fprintf(stderr, "%s:%d (%i): " f,__BASE_FILE__,__LINE__,sp-PL_stack_base ,##a )
#else
#define DEBUGf(a...)
rv = 0;
}
if(rv > buflen)
- croak("%i: read() handler returned more than buflen! (%i > %i)",getpid(),rv,buflen);
+ croak("read() handler returned more than buflen! (%i > %i)",rv,buflen);
if(rv)
memcpy(buf,SvPV_nolen(mysv),rv);
}
return rv;
}
-int _PLfuse_statfs (const char *file, struct statfs *st) {
+/* FIXME check for old fuse API (< 21?) and use statfs here */
+int _PLfuse_statfs (const char *file, struct statvfs *st) {
int rv;
char *rvstr;
FUSE_CONTEXT_PRE;
PUTBACK;
rv = call_sv(_PLfuse_callbacks[17],G_ARRAY);
SPAGAIN;
- if(rv > 5) {
+ DEBUGf("statfs got %i params\n",rv);
+ if(rv == 6 || rv == 7) {
st->f_bsize = POPi;
- st->f_bfree = POPi;
+ st->f_bfree = st->f_bavail = POPi;
st->f_blocks = POPi;
- st->f_ffree = POPi;
+ st->f_ffree = st->f_favail = POPi;
st->f_files = POPi;
- st->f_namelen = POPi;
- if(rv > 6)
+ st->f_namemax = POPi;
+ /* zero all other */
+ st->f_frsize = 4096;
+ st->f_fsid = 0;
+ st->f_flag = 0;
+
+ if(rv == 7)
rv = POPi;
else
rv = 0;
void
perl_fuse_main(...)
PREINIT:
- 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 =
+ {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};
int i, fd, varnum = 0, debug, threaded, have_mnt;
char *mountpoint;
char *mountopts;
mountopts = SvPV_nolen(ST(3));
for(i=0;i<N_CALLBACKS;i++) {
SV *var = ST(i+4);
- /* allow symbolic references, or real code references. */
- if((var != &PL_sv_undef) && (SvPOK(var) || (SvROK(var) && SvTYPE(SvRV(var)) == SVt_PVCV))) {
+ /* allow symbolic references, or real code references. */
+ if(SvOK(var) && (SvPOK(var) || (SvROK(var) && SvTYPE(SvRV(var)) == SVt_PVCV))) {
void **tmp1 = (void**)&_available_ops, **tmp2 = (void**)&fops;
tmp2[i] = tmp1[i];
+#ifdef FUSE_USE_ITHREADS
if(threaded)
/* note: under 5.8.7, this croaks for code references. */
SvSHARE(var);
+#endif
_PLfuse_callbacks[i] = var;
+ } else
+ if(SvOK(var)) {
+ croak("invalid callback passed to perl_fuse_main "
+ "(%s is not a string, code ref, or undef).\n",
+ i+4,SvPVbyte_nolen(var));
}
}
/* FIXME: need to pass fusermount arguments */