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 | |
parent | dcd08dd356ca361703f4f2a2e25b639b219ac40d (diff) | |
download | libguestfs-540c85a1102c5876265502f8ae287ea697834d20.tar.gz libguestfs-540c85a1102c5876265502f8ae287ea697834d20.tar.xz libguestfs-540c85a1102c5876265502f8ae287ea697834d20.zip |
New API call: fill - fill a file with octets
-rw-r--r-- | daemon/Makefile.am | 1 | ||||
-rw-r--r-- | daemon/fill.c | 76 | ||||
-rw-r--r-- | po/POTFILES.in | 1 | ||||
-rw-r--r-- | src/MAX_PROC_NR | 2 | ||||
-rw-r--r-- | src/generator.ml | 13 |
5 files changed, 92 insertions, 1 deletions
diff --git a/daemon/Makefile.am b/daemon/Makefile.am index 72e18966..d049da6d 100644 --- a/daemon/Makefile.am +++ b/daemon/Makefile.am @@ -41,6 +41,7 @@ guestfsd_SOURCES = \ ext2.c \ fallocate.c \ file.c \ + fill.c \ find.c \ fsck.c \ glob.c \ 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; +} diff --git a/po/POTFILES.in b/po/POTFILES.in index a125f2a9..cf632fcf 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -16,6 +16,7 @@ daemon/echo_daemon.c daemon/ext2.c daemon/fallocate.c daemon/file.c +daemon/fill.c daemon/find.c daemon/fsck.c daemon/glob.c diff --git a/src/MAX_PROC_NR b/src/MAX_PROC_NR index 9d683f8c..c34a8046 100644 --- a/src/MAX_PROC_NR +++ b/src/MAX_PROC_NR @@ -1 +1 @@ -214 +215 diff --git a/src/generator.ml b/src/generator.ml index bde50ff6..4499eb72 100644 --- a/src/generator.ml +++ b/src/generator.ml @@ -4086,6 +4086,19 @@ partition table), C<gpt> (a GPT/EFI-style partition table). Other values are possible, although unusual. See C<guestfs_part_init> for a full list."); + ("fill", (RErr, [Int "c"; Int "len"; Pathname "path"]), 215, [], + [InitBasicFS, Always, TestOutputBuffer ( + [["fill"; "0x63"; "10"; "/test"]; + ["read_file"; "/test"]], "cccccccccc")], + "fill a file with octets", + "\ +This command creates a new file called C<path>. The initial +content of the file is C<len> octets of C<c>, where C<c> +must be a number in the range C<[0..255]>. + +To fill a file with zero bytes (sparsely), it is +much more efficient to use C<guestfs_truncate_size>."); + ] let all_functions = non_daemon_functions @ daemon_functions |