#include "guestfs_protocol.h"
static void default_error_cb (guestfs_h *g, void *data, const char *msg);
-static void remove_tmpdir (guestfs_h *g);
static void close_handles (void);
gl_lock_define_initialized (static, handles_lock);
g->events = NULL;
guestfs___free_inspect_info (g);
+ guestfs___free_drives (&g->drives);
/* Close sockets. */
if (g->fd[0] >= 0)
if (g->recoverypid > 0) waitpid (g->recoverypid, NULL, 0);
/* Remove whole temporary directory. */
- remove_tmpdir (g);
+ guestfs___remove_tmpdir (g->tmpdir);
+ free (g->tmpdir);
if (g->cmdline) {
size_t i;
free (g);
}
-/* g->tmpdir can contain any files (but not subdirectories). Remove
- * those and the directory itself. Note that errors in this function
- * aren't really that important: if we end up not deleting temporary
- * files it's only annoying.
- */
-static void
-remove_tmpdir (guestfs_h *g)
-{
- DIR *dir;
- struct dirent *d;
-
- if (!g->tmpdir)
- return;
-
- dir = opendir (g->tmpdir);
- if (dir == NULL) {
- perror (g->tmpdir);
- return;
- }
-
- while ((d = readdir (dir)) != NULL) {
- if (STRNEQ (d->d_name, ".") && STRNEQ (d->d_name, "..")) {
- if (unlinkat (dirfd (dir), d->d_name, 0) == -1)
- perror (d->d_name);
- }
- }
-
- if (closedir (dir) == -1)
- perror (g->tmpdir);
-
- if (rmdir (g->tmpdir) == -1)
- perror (g->tmpdir);
-
- free (g->tmpdir);
- g->tmpdir = NULL;
-}
-
/* Close all open handles (called from atexit(3)). */
static void
close_handles (void)
if (len < 0) return;
guestfs___call_callbacks_message (g, GUESTFS_EVENT_LIBRARY, msg, len);
+
+ free (msg);
}
/* Call trace messages. These are enabled by setting g->trace, and
free (argv[i]);
free (argv);
}
+
+void
+guestfs___free_drives (struct drive **drives)
+{
+ struct drive *i = *drives;
+ *drives = NULL;
+
+ while (i != NULL) {
+ struct drive *next = i->next;
+
+ free (i->path);
+ free (i->format);
+ free (i->iface);
+ free (i->name);
+ free (i);
+
+ i = next;
+ }
+}