Add mount-loop command (RHBZ#508668).
authorRichard W.M. Jones <rjones@redhat.com>
Mon, 29 Jun 2009 15:03:54 +0000 (16:03 +0100)
committerRichard W.M. Jones <rjones@redhat.com>
Mon, 29 Jun 2009 15:03:54 +0000 (16:03 +0100)
Loop device mounts don't work for the generic 'mount' commands
because the first parameter should be a file not a device.

We want to separate out files parameters from device parameters
in the long term, so this adds a new mount-loop command for this
purpose.

daemon/mount.c
src/generator.ml

index 67b548e..b0cb496 100644 (file)
@@ -278,3 +278,47 @@ do_umount_all (void)
 
   return 0;
 }
+
+/* Mount using the loopback device.  You can't use the generic
+ * do_mount call for this because the first parameter isn't a
+ * device.
+ */
+int
+do_mount_loop (char *file, char *mountpoint)
+{
+  int len, r;
+  char *buf, *mp;
+  char *error;
+
+  NEED_ROOT (-1);
+  ABS_PATH (file, -1);
+
+  /* We have to prefix /sysroot on both the filename and the mountpoint. */
+  len = strlen (mountpoint) + 9;
+  mp = malloc (len);
+  if (!mp) {
+    reply_with_perror ("malloc");
+    return -1;
+  }
+  snprintf (mp, len, "/sysroot%s", mountpoint);
+
+  len = strlen (file) + 9;
+  buf = malloc (len);
+  if (!file) {
+    reply_with_perror ("malloc");
+    free (mp);
+    return -1;
+  }
+  snprintf (buf, len, "/sysroot%s", file);
+
+  r = command (NULL, &error, "mount", "-o", "loop", buf, mp, NULL);
+  free (mp);
+  free (buf);
+  if (r == -1) {
+    reply_with_error ("mount: %s on %s: %s", file, mountpoint, error);
+    free (error);
+    return -1;
+  }
+
+  return 0;
+}
index 2dfc8cb..27a7586 100755 (executable)
@@ -2615,6 +2615,14 @@ Old Linux kernels (2.4 and earlier) used a compressed ext2
 filesystem as initrd.  We I<only> support the newer initramfs
 format (compressed cpio files).");
 
+  ("mount_loop", (RErr, [String "file"; String "mountpoint"]), 129, [],
+   [],
+   "mount a file using the loop device",
+   "\
+This command lets you mount C<file> (a filesystem image
+in a file) on a mount point.  It is entirely equivalent to
+the command C<mount -o loop file mountpoint>.");
+
 ]
 
 let all_functions = non_daemon_functions @ daemon_functions