[Libguestfs] [PATCH v2 5/5] daemon: autogenerate OCaml interfaces

Pino Toscano
2018-04-10T10:42:54Z

Add a way to generate OCaml interfaces for all the modules in the
daemon that implement APIs: this makes sure that for them the
interface of each function matches the actual API specified in the
generator.
---
 .gitignore           | 17 +++++++++++
 daemon/blkid.mli     | 19 ------------
 daemon/btrfs.mli     | 20 -------------
 daemon/devsparts.mli | 25 ----------------
 daemon/file.mli      | 19 ------------
 daemon/filearch.mli  | 19 ------------
 daemon/findfs.mli    | 20 -------------
 daemon/inspect.mli   | 41 --------------------------
 daemon/is.mli        | 21 -------------
 daemon/ldm.mli       | 20 -------------
 daemon/link.mli      | 19 ------------
 daemon/listfs.mli    | 19 ------------
 daemon/lvm.mli       | 19 ------------
 daemon/md.mli        | 20 -------------
 daemon/mount.mli     | 22 --------------
 daemon/parted.mli    | 27 -----------------
 daemon/realpath.mli  | 20 -------------
 daemon/statvfs.mli   | 19 ------------
 generator/daemon.ml  | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 generator/daemon.mli |  1 +
 generator/main.ml    | 17 +++++++++++
 21 files changed, 118 insertions(+), 369 deletions(-)
 delete mode 100644 daemon/blkid.mli
 delete mode 100644 daemon/btrfs.mli
 delete mode 100644 daemon/devsparts.mli
 delete mode 100644 daemon/file.mli
 delete mode 100644 daemon/filearch.mli
 delete mode 100644 daemon/findfs.mli
 delete mode 100644 daemon/inspect.mli
 delete mode 100644 daemon/is.mli
 delete mode 100644 daemon/ldm.mli
 delete mode 100644 daemon/link.mli
 delete mode 100644 daemon/listfs.mli
 delete mode 100644 daemon/lvm.mli
 delete mode 100644 daemon/md.mli
 delete mode 100644 daemon/mount.mli
 delete mode 100644 daemon/parted.mli
 delete mode 100644 daemon/realpath.mli
 delete mode 100644 daemon/statvfs.mli

diff --git a/.gitignore b/.gitignore
index bb7026537..e67013478 100644
--- a/.gitignore
+++ b/.gitignore
@@ -185,21 +185,38 @@ Makefile.in
 /customize/virt-customize.1
 /daemon/.depend
 /daemon/actions.h
+/daemon/blkid.mli
+/daemon/btrfs.mli
 /daemon/callbacks.ml
 /daemon/caml-stubs.c
 /daemon/daemon_config.ml
 /daemon/daemon_utils_tests
+/daemon/devsparts.mli
 /daemon/dispatch.c
+/daemon/file.mli
+/daemon/filearch.mli
+/daemon/findfs.mli
 /daemon/guestfsd
 /daemon/guestfsd.8
 /daemon/guestfsd.exe
+/daemon/inspect.mli
+/daemon/is.mli
+/daemon/ldm.mli
+/daemon/link.mli
+/daemon/listfs.mli
+/daemon/lvm.mli
 /daemon/lvm-tokenization.c
+/daemon/md.mli
+/daemon/mount.mli
 /daemon/names.c
 /daemon/optgroups.c
 /daemon/optgroups.h
 /daemon/optgroups.ml
 /daemon/optgroups.mli
+/daemon/parted.mli
+/daemon/realpath.mli
 /daemon/stamp-guestfsd.pod
+/daemon/statvfs.mli
 /daemon/structs-cleanups.c
 /daemon/structs-cleanups.h
 /daemon/structs.ml
