use add_drive_ro for --mount parameters from guestfish when called with --ro
authorCharles Duffy <cduffy@messageone.com>
Tue, 2 Jun 2009 16:30:26 +0000 (11:30 -0500)
committerRichard Jones <rjones@trick.home.annexia.org>
Tue, 2 Jun 2009 18:16:34 +0000 (19:16 +0100)
To prevent writes (such as ext3 journal replay) from occuring even when --ro is
passed, guestfish should use add_drive_ro() for any drives specified on the
command line with --add if --ro is also passed.

As we need to look through the entire command line for --ro before adding any
drives, we move the add process out of the argument-parsing loop and into its
own function, patterned off mount_mps().

Signed-off-by: Charles Duffy <charles_duffy@dell.com>
fish/fish.c

index 18d3880..96c1a81 100644 (file)
@@ -45,6 +45,12 @@ struct mp {
   char *mountpoint;
 };
 
+struct drv {
+  struct drv *next;
+  char *filename;
+};
+
+static void add_drives (struct drv *drv);
 static void mount_mps (struct mp *mp);
 static void interactive (void);
 static void shell_script (void);
@@ -119,6 +125,8 @@ main (int argc, char *argv[])
     { "version", 0, 0, 'V' },
     { 0, 0, 0, 0 }
   };
+  struct drv *drvs = NULL;
+  struct drv *drv;
   struct mp *mps = NULL;
   struct mp *mp;
   char *p;
@@ -160,8 +168,14 @@ main (int argc, char *argv[])
        perror (optarg);
        exit (1);
       }
-      if (guestfs_add_drive (g, optarg) == -1)
-       exit (1);
+      drv = malloc (sizeof (struct drv));
+      if (!drv) {
+        perror ("malloc");
+        exit (1);
+      }
+      drv->filename = optarg;
+      drv->next = drvs;
+      drvs = drv;
       break;
 
     case 'h':
@@ -218,6 +232,9 @@ main (int argc, char *argv[])
     }
   }
 
+  /* If we've got drives to add, add them now. */
+  add_drives (drvs);
+
   /* If we've got mountpoints, we must launch the guest and mount them. */
   if (mps != NULL) {
     if (launch (g) == -1) exit (1);
@@ -277,6 +294,22 @@ mount_mps (struct mp *mp)
 }
 
 static void
+add_drives (struct drv *drv)
+{
+  int r;
+
+  if (drv) {
+    add_drives (drv->next);
+    if (!read_only)
+      r = guestfs_add_drive (g, drv->filename);
+    else
+      r = guestfs_add_drive_ro (g, drv->filename);
+    if (r == -1)
+      exit (1);
+  }
+}
+
+static void
 interactive (void)
 {
   script (1);