[Libguestfs] [PATCH 0/3] Three small fixes (pushed already)

Richard W.M. Jones rjones at redhat.com
Fri Nov 6 12:35:51 UTC 2009


I pushed these already.  One seems to be an obvious fix
for 32 bit platforms.  The other two are tidy-ups for the
OCaml bindings which won't interest most people.

Rich.

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming blog: http://rwmj.wordpress.com
Fedora now supports 80 OCaml packages (the OPEN alternative to F#)
http://cocan.org/getting_started_with_ocaml_on_red_hat_and_fedora
-------------- next part --------------
>From e1f5472395b08033c60054e8f87f3c61126c4fa4 Mon Sep 17 00:00:00 2001
From: Richard W.M. Jones <rjones at redhat.com>
Date: Fri, 6 Nov 2009 09:14:31 +0000
Subject: [PATCH 1/3] Fixes for compiling on 32 bit.

---
 fish/alloc.c      |   14 +++++++-------
 fuse/guestmount.c |    2 +-
 2 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/fish/alloc.c b/fish/alloc.c
index fd5be2c..ad2dccc 100644
--- a/fish/alloc.c
+++ b/fish/alloc.c
@@ -140,12 +140,12 @@ parse_size (const char *str, off_t *size_rtn)
    */
   if (sscanf (str, "%"SCNu64"%c", &size, &type) == 2) {
     switch (type) {
-    case 'k': case 'K': size *= 1024L; break;
-    case 'm': case 'M': size *= 1024L * 1024; break;
-    case 'g': case 'G': size *= 1024L * 1024 * 1024; break;
-    case 't': case 'T': size *= 1024L * 1024 * 1024 * 1024; break;
-    case 'p': case 'P': size *= 1024L * 1024 * 1024 * 1024 * 1024; break;
-    case 'e': case 'E': size *= 1024L * 1024 * 1024 * 1024 * 1024 * 1024; break;
+    case 'k': case 'K': size *= 1024ULL; break;
+    case 'm': case 'M': size *= 1024ULL * 1024ULL; break;
+    case 'g': case 'G': size *= 1024ULL * 1024ULL * 1024ULL; break;
+    case 't': case 'T': size *= 1024ULL * 1024ULL * 1024ULL * 1024ULL; break;
+    case 'p': case 'P': size *= 1024ULL * 1024ULL * 1024ULL * 1024ULL * 1024ULL; break;
+    case 'e': case 'E': size *= 1024ULL * 1024ULL * 1024ULL * 1024ULL * 1024ULL * 1024ULL; break;
     case 's': size *= 512; break;
     default:
       fprintf (stderr, _("could not parse size specification '%s'\n"), str);
@@ -153,7 +153,7 @@ parse_size (const char *str, off_t *size_rtn)
     }
   }
   else if (sscanf (str, "%"SCNu64, &size) == 1)
-    size *= 1024;
+    size *= 1024ULL;
   else {
     fprintf (stderr, _("could not parse size specification '%s'\n"), str);
     return -1;
diff --git a/fuse/guestmount.c b/fuse/guestmount.c
index 3ae614c..8812ac2 100644
--- a/fuse/guestmount.c
+++ b/fuse/guestmount.c
@@ -619,7 +619,7 @@ fg_read (const char *path, char *buf, size_t size, off_t offset,
   size_t rsize;
 
   if (verbose)
-    fprintf (stderr, "fg_read: %s: size %zu offset %zu\n",
+    fprintf (stderr, "fg_read: %s: size %zu offset %ju\n",
              path, size, offset);
 
   /* The guestfs protocol limits size to somewhere over 2MB.  We just
-- 
1.6.2.5

-------------- next part --------------
>From 79125c4dea9c69d08b522ed7c85f26dc6ee1bcb3 Mon Sep 17 00:00:00 2001
From: Richard W.M. Jones <rjones at redhat.com>
Date: Fri, 6 Nov 2009 10:48:37 +0000
Subject: [PATCH 2/3] ocaml: General improvements to generated code.

---
 ocaml/guestfs_c.c |   11 +++++++++++
 ocaml/guestfs_c.h |    2 ++
 src/generator.ml  |   37 +++++++++++++++++++++++++++++--------
 3 files changed, 42 insertions(+), 8 deletions(-)

diff --git a/ocaml/guestfs_c.c b/ocaml/guestfs_c.c
index 80dcf99..f7d8dff 100644
--- a/ocaml/guestfs_c.c
+++ b/ocaml/guestfs_c.c
@@ -93,6 +93,17 @@ ocaml_guestfs_raise_error (guestfs_h *g, const char *func)
   CAMLnoreturn;
 }
 
+void
+ocaml_guestfs_raise_closed (const char *func)
+{
+  CAMLparam0 ();
+  CAMLlocal1 (v);
+
+  v = caml_copy_string (func);
+  caml_raise_with_arg (*caml_named_value ("ocaml_guestfs_closed"), v);
+  CAMLnoreturn;
+}
+
 /* Guestfs.create */
 CAMLprim value
 ocaml_guestfs_create (void)
diff --git a/ocaml/guestfs_c.h b/ocaml/guestfs_c.h
index b4a7661..cd1d73b 100644
--- a/ocaml/guestfs_c.h
+++ b/ocaml/guestfs_c.h
@@ -22,6 +22,8 @@
 #define Guestfs_val(v) (*((guestfs_h **)Data_custom_val(v)))
 extern void ocaml_guestfs_raise_error (guestfs_h *g, const char *func)
   Noreturn;
+extern void ocaml_guestfs_raise_closed (const char *func)
+  Noreturn;
 extern char **ocaml_guestfs_strings_val (guestfs_h *g, value sv);
 extern void ocaml_guestfs_free_strings (char **r);
 
diff --git a/src/generator.ml b/src/generator.ml
index a06e208..8b83496 100755
--- a/src/generator.ml
+++ b/src/generator.ml
@@ -6963,12 +6963,21 @@ type t
 exception Error of string
 (** This exception is raised when there is an error. *)
 
+exception Handle_closed of string
+(** This exception is raised if you use a {!Guestfs.t} handle
+    after calling {!close} on it.  The string is the name of
+    the function. *)
+
 val create : unit -> t
+(** Create a {!Guestfs.t} handle. *)
 
 val close : t -> unit
-(** Handles are closed by the garbage collector when they become
-    unreferenced, but callers can also call this in order to
-    provide predictable cleanup. *)
+(** Close the {!Guestfs.t} handle and free up all resources used
+    by it immediately.
+
+    Handles are closed by the garbage collector when they become
+    unreferenced, but callers can call this in order to provide
+    predictable cleanup. *)
 
 ";
   generate_ocaml_structure_decls ();
@@ -6979,7 +6988,7 @@ val close : t -> unit
       generate_ocaml_prototype name style;
       pr "(** %s *)\n" shortdesc;
       pr "\n"
-  ) all_functions
+  ) all_functions_sorted
 
 (* Generate the OCaml bindings implementation. *)
 and generate_ocaml_ml () =
@@ -6987,12 +6996,17 @@ and generate_ocaml_ml () =
 
   pr "\
 type t
+
 exception Error of string
+exception Handle_closed of string
+
 external create : unit -> t = \"ocaml_guestfs_create\"
 external close : t -> unit = \"ocaml_guestfs_close\"
 
+(* Give the exceptions names, so they can be raised from the C code. *)
 let () =
-  Callback.register_exception \"ocaml_guestfs_error\" (Error \"\")
+  Callback.register_exception \"ocaml_guestfs_error\" (Error \"\");
+  Callback.register_exception \"ocaml_guestfs_closed\" (Handle_closed \"\")
 
 ";
 
@@ -7002,7 +7016,7 @@ let () =
   List.iter (
     fun (name, style, _, _, _, shortdesc, _) ->
       generate_ocaml_prototype ~is_external:true name style;
-  ) all_functions
+  ) all_functions_sorted
 
 (* Generate the OCaml bindings C implementation. *)
 and generate_ocaml_c () =
@@ -7138,6 +7152,12 @@ copy_table (char * const * argv)
   (* The wrappers. *)
   List.iter (
     fun (name, style, _, _, _, _, _) ->
+      pr "/* Automatically generated wrapper for function\n";
+      pr " * ";
+      generate_ocaml_prototype name style;
+      pr " */\n";
+      pr "\n";
+
       let params =
         "gv" :: List.map (fun arg -> name_of_argt arg ^ "v") (snd style) in
 
@@ -7147,6 +7167,7 @@ copy_table (char * const * argv)
       pr "/* Emit prototype to appease gcc's -Wmissing-prototypes. */\n";
       pr "CAMLprim value ocaml_guestfs_%s (value %s" name (List.hd params);
       List.iter (pr ", value %s") (List.tl params); pr ");\n";
+      pr "\n";
 
       pr "CAMLprim value\n";
       pr "ocaml_guestfs_%s (value %s" name (List.hd params);
@@ -7172,7 +7193,7 @@ copy_table (char * const * argv)
 
       pr "  guestfs_h *g = Guestfs_val (gv);\n";
       pr "  if (g == NULL)\n";
-      pr "    caml_failwith (\"%s: used handle after closing it\");\n" name;
+      pr "    ocaml_guestfs_raise_closed (\"%s\");\n" name;
       pr "\n";
 
       List.iter (
@@ -7296,7 +7317,7 @@ copy_table (char * const * argv)
         pr "}\n";
         pr "\n"
       )
-  ) all_functions
+  ) all_functions_sorted
 
 and generate_ocaml_structure_decls () =
   List.iter (
-- 
1.6.2.5

-------------- next part --------------
>From c0465ca3ae5cd55dbc5dc6d3a511ae5431985d3b Mon Sep 17 00:00:00 2001
From: Richard W.M. Jones <rjones at redhat.com>
Date: Fri, 6 Nov 2009 12:32:57 +0000
Subject: [PATCH 3/3] ocaml: Sort the dependencies so they are stable between machines.

---
 ocaml/.depend     |    6 +++---
 ocaml/Makefile.am |    2 +-
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/ocaml/.depend b/ocaml/.depend
index 8ed7c5b..3f743d5 100644
--- a/ocaml/.depend
+++ b/ocaml/.depend
@@ -1,8 +1,8 @@
-guestfs.cmi:
 guestfs_inspector.cmi:
+guestfs.cmi:
 bindtests.cmo: guestfs.cmi
 bindtests.cmx: guestfs.cmx
-guestfs.cmo: guestfs.cmi
-guestfs.cmx: guestfs.cmi
 guestfs_inspector.cmo: guestfs_inspector.cmi
 guestfs_inspector.cmx: guestfs_inspector.cmi
+guestfs.cmo: guestfs.cmi
+guestfs.cmx: guestfs.cmi
diff --git a/ocaml/Makefile.am b/ocaml/Makefile.am
index 032a551..bb7407a 100644
--- a/ocaml/Makefile.am
+++ b/ocaml/Makefile.am
@@ -103,7 +103,7 @@ depend: .depend
 
 .depend: $(wildcard *.mli) $(wildcard *.ml)
 	rm -f $@ $@-t
-	$(OCAMLFIND) ocamldep $^ | sed 's/  *$$//' > $@-t
+	$(OCAMLFIND) ocamldep $^ | sed 's/  *$$//' | sort > $@-t
 	mv $@-t $@
 
 include .depend
-- 
1.6.2.5



More information about the Libguestfs mailing list