From: Richard Jones Date: Tue, 18 May 2010 22:20:30 +0000 (+0100) Subject: New API: Implement pwrite system call (partial fix for RHBZ#592883). X-Git-Tag: 1.3.14~22 X-Git-Url: http://git.annexia.org/?p=libguestfs.git;a=commitdiff_plain;h=1214b321621e7750c67423ecf4d9528809e1eeac;hp=3920ad95f6b2db8fbf20aa26692877a09070cb04 New API: Implement pwrite system call (partial fix for RHBZ#592883). --- 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 bytes of the file, starting at C, from file C. This may read fewer bytes than requested. For further details -see the L system call."); +see the L system call. + +See also C."); ("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 bytes."); This call creates a file called C. The content of the file is the string C (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 to the file C starting at offset C. + +This command implements the L 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."); + ] let all_functions = non_daemon_functions @ daemon_functions