From e72592563c0be15f1b2400e15205d5e803875685 Mon Sep 17 00:00:00 2001 From: "Richard W.M. Jones" Date: Sat, 16 Jul 2011 19:11:52 +0100 Subject: [PATCH] ocaml: Bind guestfs_last_errno. --- generator/generator_ocaml.ml | 13 +++++++++++++ ocaml/guestfs_c.c | 19 +++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/generator/generator_ocaml.ml b/generator/generator_ocaml.ml index aafc6cb..594ed4e 100644 --- a/generator/generator_ocaml.ml +++ b/generator/generator_ocaml.ml @@ -94,6 +94,15 @@ val delete_event_callback : t -> event_handle -> unit (** [delete_event_callback g eh] removes a previously registered event callback. See {!set_event_callback}. *) +val last_errno : t -> int +(** [last_errno g] returns the last errno that happened on the handle [g] + (or [0] if there was no errno). Note that the returned integer is the + raw errno number, and it is {i not} related to the {!Unix.error} type. + + [last_errno] can be overwritten by subsequent operations on a handle, + so if you want to capture the errno correctly, you must call this + in the {!Error} exception handler, before any other operation on [g]. *) + val user_cancel : t -> unit (** Cancel current transfer. This is safe to call from OCaml signal handlers and threads. *) @@ -133,6 +142,7 @@ class guestfs : unit -> object method close : unit -> unit method set_event_callback : event_callback -> event list -> event_handle method delete_event_callback : event_handle -> unit + method last_errno : unit -> int method user_cancel : unit -> unit method ocaml_handle : t "; @@ -193,6 +203,8 @@ external set_event_callback : t -> event_callback -> event list -> event_handle external delete_event_callback : t -> event_handle -> unit = \"ocaml_guestfs_delete_event_callback\" +external last_errno : t -> int = \"ocaml_guestfs_last_errno\" + external user_cancel : t -> unit = \"ocaml_guestfs_user_cancel\" \"noalloc\" (* Give the exceptions names, so they can be raised from the C code. *) @@ -218,6 +230,7 @@ class guestfs () = method close () = close g method set_event_callback = set_event_callback g method delete_event_callback = delete_event_callback g + method last_errno () = last_errno g method user_cancel () = user_cancel g method ocaml_handle = g "; diff --git a/ocaml/guestfs_c.c b/ocaml/guestfs_c.c index 45b8eae..3f862ea 100644 --- a/ocaml/guestfs_c.c +++ b/ocaml/guestfs_c.c @@ -52,6 +52,7 @@ CAMLprim value ocaml_guestfs_create (void); CAMLprim value ocaml_guestfs_close (value gv); CAMLprim value ocaml_guestfs_set_event_callback (value gv, value closure, value events); CAMLprim value ocaml_guestfs_delete_event_callback (value gv, value eh); +value ocaml_guestfs_last_errno (value gv); value ocaml_guestfs_user_cancel (value gv); /* Allocate handles and deal with finalization. */ @@ -374,6 +375,24 @@ event_callback_wrapper (guestfs_h *g, CAMLreturn0; } +value +ocaml_guestfs_last_errno (value gv) +{ + CAMLparam1 (gv); + CAMLlocal1 (rv); + int r; + guestfs_h *g; + + g = Guestfs_val (gv); + if (g == NULL) + ocaml_guestfs_raise_closed ("last_errno"); + + r = guestfs_last_errno (g); + + rv = Val_int (r); + CAMLreturn (rv); +} + /* NB: This is and must remain a "noalloc" function. */ value ocaml_guestfs_user_cancel (value gv) -- 1.8.3.1