summaryrefslogtreecommitdiffstats
path: root/src/guestfs.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/guestfs.c')
-rw-r--r--src/guestfs.c60
1 files changed, 51 insertions, 9 deletions
diff --git a/src/guestfs.c b/src/guestfs.c
index 5b969185..6b21e390 100644
--- a/src/guestfs.c
+++ b/src/guestfs.c
@@ -62,7 +62,7 @@
#include "guestfs_protocol.h"
static int parse_attach_method (guestfs_h *g, const char *method);
-static void default_error_cb (guestfs_h *g, void *data, const char *msg);
+static void init_error_handler (guestfs_h *g);
static int shutdown_backend (guestfs_h *g, int check_for_errors);
static void close_handles (void);
@@ -117,9 +117,8 @@ guestfs_create_flags (unsigned flags, ...)
g->fd[1] = -1;
g->sock = -1;
+ init_error_handler (g);
g->abort_cb = abort;
- g->error_cb = default_error_cb;
- g->error_cb_data = NULL;
g->recovery_proc = 1;
g->autosync = 1;
@@ -340,6 +339,9 @@ guestfs_close (guestfs_h *g)
free (qp);
}
+ while (g->error_cb_stack)
+ guestfs_pop_error_handler (g);
+
if (g->pda)
hash_free (g->pda);
free (g->tmpdir);
@@ -500,12 +502,6 @@ guestfs___trace (guestfs_h *g, const char *fs, ...)
free (msg);
}
-static void
-default_error_cb (guestfs_h *g, void *data, const char *msg)
-{
- fprintf (stderr, _("libguestfs: error: %s\n"), msg);
-}
-
void
guestfs_error_errno (guestfs_h *g, int errnum, const char *fs, ...)
{
@@ -681,6 +677,52 @@ guestfs_get_error_handler (guestfs_h *g, void **data_rtn)
}
void
+guestfs_push_error_handler (guestfs_h *g,
+ guestfs_error_handler_cb cb, void *data)
+{
+ struct error_cb_stack *old_stack;
+
+ old_stack = g->error_cb_stack;
+ g->error_cb_stack = safe_malloc (g, sizeof (struct error_cb_stack));
+ g->error_cb_stack->next = old_stack;
+ g->error_cb_stack->error_cb = g->error_cb;
+ g->error_cb_stack->error_cb_data = g->error_cb_data;
+
+ guestfs_set_error_handler (g, cb, data);
+}
+
+void
+guestfs_pop_error_handler (guestfs_h *g)
+{
+ struct error_cb_stack *next_stack;
+
+ if (g->error_cb_stack) {
+ next_stack = g->error_cb_stack->next;
+ guestfs_set_error_handler (g, g->error_cb_stack->error_cb,
+ g->error_cb_stack->error_cb_data);
+ free (g->error_cb_stack);
+ g->error_cb_stack = next_stack;
+ }
+ else
+ init_error_handler (g);
+}
+
+static void default_error_cb (guestfs_h *g, void *data, const char *msg);
+
+static void
+init_error_handler (guestfs_h *g)
+{
+ g->error_cb = default_error_cb;
+ g->error_cb_data = NULL;
+}
+
+static void
+default_error_cb (guestfs_h *g, void *data, const char *msg)
+{
+ fprintf (stderr, _("libguestfs: error: %s\n"), msg);
+}
+
+void
guestfs_user_cancel (guestfs_h *g)
{
g->user_cancel = 1;