X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=fish%2Ffish.c;h=04ee5b03a7c370478584c5bcbc5325578133c8c9;hb=431503d007b22bf10226843cca84628544fadca9;hp=a896a925750c8b34faccd52e2ddccd77916ed545;hpb=4440e22f4f7ebffe0728a8c019319d1a2b260cf5;p=libguestfs.git diff --git a/fish/fish.c b/fish/fish.c index a896a92..04ee5b0 100644 --- a/fish/fish.c +++ b/fish/fish.c @@ -20,15 +20,16 @@ #include #include +#include #include #include #include #include #include -#include #include #include #include +#include #include #ifdef HAVE_LIBREADLINE @@ -68,6 +69,7 @@ struct mp { char *mountpoint; }; +static void set_up_terminal (void); static char add_drives (struct drv *drv, char next_drive); static void prepare_drives (struct drv *drv); static void mount_mps (struct mp *mp); @@ -82,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; @@ -95,6 +99,9 @@ int command_num = 0; int keys_from_stdin = 0; 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) @@ -132,6 +139,8 @@ 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" @@ -158,6 +167,8 @@ main (int argc, char *argv[]) bindtextdomain (PACKAGE, LOCALEBASEDIR); textdomain (PACKAGE); + set_up_terminal (); + enum { HELP_OPTION = CHAR_MAX + 1 }; static const char *options = "a:c:d:Df:h::im:nN:rv?Vx"; @@ -175,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 }, @@ -260,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); @@ -300,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); } @@ -381,9 +401,12 @@ main (int argc, char *argv[]) guestfs_set_verbose (g, verbose); break; - case 'V': - printf ("%s %s\n", program_name, PACKAGE_VERSION); + case 'V': { + struct guestfs_version *v = guestfs_version (g); + printf ("%s %"PRIi64".%"PRIi64".%"PRIi64"%s\n", program_name, + v->major, v->minor, v->release, v->extra); exit (EXIT_SUCCESS); + } case 'x': guestfs_set_trace (g, 1); @@ -490,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)) @@ -505,6 +537,35 @@ main (int argc, char *argv[]) exit (EXIT_SUCCESS); } +/* The header file which defines this has "issues". */ +extern int tgetent (char *, const char *); + +static void +set_up_terminal (void) +{ + /* http://www.cl.cam.ac.uk/~mgk25/unicode.html#activate */ + utf8_mode = STREQ (nl_langinfo (CODESET), "UTF-8"); + + char *term = getenv ("TERM"); + if (term == NULL) { + //fprintf (stderr, _("guestfish: TERM (terminal type) not defined.\n")); + return; + } + + int r = tgetent (NULL, term); + if (r == -1) { + fprintf (stderr, _("guestfish: could not access termcap or terminfo database.\n")); + return; + } + if (r == 0) { + fprintf (stderr, _("guestfish: terminal type \"%s\" not defined.\n"), + term); + return; + } + + have_terminfo = 1; +} + void pod2text (const char *name, const char *shortdesc, const char *str) { @@ -924,6 +985,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++; @@ -997,6 +1060,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") || @@ -1062,6 +1131,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")); @@ -1102,6 +1175,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"