diff --git a/daemon/blkid.mli b/daemon/blkid.mli
deleted file mode 100644
index 65a61def4..000000000
--- a/daemon/blkid.mli
+++ /dev/null
@@ -1,19 +0,0 @@
-(* guestfs-inspection
- * Copyright (C) 2009-2018 Red Hat Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *)
-
-val vfs_type : Mountable.t -> string
diff --git a/daemon/btrfs.mli b/daemon/btrfs.mli
deleted file mode 100644
index ce1c2b66f..000000000
--- a/daemon/btrfs.mli
+++ /dev/null
@@ -1,20 +0,0 @@
-(* guestfs-inspection
- * Copyright (C) 2009-2018 Red Hat Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *)
-
-val btrfs_subvolume_list : Mountable.t -> Structs.btrfssubvolume list
-val btrfs_subvolume_get_default : Mountable.t -> int64
diff --git a/daemon/devsparts.mli b/daemon/devsparts.mli
deleted file mode 100644
index 7b669c269..000000000
--- a/daemon/devsparts.mli
+++ /dev/null
@@ -1,25 +0,0 @@
-(* guestfs-inspection
- * Copyright (C) 2009-2018 Red Hat Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *)
-
-val list_devices : unit -> string list
-val list_partitions : unit -> string list
-val part_to_dev : string -> string
-val part_to_partnum : string -> int
-val is_whole_device : string -> bool
-val nr_devices : unit -> int
-val device_index : string -> int
diff --git a/daemon/file.mli b/daemon/file.mli
deleted file mode 100644
index 1e1631840..000000000
--- a/daemon/file.mli
+++ /dev/null
@@ -1,19 +0,0 @@
-(* guestfs-inspection
- * Copyright (C) 2009-2018 Red Hat Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *)
-
-val file : string -> string
diff --git a/daemon/filearch.mli b/daemon/filearch.mli
deleted file mode 100644
index 3f472af51..000000000
--- a/daemon/filearch.mli
+++ /dev/null
@@ -1,19 +0,0 @@
-(* guestfs-inspection
- * Copyright (C) 2009-2018 Red Hat Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *)
-
-val file_architecture : string -> string
diff --git a/daemon/findfs.mli b/daemon/findfs.mli
deleted file mode 100644
index c671782c3..000000000
--- a/daemon/findfs.mli
+++ /dev/null
@@ -1,20 +0,0 @@
-(* guestfs-inspection
- * Copyright (C) 2009-2018 Red Hat Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *)
-
-val findfs_uuid : string -> string
-val findfs_label : string -> string
diff --git a/daemon/inspect.mli b/daemon/inspect.mli
deleted file mode 100644
index 336bbcfae..000000000
--- a/daemon/inspect.mli
+++ /dev/null
@@ -1,41 +0,0 @@
-(* guestfs-inspection
- * Copyright (C) 2009-2018 Red Hat Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *)
-
-val inspect_os : unit -> Mountable.t list
-val inspect_get_roots : unit -> Mountable.t list
-val inspect_get_mountpoints : Mountable.t -> (string * Mountable.t) list
-val inspect_get_filesystems : Mountable.t -> Mountable.t list
-val inspect_get_format : Mountable.t -> string
-val inspect_get_type : Mountable.t -> string
-val inspect_get_distro : Mountable.t -> string
-val inspect_get_package_format : Mountable.t -> string
-val inspect_get_package_management : Mountable.t -> string
-val inspect_get_product_name : Mountable.t -> string
-val inspect_get_product_variant : Mountable.t -> string
-val inspect_get_major_version : Mountable.t -> int
-val inspect_get_minor_version : Mountable.t -> int
-val inspect_get_arch : Mountable.t -> string
-val inspect_get_hostname : Mountable.t -> string
-val inspect_get_windows_systemroot : Mountable.t -> string
-val inspect_get_windows_software_hive : Mountable.t -> string
-val inspect_get_windows_system_hive : Mountable.t -> string
-val inspect_get_windows_current_control_set : Mountable.t -> string
-val inspect_get_drive_mappings : Mountable.t -> (string * string) list
-val inspect_is_live : Mountable.t -> bool
-val inspect_is_netinst : Mountable.t -> bool
-val inspect_is_multipart : Mountable.t -> bool
diff --git a/daemon/is.mli b/daemon/is.mli
deleted file mode 100644
index f64d33dae..000000000
--- a/daemon/is.mli
+++ /dev/null
@@ -1,21 +0,0 @@
-(* guestfs-inspection
- * Copyright (C) 2009-2018 Red Hat Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *)
-
-val is_file : ?followsymlinks:bool -> string -> bool
-val is_dir : ?followsymlinks:bool -> string -> bool
-val is_symlink : string -> bool
diff --git a/daemon/ldm.mli b/daemon/ldm.mli
deleted file mode 100644
index 74afdf5d8..000000000
--- a/daemon/ldm.mli
+++ /dev/null
@@ -1,20 +0,0 @@
-(* guestfs-inspection
- * Copyright (C) 2009-2018 Red Hat Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *)
-
-val list_ldm_volumes : unit -> string list
-val list_ldm_partitions : unit -> string list
diff --git a/daemon/link.mli b/daemon/link.mli
deleted file mode 100644
index f3c6d1564..000000000
--- a/daemon/link.mli
+++ /dev/null
@@ -1,19 +0,0 @@
-(* guestfs-inspection
- * Copyright (C) 2009-2018 Red Hat Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *)
-
-val readlink : string -> string
diff --git a/daemon/listfs.mli b/daemon/listfs.mli
deleted file mode 100644
index 0e8f24080..000000000
--- a/daemon/listfs.mli
+++ /dev/null
@@ -1,19 +0,0 @@
-(* guestfs-inspection
- * Copyright (C) 2009-2018 Red Hat Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *)
-
-val list_filesystems : unit -> (Mountable.t * string) list
diff --git a/daemon/lvm.mli b/daemon/lvm.mli
deleted file mode 100644
index 592168433..000000000
--- a/daemon/lvm.mli
+++ /dev/null
@@ -1,19 +0,0 @@
-(* guestfs-inspection
- * Copyright (C) 2009-2018 Red Hat Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *)
-
-val lvs : unit -> string list
diff --git a/daemon/md.mli b/daemon/md.mli
deleted file mode 100644
index e0c3e08ad..000000000
--- a/daemon/md.mli
+++ /dev/null
@@ -1,20 +0,0 @@
-(* guestfs-inspection
- * Copyright (C) 2009-2018 Red Hat Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *)
-
-val list_md_devices : unit -> string list
-val md_detail : string -> (string * string) list
diff --git a/daemon/mount.mli b/daemon/mount.mli
deleted file mode 100644
index 9fa5b76e7..000000000
--- a/daemon/mount.mli
+++ /dev/null
@@ -1,22 +0,0 @@
-(* guestfs-inspection
- * Copyright (C) 2009-2018 Red Hat Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *)
-
-val mount : Mountable.t -> string -> unit
-val mount_ro : Mountable.t -> string -> unit
-val mount_options : string -> Mountable.t -> string -> unit
-val mount_vfs : string -> string -> Mountable.t -> string -> unit
diff --git a/daemon/parted.mli b/daemon/parted.mli
deleted file mode 100644
index 0b7eb87f4..000000000
--- a/daemon/parted.mli
+++ /dev/null
@@ -1,27 +0,0 @@
-(* guestfs-inspection
- * Copyright (C) 2009-2018 Red Hat Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *)
-
-val part_get_mbr_id : string -> int -> int
-val part_list : string -> Structs.partition list
-
-val part_get_parttype : string -> string
-
-val part_get_gpt_type : string -> int -> string
-val part_get_gpt_guid : string -> int -> string
-val part_get_gpt_attributes : string -> int -> int64
-val part_set_gpt_attributes : string -> int -> int64 -> unit
diff --git a/daemon/realpath.mli b/daemon/realpath.mli
deleted file mode 100644
index 10b9ae565..000000000
--- a/daemon/realpath.mli
+++ /dev/null
@@ -1,20 +0,0 @@
-(* guestfs-inspection
- * Copyright (C) 2009-2018 Red Hat Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *)
-
-val realpath : string -> string
-val case_sensitive_path : string -> string
diff --git a/daemon/statvfs.mli b/daemon/statvfs.mli
deleted file mode 100644
index 13b22f88d..000000000
--- a/daemon/statvfs.mli
+++ /dev/null
@@ -1,19 +0,0 @@
-(* guestfs-inspection
- * Copyright (C) 2009-2018 Red Hat Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *)
-
-val statvfs : string -> Structs.statvfs
diff --git a/generator/daemon.ml b/generator/daemon.ml
index 7fb7052a0..559ed6898 100644
--- a/generator/daemon.ml
+++ b/generator/daemon.ml
@@ -490,6 +490,89 @@ let generate_daemon_caml_callbacks_ml ()    else
     pr "let init_callbacks () = ()\n"

