diff options
author | Richard Jones <rjones@redhat.com> | 2009-11-17 19:51:29 +0000 |
---|---|---|
committer | Richard Jones <rjones@redhat.com> | 2009-11-17 20:14:47 +0000 |
commit | 540c85a1102c5876265502f8ae287ea697834d20 (patch) | |
tree | 9fc0df1d0a607e83740111a8737e7fffaea9d701 /daemon/fill.c | |
parent | dcd08dd356ca361703f4f2a2e25b639b219ac40d (diff) | |
download | libguestfs-540c85a1102c5876265502f8ae287ea697834d20.tar.gz libguestfs-540c85a1102c5876265502f8ae287ea697834d20.tar.xz libguestfs-540c85a1102c5876265502f8ae287ea697834d20.zip |
New API call: fill - fill a file with octets
Diffstat (limited to 'daemon/fill.c')
-rw-r--r-- | daemon/fill.c | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/daemon/fill.c b/daemon/fill.c new file mode 100644 index 00000000..b1b0f5e7 --- /dev/null +++ b/daemon/fill.c @@ -0,0 +1,76 @@ +/* libguestfs - the guestfsd daemon + * Copyright (C) 2009 Red Hat Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * 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. + */ + +#include <config.h> + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <fcntl.h> + +#include "../src/guestfs_protocol.h" +#include "daemon.h" +#include "actions.h" + +int +do_fill (int c, int len, const char *path) +{ + int fd; + ssize_t r; + size_t len_sz; + size_t n; + char buf[BUFSIZ]; + + if (c < 0 || c > 255) { + reply_with_error ("fill: %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); + return -1; + } + len_sz = (size_t) len; + + 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; + } + + n = 0; + while (n < len_sz) { + r = write (fd, buf, len_sz - n < BUFSIZ ? len_sz - n : BUFSIZ); + if (r == -1) { + reply_with_perror ("write: %s", path); + close (fd); + return -1; + } + n += r; + } + + if (close (fd) == -1) { + reply_with_perror ("close: %s", path); + return -1; + } + + return 0; +} |