Skip to content

Commit

Permalink
fuse: In mount-local-run, test if root filesystem has been mounted (R…
Browse files Browse the repository at this point in the history
…HBZ#1057504).

It is never normally valid to use the mount-local* APIs when you
haven't mounted some filesystems in the libguestfs namespace.

If you try it, it results in some odd errors.  The mount-local-run
call is successful, but subsequent operations fail:

$ mkdir -p /tmp/mnt
$ guestfish -x -N fs mount-local /tmp/mnt : mount-local-run
libguestfs: error: lstat: lstat_stub: you must call 'mount' first to mount the root filesystem
libguestfs: error: lstat: lstat_stub: you must call 'mount' first to mount the root filesystem

With this commit, the mount-local-run call gives an error:

libguestfs: error: you must call 'guestfs_mount' first to mount a filesystem on '/'.
Note: '/tmp/mnt' is still mounted.  Use 'guestunmount /tmp/mnt' to clean up.

The error is implemented by calling guestfs_exists (g, "/") which has
the side effect of running the NEED_ROOT macro in the daemon.  (There
is no simple equivalent of NEED_ROOT on the library side.)
  • Loading branch information
rwmjones committed Jan 24, 2014
1 parent 01d2703 commit 0e24899
Showing 1 changed file with 12 additions and 0 deletions.
12 changes: 12 additions & 0 deletions src/fuse.c
Expand Up @@ -1028,6 +1028,18 @@ guestfs__mount_local_run (guestfs_h *g)
return -1;
}

/* Test if root is mounted. We do this by using a side-effect of
* guestfs_exists (which is that it calls NEED_ROOT).
*/
guestfs_push_error_handler (g, NULL, NULL);
r = guestfs_exists (g, "/");
guestfs_pop_error_handler (g);
if (r == -1) {
error (g, _("you must call 'guestfs_mount' first to mount a filesystem on '/'.\nNote: '%s' is still mounted. Use 'guestunmount %s' to clean up."),
g->localmountpoint, g->localmountpoint);
return -1;
}

debug (g, "%s: entering fuse_loop", __func__);

/* Enter the main loop. */
Expand Down

0 comments on commit 0e24899

Please sign in to comment.