From 65510965b3475dd80bdbf042992298451dc2b67b Mon Sep 17 00:00:00 2001 From: Richard Jones Date: Wed, 1 Sep 2010 11:54:15 +0100 Subject: [PATCH] Add progress messages to download command. --- daemon/upload.c | 27 +++++++++++++++++++++++++++ src/generator.ml | 2 +- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/daemon/upload.c b/daemon/upload.c index 9a6c873..604e705 100644 --- a/daemon/upload.c +++ b/daemon/upload.c @@ -20,8 +20,12 @@ #include #include +#include #include #include +#include +#include +#include #include "../src/guestfs_protocol.h" #include "daemon.h" @@ -98,6 +102,26 @@ do_download (const char *filename) return -1; } + /* Calculate the size of the file or device for notification messages. */ + uint64_t total, sent = 0; + if (!is_dev) { + struct stat statbuf; + if (fstat (fd, &statbuf) == -1) { + reply_with_perror ("%s", filename); + close (fd); + return -1; + } + total = statbuf.st_size; + } else { + int64_t size = do_blockdev_getsize64 (filename); + if (size == -1) { + /* do_blockdev_getsize64 has already sent a reply. */ + close (fd); + return -1; + } + total = (uint64_t) size; + } + /* Now we must send the reply message, before the file contents. After * this there is no opportunity in the protocol to send any error * message back. Instead we can only cancel the transfer. @@ -109,6 +133,9 @@ do_download (const char *filename) close (fd); return -1; } + + sent += r; + notify_progress (sent, total); } if (r == -1) { diff --git a/src/generator.ml b/src/generator.ml index 0f080af..c5add6f 100755 --- a/src/generator.ml +++ b/src/generator.ml @@ -2338,7 +2338,7 @@ C can also be a named pipe. See also C."); - ("download", (RErr, [Dev_or_Path "remotefilename"; FileOut "filename"]), 67, [], + ("download", (RErr, [Dev_or_Path "remotefilename"; FileOut "filename"]), 67, [Progress], [InitBasicFS, Always, TestOutput ( (* Pick a file from cwd which isn't likely to change. *) [["upload"; "../COPYING.LIB"; "/COPYING.LIB"]; -- 1.8.3.1