X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=fish%2Ffish.c;h=48ba4590dab1eb690c842b42317c36da74317880;hb=00dcc4084e1f581d6eb98508431c51c83ae014b4;hp=7dae815daa8082455edb606986338b4fe52c4fa0;hpb=4d45c45f0928c7791429d351dc69b75167888f7d;p=libguestfs.git diff --git a/fish/fish.c b/fish/fish.c index 7dae815..48ba459 100644 --- a/fish/fish.c +++ b/fish/fish.c @@ -28,6 +28,7 @@ #include #include #include +#include #ifdef HAVE_LIBREADLINE #include @@ -60,7 +61,9 @@ static void script (int prompt); static void cmdline (char *argv[], int optind, int argc); static void initialize_readline (void); static void cleanup_readline (void); +#ifdef HAVE_LIBREADLINE static void add_history_line (const char *); +#endif /* Currently open libguestfs handle. */ guestfs_h *g; @@ -68,10 +71,10 @@ guestfs_h *g; int read_only = 0; int quit = 0; int verbose = 0; -int echo_commands = 0; int remote_control_listen = 0; int remote_control = 0; int exit_on_error = 1; +int command_num = 0; int launch (guestfs_h *_g) @@ -139,6 +142,10 @@ main (int argc, char *argv[]) atexit (close_stdout); + setlocale (LC_ALL, ""); + bindtextdomain (PACKAGE, LOCALEBASEDIR); + textdomain (PACKAGE); + enum { HELP_OPTION = CHAR_MAX + 1 }; static const char *options = "a:Df:h::im:nrv?Vx"; @@ -318,7 +325,7 @@ main (int argc, char *argv[]) exit (EXIT_SUCCESS); case 'x': - echo_commands = 1; + guestfs_set_trace (g, 1); break; case HELP_OPTION: @@ -374,6 +381,8 @@ main (int argc, char *argv[]) strcat (cmd, " -v"); if (!guestfs_get_autosync (g)) strcat (cmd, " -n"); + if (guestfs_get_trace (g)) + strcat (cmd, " -x"); if (verbose) fprintf (stderr, @@ -470,10 +479,13 @@ mount_mps (struct mp *mp) if (mp) { mount_mps (mp->next); - if (!read_only) - r = guestfs_mount (g, mp->device, mp->mountpoint); - else - r = guestfs_mount_ro (g, mp->device, mp->mountpoint); + + /* 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) exit (EXIT_FAILURE); } @@ -759,6 +771,15 @@ cmdline (char *argv[], int optind, int argc) fprintf (stderr, _("%s: empty command on command line\n"), program_name); exit (EXIT_FAILURE); } + + /* Allow -cmd on the command line to mean (temporarily) override + * the normal exit on error (RHBZ#578407). + */ + if (cmd[0] == '-') { + exit_on_error = 0; + cmd++; + } + params = &argv[optind]; /* Search for end of command list or ":" ... */ @@ -766,10 +787,12 @@ cmdline (char *argv[], int optind, int argc) optind++; if (optind == argc) { - if (issue_command (cmd, params, NULL) == -1) exit (EXIT_FAILURE); + if (issue_command (cmd, params, NULL) == -1 && exit_on_error) + exit (EXIT_FAILURE); } else { argv[optind] = NULL; - if (issue_command (cmd, params, NULL) == -1) exit (EXIT_FAILURE); + if (issue_command (cmd, params, NULL) == -1 && exit_on_error) + exit (EXIT_FAILURE); cmdline (argv, optind+1, argc); } } @@ -782,12 +805,8 @@ issue_command (const char *cmd, char *argv[], const char *pipecmd) int pid = 0; int i, r; - if (echo_commands) { - printf ("%s", cmd); - for (i = 0; argv[i] != NULL; ++i) - printf (" %s", argv[i]); - printf ("\n"); - } + /* This counts the commands issued, starting at 1. */ + command_num++; /* For | ... commands. Annoyingly we can't use popen(3) here. */ if (pipecmd) { @@ -1065,6 +1084,21 @@ display_builtin_command (const char *cmd) cmd); } +/* This is printed when the user types in an unknown command for the + * first command issued. A common case is the user doing: + * guestfish disk.img + * expecting guestfish to open 'disk.img' (in fact, this tried to + * run a command 'disk.img'). + */ +void +extended_help_message (void) +{ + fprintf (stderr, + _("Did you mean to open a disk image? guestfish -a disk.img\n" + "For a list of commands: guestfish -h\n" + "For complete documentation: man guestfish\n")); +} + void free_strings (char **argv) { @@ -1297,19 +1331,23 @@ cleanup_readline (void) } close (fd); +#ifdef HAVE_APPEND_HISTORY (void) append_history (nr_history_lines, histfile); +#else + (void) write_history (histfile); +#endif } #endif } +#ifdef HAVE_LIBREADLINE static void add_history_line (const char *line) { -#ifdef HAVE_LIBREADLINE add_history (line); nr_history_lines++; -#endif } +#endif int xwrite (int fd, const void *v_buf, size_t len)