+let rec generate_daemon_caml_interface modname () +  generate_header OCamlStyle
GPLv2plus;
+
+  let is_ocaml_module_function = function
+    | { impl = OCaml m } when String.is_prefix m (modname ^ ".")
-> true
+    | { impl = OCaml _ } -> false
+    | { impl = C } -> false
+  in
+
+  let ocaml_actions = actions |> (List.filter is_ocaml_module_function) in
+  if ocaml_actions == [] then
+    failwithf "no OCaml implementations for module %s" modname;
+
+  let prefix_length = String.length modname + 1 in
+  List.iter (
+    fun { name; style; impl } ->
+      let ocaml_function +        match impl with
+        | OCaml f ->
+            String.sub f prefix_length (String.length f - prefix_length)
+        | C -> assert false in
+
+      generate_ocaml_daemon_prototype ocaml_function style
+  ) ocaml_actions
+
+and generate_ocaml_daemon_prototype name (ret, args, optargs) +  let
type_for_stringt = function
+    | Mountable
+    | Mountable_or_Path -> "Mountable.t"
+    | PlainString
+    | Device
+    | Pathname
+    | FileIn
+    | FileOut
+    | Key
+    | GUID
+    | Filename
+    | Dev_or_Path -> "string"
+  in
+  let type_for_rstringt = function
+    | RMountable -> "Mountable.t"
+    | RPlainString
+    | RDevice -> "string"
+  in
+  pr "val %s : " name;
+  List.iter (
+    function
+    | OBool n -> pr "?%s:bool -> " n
+    | OInt n -> pr "?%s:int -> " n
+    | OInt64 n -> pr "?%s:int64 -> " n
+    | OString n -> pr "?%s:string -> " n
+    | OStringList n -> pr "?%s:string array -> " n
+  ) optargs;
+  if args <> [] then
+    List.iter (
+      function
+      | String (typ, _) -> pr "%s -> " (type_for_stringt typ)
+      | BufferIn _ -> pr "string -> "
+      | OptString _ -> pr "string option -> "
+      | StringList (typ, _) -> pr "%s array -> "
(type_for_stringt typ)
+      | Bool _ -> pr "bool -> "
+      | Int _ -> pr "int -> "
+      | Int64 _ | Pointer _ -> pr "int64 -> "
+    ) args
+  else
+    pr "unit -> ";
+  (match ret with
+   | RErr -> pr "unit" (* all errors are turned into exceptions *)
+   | RInt _ -> pr "int"
+   | RInt64 _ -> pr "int64"
+   | RBool _ -> pr "bool"
+   | RConstString _ -> pr "string"
+   | RConstOptString _ -> pr "string option"
+   | RString (typ, _) -> pr "%s" (type_for_rstringt typ)
+   | RBufferOut _ -> pr "string"
+   | RStringList (typ, _) -> pr "%s list" (type_for_rstringt typ)
+   | RStruct (_, typ) -> pr "Structs.%s" typ
+   | RStructList (_, typ) -> pr "Structs.%s list" typ
+   | RHashtable (typea, typeb, _) ->
+       pr "(%s * %s) list" (type_for_rstringt typea)
(type_for_rstringt typeb)
+  );
+  pr "\n"
+
 (* Generate stubs for the functions implemented in OCaml.
  * Basically we implement the do_<name> function here, and
  * have it call out to OCaml code.
diff --git a/generator/daemon.mli b/generator/daemon.mli
index 40bf31302..f0268ba99 100644
--- a/generator/daemon.mli
+++ b/generator/daemon.mli
@@ -21,6 +21,7 @@ val generate_daemon_stubs_h : unit -> unit
 val generate_daemon_stubs : Types.action list -> unit -> unit
 val generate_daemon_caml_stubs : unit -> unit
 val generate_daemon_caml_callbacks_ml : unit -> unit
+val generate_daemon_caml_interface : string -> unit -> unit
 val generate_daemon_dispatch : unit -> unit
 val generate_daemon_lvm_tokenization : unit -> unit
 val generate_daemon_names : unit -> unit
diff --git a/generator/main.ml b/generator/main.ml
index 34bca68d9..e51313779 100644
--- a/generator/main.ml
+++ b/generator/main.ml
@@ -155,6 +155,23 @@ Run it from the top source directory using the command
             Daemon.generate_daemon_structs_cleanups_c;
   output_to "daemon/structs-cleanups.h"
             Daemon.generate_daemon_structs_cleanups_h;
+  let daemon_ocaml_interfaces +    List.fold_left (
+      fun set { impl } ->
+        let ocaml_function +          match impl with
+          | OCaml f -> fst (String.split "." f)
+          | C -> assert false in
+
+        StringSet.add ocaml_function set
+    ) StringSet.empty (actions |> impl_ocaml_functions) in
+  StringSet.iter (
+    fun modname ->
+      let fn = Char.escaped (Char.lowercase_ascii (String.unsafe_get modname
0)) ^
+               String.sub modname 1 (String.length modname - 1) in
+      output_to (sprintf "daemon/%s.mli" fn)
+                (Daemon.generate_daemon_caml_interface modname)
+  ) daemon_ocaml_interfaces;

   output_to "fish/cmds-gperf.gperf"
             Fish.generate_fish_cmds_gperf;
--
2.14.3