fish: Add --rw option (does nothing yet).
authorRichard W.M. Jones <rjones@redhat.com>
Fri, 5 Nov 2010 18:36:02 +0000 (18:36 +0000)
committerRichard W.M. Jones <rjones@redhat.com>
Mon, 8 Nov 2010 10:21:48 +0000 (10:21 +0000)
This adds the guestfish --rw option, intended in future
to be required for writing to disk images.

At the moment this does not change the default and so does
nothing.  This patch is intended for backporting to the
stable branches so that we can start to introduce scripts
which use 'guestfish --rw'.

fish/fish.c
fish/guestfish.pod
fish/options.h
fuse/guestmount.c
fuse/guestmount.pod

index 9f20bba..5d7aac6 100644 (file)
@@ -150,7 +150,7 @@ main (int argc, char *argv[])
 
   enum { HELP_OPTION = CHAR_MAX + 1 };
 
 
   enum { HELP_OPTION = CHAR_MAX + 1 };
 
-  static const char *options = "a:c:d:Df:h::im:nN:rv?Vx";
+  static const char *options = "a:c:d:Df:h::im:nN:rv?Vwx";
   static const struct option long_options[] = {
     { "add", 1, 0, 'a' },
     { "cmd-help", 2, 0, 'h' },
   static const struct option long_options[] = {
     { "add", 1, 0, 'a' },
     { "cmd-help", 2, 0, 'h' },
@@ -172,6 +172,7 @@ main (int argc, char *argv[])
     { "no-progress-bars", 0, 0, 0 },
     { "remote", 2, 0, 0 },
     { "ro", 0, 0, 'r' },
     { "no-progress-bars", 0, 0, 0 },
     { "remote", 2, 0, 0 },
     { "ro", 0, 0, 'r' },
+    { "rw", 0, 0, 'w' },
     { "selinux", 0, 0, 0 },
     { "verbose", 0, 0, 'v' },
     { "version", 0, 0, 'V' },
     { "selinux", 0, 0, 0 },
     { "verbose", 0, 0, 'v' },
     { "version", 0, 0, 'V' },
@@ -362,6 +363,10 @@ main (int argc, char *argv[])
       OPTION_V;
       break;
 
       OPTION_V;
       break;
 
+    case 'w':
+      OPTION_w;
+      break;
+
     case 'x':
       OPTION_x;
       break;
     case 'x':
       OPTION_x;
       break;
index d265a3d..c52b773 100644 (file)
@@ -10,13 +10,13 @@ guestfish - the libguestfs Filesystem Interactive SHell
 
  guestfish
 
 
  guestfish
 
- guestfish -a disk.img
+ guestfish [--ro|--rw] -a disk.img
 
 
- guestfish -a disk.img -m dev[:mountpoint]
+ guestfish [--ro|--rw] -a disk.img -m dev[:mountpoint]
 
  guestfish -d libvirt-domain
 
 
  guestfish -d libvirt-domain
 
- guestfish -a disk.img -i
+ guestfish [--ro|--rw] -a disk.img -i
 
  guestfish -d libvirt-domain -i
 
 
  guestfish -d libvirt-domain -i
 
@@ -99,7 +99,7 @@ Update C</etc/resolv.conf> in a guest:
 
 Edit C</boot/grub/grub.conf> interactively:
 
 
 Edit C</boot/grub/grub.conf> interactively:
 
- guestfish --add disk.img \
+ guestfish --rw --add disk.img \
    --mount /dev/vg_guest/lv_root \
    --mount /dev/sda1:/boot \
    edit /boot/grub/grub.conf
    --mount /dev/vg_guest/lv_root \
    --mount /dev/sda1:/boot \
    edit /boot/grub/grub.conf
@@ -115,7 +115,7 @@ disks from a virtual machine:
 
 Another way to edit C</boot/grub/grub.conf> interactively is:
 
 
 Another way to edit C</boot/grub/grub.conf> interactively is:
 
- guestfish -a disk.img -i edit /boot/grub/grub.conf
+ guestfish --rw -a disk.img -i edit /boot/grub/grub.conf
 
 =head2 As a script interpreter
 
 
 =head2 As a script interpreter
 
@@ -245,7 +245,7 @@ Typical usage is either:
 
 (for active domains, readonly), or specify the block device directly:
 
 
 (for active domains, readonly), or specify the block device directly:
 
- guestfish -a /dev/Guests/MyGuest -i
+ guestfish --rw -a /dev/Guests/MyGuest -i
 
 Note that the command line syntax changed slightly over older
 versions of guestfish.  You can still use the old syntax:
 
 Note that the command line syntax changed slightly over older
 versions of guestfish.  You can still use the old syntax:
@@ -320,6 +320,8 @@ don't need write access to the disk.
 Note that prepared disk images created with I<-N> are not affected by
 the I<--ro> option.
 
 Note that prepared disk images created with I<-N> are not affected by
 the I<--ro> option.
 
+See also L</OPENING DISKS FOR READ AND WRITE> below.
+
 =item B<--selinux>
 
 Enable SELinux support for the guest.  See L<guestfs(3)/SELINUX>.
 =item B<--selinux>
 
 Enable SELinux support for the guest.  See L<guestfs(3)/SELINUX>.
@@ -333,6 +335,11 @@ a bug.
 
 Display the guestfish / libguestfs version number and exit.
 
 
 Display the guestfish / libguestfs version number and exit.
 
+=item B<-w> | B<--rw>
+
+This option does nothing at the moment.
+See L</OPENING DISKS FOR READ AND WRITE> below.
+
 =item B<-x>
 
 Echo each command before executing it.
 =item B<-x>
 
 Echo each command before executing it.
@@ -392,6 +399,33 @@ I<-N> or I<--new> options were given then C<run> is done
 automatically, simply because guestfish can't perform the action you
 asked for without doing this.
 
 automatically, simply because guestfish can't perform the action you
 asked for without doing this.
 
+=head1 OPENING DISKS FOR READ AND WRITE
+
+The guestfish (and L<guestmount(1)>) options I<--ro> and I<--rw>
+affect whether the other command line options I<-a>, I<-c>, I<-d>,
+I<-i> and I<-m> open disk images read-only or for writing.
+
+In libguestfs E<lt> 1.6.2, guestfish and guestmount defaulted to
+opening disk images supplied on the command line for write.  To open a
+disk image read-only you have to do I<-a image --ro>.
+
+This matters: If you accidentally open a live VM disk image writable
+then you will cause irreversible disk corruption.
+
+By libguestfs 1.8 we intend to change the default the other way.  Disk
+images will be opened read-only.  You will have to either specify
+I<guestfish --rw> or change a configuration file in order to get write
+access for disk images specified by those other command line options.
+
+This version of guestfish has a I<--rw> option which does nothing (it
+is already the default).  However it is highly recommended that you
+use this option to indicate that guestfish needs write access, and to
+prepare your scripts for the day when this option will be required for
+write access.
+
+B<Note:> This does I<not> affect commands like L</add> and L</mount>,
+or any other libguestfs program apart from guestfish and guestmount.
+
 =head1 QUOTING
 
 You can quote ordinary parameters using either single or double
 =head1 QUOTING
 
 You can quote ordinary parameters using either single or double
index e36c57a..9cb7f4b 100644 (file)
@@ -185,6 +185,13 @@ extern int add_libvirt_drives (const char *guest);
     exit (EXIT_SUCCESS);                                                \
   }
 
     exit (EXIT_SUCCESS);                                                \
   }
 
