#include <caml/callback.h>
#include <caml/custom.h>
+#include <stdbool.h>
+
#ifdef __GNUC__
#define NORETURN __attribute__ ((noreturn))
#else
};
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];
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);
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)