[Libguestfs] [PATCH 2/2] New API: pwrite-device

Richard W.M. Jones rjones at redhat.com
Sun Sep 26 18:55:03 UTC 2010


-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
New in Fedora 11: Fedora Windows cross-compiler. Compile Windows
programs, test, and build Windows installers. Over 70 libraries supprt'd
http://fedoraproject.org/wiki/MinGW http://www.annexia.org/fedora_mingw
-------------- next part --------------
>From d0eca2641b2157e08b53f9059e6cbd0b2462969f Mon Sep 17 00:00:00 2001
From: Richard W.M. Jones <rjones at redhat.com>
Date: Sun, 26 Sep 2010 18:00:11 +0100
Subject: [PATCH 2/2] New API: pwrite-device

This is the same as the existing 'pwrite' API call, but allows you
to write to a device.
---
 daemon/file.c                  |   44 +++++++++++++++++++++++++++++++--------
 generator/generator_actions.ml |   19 ++++++++++++++++-
 src/MAX_PROC_NR                |    2 +-
 3 files changed, 54 insertions(+), 11 deletions(-)

diff --git a/daemon/file.c b/daemon/file.c
index 0849456..9403100 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 ac8dab2..e94fcbd 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 d4d5a4b..4c738e3 100644
--- a/src/MAX_PROC_NR
+++ b/src/MAX_PROC_NR
@@ -1 +1 @@
-274
+275
-- 
1.7.3



More information about the Libguestfs mailing list