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");
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. */
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, [],
[],
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