Started BUGS list.
[libguestfs.git] / src / guestfs.c
index 7f0f821..e104633 100644 (file)
@@ -121,6 +121,8 @@ struct guestfs_h
 
   const char *path;
 
+  char *last_error;
+
   /* Callbacks. */
   guestfs_abort_cb           abort_cb;
   guestfs_error_handler_cb   error_cb;
@@ -264,6 +266,7 @@ guestfs_close (guestfs_h *g)
   }
   /* release mutex (XXX) */
 
+  free (g->last_error);
   free (g);
 }
 
@@ -274,6 +277,19 @@ close_handles (void)
   while (handles) guestfs_close (handles);
 }
 
+const char *
+guestfs_last_error (guestfs_h *g)
+{
+  return g->last_error;
+}
+
+static void
+set_last_error (guestfs_h *g, const char *msg)
+{
+  free (g->last_error);
+  g->last_error = strdup (msg);
+}
+
 static void
 default_error_cb (guestfs_h *g, void *data, const char *msg)
 {
@@ -286,13 +302,12 @@ error (guestfs_h *g, const char *fs, ...)
   va_list args;
   char *msg;
 
-  if (!g->error_cb) return;
-
   va_start (args, fs);
   vasprintf (&msg, fs, args);
   va_end (args);
 
-  g->error_cb (g, g->error_cb_data, msg);
+  if (g->error_cb) g->error_cb (g, g->error_cb_data, msg);
+  set_last_error (g, msg);
 
   free (msg);
 }
@@ -304,8 +319,6 @@ perrorf (guestfs_h *g, const char *fs, ...)
   char *msg;
   int err = errno;
 
-  if (!g->error_cb) return;
-
   va_start (args, fs);
   vasprintf (&msg, fs, args);
   va_end (args);
@@ -323,7 +336,8 @@ perrorf (guestfs_h *g, const char *fs, ...)
   strcat (msg, ": ");
   strcat (msg, buf);
 
-  g->error_cb (g, g->error_cb_data, msg);
+  if (g->error_cb) g->error_cb (g, g->error_cb_data, msg);
+  set_last_error (g, msg);
 
   free (msg);
 }
@@ -1271,6 +1285,12 @@ check_reply_header (guestfs_h *g,
  * generator.ml.
  */
 void
+guestfs_free_int_bool (struct guestfs_int_bool *x)
+{
+  free (x);
+}
+
+void
 guestfs_free_lvm_pv_list (struct guestfs_lvm_pv_list *x)
 {
   xdr_free ((xdrproc_t) xdr_guestfs_lvm_int_pv_list, (char *) x);