From: "Richard W.M. Jones" <rjones@redhat.com> --- src/appliance.c | 20 ++++++++++---------- src/filearch.c | 2 +- src/guestfs-internal.h | 2 +- src/guestfs.c | 2 +- src/launch.c | 29 ++++++++++------------------- 5 files changed, 23 insertions(+), 32 deletions(-) diff --git a/src/appliance.c b/src/appliance.c index ecbb7af..9db42cb 100644 --- a/src/appliance.c +++ b/src/appliance.c @@ -500,7 +500,7 @@ build_supermin_appliance (guestfs_h *g, int r = run_supermin_helper (g, supermin_path, tmpcd, len); if (r == -1) { - guestfs___remove_tmpdir (tmpcd); + guestfs___remove_tmpdir (g, tmpcd); return -1; } @@ -519,7 +519,7 @@ build_supermin_appliance (guestfs_h *g, int fd = open (filename, O_WRONLY|O_CREAT|O_NOCTTY|O_CLOEXEC, 0755); if (fd == -1) { perrorf (g, "open: %s", filename); - guestfs___remove_tmpdir (tmpcd); + guestfs___remove_tmpdir (g, tmpcd); return -1; } struct flock fl; @@ -533,7 +533,7 @@ build_supermin_appliance (guestfs_h *g, goto again; perrorf (g, "fcntl: F_SETLKW: %s", filename); close (fd); - guestfs___remove_tmpdir (tmpcd); + guestfs___remove_tmpdir (g, tmpcd); return -1; } @@ -545,7 +545,7 @@ build_supermin_appliance (guestfs_h *g, if (ftruncate (fd, clen) == -1) { perrorf (g, "ftruncate: %s", filename); close (fd); - guestfs___remove_tmpdir (tmpcd); + guestfs___remove_tmpdir (g, tmpcd); return -1; } @@ -553,13 +553,13 @@ build_supermin_appliance (guestfs_h *g, if (rr == -1) { perrorf (g, "write: %s", filename); close (fd); - guestfs___remove_tmpdir (tmpcd); + guestfs___remove_tmpdir (g, tmpcd); return -1; } if ((size_t) rr != clen) { error (g, "partial write: %s", filename); close (fd); - guestfs___remove_tmpdir (tmpcd); + guestfs___remove_tmpdir (g, tmpcd); return -1; } @@ -569,7 +569,7 @@ build_supermin_appliance (guestfs_h *g, if (rename (filename, filename2) == -1) { perrorf (g, "rename: %s %s", filename, filename2); close (fd); - guestfs___remove_tmpdir (tmpcd); + guestfs___remove_tmpdir (g, tmpcd); return -1; } @@ -579,7 +579,7 @@ build_supermin_appliance (guestfs_h *g, if (rename (filename, filename2) == -1) { perrorf (g, "rename: %s %s", filename, filename2); close (fd); - guestfs___remove_tmpdir (tmpcd); + guestfs___remove_tmpdir (g, tmpcd); return -1; } @@ -589,11 +589,11 @@ build_supermin_appliance (guestfs_h *g, if (rename (filename, filename2) == -1) { perrorf (g, "rename: %s %s", filename, filename2); close (fd); - guestfs___remove_tmpdir (tmpcd); + guestfs___remove_tmpdir (g, tmpcd); return -1; } - guestfs___remove_tmpdir (tmpcd); + guestfs___remove_tmpdir (g, tmpcd); /* Now finish off by linking to the cached appliance and returning it. */ if (hard_link_to_cached_appliance (g, cachedir, diff --git a/src/filearch.c b/src/filearch.c index 0b5d37b..10c1d4a 100644 --- a/src/filearch.c +++ b/src/filearch.c @@ -214,7 +214,7 @@ cpio_arch (guestfs_h *g, const char *file, const char *path) error (g, "file_architecture: could not determine architecture of cpio archive"); out: - guestfs___remove_tmpdir (dir); + guestfs___remove_tmpdir (g, dir); return ret; #undef dir_len diff --git a/src/guestfs-internal.h b/src/guestfs-internal.h index cf810e1..2cfa35b 100644 --- a/src/guestfs-internal.h +++ b/src/guestfs-internal.h @@ -526,7 +526,7 @@ extern int guestfs___build_appliance (guestfs_h *g, char **kernel, char **initrd /* launch.c */ extern const char *guestfs___persistent_tmpdir (void); extern int guestfs___lazy_make_tmpdir (guestfs_h *g); -extern void guestfs___remove_tmpdir (const char *dir); +extern void guestfs___remove_tmpdir (guestfs_h *g, const char *dir); extern int64_t guestfs___timeval_diff (const struct timeval *x, const struct timeval *y); extern void guestfs___print_timestamped_message (guestfs_h *g, const char *fs, ...); extern void guestfs___launch_send_progress (guestfs_h *g, int perdozen); diff --git a/src/guestfs.c b/src/guestfs.c index cc645fd..e755ffa 100644 --- a/src/guestfs.c +++ b/src/guestfs.c @@ -302,7 +302,7 @@ guestfs_close (guestfs_h *g) /* Remove whole temporary directory. */ if (g->tmpdir) - guestfs___remove_tmpdir (g->tmpdir); + guestfs___remove_tmpdir (g, g->tmpdir); /* Test output file used by bindtests. */ if (g->test_fp != NULL) diff --git a/src/launch.c b/src/launch.c index cc45a10..4681707 100644 --- a/src/launch.c +++ b/src/launch.c @@ -760,29 +760,20 @@ guestfs___lazy_make_tmpdir (guestfs_h *g) /* Recursively remove a temporary directory. If removal fails, just * return (it's a temporary directory so it'll eventually be cleaned * up by a temp cleaner). This is done using "rm -rf" because that's - * simpler and safer, but we have to exec to ensure that paths don't - * need to be quoted. + * simpler and safer. */ void -guestfs___remove_tmpdir (const char *dir) +guestfs___remove_tmpdir (guestfs_h *g, const char *dir) { - pid_t pid = fork (); + struct command *cmd; - if (pid == -1) { - perror ("remove tmpdir: fork"); - return; - } - if (pid == 0) { - execlp ("rm", "rm", "-rf", dir, NULL); - perror ("remove tmpdir: exec: rm"); - _exit (EXIT_FAILURE); - } - - /* Parent. */ - if (waitpid (pid, NULL, 0) == -1) { - perror ("remove tmpdir: waitpid"); - return; - } + cmd = guestfs___new_command (g); + guestfs___cmd_add_arg (cmd, "rm"); + guestfs___cmd_add_arg (cmd, "-rf"); + guestfs___cmd_add_arg (cmd, dir); + /* Ignore failures. */ + guestfs___cmd_run (cmd); + guestfs___cmd_close (cmd); } int -- 1.7.11.4