+#define OPTION_w                                                        \
+  if (read_only) {                                                      \
+    fprintf (stderr, _("%s: cannot mix --ro and --rw options\n"),       \
+             program_name);                                             \
+    exit (EXIT_FAILURE);                                                \
+  }
+
 #define OPTION_x                                \
   guestfs_set_trace (g, 1)
 
 #define OPTION_x                                \
   guestfs_set_trace (g, 1)
 
index 55b71d7..1b3abf9 100644 (file)
@@ -884,7 +884,7 @@ main (int argc, char *argv[])
   /* The command line arguments are broadly compatible with (a subset
    * of) guestfish.  Thus we have to deal mainly with -a, -m and --ro.
    */
   /* The command line arguments are broadly compatible with (a subset
    * of) guestfish.  Thus we have to deal mainly with -a, -m and --ro.
    */
-  static const char *options = "a:c:d:im:no:rv?Vx";
+  static const char *options = "a:c:d:im:no:rv?Vwx";
   static const struct option long_options[] = {
     { "add", 1, 0, 'a' },
     { "connect", 1, 0, 'c' },
   static const struct option long_options[] = {
     { "add", 1, 0, 'a' },
     { "connect", 1, 0, 'c' },
@@ -900,6 +900,7 @@ main (int argc, char *argv[])
     { "no-sync", 0, 0, 'n' },
     { "option", 1, 0, 'o' },
     { "ro", 0, 0, 'r' },
     { "no-sync", 0, 0, 'n' },
     { "option", 1, 0, 'o' },
     { "ro", 0, 0, 'r' },
+    { "rw", 0, 0, 'w' },
     { "selinux", 0, 0, 0 },
     { "trace", 0, 0, 'x' },
     { "verbose", 0, 0, 'v' },
     { "selinux", 0, 0, 0 },
     { "trace", 0, 0, 'x' },
     { "verbose", 0, 0, 'v' },
@@ -1043,6 +1044,10 @@ main (int argc, char *argv[])
       OPTION_V;
       break;
 
       OPTION_V;
       break;
 
+    case 'w':
+      OPTION_w;
+      break;
+
     case 'x':
       OPTION_x;
       ADD_FUSE_ARG ("-f");
     case 'x':
       OPTION_x;
       ADD_FUSE_ARG ("-f");
index 4ddea5f..e86d76c 100644 (file)
@@ -203,6 +203,8 @@ disk.  If the guest is running and this option is I<not> supplied,
 then there is a strong risk of disk corruption in the guest.  We try
 to prevent this from happening, but it is not always possible.
 
 then there is a strong risk of disk corruption in the guest.  We try
 to prevent this from happening, but it is not always possible.
 
+See also L<guestfish(1)/OPENING DISKS FOR READ AND WRITE>.
+
 =item B<--selinux>
 
 Enable SELinux support for the guest.
 =item B<--selinux>
 
 Enable SELinux support for the guest.
@@ -215,6 +217,11 @@ Enable verbose messages from underlying libguestfs.
 
 Display the program version and exit.
 
 
 Display the program version and exit.
 
+=item B<-w> | B<--rw>
+
+This option does nothing at the moment.
+See L<guestfish(1)/OPENING DISKS FOR READ AND WRITE>.
+
 =item B<-x> | B<--trace>
 
 Trace libguestfs calls.
 =item B<-x> | B<--trace>
 
 Trace libguestfs calls.