#ifdef USE_ITHREADS
# ifdef I_PTHREAD
# define FUSE_USE_ITHREADS
+# if (PERL_VERSION < 8) || (PERL_VERSION == 8 && PERL_SUBVERSION < 9)
+# define tTHX PerlInterpreter*
+# define STR_WITH_LEN(s) ("" s ""), (sizeof(s)-1)
+# define hv_fetchs(hv,key,lval) Perl_hv_fetch(aTHX_ hv, STR_WITH_LEN(key), lval)
+# define dMY_CXT_INTERP(interp) \
+ SV *my_cxt_sv = *hv_fetchs(interp->Imodglobal, MY_CXT_KEY, TRUE); \
+ my_cxt_t *my_cxtp = INT2PTR(my_cxt_t*, SvUV(my_cxt_sv))
+# endif
# else
# warning "Sorry, I don't know how to handle ithreads on this architecture. Building non-threaded version"
# endif
/* Global Data */
#define MY_CXT_KEY "Fuse::_guts" XS_VERSION
-/* #if FUSE_VERSION >= 28
-# define N_CALLBACKS 41 */
-#if FUSE_VERSION >= 26
+#if FUSE_VERSION >= 28
+# define N_CALLBACKS 40
+/* # define N_CALLBACKS 41 */
+#elif FUSE_VERSION >= 26
# define N_CALLBACKS 38
#elif FUSE_VERSION >= 25
# define N_CALLBACKS 35
typedef struct {
SV *callback[N_CALLBACKS];
HV *handles;
+#ifdef USE_ITHREADS
tTHX self;
+#endif
int threaded;
+#ifdef USE_ITHREADS
perl_mutex mutex;
+#endif
} my_cxt_t;
START_MY_CXT;
#define CLONE_INTERP(parent) S_clone_interp(parent)
tTHX S_clone_interp(tTHX parent) {
+# if (PERL_VERSION < 10)
+ tTHX my_perl = parent;
+#endif
dMY_CXT_INTERP(parent);
if(MY_CXT.threaded) {
MUTEX_LOCK(&MY_CXT.mutex);
return rv;
}
+#if __FreeBSD__ >= 10
+int _PLfuse_setxattr (const char *file, const char *name, const char *buf, size_t buflen, int flags, uint32_t position) {
+#else
int _PLfuse_setxattr (const char *file, const char *name, const char *buf, size_t buflen, int flags) {
+#endif
int rv;
FUSE_CONTEXT_PRE;
DEBUGf("setxattr begin\n");
return rv;
}
+#if __FreeBSD__ >= 10
+int _PLfuse_getxattr (const char *file, const char *name, char *buf, size_t buflen, uint32_t position) {
+#else
int _PLfuse_getxattr (const char *file, const char *name, char *buf, size_t buflen) {
+#endif
int rv;
FUSE_CONTEXT_PRE;
DEBUGf("getxattr begin\n");
}
#endif /* FUSE_VERSION >= 26 */
-#if 0
#if FUSE_VERSION >= 28
int _PLfuse_ioctl(const char *file, int cmd, void *arg,
struct fuse_file_info *fi, unsigned int flags, void *data) {
int rv;
+ SV *sv = NULL;
FUSE_CONTEXT_PRE;
DEBUGf("ioctl begin\n");
ENTER;
XPUSHs(sv_2mortal(newSVpv(file,0)));
XPUSHs(sv_2mortal(newSViv(cmd)));
XPUSHs(sv_2mortal(newSViv(flags)));
- if (_IOC_DIR(cmd) & _IOC_READ)
+ if (_IOC_DIR(cmd) & _IOC_WRITE)
XPUSHs(sv_2mortal(newSVpvn(data, _IOC_SIZE(cmd))));
else
XPUSHs(&PL_sv_undef);
PUTBACK;
rv = call_sv(MY_CXT.callback[39],G_ARRAY);
SPAGAIN;
- if (_IOC_DIR(cmd) & _IOC_WRITE) {
- if (rv == 2) {
- SV *sv = POPs;
- unsigned int len;
+ if ((_IOC_DIR(cmd) & _IOC_READ) && (rv == 2)) {
+ sv = POPs;
+ rv--;
+ }
+
+ if (rv > 0)
+ rv = POPi;
+
+ if ((_IOC_DIR(cmd) & _IOC_READ) && !rv) {
+ if (sv) {
+ size_t len;
char *rdata = SvPV(sv, len);
+
if (len > _IOC_SIZE(cmd)) {
fprintf(stderr, "ioctl(): returned data was too large for data area\n");
rv = -EFBIG;
memset(data, 0, _IOC_SIZE(cmd));
memcpy(data, rdata, len);
}
-
- rv--;
}
else {
- fprintf(stderr, "ioctl(): ioctl was a write op, but no data was returned from call?\n");
+ fprintf(stderr, "ioctl(): ioctl was a read op, but no data was returned from call?\n");
rv = -EFAULT;
}
}
- if (rv > 0)
- rv = POPi;
FREETMPS;
LEAVE;
PUTBACK;
return rv;
}
+#if 0
int _PLfuse_poll(const char *file, struct fuse_file_info *fi,
struct fuse_pollhandle *ph, unsigned *reventsp) {
}
-#endif /* FUSE_VERSION >= 28 */
#endif
+#endif /* FUSE_VERSION >= 28 */
struct fuse_operations _available_ops = {
getattr: _PLfuse_getattr,
utimens: _PLfuse_utimens,
bmap: _PLfuse_bmap,
#endif /* FUSE_VERSION >= 26 */
-#if 0
#if FUSE_VERSION >= 28
ioctl: _PLfuse_ioctl,
+#if 0
poll: _PLfuse_poll,
-#endif /* FUSE_VERSION >= 28 */
#endif
+#endif /* FUSE_VERSION >= 28 */
};
MODULE = Fuse PACKAGE = Fuse
BOOT:
MY_CXT_INIT;
+#ifdef USE_ITHREADS
MY_CXT.self = aTHX;
+#endif
void
CLONE(...)
PREINIT:
+#ifdef USE_ITHREADS
int i;
dTHX;
+#endif
CODE:
+#ifdef USE_ITHREADS
MY_CXT_CLONE;
tTHX parent = MY_CXT.self;
MY_CXT.self = my_perl;
{
CLONE_PARAMS *clone_param;
#if (PERL_VERSION > 13) || (PERL_VERSION == 13 && PERL_SUBVERSION >= 2)
- clone_param = clone_params_new(parent, aTHX);
+ clone_param = Perl_clone_params_new(parent, aTHX);
#else
CLONE_PARAMS raw_param;
raw_param.flags = 0;
}
MY_CXT.handles = (HV*)sv_dup((SV*)MY_CXT.handles, clone_param);
#if (PERL_VERSION > 13) || (PERL_VERSION == 13 && PERL_SUBVERSION >= 2)
- clone_params_del(clone_param);
+ Perl_clone_params_del(clone_param);
#endif
}
+#endif
SV*
fuse_get_context()