X-Git-Url: http://git.annexia.org/?p=libguestfs.git;a=blobdiff_plain;f=daemon%2Ffill.c;h=807ee390f1fe78883d52b2f75a794e6125e89e31;hp=5a391aac70a738c5fc2b35fbf2a4a6d87d3529ce;hb=53ca11ee44f71ed056f72df9769ca93b9a35e1a7;hpb=e9c37113104c1cfb234535adc9b52ad3880a41ce diff --git a/daemon/fill.c b/daemon/fill.c index 5a391aa..807ee39 100644 --- a/daemon/fill.c +++ b/daemon/fill.c @@ -75,3 +75,49 @@ do_fill (int c, int len, const char *path) 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; + } + + if (close (fd) == -1) { + reply_with_perror ("close: %s", path); + return -1; + } + + return 0; +}