X-Git-Url: http://git.annexia.org/?p=libguestfs.git;a=blobdiff_plain;f=daemon%2Ftar.c;h=74d7b056697847e8e9cba3d6e6d555fa0106fe04;hp=941f80bd8110ae0fca1715539a09b788c24bdd5d;hb=463a739bf0475cf45bf03ad2c4130b2ed656686e;hpb=55748a94bc840ac07d3c211119372cd16b31f1a0 diff --git a/daemon/tar.c b/daemon/tar.c index 941f80b..74d7b05 100644 --- a/daemon/tar.c +++ b/daemon/tar.c @@ -1,5 +1,5 @@ /* libguestfs - the guestfsd daemon - * Copyright (C) 2009 Red Hat Inc. + * Copyright (C) 2009-2010 Red Hat Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -25,9 +25,16 @@ #include "read-file.h" -#include "../src/guestfs_protocol.h" +#include "guestfs_protocol.h" #include "daemon.h" #include "actions.h" +#include "optgroups.h" + +int +optgroup_xz_available (void) +{ + return prog_exists ("xz"); +} /* Redirect errors from the tar command to the error file, then * provide functions for reading it in. We overwrite the file each @@ -78,7 +85,7 @@ do_tXz_in (const char *dir, const char *filter) err = errno; r = cancel_receive (); errno = err; - if (r != -2) reply_with_perror ("asprintf"); + reply_with_perror ("asprintf"); return -1; } @@ -90,7 +97,7 @@ do_tXz_in (const char *dir, const char *filter) err = errno; r = cancel_receive (); errno = err; - if (r != -2) reply_with_perror ("%s", cmd); + reply_with_perror ("%s", cmd); free (cmd); return -1; } @@ -103,29 +110,27 @@ do_tXz_in (const char *dir, const char *filter) r = receive_file (write_cb, &fd); if (r == -1) { /* write error */ - if (cancel_receive () != -2) { - char *errstr = read_error_file (); - reply_with_error ("write error on directory: %s: %s", dir, errstr); - free (errstr); - } + cancel_receive (); + char *errstr = read_error_file (); + reply_with_error ("write error on directory: %s: %s", dir, errstr); + free (errstr); pclose (fp); return -1; } if (r == -2) { /* cancellation from library */ + /* This error is ignored by the library since it initiated the + * cancel. Nevertheless we must send an error reply here. + */ + reply_with_error ("file upload cancelled"); pclose (fp); - /* Do NOT send any error. */ return -1; } if (pclose (fp) != 0) { - if (r == -1) /* if r == 0, file transfer ended already */ - r = cancel_receive (); - if (r != -2) { - char *errstr = read_error_file (); - reply_with_error ("tar subcommand failed on directory: %s: %s", - dir, errstr); - free (errstr); - } + char *errstr = read_error_file (); + reply_with_error ("tar subcommand failed on directory: %s: %s", + dir, errstr); + free (errstr); return -1; }