Put in a list the errnos to expose, filling the content of the
Guestfs.Errno submodule from that.
Also, generate a separate guestfs-c-errnos.c with the implementations of
the functions returning the errno codes.
Only code motion and refactoring, no actual changes on the content of
the ocaml Guestfs module.
---
.gitignore | 1 +
generator/main.ml | 1 +
generator/ocaml.ml | 77 +++++++++++++++++++++++++++++++++++++++++++++---------
ocaml/Makefile.am | 2 ++
ocaml/guestfs-c.c | 32 -----------------------
po/POTFILES | 1 +
6 files changed, 70 insertions(+), 44 deletions(-)
diff --git a/.gitignore b/.gitignore
index e968399..fb972a7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -332,6 +332,7 @@ Makefile.in
/ocaml/examples/inspect_vm
/ocaml/examples/stamp-guestfs-ocaml.pod
/ocaml/guestfs-c-actions.c
+/ocaml/guestfs-c-errnos.c
/ocaml/guestfs.ml
/ocaml/guestfs.mli
/ocamlinit-stamp
diff --git a/generator/main.ml b/generator/main.ml
index 94f0d09..1e0e7d6 100644
--- a/generator/main.ml
+++ b/generator/main.ml
@@ -125,6 +125,7 @@ Run it from the top source directory using the command
output_to "ocaml/guestfs.mli" generate_ocaml_mli;
output_to "ocaml/guestfs.ml" generate_ocaml_ml;
output_to "ocaml/guestfs-c-actions.c" generate_ocaml_c;
+ output_to "ocaml/guestfs-c-errnos.c" generate_ocaml_c_errnos;
output_to "ocaml/bindtests.ml" generate_ocaml_bindtests;
output_to "perl/Guestfs.xs" generate_perl_xs;
output_to "perl/lib/Sys/Guestfs.pm" generate_perl_pm;
diff --git a/generator/ocaml.ml b/generator/ocaml.ml
index 05c7456..7742209 100644
--- a/generator/ocaml.ml
+++ b/generator/ocaml.ml
@@ -30,6 +30,14 @@ open Structs
open C
open Events
+(* List of errnos to expose on Guestfs.Errno. *)
+let ocaml_errnos = [
+ "EINVAL";
+ "ENOTSUP";
+ "EPERM";
+ "ESRCH";
+]
+
(* Generate the OCaml bindings interface. *)
let rec generate_ocaml_mli () =
generate_header OCamlStyle LGPLv2plus;
@@ -132,10 +140,12 @@ val last_errno : t -> int
which you can use to test the return value of {!Guestfs.last_errno}. *)
module Errno : sig
- val errno_EINVAL : int
- val errno_ENOTSUP : int
- val errno_EPERM : int
- val errno_ESRCH : int
+";
+ List.iter (
+ fun e ->
+ pr " val errno_%s : int\n" e
+ ) ocaml_errnos;
+ pr "\
end
";
@@ -287,14 +297,15 @@ external event_to_string : event list -> string
external last_errno : t -> int = \"ocaml_guestfs_last_errno\"
module Errno = struct
- external einval : unit -> int = \"ocaml_guestfs_get_EINVAL\"
\"noalloc\"
- let errno_EINVAL = einval ()
- external enotsup : unit -> int = \"ocaml_guestfs_get_ENOTSUP\"
\"noalloc\"
- let errno_ENOTSUP = enotsup ()
- external eperm : unit -> int = \"ocaml_guestfs_get_EPERM\"
\"noalloc\"
- let errno_EPERM = eperm ()
- external esrch : unit -> int = \"ocaml_guestfs_get_ESRCH\"
\"noalloc\"
- let errno_ESRCH = esrch ()
+";
+ List.iter (
+ fun e ->
+ let le = String.lowercase e in
+ pr " external %s : unit -> int = \"ocaml_guestfs_get_%s\"
\"noalloc\"\n"
+ le e;
+ pr " let errno_%s = %s ()\n" e le
+ ) ocaml_errnos;
+ pr "\
end
(* Give the exceptions names, so they can be raised from the C code. *)
@@ -717,6 +728,48 @@ copy_table (char * const * argv)
)
) external_functions_sorted
+(* Generate the OCaml bindings C errnos. *)
+and generate_ocaml_c_errnos () =
+ generate_header CStyle LGPLv2plus;
+
+ pr "\
+#include <config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+
+#include <caml/config.h>
+#include <caml/alloc.h>
+#include <caml/fail.h>
+#include <caml/memory.h>
+#include <caml/mlvalues.h>
+
+#include \"guestfs.h\"
+
+#include \"guestfs-c.h\"
+
+/* These prototypes are solely to quiet gcc warnings. */
+";
+ List.iter (
+ fun e ->
+ pr "value ocaml_guestfs_get_%s (value unitv);\n" e
+ ) ocaml_errnos;
+
+ List.iter (
+ fun e ->
+ pr "\
+
+/* NB: \"noalloc\" function. */
+value
+ocaml_guestfs_get_%s (value unitv)
+{
+ return Val_int (%s);
+}
+" e e
+ ) ocaml_errnos
+
and generate_ocaml_structure_decls () =
List.iter (
fun { s_name = typ; s_cols = cols } ->
diff --git a/ocaml/Makefile.am b/ocaml/Makefile.am
index db13a8f..e781363 100644
--- a/ocaml/Makefile.am
+++ b/ocaml/Makefile.am
@@ -21,6 +21,7 @@ generator_built = \
guestfs.mli \
guestfs.ml \
guestfs-c-actions.c \
+ guestfs-c-errnos.c \
$(srcdir)/bindtests.ml
EXTRA_DIST = \
@@ -89,6 +90,7 @@ libguestfsocaml_a_CFLAGS = \
libguestfsocaml_a_SOURCES = \
guestfs-c.c \
guestfs-c-actions.c \
+ guestfs-c-errnos.c \
../src/utils.c
if HAVE_OCAMLDOC
diff --git a/ocaml/guestfs-c.c b/ocaml/guestfs-c.c
index 9603f04..03e3659 100644
--- a/ocaml/guestfs-c.c
+++ b/ocaml/guestfs-c.c
@@ -63,10 +63,6 @@ value ocaml_guestfs_set_event_callback (value gv, value closure, value
events);
value ocaml_guestfs_delete_event_callback (value gv, value eh);
value ocaml_guestfs_event_to_string (value events);
value ocaml_guestfs_last_errno (value gv);
-value ocaml_guestfs_get_EINVAL (value unitv);
-value ocaml_guestfs_get_ENOTSUP (value unitv);
-value ocaml_guestfs_get_EPERM (value unitv);
-value ocaml_guestfs_get_ESRCH (value unitv);
/* Allocate handles and deal with finalization. */
static void
@@ -442,31 +438,3 @@ ocaml_guestfs_last_errno (value gv)
rv = Val_int (r);
CAMLreturn (rv);
}
-
-/* NB: "noalloc" function. */
-value
-ocaml_guestfs_get_EINVAL (value unitv)
-{
- return Val_int (EINVAL);
-}
-
-/* NB: "noalloc" function. */
-value
-ocaml_guestfs_get_ENOTSUP (value unitv)
-{
- return Val_int (ENOTSUP);
-}
-
-/* NB: "noalloc" function. */
-value
-ocaml_guestfs_get_EPERM (value unitv)
-{
- return Val_int (EPERM);
-}
-
-/* NB: "noalloc" function. */
-value
-ocaml_guestfs_get_ESRCH (value unitv)
-{
- return Val_int (ESRCH);
-}
diff --git a/po/POTFILES b/po/POTFILES
index 7f1580c..6a0a3fc 100644
--- a/po/POTFILES
+++ b/po/POTFILES
@@ -263,6 +263,7 @@ mllib/mkdtemp-c.c
mllib/progress-c.c
mllib/uri-c.c
ocaml/guestfs-c-actions.c
+ocaml/guestfs-c-errnos.c
ocaml/guestfs-c.c
p2v/about-authors.c
p2v/about-license.c
--
2.1.0