summaryrefslogtreecommitdiff
blob: 8f1e7f405bf6a717a27bac7c3ab9b2b58ce25281 (plain)
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)
 }