X-Git-Url: http://git.annexia.org/?p=libguestfs.git;a=blobdiff_plain;f=daemon%2Ftar.c;h=bb0e4830820f346991b10231b7e1ecbcd90f49f4;hp=9d21e791f3595a86f3a05ce5ce1d9215e44e5e60;hb=07f4b20ae959069fca41756b0dc103ec5fa99754;hpb=6bda071b5cd8393b37653687027c4ae6c6cf3804 diff --git a/daemon/tar.c b/daemon/tar.c index 9d21e79..bb0e483 100644 --- a/daemon/tar.c +++ b/daemon/tar.c @@ -36,7 +36,7 @@ fwrite_cb (void *fp_ptr, const void *buf, int len) /* Has one FileIn parameter. */ int -do_tar_in (char *dir) +do_tar_in (const char *dir) { int err, r; FILE *fp; @@ -44,7 +44,7 @@ do_tar_in (char *dir) if (!root_mounted || dir[0] != '/') { cancel_receive (); - reply_with_error ("tar-in: root must be mounted and path must be absolute"); + reply_with_error ("root must be mounted and path must be absolute"); return -1; } @@ -88,7 +88,8 @@ do_tar_in (char *dir) if (pclose (fp) != 0) { err = errno; - cancel_receive (); + if (r == -1) /* if r == 0, file transfer ended already */ + cancel_receive (); errno = err; reply_with_perror ("pclose: %s", dir); return -1; @@ -99,16 +100,13 @@ do_tar_in (char *dir) /* Has one FileOut parameter. */ int -do_tar_out (char *dir) +do_tar_out (const char *dir) { int r; FILE *fp; char *cmd; char buf[GUESTFS_MAX_CHUNK_SIZE]; - NEED_ROOT (return -1); - ABS_PATH (dir, return -1); - /* "tar -C /sysroot%s -cf - ." but we have to quote the dir. */ if (asprintf_nowarn (&cmd, "tar -C %R -cf - .", dir) == -1) { reply_with_perror ("asprintf"); @@ -152,13 +150,15 @@ do_tar_out (char *dir) return -1; } - send_file_end (0); /* Normal end of file. */ + if (send_file_end (0)) /* Normal end of file. */ + return -1; + return 0; } /* Has one FileIn parameter. */ int -do_tgz_in (char *dir) +do_tgz_in (const char *dir) { int err, r; FILE *fp; @@ -166,7 +166,7 @@ do_tgz_in (char *dir) if (!root_mounted || dir[0] != '/') { cancel_receive (); - reply_with_error ("tar-in: root must be mounted and path must be absolute"); + reply_with_error ("root must be mounted and path must be absolute"); return -1; } @@ -210,7 +210,8 @@ do_tgz_in (char *dir) if (pclose (fp) != 0) { err = errno; - cancel_receive (); + if (r == -1) /* if r == 0, file transfer ended already */ + cancel_receive (); errno = err; reply_with_perror ("pclose: %s", dir); return -1; @@ -221,16 +222,13 @@ do_tgz_in (char *dir) /* Has one FileOut parameter. */ int -do_tgz_out (char *dir) +do_tgz_out (const char *dir) { int r; FILE *fp; char *cmd; char buf[GUESTFS_MAX_CHUNK_SIZE]; - NEED_ROOT (return -1); - ABS_PATH (dir, return -1); - /* "tar -C /sysroot%s -zcf - ." but we have to quote the dir. */ if (asprintf_nowarn (&cmd, "tar -C %R -zcf - .", dir) == -1) { reply_with_perror ("asprintf"); @@ -274,6 +272,8 @@ do_tgz_out (char *dir) return -1; } - send_file_end (0); /* Normal end of file. */ + if (send_file_end (0)) /* Normal end of file. */ + return -1; + return 0; }