X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=fish%2Foptions.c;h=48c8e1c2fa4286e8ec74a120cc727a0257a0df0e;hb=0ef30bbb316b50beba511a5eb4bd7174671fa1ca;hp=436e10d8d79865a09047b21d3e22cf968159a0f6;hpb=70faafe8d4f0c06c3e62c1e1469289255ee30c53;p=libguestfs.git diff --git a/fish/options.c b/fish/options.c index 436e10d..48c8e1c 100644 --- a/fish/options.c +++ b/fish/options.c @@ -1,5 +1,5 @@ /* libguestfs - guestfish and guestmount shared option parsing - * Copyright (C) 2010 Red Hat Inc. + * Copyright (C) 2010-2011 Red Hat Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,6 +21,8 @@ #include #include +#include "c-ctype.h" + #include "guestfs.h" #include "options.h" @@ -97,6 +99,9 @@ add_drives (struct drv *drv, char next_drive) return next_drive; } +static void display_mountpoints_on_failure (const char *mp_device); +static void canonical_device_name (char *dev); + /* List is built in reverse order, so mount them in reverse order. */ void mount_mps (struct mp *mp) @@ -106,30 +111,68 @@ mount_mps (struct mp *mp) if (mp) { mount_mps (mp->next); + const char *options; + if (mp->options) + options = mp->options; + else if (read_only) + options = "ro"; + else + options = ""; + /* Don't use guestfs_mount here because that will default to mount * options -o sync,noatime. For more information, see guestfs(3) * section "LIBGUESTFS GOTCHAS". */ - const char *options = read_only ? "ro" : ""; r = guestfs_mount_options (g, options, mp->device, mp->mountpoint); if (r == -1) { - /* Display possible mountpoints before exiting. */ - char **fses = guestfs_list_filesystems (g); - if (fses == NULL || fses[0] == NULL) - goto out; - fprintf (stderr, - _("%s: '%s' could not be mounted. Did you mean one of these?\n"), - program_name, mp->device); - size_t i; - for (i = 0; fses[i] != NULL; i += 2) - fprintf (stderr, "\t%s (%s)\n", fses[i], fses[i+1]); - - out: + display_mountpoints_on_failure (mp->device); exit (EXIT_FAILURE); } } } +/* If the -m option fails on any command, display a useful error + * message listing the mountpoints. + */ +static void +display_mountpoints_on_failure (const char *mp_device) +{ + char **fses; + size_t i; + + fses = guestfs_list_filesystems (g); + if (fses == NULL) + return; + if (fses[0] == NULL) { + free (fses); + return; + } + + fprintf (stderr, + _("%s: '%s' could not be mounted. Did you mean one of these?\n"), + program_name, mp_device); + + for (i = 0; fses[i] != NULL; i += 2) { + canonical_device_name (fses[i]); + fprintf (stderr, "\t%s (%s)\n", fses[i], fses[i+1]); + free (fses[i]); + free (fses[i+1]); + } + + free (fses); +} + +static void +canonical_device_name (char *dev) +{ + if (STRPREFIX (dev, "/dev/") && + (dev[5] == 'h' || dev[5] == 'v') && + dev[6] == 'd' && + c_isalpha (dev[7]) && + (c_isdigit (dev[8]) || dev[8] == '\0')) + dev[5] = 's'; +} + void free_drives (struct drv *drv) {