X-Git-Url: http://git.annexia.org/?p=libguestfs.git;a=blobdiff_plain;f=fish%2Ffish.c;h=43b7eee209cd458edf1a677728a676865b22cd2d;hp=c4ade8c26af7be6ae7338edd95b54e8dce4de918;hb=3eb76554ef1f2f218f8920d9a8b8fb4ba6b21d66;hpb=3003df6bbc889c3939e6c478462dc4478d5b89f7 diff --git a/fish/fish.c b/fish/fish.c index c4ade8c..43b7eee 100644 --- a/fish/fish.c +++ b/fish/fish.c @@ -26,7 +26,6 @@ #include #include #include -#include #include #include #include @@ -85,6 +84,8 @@ static void cleanup_readline (void); static void add_history_line (const char *); #endif +static int override_progress_bars = -1; + /* Currently open libguestfs handle. */ guestfs_h *g; @@ -100,6 +101,7 @@ const char *libvirt_uri = NULL; int inspector = 0; int utf8_mode = 0; int have_terminfo = 0; +int progress_bars = 0; static void __attribute__((noreturn)) usage (int status) @@ -111,11 +113,11 @@ usage (int status) fprintf (stdout, _("%s: guest filesystem shell\n" "%s lets you edit virtual machine filesystems\n" - "Copyright (C) 2009 Red Hat Inc.\n" + "Copyright (C) 2009-2010 Red Hat Inc.\n" "Usage:\n" " %s [--options] cmd [: cmd : cmd ...]\n" - " %s -i libvirt-domain\n" - " %s -i disk-image(s)\n" + " %s [--ro] -i -a disk-image\n" + " %s [--ro] -i -d libvirt-domain\n" "or for interactive use:\n" " %s\n" "or from a shell script:\n" @@ -137,13 +139,15 @@ usage (int status) " -m|--mount dev[:mnt] Mount dev on mnt (if omitted, /)\n" " -n|--no-sync Don't autosync\n" " -N|--new type Create prepared disk (test1.img, ...)\n" + " --progress-bars Enable progress bars even when not interactive\n" + " --no-progress-bars Disable progress bars\n" " --remote[=pid] Send commands to remote %s\n" " -r|--ro Mount read-only\n" " --selinux Enable SELinux support\n" " -v|--verbose Verbose messages\n" " -x Echo each command before executing it\n" " -V|--version Display version and exit\n" - "For more information, see the manpage %s(1).\n"), + "For more information, see the manpage %s(1).\n"), program_name, program_name, program_name, program_name, program_name, program_name, program_name, program_name, program_name); @@ -182,6 +186,8 @@ main (int argc, char *argv[]) { "new", 1, 0, 'N' }, { "no-dest-paths", 0, 0, 'D' }, { "no-sync", 0, 0, 'n' }, + { "progress-bars", 0, 0, 0 }, + { "no-progress-bars", 0, 0, 0 }, { "remote", 2, 0, 0 }, { "ro", 0, 0, 'r' }, { "selinux", 0, 0, 0 }, @@ -267,6 +273,10 @@ main (int argc, char *argv[]) guestfs_set_selinux (g, 1); } else if (STREQ (long_options[option_index].name, "keys-from-stdin")) { keys_from_stdin = 1; + } else if (STREQ (long_options[option_index].name, "progress-bars")) { + override_progress_bars = 1; + } else if (STREQ (long_options[option_index].name, "no-progress-bars")) { + override_progress_bars = 0; } else { fprintf (stderr, _("%s: unknown long option: %s (%d)\n"), program_name, long_options[option_index].name, option_index); @@ -307,7 +317,10 @@ main (int argc, char *argv[]) break; case 'N': - if (STRCASEEQ (optarg, "list")) { + if (STRCASEEQ (optarg, "list") || + STRCASEEQ (optarg, "help") || + STRCASEEQ (optarg, "h") || + STRCASEEQ (optarg, "?")) { list_prepared_drives (); exit (EXIT_SUCCESS); } @@ -500,6 +513,15 @@ main (int argc, char *argv[]) } } + /* Decide if we display progress bars. */ + progress_bars = + override_progress_bars >= 0 + ? override_progress_bars + : (optind >= argc && isatty (0)); + + if (progress_bars) + guestfs_set_progress_callback (g, progress_callback, NULL); + /* Interactive, shell script, or command(s) on the command line? */ if (optind >= argc) { if (isatty (0)) @@ -577,8 +599,21 @@ mount_mps (struct mp *mp) */ const char *options = read_only ? "ro" : ""; r = guestfs_mount_options (g, options, mp->device, mp->mountpoint); - if (r == -1) + if (r == -1) { + /* Display possible mountpoints before exiting. */ + char **fses = guestfs_list_filesystems (g); + if (fses == NULL || fses[0] == NULL) + goto out; + fprintf (stderr, + _("guestfish: '%s' could not be mounted. Did you mean one of these?\n"), + 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: exit (EXIT_FAILURE); + } } } @@ -963,6 +998,8 @@ issue_command (const char *cmd, char *argv[], const char *pipecmd) int pid = 0; int i, r; + reset_progress_bar (); + /* This counts the commands issued, starting at 1. */ command_num++; @@ -1036,6 +1073,12 @@ issue_command (const char *cmd, char *argv[], const char *pipecmd) else if (STRCASEEQ (cmd, "alloc") || STRCASEEQ (cmd, "allocate")) r = do_alloc (cmd, argc, argv); + else if (STRCASEEQ (cmd, "copy-in") || + STRCASEEQ (cmd, "copy_in")) + r = do_copy_in (cmd, argc, argv); + else if (STRCASEEQ (cmd, "copy-out") || + STRCASEEQ (cmd, "copy_out")) + r = do_copy_out (cmd, argc, argv); else if (STRCASEEQ (cmd, "echo")) r = do_echo (cmd, argc, argv); else if (STRCASEEQ (cmd, "edit") || @@ -1101,6 +1144,10 @@ list_builtin_commands (void) printf ("%-20s %s\n", "alloc", _("allocate an image")); printf ("%-20s %s\n", + "copy-in", _("copy files into an image")); + printf ("%-20s %s\n", + "copy-out", _("copy files out of an image")); + printf ("%-20s %s\n", "echo", _("display a line of text")); printf ("%-20s %s\n", "edit", _("edit a file in the image")); @@ -1141,6 +1188,26 @@ display_builtin_command (const char *cmd) )); return 0; } + else if (STRCASEEQ (cmd, "copy-in") || + STRCASEEQ (cmd, "copy_in")) { + printf (_("copy-in - copy files into an image\n" + " copy-in [ ...] \n" + "\n" + " Copy local files or directories recursively into the\n" + " image, placing them on a remote directory.\n" + )); + return 0; + } + else if (STRCASEEQ (cmd, "copy-out") || + STRCASEEQ (cmd, "copy_out")) { + printf (_("copy-out - copy files out of an image\n" + " copy-out [ ...] \n" + "\n" + " Copy remote files or directories recursively out of the\n" + " image, placing them in a local directory.\n" + )); + return 0; + } else if (STRCASEEQ (cmd, "echo")) { printf (_("echo - display a line of text\n" " echo [ ...]\n" @@ -1160,10 +1227,7 @@ display_builtin_command (const char *cmd) " running \"cat\", editing locally, and then \"write\".\n" "\n" " Normally it uses $EDITOR, but if you use the aliases\n" - " \"vi\" or \"emacs\" you will get those editors.\n" - "\n" - " NOTE: This will not work reliably for large files\n" - " (> 2 MB) or binary files containing \\0 bytes.\n")); + " \"vi\" or \"emacs\" you will get those editors.\n")); return 0; } else if (STRCASEEQ (cmd, "lcd")) { @@ -1209,10 +1273,7 @@ display_builtin_command (const char *cmd) " running \"cat\" and using the pager.\n" "\n" " Normally it uses $PAGER, but if you use the alias\n" - " \"less\" then it always uses \"less\".\n" - "\n" - " NOTE: This will not work reliably for large files\n" - " (> 2 MB) or binary files containing \\0 bytes.\n")); + " \"less\" then it always uses \"less\".\n")); return 0; } else if (STRCASEEQ (cmd, "quit") ||