X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=fish%2Foptions.c;h=48c8e1c2fa4286e8ec74a120cc727a0257a0df0e;hb=7708d3e04f6ec3985fd74ee1a44a5615d43065e2;hp=43a15e49ab95abf4ebdd0f4e08d076bdac69afe7;hpb=4e529e06a4500959cd783f5029354fea47a253a6;p=libguestfs.git diff --git a/fish/options.c b/fish/options.c index 43a15e4..48c8e1c 100644 --- a/fish/options.c +++ b/fish/options.c @@ -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) @@ -120,23 +125,54 @@ mount_mps (struct mp *mp) */ 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) {