X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=daemon%2Fdd.c;h=a98f7ae0671bd08b3419b74ceb4e2c423b1ab00e;hb=eb7ec6170eca278fb910e18ca1f7ca81c6b507c0;hp=2bbe85514f5a0935ad06ceb5788f762d3f6ab69c;hpb=b6483061c25e90ae1b9e016812dea8e3756d6c23;p=libguestfs.git diff --git a/daemon/dd.c b/daemon/dd.c index 2bbe855..a98f7ae 100644 --- a/daemon/dd.c +++ b/daemon/dd.c @@ -13,7 +13,7 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include @@ -23,7 +23,7 @@ #include #include -#include "../src/guestfs_protocol.h" +#include "guestfs_protocol.h" #include "daemon.h" #include "actions.h" @@ -73,7 +73,7 @@ do_dd (const char *src, const char *dest) } int -do_copy_size (const char *src, const char *dest, int64_t size) +do_copy_size (const char *src, const char *dest, int64_t ssize) { char *buf; int src_fd, dest_fd; @@ -112,9 +112,19 @@ do_copy_size (const char *src, const char *dest, int64_t size) return -1; } - while (size > 0) { + uint64_t position = 0, size = (uint64_t) ssize; + + while (position < size) { char buf[1024*1024]; - size_t n = size > (int64_t) (sizeof buf) ? sizeof buf : (size_t) size; + + /* Calculate bytes to copy. */ + uint64_t n64 = size - position; + size_t n; + if (n64 > sizeof buf) + n = sizeof buf; + else + n = (size_t) n64; /* safe because of if condition */ + ssize_t r = read (src_fd, buf, n); if (r == -1) { reply_with_perror ("%s: read", src); @@ -136,7 +146,8 @@ do_copy_size (const char *src, const char *dest, int64_t size) return -1; } - size -= r; + position += r; + notify_progress ((uint64_t) position, (uint64_t) size); } if (close (src_fd) == -1) {