New API: guestfs_zero_device to zero whole devices.
authorRichard Jones <rjones@redhat.com>
Wed, 31 Mar 2010 12:19:34 +0000 (13:19 +0100)
committerRichard Jones <rjones@redhat.com>
Wed, 31 Mar 2010 12:19:34 +0000 (13:19 +0100)
daemon/zero.c
src/MAX_PROC_NR
src/generator.ml

index 4d06505..6e62e15 100644 (file)
@@ -20,6 +20,7 @@
 
 #include <stdio.h>
 #include <stdlib.h>
+#include <inttypes.h>
 #include <string.h>
 #include <fcntl.h>
 #include <unistd.h>
@@ -55,3 +56,39 @@ do_zero (const char *device)
 
   return 0;
 }
+
+int
+do_zero_device (const char *device)
+{
+  int64_t size = do_blockdev_getsize64 (device);
+  if (size == -1)
+    return -1;
+
+  int fd = open (device, O_WRONLY);
+  if (fd == -1) {
+    reply_with_perror ("%s", device);
+    return -1;
+  }
+
+  char buf[1024*1024];
+  memset (buf, 0, sizeof buf);
+
+  while (size > 0) {
+    size_t n = size > sizeof buf ? sizeof buf : size;
+    ssize_t r = write (fd, buf, n);
+    if (r == -1) {
+      reply_with_perror ("write: %s (with %" PRId64 " bytes left to write)",
+                         device, size);
+      close (fd);
+      return -1;
+    }
+    size -= r;
+  }
+
+  if (close (fd) == -1) {
+    reply_with_perror ("close: %s", device);
+    return -1;
+  }
+
+  return 0;
+}
index 2c36bbd..9be0dc9 100644 (file)
@@ -1 +1 @@
-227
+228
index f519c4d..f206be1 100755 (executable)
@@ -2294,7 +2294,7 @@ How many blocks are zeroed isn't specified (but it's I<not> enough
 to securely wipe the device).  It should be sufficient to remove
 any partition tables, filesystem superblocks and so on.
 
-See also: C<guestfs_scrub_device>.");
+See also: C<guestfs_zero_device>, C<guestfs_scrub_device>.");
 
   ("grub_install", (RErr, [Pathname "root"; Device "device"]), 86, [],
    (* Test disabled because grub-install incompatible with virtio-blk driver.
@@ -4346,6 +4346,15 @@ or file C<src> to another destination device or file C<dest>.
 Note this will fail if the source is too short or if the destination
 is not large enough.");
 
+  ("zero_device", (RErr, [Device "device"]), 228, [DangerWillRobinson],
+   [InitBasicFSonLVM, Always, TestRun (
+      [["zero_device"; "/dev/VG/LV"]])],
+   "write zeroes to an entire device",
+   "\
+This command writes zeroes over the entire C<device>.  Compare
+with C<guestfs_zero> which just zeroes the first few blocks of
+a device.");
+
 ]
 
 let all_functions = non_daemon_functions @ daemon_functions