#include <sys/types.h>
#include <sys/wait.h>
#include <locale.h>
+#include <langinfo.h>
#include <termios.h>
#ifdef HAVE_LIBREADLINE
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);
static void add_history_line (const char *);
#endif
+static int override_progress_bars = -1;
+
/* Currently open libguestfs handle. */
guestfs_h *g;
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)
" -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"
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";
{ "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 },
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);
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);
}
}
}
+ /* 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))
exit (EXIT_SUCCESS);
}
+/* The <term.h> 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)
{
int pid = 0;
int i, r;
+ reset_progress_bar ();
+
/* This counts the commands issued, starting at 1. */
command_num++;
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") ||
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"));
));
return 0;
}
+ else if (STRCASEEQ (cmd, "copy-in") ||
+ STRCASEEQ (cmd, "copy_in")) {
+ printf (_("copy-in - copy files into an image\n"
+ " copy-in <local> [<local> ...] <remotedir>\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 <remote> [<remote> ...] <localdir>\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 [<params> ...]\n"