1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
--- a/lib/Fuse_util.c 2024-05-31 19:58:34.910818884 +0200
+++ b/lib/Fuse_util.c 2024-05-31 20:25:27.021700407 +0200
@@ -293,7 +293,6 @@
}
#define FOR_ALL_OPS(MACRO) \
- MACRO(init) \
MACRO(getattr) \
MACRO(readlink) \
MACRO(readdir) \
@@ -344,12 +343,14 @@
#define SET_NULL_OP(OPNAME) .OPNAME = NULL,
static struct fuse_operations ops = {
+ SET_NULL_OP(init)
FOR_ALL_OPS(SET_NULL_OP)
};
static value * ocaml_list_length=NULL;
#define DECLARE_OP_CLOSURE(OPNAME) static value * OPNAME##_closure=NULL;
+DECLARE_OP_CLOSURE(init)
FOR_ALL_OPS(DECLARE_OP_CLOSURE)
#define init_ARGS (struct fuse_conn_info *conn)
@@ -593,6 +594,33 @@
#define removexattr_CB vpath = copy_string(path); vres=callback2(*removexattr_closure,vpath,copy_string(name));
#define removexattr_RES
+static void *gm281_ops_init(struct fuse_conn_info *conn)
+{
+ CAMLparam0();
+ CAMLlocal4(vstring, vpath, vres, vtmp);
+ intptr_t res = -1;
+ vres=callback(*init_closure,Val_unit);
+ if (Tag_val(vres)==1) /* Result is not Bad */
+ {
+ res=0;
+ }
+ else
+ {
+ if (Is_block(Field(vres,0))) /* This is EUNKNOWNERR of int in ocaml */
+ res=-Int_val(Field(Field(vres,0),0));
+ else res=-ml2c_unix_error(Int_val(Field(vres,0)));
+ }
+ CAMLreturnT(void *, (void *)res);
+}
+
+static void *ops_init(struct fuse_conn_info *conn)
+{
+ leave_blocking_section();
+ void *ret = gm281_ops_init(conn);
+ enter_blocking_section();
+ return ret;
+}
+
#define CALLBACK(OPNAME) \
static OPNAME##_RTYPE gm281_ops_##OPNAME OPNAME##_ARGS \
{\
@@ -634,6 +662,7 @@
void set_fuse_operations(struct fuse_operation_names const *op)
{
+ SET_OPERATION(init)
FOR_ALL_OPS(SET_OPERATION)
}
|