git.annexia.org
/
libguestfs.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Correctly free memory in RHashtable binding for OCaml & Python.
[libguestfs.git]
/
src
/
guestfs.c
diff --git
a/src/guestfs.c
b/src/guestfs.c
index
092e405
..
e104633
100644
(file)
--- a/
src/guestfs.c
+++ b/
src/guestfs.c
@@
-121,6
+121,8
@@
struct guestfs_h
const char *path;
const char *path;
+ char *last_error;
+
/* Callbacks. */
guestfs_abort_cb abort_cb;
guestfs_error_handler_cb error_cb;
/* Callbacks. */
guestfs_abort_cb abort_cb;
guestfs_error_handler_cb error_cb;
@@
-264,6
+266,7
@@
guestfs_close (guestfs_h *g)
}
/* release mutex (XXX) */
}
/* release mutex (XXX) */
+ free (g->last_error);
free (g);
}
free (g);
}
@@
-274,6
+277,19
@@
close_handles (void)
while (handles) guestfs_close (handles);
}
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)
{
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;
va_list args;
char *msg;
- if (!g->error_cb) return;
-
va_start (args, fs);
vasprintf (&msg, fs, args);
va_end (args);
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);
}
free (msg);
}
@@
-304,8
+319,6
@@
perrorf (guestfs_h *g, const char *fs, ...)
char *msg;
int err = errno;
char *msg;
int err = errno;
- if (!g->error_cb) return;
-
va_start (args, fs);
vasprintf (&msg, fs, args);
va_end (args);
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);
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);
}
free (msg);
}
@@
-387,10
+401,11
@@
guestfs_get_error_handler (guestfs_h *g, void **data_rtn)
return g->error_cb;
}
return g->error_cb;
}
-void
+int
guestfs_set_verbose (guestfs_h *g, int v)
{
guestfs_set_verbose (guestfs_h *g, int v)
{
- g->verbose = v;
+ g->verbose = !!v;
+ return 0;
}
int
}
int
@@
-399,10
+414,11
@@
guestfs_get_verbose (guestfs_h *g)
return g->verbose;
}
return g->verbose;
}
-void
+int
guestfs_set_autosync (guestfs_h *g, int a)
{
guestfs_set_autosync (guestfs_h *g, int a)
{
- g->autosync = a;
+ g->autosync = !!a;
+ return 0;
}
int
}
int
@@
-411,13
+427,14
@@
guestfs_get_autosync (guestfs_h *g)
return g->autosync;
}
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;
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 *
}
const char *
@@
-1268,6
+1285,12
@@
check_reply_header (guestfs_h *g,
* generator.ml.
*/
void
* 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);
guestfs_free_lvm_pv_list (struct guestfs_lvm_pv_list *x)
{
xdr_free ((xdrproc_t) xdr_guestfs_lvm_int_pv_list, (char *) x);