Richard W.M. Jones
2010-May-18 22:26 UTC
[Libguestfs] [PATCH] New API: Implement pwrite system call (partial fix for RHBZ#592883).
-- 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 2001From: 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
Reasonably Related Threads
- [PATCH] Add waitpid along guestfs_close path (RHBZ#518747)
- [PATCH] Add error callback (RHBZ#602599).
- [PATCH 0/3] some guestfish sub commands can not handle special files properly (RHBZ#582484)
- [PATCH] Don't run new-kernel-pkg or nscd (RHBZ#557262).
- [PATCH] daemon: Parse output of old parted which didn't support -m option (RHBZ#598309).