Enhance raise_error to be able to close handle
authorPino Toscano <ptoscano@redhat.com>
Wed, 29 May 2019 09:48:37 +0000 (11:48 +0200)
committerRichard W.M. Jones <rjones@redhat.com>
Wed, 29 May 2019 09:55:36 +0000 (10:55 +0100)
Rename raise_error to raise_error_and_maybe_close, and add the
possibility to close the specified handle before raising the OCaml
exception.

raise_error is left as non-closing macro.

augeas-c.c

index f3f5223..81f87f9 100644 (file)
@@ -29,6 +29,8 @@
 #include <caml/callback.h>
 #include <caml/custom.h>
 
+#include <stdbool.h>
+
 #ifdef __GNUC__
   #define NORETURN __attribute__ ((noreturn))
 #else
@@ -73,9 +75,11 @@ static const int error_map[] = {
 };
 static const int error_map_len = sizeof error_map / sizeof error_map[0];
 
-/* Raise an Augeas.Error exception. */
+/* Raise an Augeas.Error exception, and optionally close the
+ * specified handle.
+ */
 static void
-raise_error (augeas_t t, const char *msg)
+raise_error_and_maybe_close (augeas_t t, const char *msg, bool close_handle)
 {
   value *exn = caml_named_value ("Augeas.Error");
   value args[4];
@@ -85,8 +89,11 @@ raise_error (augeas_t t, const char *msg)
   int ocaml_code = -1;
   int i;
 
-  if (code == AUG_ENOMEM)
+  if (code == AUG_ENOMEM) {
+    if (close_handle)
+      aug_close (t);
     caml_raise_out_of_memory ();
+  }
 
   aug_err_minor = aug_error_minor_message (t);
   aug_err_details = aug_error_details (t);
@@ -107,8 +114,12 @@ raise_error (augeas_t t, const char *msg)
   args[2] = caml_copy_string (aug_err_minor ? : "");
   args[3] = caml_copy_string (aug_err_details ? : "");
 
+  if (close_handle)
+    aug_close (t);
+
   caml_raise_with_args (*exn, 4, args);
 }
+#define raise_error(t, msg) raise_error_and_maybe_close(t, msg, false)
 
 static void
 raise_init_error (const char *msg)