fuse: Return EXIT_FAILURE if fuse_main fails.
[libguestfs.git] / fuse / guestmount.c
index 8d483b3..7782be1 100644 (file)
@@ -13,7 +13,7 @@
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  *
  * Derived from the example program 'fusexmp.c':
  * Copyright (C) 2001-2007  Miklos Szeredi <miklos@szeredi.hu>
@@ -595,7 +595,7 @@ static int
 fg_read (const char *path, char *buf, size_t size, off_t offset,
          struct fuse_file_info *fi)
 {
-  TRACE_CALL ("%s, %p, %zu, %ld", path, buf, size, offset);
+  TRACE_CALL ("%s, %p, %zu, %ld", path, buf, size, (long) offset);
              
   char *r;
   size_t rsize;
@@ -632,7 +632,7 @@ static int
 fg_write (const char *path, const char *buf, size_t size,
           off_t offset, struct fuse_file_info *fi)
 {
-  TRACE_CALL ("%s, %p, %zu, %ld", path, buf, size, offset);
+  TRACE_CALL ("%s, %p, %zu, %ld", path, buf, size, (long) offset);
 
   if (read_only) return -EROFS;
 
@@ -1034,19 +1034,6 @@ main (int argc, char *argv[])
    */
   ADD_FUSE_ARG ("-s");
 
-  /* If developing, add ./appliance to the path.  Note that libtools
-   * interferes with this because uninstalled guestfish is a shell
-   * script that runs the real program with an absolute path.  Detect
-   * that too.
-   *
-   * BUT if LIBGUESTFS_PATH environment variable is already set by
-   * the user, then don't override it.
-   */
-  if (getenv ("LIBGUESTFS_PATH") == NULL &&
-      argv[0] &&
-      (argv[0][0] != '/' || strstr (argv[0], "/.libs/lt-") != NULL))
-    guestfs_set_path (g, "appliance:" GUESTFS_DEFAULT_PATH);
-
   for (;;) {
     c = getopt_long (argc, argv, options, long_options, &option_index);
     if (c == -1) break;
@@ -1138,11 +1125,52 @@ main (int argc, char *argv[])
   }
 
   /* Check we have the right options. */
-  if (!drvs || !(mps || inspector)) {
-    fprintf (stderr,
-             _("%s: must have at least one -a/-d and at least one -m/-i option\n"),
-             program_name);
-    exit (EXIT_FAILURE);
+  if (!live) {
+    if (!drvs || !(mps || inspector)) {
+      fprintf (stderr,
+               _("%s: must have at least one -a/-d and at least one -m/-i option\n"),
+               program_name);
+      exit (EXIT_FAILURE);
+    }
+  } else {
+    size_t count_d = 0, count_other = 0;
+    struct drv *drv;
+
+    if (read_only) {
+      fprintf (stderr,
+               _("%s: --live is not compatible with --ro option\n"),
+               program_name);
+      exit (EXIT_FAILURE);
+    }
+
+    if (inspector) {
+      fprintf (stderr,
+               _("%s: --live is not compatible with -i option\n"),
+               program_name);
+      exit (EXIT_FAILURE);
+    }
+
+    /* --live: make sure there was one -d option and no -a options */
+    for (drv = drvs; drv; drv = drv->next) {
+      if (drv->type == drv_d)
+        count_d++;
+      else
+        count_other++;
+    }
+
+    if (count_d != 1) {
+      fprintf (stderr,
+               _("%s: with --live, you must use exactly one -d option\n"),
+               program_name);
+      exit (EXIT_FAILURE);
+    }
+
+    if (count_other != 0) {
+      fprintf (stderr,
+               _("%s: --live is not compatible with -a option\n"),
+               program_name);
+      exit (EXIT_FAILURE);
+    }
   }
 
   /* We'd better have a mountpoint. */
@@ -1199,5 +1227,5 @@ main (int argc, char *argv[])
   guestfs_close (g);
   free_dir_caches ();
 
-  exit (r == -1 ? 1 : 0);
+  exit (r == 0 ? EXIT_SUCCESS : EXIT_FAILURE);
 }