X-Git-Url: http://git.annexia.org/?p=libguestfs.git;a=blobdiff_plain;f=daemon%2Ffill.c;h=d78e6eeb86f28f9d4515cf3803392a98308bd3d8;hp=955150253c5f45505631650b0c8102b5da6358ff;hb=4d900cdac8258daa2e99c6ceb2a4985154e94150;hpb=688bdc1a068a6c0bea58addd04d5bbe6dc1940c4 diff --git a/daemon/fill.c b/daemon/fill.c index 9551502..d78e6ee 100644 --- a/daemon/fill.c +++ b/daemon/fill.c @@ -24,7 +24,7 @@ #include #include -#include "../src/guestfs_protocol.h" +#include "guestfs_protocol.h" #include "daemon.h" #include "actions.h" @@ -38,12 +38,12 @@ do_fill (int c, int len, const char *path) char buf[BUFSIZ]; if (c < 0 || c > 255) { - reply_with_error ("fill: %d: byte number must be in range 0..255", c); + reply_with_error ("%d: byte number must be in range 0..255", c); return -1; } memset (buf, c, BUFSIZ); if (len < 0) { - reply_with_error ("fill: %d: length is < 0", len); + reply_with_error ("%d: length is < 0", len); return -1; } len_sz = (size_t) len; @@ -66,6 +66,54 @@ do_fill (int c, int len, const char *path) return -1; } n += r; + notify_progress ((uint64_t) n, (uint64_t) len_sz); + } + + if (close (fd) == -1) { + reply_with_perror ("close: %s", path); + return -1; + } + + return 0; +} + +int +do_fill_pattern (const char *pattern, int len, const char *path) +{ + size_t patlen = strlen (pattern); + + if (patlen < 1) { + reply_with_error ("pattern string must be non-empty"); + return -1; + } + + if (len < 0) { + reply_with_error ("%d: length is < 0", len); + return -1; + } + size_t len_sz = (size_t) len; + + int fd; + CHROOT_IN; + fd = open (path, O_WRONLY | O_CREAT | O_NOCTTY, 0666); + CHROOT_OUT; + + if (fd == -1) { + reply_with_perror ("open: %s", path); + return -1; + } + + /* XXX This implementation won't be very efficient for large files. */ + size_t n = 0; + while (n < len_sz) { + size_t wrlen = len_sz - n < patlen ? len_sz - n : patlen; + if (xwrite (fd, pattern, wrlen) == -1) { + reply_with_perror ("write: %s", path); + close (fd); + return -1; + } + n += wrlen; + notify_progress ((uint64_t) n, (uint64_t) len_sz); } if (close (fd) == -1) {