summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorRichard W.M. Jones <rjones@redhat.com>2011-04-13 22:02:08 +0100
committerRichard W.M. Jones <rjones@redhat.com>2011-04-13 22:02:08 +0100
commit70975981bed8e0c01b5966c10b507bb82086e5f8 (patch)
tree40e6ce9b15ed02cc72cb0f21a036a7c64bcf58c9 /src
parent6740028b333840eec5e8e46e8512f8155728b037 (diff)
downloadlibguestfs-70975981bed8e0c01b5966c10b507bb82086e5f8.tar.gz
libguestfs-70975981bed8e0c01b5966c10b507bb82086e5f8.tar.xz
libguestfs-70975981bed8e0c01b5966c10b507bb82086e5f8.zip
Remove temporary directory containing arbitrary files.
In preparation for caching inspection information in the temporary directory (g->tmpdir), allow the temporary directory to contain arbitrary files, and remove all of them when the handle is closed. This just generalizes the previous method of cleaning up the tmpdir.
Diffstat (limited to 'src')
-rw-r--r--src/guestfs.c49
1 files changed, 40 insertions, 9 deletions
diff --git a/src/guestfs.c b/src/guestfs.c
index 9c4f22fa..206841e6 100644
--- a/src/guestfs.c
+++ b/src/guestfs.c
@@ -72,6 +72,7 @@
#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);
@@ -215,15 +216,8 @@ guestfs_close (guestfs_h *g)
if (g->pid > 0) waitpid (g->pid, NULL, 0);
if (g->recoverypid > 0) waitpid (g->recoverypid, NULL, 0);
- /* Remove tmpfiles. */
- if (g->tmpdir) {
- snprintf (filename, sizeof filename, "%s/guestfsd.sock", g->tmpdir);
- unlink (filename);
-
- rmdir (g->tmpdir);
-
- free (g->tmpdir);
- }
+ /* Remove whole temporary directory. */
+ remove_tmpdir (g);
if (g->cmdline) {
for (i = 0; i < g->cmdline_size; ++i)
@@ -255,6 +249,43 @@ guestfs_close (guestfs_h *g)
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)