X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=src%2Fguestfs.c;h=e10463309bf625fae4b91d3903a82cf96da3ee2a;hb=161018ed1e90c796e6e099859979da02d5f3e410;hp=092e405e90b9076fe25fd77b3ce0100622749903;hpb=73d6932ab2dd3f9120a1f4a532621c07cb174705;p=libguestfs.git diff --git a/src/guestfs.c b/src/guestfs.c index 092e405..e104633 100644 --- a/src/guestfs.c +++ b/src/guestfs.c @@ -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); } @@ -387,10 +401,11 @@ guestfs_get_error_handler (guestfs_h *g, void **data_rtn) return g->error_cb; } -void +int guestfs_set_verbose (guestfs_h *g, int v) { - g->verbose = v; + g->verbose = !!v; + return 0; } int @@ -399,10 +414,11 @@ guestfs_get_verbose (guestfs_h *g) return g->verbose; } -void +int guestfs_set_autosync (guestfs_h *g, int a) { - g->autosync = a; + g->autosync = !!a; + return 0; } int @@ -411,13 +427,14 @@ guestfs_get_autosync (guestfs_h *g) return g->autosync; } -void +int guestfs_set_path (guestfs_h *g, const char *path) { if (path == NULL) g->path = GUESTFS_DEFAULT_PATH; else g->path = path; + return 0; } const char * @@ -1268,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);