diff options
author | Richard Jones <rjones@redhat.com> | 2009-04-04 01:40:43 +0100 |
---|---|---|
committer | Richard Jones <rjones@redhat.com> | 2009-04-04 01:40:43 +0100 |
commit | 76f3ea8fb3318966c376bc6fbccbd5a81a9ec564 (patch) | |
tree | 015991e0071b040da5be87b2c9014dbae37c77cc /fish | |
parent | 4567839859befc5aa9e1eee942dc2ba0701516e2 (diff) | |
download | libguestfs-76f3ea8fb3318966c376bc6fbccbd5a81a9ec564.tar.gz libguestfs-76f3ea8fb3318966c376bc6fbccbd5a81a9ec564.tar.xz libguestfs-76f3ea8fb3318966c376bc6fbccbd5a81a9ec564.zip |
Command line, help.
Diffstat (limited to 'fish')
-rw-r--r-- | fish/cmds.c | 26 | ||||
-rw-r--r-- | fish/fish.c | 117 | ||||
-rw-r--r-- | fish/fish.h | 4 |
3 files changed, 123 insertions, 24 deletions
diff --git a/fish/cmds.c b/fish/cmds.c index d0ab20c7..a3a1d0fc 100644 --- a/fish/cmds.c +++ b/fish/cmds.c @@ -27,7 +27,8 @@ void list_commands (void) { - printf ("%-20s %s\n", "Command", "Description"); + printf (" %-16s %s\n", "Command", "Description"); + list_builtin_commands (); printf ("%-20s %s\n", "mount", "Mount a guest disk at a position in the filesystem"); printf ("%-20s %s\n", "sync", "Sync disks, writes are flushed through to the disk image"); printf ("%-20s %s\n", "touch", "Update file timestamps or create a new file"); @@ -45,9 +46,24 @@ void display_command (const char *cmd) if (strcasecmp (cmd, "touch") == 0) pod2text ("touch - Update file timestamps or create a new file", " touch <path>\n\nTouch acts like the L<touch(1)> command. It can be used to\nupdate the timestamps on a file, or, if the file does not exist,\nto create a new zero-length file."); else - { - fprintf (stderr, "%s: command not known, use -h to list all commands\n", cmd); - exit (1); - } + display_builtin_command (cmd); +} + +int run_action (const char *cmd, int argc, char *argv[]) +{ + if (strcasecmp (cmd, "mount") == 0) + printf ("running mount ...\n"); + else + if (strcasecmp (cmd, "sync") == 0) + printf ("running sync ...\n"); + else + if (strcasecmp (cmd, "touch") == 0) + printf ("running touch ...\n"); + else + { + fprintf (stderr, "%s: unknown command\n", cmd); + return -1; + } + return 0; } diff --git a/fish/fish.c b/fish/fish.c index a2525162..d256c2b0 100644 --- a/fish/fish.c +++ b/fish/fish.c @@ -39,24 +39,26 @@ static void interactive (void); static void shell_script (void); static void script (int prompt); static void cmdline (char *argv[], int optind, int argc); -static void issue_command (const char *cmd, char *argv[]); +static int issue_command (const char *cmd, char *argv[]); /* Currently open libguestfs handle. */ guestfs_h *g; int g_launched = 0; int quit = 0; +int verbose = 0; -void +int launch (void) { if (!g_launched) { if (guestfs_launch (g) == -1) - exit (1); + return -1; if (guestfs_wait_ready (g) == -1) - exit (1); + return -1; g_launched = 1; } + return 0; } static void @@ -67,7 +69,7 @@ usage (void) "guestfish lets you edit virtual machine filesystems\n" "Copyright (C) 2009 Red Hat Inc.\n" "Usage:\n" - " guestfish [--options] cmd [: cmd ...]\n" + " guestfish [--options] cmd [: cmd : cmd ...]\n" "or for interactive use:\n" " guestfish\n" "or from a shell script:\n" @@ -151,6 +153,11 @@ main (int argc, char *argv[]) mps = mp->next; break; + case 'v': + verbose++; + guestfs_set_verbose (g, verbose); + break; + case '?': usage (); exit (0); @@ -163,7 +170,7 @@ main (int argc, char *argv[]) /* If we've got mountpoints, we must launch the guest and mount them. */ if (mps != NULL) { - launch (); + if (launch () == -1) exit (1); mount_mps (mps); } @@ -263,7 +270,7 @@ script (int prompt) exit (1); } - issue_command (cmd, argv); + (void) issue_command (cmd, argv); } if (prompt) printf ("\n"); } @@ -287,27 +294,99 @@ cmdline (char *argv[], int optind, int argc) while (optind < argc && strcmp (argv[optind], ":") != 0) optind++; - if (optind == argc) - issue_command (cmd, params); - else { + if (optind == argc) { + if (issue_command (cmd, params) == -1) exit (1); + } else { argv[optind] = NULL; - issue_command (cmd, params); + if (issue_command (cmd, params) == -1) exit (1); cmdline (argv, optind+1, argc); } } -static void +static int issue_command (const char *cmd, char *argv[]) { - int i; - - fprintf (stderr, "cmd = %s", cmd); - for (i = 0; argv[i] != NULL; ++i) - fprintf (stderr, ", arg[%d]=%s", i, argv[i]); - fprintf (stderr, "\n"); - + int argc; + for (argc = 0; argv[argc] != NULL; ++argc) + ; + if (strcasecmp (cmd, "help") == 0) { + if (argc == 0) + list_commands (); + else + display_command (argv[0]); + return 0; + } + else if (strcasecmp (cmd, "quit") == 0 || + strcasecmp (cmd, "exit") == 0 || + strcasecmp (cmd, "q") == 0) + exit (0); + else if (strcasecmp (cmd, "add") == 0 || + strcasecmp (cmd, "drive") == 0 || + strcasecmp (cmd, "add_drive") == 0) { + if (argc != 1) { + fprintf (stderr, "use 'add image' to add a guest image\n"); + return -1; + } + else + return guestfs_add_drive (g, argv[0]); + } + else if (strcasecmp (cmd, "cdrom") == 0) { + if (argc != 1) { + fprintf (stderr, "use 'cdrom image' to add a guest cdrom\n"); + return -1; + } + else + return guestfs_add_cdrom (g, argv[0]); + } + else if (strcasecmp (cmd, "launch") == 0) { + if (argc != 0) { + fprintf (stderr, "'launch' command takes no parameters\n"); + return -1; + } + else + return launch (); + } + else + return run_action (cmd, argc, argv); +} +void +list_builtin_commands (void) +{ + printf ("%-20s %s\n", + "help", "display a list of commands or help on a command"); + printf ("%-20s %s\n", + "quit", "quit guestfish"); + printf ("%-20s %s\n", + "add", "add a guest image to be examined or modified"); + printf ("%-20s %s\n", + "cdrom", "add a guest CD-ROM image to be examined"); + printf ("%-20s %s\n", + "launch", "launch the subprocess"); +} +void +display_builtin_command (const char *cmd) +{ + if (strcasecmp (cmd, "add") == 0) + printf ("add - add a guest image to be examined or modified\n" + " add <image>\n"); + else if (strcasecmp (cmd, "cdrom") == 0) + printf ("cdrom - add a guest CD-ROM image to be examined\n" + " cdrom <iso-file>\n"); + else if (strcasecmp (cmd, "help") == 0) + printf ("help - display a list of commands or help on a command\n" + " help cmd\n" + " help\n"); + else if (strcasecmp (cmd, "quit") == 0) + printf ("quit - quit guestfish\n" + " quit\n"); + else if (strcasecmp (cmd, "launch") == 0) + printf ("launch - launch the subprocess\n" + " launch\n"); + else + fprintf (stderr, "%s: command not known, use -h to list all commands\n", + cmd); } diff --git a/fish/fish.h b/fish/fish.h index 09a9ef27..f98464a5 100644 --- a/fish/fish.h +++ b/fish/fish.h @@ -25,10 +25,14 @@ extern guestfs_h *g; extern int g_launched; extern int quit; +extern int verbose; extern void pod2text (const char *heading, const char *body); +extern void list_builtin_commands (void); +extern void display_builtin_command (const char *cmd); /* in cmds.c (auto-generated) */ extern void list_commands (void); extern void display_command (const char *cmd); +extern int run_action (const char *cmd, int argc, char *argv[]); #endif /* FISH_H */ |