diff options
author | Richard W.M. Jones <rjones@redhat.com> | 2010-09-26 18:00:11 +0100 |
---|---|---|
committer | Richard W.M. Jones <rjones@redhat.com> | 2010-09-26 22:21:36 +0100 |
commit | eeaab2ba84441a96977281a4472b1bccb9ec80a9 (patch) | |
tree | 0e0e103b582b957d3d018469843dd49912e8893d | |
parent | 5a8c8b8bf6e846b8d2d7e710f814d24d9a0183c3 (diff) | |
download | libguestfs-eeaab2ba84441a96977281a4472b1bccb9ec80a9.tar.gz libguestfs-eeaab2ba84441a96977281a4472b1bccb9ec80a9.tar.xz libguestfs-eeaab2ba84441a96977281a4472b1bccb9ec80a9.zip |
New API: pwrite-device
This is the same as the existing 'pwrite' API call, but allows you
to write to a device.
-rw-r--r-- | daemon/file.c | 44 | ||||
-rw-r--r-- | generator/generator_actions.ml | 19 | ||||
-rw-r--r-- | src/MAX_PROC_NR | 2 |
3 files changed, 54 insertions, 11 deletions
diff --git a/daemon/file.c b/daemon/file.c index 08494564..9403100d 100644 --- a/daemon/file.c +++ b/daemon/file.c @@ -463,11 +463,32 @@ do_pread (const char *path, int count, int64_t offset, size_t *size_r) return buf; } +static int +pwrite_fd (int fd, const char *content, size_t size, int64_t offset, + const char *display_path) +{ + ssize_t r; + + r = pwrite (fd, content, size, offset); + if (r == -1) { + reply_with_perror ("pwrite: %s", display_path); + close (fd); + return -1; + } + + if (close (fd) == -1) { + reply_with_perror ("close: %s", display_path); + close (fd); + return -1; + } + + return r; +} + int do_pwrite (const char *path, const char *content, size_t size, int64_t offset) { int fd; - ssize_t r; if (offset < 0) { reply_with_error ("offset is negative"); @@ -483,20 +504,25 @@ 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 pwrite_fd (fd, content, size, offset, path); +} + +int +do_pwrite_device (const char *device, const char *content, size_t size, + int64_t offset) +{ + if (offset < 0) { + reply_with_error ("offset is negative"); return -1; } - if (close (fd) == -1) { - reply_with_perror ("close: %s", path); - close (fd); + int fd = open (device, O_WRONLY); + if (fd == -1) { + reply_with_perror ("open: %s", device); return -1; } - return r; + return pwrite_fd (fd, content, size, offset, device); } /* This runs the 'file' command. */ diff --git a/generator/generator_actions.ml b/generator/generator_actions.ml index ac8dab21..e94fcbde 100644 --- a/generator/generator_actions.ml +++ b/generator/generator_actions.ml @@ -4812,7 +4812,7 @@ 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>."); +See also C<guestfs_pread>, C<guestfs_pwrite_device>."); ("resize2fs_size", (RErr, [Device "device"; Int64 "size"]), 248, [], [], @@ -5166,6 +5166,23 @@ error occurs. See also C<guestfs_download>, C<guestfs_pread>."); + ("pwrite_device", (RInt "nbytes", [Device "device"; BufferIn "content"; Int64 "offset"]), 275, [ProtocolLimitWarning], + [InitPartition, Always, TestOutputList ( + [["pwrite_device"; "/dev/sda"; "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"; "446"]; + ["blockdev_rereadpt"; "/dev/sda"]; + ["list_partitions"]], [])], + "write to part of a device", + "\ +This command writes to part of a device. It writes the data +buffer C<content> to C<device> 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 +(although short writes to disk devices and partitions are +probably impossible with standard Linux kernels). + +See also C<guestfs_pwrite>."); + ] let all_functions = non_daemon_functions @ daemon_functions diff --git a/src/MAX_PROC_NR b/src/MAX_PROC_NR index d4d5a4b7..4c738e3f 100644 --- a/src/MAX_PROC_NR +++ b/src/MAX_PROC_NR @@ -1 +1 @@ -274 +275 |