diff options
author | Richard Jones <rjones@redhat.com> | 2010-05-18 23:20:30 +0100 |
---|---|---|
committer | Richard Jones <rjones@redhat.com> | 2010-05-20 10:30:12 +0100 |
commit | 1214b321621e7750c67423ecf4d9528809e1eeac (patch) | |
tree | 4f53875a21079a80b8b78626968fca1cf8aab2ff | |
parent | 3920ad95f6b2db8fbf20aa26692877a09070cb04 (diff) | |
download | libguestfs-1214b321621e7750c67423ecf4d9528809e1eeac.tar.gz libguestfs-1214b321621e7750c67423ecf4d9528809e1eeac.tar.xz libguestfs-1214b321621e7750c67423ecf4d9528809e1eeac.zip |
New API: Implement pwrite system call (partial fix for RHBZ#592883).
-rw-r--r-- | daemon/file.c | 31 | ||||
-rw-r--r-- | src/MAX_PROC_NR | 2 | ||||
-rwxr-xr-x | src/generator.ml | 30 |
3 files changed, 61 insertions, 2 deletions
diff --git a/daemon/file.c b/daemon/file.c index 7d37f569..aca1caa6 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 5d165ff2..e06108c0 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 dfab8dcd..32a81400 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 |