From 540c85a1102c5876265502f8ae287ea697834d20 Mon Sep 17 00:00:00 2001 From: Richard Jones Date: Tue, 17 Nov 2009 19:51:29 +0000 Subject: [PATCH] New API call: fill - fill a file with octets --- daemon/Makefile.am | 1 + daemon/fill.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ po/POTFILES.in | 1 + src/MAX_PROC_NR | 2 +- src/generator.ml | 13 ++++++++++ 5 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 daemon/fill.c diff --git a/daemon/Makefile.am b/daemon/Makefile.am index 72e1896..d049da6 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 0000000..b1b0f5e --- /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 + +#include +#include +#include +#include + +#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 a125f2a..cf632fc 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 9d683f8..c34a804 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 bde50ff..4499eb7 100644 --- a/src/generator.ml +++ b/src/generator.ml @@ -4086,6 +4086,19 @@ partition table), C (a GPT/EFI-style partition table). Other values are possible, although unusual. See C 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. The initial +content of the file is C octets of C, where 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."); + ] let all_functions = non_daemon_functions @ daemon_functions -- 1.8.3.1