[Libguestfs] [PATCH] New API: Implement pwrite system call (partial fix for RHBZ#592883).
Richard W.M. Jones
rjones at redhat.com
Tue May 18 22:26:50 UTC 2010
--
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
libguestfs lets you edit virtual machines. Supports shell scripting,
bindings from many languages. http://et.redhat.com/~rjones/libguestfs/
See what it can do: http://et.redhat.com/~rjones/libguestfs/recipes.html
-------------- next part --------------
>From d634c9780b55b6bb21bffc997e483e5b12491eb8 Mon Sep 17 00:00:00 2001
From: Richard Jones <rjones at redhat.com>
Date: Tue, 18 May 2010 23:20:30 +0100
Subject: [PATCH 2/2] New API: Implement pwrite system call (partial fix for RHBZ#592883).
---
daemon/file.c | 31 +++++++++++++++++++++++++++++++
src/MAX_PROC_NR | 2 +-
src/generator.ml | 30 +++++++++++++++++++++++++++++-
3 files changed, 61 insertions(+), 2 deletions(-)
diff --git a/daemon/file.c b/daemon/file.c
index 7d37f56..aca1caa 100644
--- a/daemon/file.c
+++ b/daemon/file.c
@@ -456,6 +456,37 @@ do_pread (const char *path, int count, int64_t offset, size_t *size_r)
return buf;
}
+int
+do_pwrite (const char *path, const char *content, size_t size, int64_t offset)
+{
+ int fd;
+ ssize_t r;
+
+ CHROOT_IN;
+ fd = open (path, O_WRONLY);
+ CHROOT_OUT;
+
+ if (fd == -1) {
+ reply_with_perror ("open: %s", path);
+ return -1;
+ }
+
+ r = pwrite (fd, content, size, offset);
+ if (r == -1) {
+ reply_with_perror ("pwrite: %s", path);
+ close (fd);
+ return -1;
+ }
+
+ if (close (fd) == -1) {
+ reply_with_perror ("close: %s", path);
+ close (fd);
+ return -1;
+ }
+
+ return r;
+}
+
/* This runs the 'file' command. */
char *
do_file (const char *path)
diff --git a/src/MAX_PROC_NR b/src/MAX_PROC_NR
index 5d165ff..e06108c 100644
--- a/src/MAX_PROC_NR
+++ b/src/MAX_PROC_NR
@@ -1 +1 @@
-246
+247
diff --git a/src/generator.ml b/src/generator.ml
index dfab8dc..32a8140 100755
--- a/src/generator.ml
+++ b/src/generator.ml
@@ -4062,7 +4062,9 @@ This command lets you read part of a file. It reads C<count>
bytes of the file, starting at C<offset>, from file C<path>.
This may read fewer bytes than requested. For further details
-see the L<pread(2)> system call.");
+see the L<pread(2)> system call.
+
+See also C<guestfs_pwrite>.");
("part_init", (RErr, [Device "device"; String "parttype"]), 208, [],
[InitEmpty, Always, TestRun (
@@ -4658,6 +4660,32 @@ to ensure the length of the file is exactly C<len> bytes.");
This call creates a file called C<path>. The content of the
file is the string C<content> (which can contain any 8 bit data).");
+ ("pwrite", (RInt "nbytes", [Pathname "path"; BufferIn "content"; Int64 "offset"]), 247, [ProtocolLimitWarning],
+ [InitBasicFS, Always, TestOutput (
+ [["write"; "/new"; "new file contents"];
+ ["pwrite"; "/new"; "data"; "4"];
+ ["cat"; "/new"]], "new data contents");
+ InitBasicFS, Always, TestOutput (
+ [["write"; "/new"; "new file contents"];
+ ["pwrite"; "/new"; "is extended"; "9"];
+ ["cat"; "/new"]], "new file is extended");
+ InitBasicFS, Always, TestOutput (
+ [["write"; "/new"; "new file contents"];
+ ["pwrite"; "/new"; ""; "4"];
+ ["cat"; "/new"]], "new file contents")],
+ "write to part of a file",
+ "\
+This command writes to part of a file. It writes the data
+buffer C<content> to the file C<path> starting at offset C<offset>.
+
+This command implements the L<pwrite(2)> system call, and like
+that system call it may not write the full data requested. The
+return value is the number of bytes that were actually written
+to the file. This could even be 0, although short writes are
+unlikely for regular files in ordinary circumstances.
+
+See also C<guestfs_pread>.");
+
]
let all_functions = non_daemon_functions @ daemon_functions
--
1.6.6.1
More information about the Libguestfs
mailing list