Matthew Booth
2010-Aug-27 15:30 UTC
[Libguestfs] [PATCH] Update pwrite to write a full buffer
This patch changes pwrite such that it will never return a short write. This is a backwards compatible API change, as checking for short writes remains correct, but redundant. --- daemon/file.c | 20 +++++++++++++------- src/generator.ml | 6 ------ 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/daemon/file.c b/daemon/file.c index da899b6..9ce0783 100644 --- a/daemon/file.c +++ b/daemon/file.c @@ -501,7 +501,6 @@ 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); @@ -512,11 +511,18 @@ do_pwrite (const char *path, const char *content, size_t size, int64_t offset) return -1; } - r = pwrite (fd, content, size, offset); - if (r == -1) { - reply_with_perror ("pwrite: %s", path); - close (fd); - return -1; + size_t written = 0; + while (written < size) { + ssize_t r = pwrite (fd, content, size - written, offset); + + if (r == -1) { + reply_with_perror ("pwrite: %s", path); + close (fd); + return -1; + } + + offset += r; + written += r; } if (close (fd) == -1) { @@ -525,7 +531,7 @@ do_pwrite (const char *path, const char *content, size_t size, int64_t offset) return -1; } - return r; + return size; } /* This runs the 'file' command. */ diff --git a/src/generator.ml b/src/generator.ml index dc072ef..7dcd7b4 100755 --- a/src/generator.ml +++ b/src/generator.ml @@ -5120,12 +5120,6 @@ file is the string C<content> (which can contain any 8 bit data)."); 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>."); ("resize2fs_size", (RErr, [Device "device"; Int64 "size"]), 248, [], -- 1.7.2.2
Maybe Matching Threads
- [PATCH 1/2] Revert "daemon: Run udev_settle after pwrite-device finishes."
- [PATCH] v2v: -o rhv-upload: Support zero requests.
- [PATCH 1/3] daemon: pwrite/pread: Don't double close on error path.
- Proposed new libguestfs file APIS
- [PATCH] v2v: -o rhv-upload: Support zero requests.