[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

Re: [fedora-virt] Re: virt-inspector calling guestfs_umount_all() before launch()?



Richard W.M. Jones wrote:
On Tue, Jun 02, 2009 at 08:51:53AM -0500, Charles Duffy wrote:
That said -- might I suggest that guestfish use add_drive_ro() for all --add
options if --ro is specified on the command line at startup?
Yes, good idea, please send a patch.
Attached.
>From 713f8194fdb4567663a009334d14e34ace2ebd52 Mon Sep 17 00:00:00 2001
From: Charles Duffy <cduffy messageone com>
Date: Tue, 2 Jun 2009 11:30:26 -0500
Subject: [PATCH] use add_drive_ro for --mount parameters from guestfish when called with --ro

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 |   37 +++++++++++++++++++++++++++++++++++--
 1 files changed, 35 insertions(+), 2 deletions(-)

diff --git a/fish/fish.c b/fish/fish.c
index 18d3880..96c1a81 100644
--- a/fish/fish.c
+++ b/fish/fish.c
@@ -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);
-- 
1.6.0.4


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]