diff options
-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 |