win-reg: Move documentation after options, combine shell quote sections.
[libguestfs.git] / fuse / guestmount.c
index 55b71d7..8fe9122 100644 (file)
@@ -535,53 +535,16 @@ fg_utimens (const char *path, const struct timespec ts[2])
   return 0;
 }
 
-/* This call is quite hard to emulate through the guestfs(3) API.  In
- * one sense it's a little like access (see above) because it tests
- * whether opening a file would succeed given the flags.  But it also
- * has side effects such as truncating the file if O_TRUNC is given.
- * Therefore we need to emulate it ... painfully.
+/* All this function needs to do is to check that the requested open
+ * flags are valid.  See the notes in <fuse/fuse.h>.
  */
 static int
 fg_open (const char *path, struct fuse_file_info *fi)
 {
-  int r, exists;
+  int flags = fi->flags & 3;
 
-  if (fi->flags & O_WRONLY) {
-    if (read_only)
-      return -EROFS;
-  }
-
-  exists = guestfs_exists (g, path);
-  if (exists == -1)
-    return error ();
-
-  if (fi->flags & O_CREAT) {
-    if (read_only)
-      return -EROFS;
-
-    dir_cache_invalidate (path);
-
-    /* Exclusive?  File must not exist already. */
-    if (fi->flags & O_EXCL) {
-      if (exists)
-        return -EEXIST;
-    }
-
-    /* Create?  Touch it and optionally truncate it. */
-    r = guestfs_touch (g, path);
-    if (r == -1)
-      return error ();
-
-    if (fi->flags & O_TRUNC) {
-      r = guestfs_truncate (g, path);
-      if (r == -1)
-        return error ();
-    }
-  } else {
-    /* Not create, just check it exists. */
-    if (!exists)
-      return -ENOENT;
-  }
+  if (read_only && flags != O_RDONLY)
+    return -EROFS;
 
   return 0;
 }
@@ -884,7 +847,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.
    */
-  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' },
@@ -900,6 +863,7 @@ main (int argc, char *argv[])
     { "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' },
@@ -1043,6 +1007,10 @@ main (int argc, char *argv[])
       OPTION_V;
       break;
 
+    case 'w':
+      OPTION_w;
+      break;
+
     case 'x':
       OPTION_x;
       ADD_FUSE_ARG ("-f");