summaryrefslogtreecommitdiffstats
path: root/daemon
diff options
context:
space:
mode:
authorRichard Jones <rjones@redhat.com>2010-09-01 11:54:15 +0100
committerRichard Jones <rjones@redhat.com>2010-09-01 12:03:35 +0100
commit65510965b3475dd80bdbf042992298451dc2b67b (patch)
treecbafa1a56718b1eacd3b25a20ae3eb14960e5307 /daemon
parent133a92be6948ff7e65bfecb7be70b15f4336d2af (diff)
downloadlibguestfs-65510965b3475dd80bdbf042992298451dc2b67b.tar.gz
libguestfs-65510965b3475dd80bdbf042992298451dc2b67b.tar.xz
libguestfs-65510965b3475dd80bdbf042992298451dc2b67b.zip
Add progress messages to download command.
Diffstat (limited to 'daemon')
-rw-r--r--daemon/upload.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/daemon/upload.c b/daemon/upload.c
index 9a6c8731..604e7054 100644
--- a/daemon/upload.c
+++ b/daemon/upload.c
@@ -20,8 +20,12 @@
#include <stdio.h>
#include <stdlib.h>
+#include <stdint.h>
#include <string.h>
#include <fcntl.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
#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) {