diff options
author | Richard W.M. Jones <rjones@redhat.com> | 2011-12-23 10:33:25 +0000 |
---|---|---|
committer | Richard W.M. Jones <rjones@redhat.com> | 2011-12-23 10:35:34 +0000 |
commit | 690ff694ca6db586c06ec484ea158261c156aa2f (patch) | |
tree | 0b2de2288deb1b6af1b51519da6cf8293ff9cfde /src/guestfs.c | |
parent | 486cafd4acf4945bbf3fea541eaa320f5c419406 (diff) | |
download | libguestfs-690ff694ca6db586c06ec484ea158261c156aa2f.tar.gz libguestfs-690ff694ca6db586c06ec484ea158261c156aa2f.tar.xz libguestfs-690ff694ca6db586c06ec484ea158261c156aa2f.zip |
lib: Add guestfs___remove_tmpdir helper function.
This function does 'rm -rf <dir>' for temporary directories, safely
working if '<dir>' contains shell meta-characters.
Replace existing code for removing directories with this.
Diffstat (limited to 'src/guestfs.c')
-rw-r--r-- | src/guestfs.c | 41 |
1 files changed, 2 insertions, 39 deletions
diff --git a/src/guestfs.c b/src/guestfs.c index 450ffd84..9f734866 100644 --- a/src/guestfs.c +++ b/src/guestfs.c @@ -72,7 +72,6 @@ #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); @@ -224,7 +223,8 @@ guestfs_close (guestfs_h *g) 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; @@ -260,43 +260,6 @@ 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) |