From 76f3ea8fb3318966c376bc6fbccbd5a81a9ec564 Mon Sep 17 00:00:00 2001 From: Richard Jones Date: Sat, 4 Apr 2009 01:40:43 +0100 Subject: [PATCH] Command line, help. --- fish/cmds.c | 26 ++++++++++--- fish/fish.c | 117 ++++++++++++++++++++++++++++++++++++++++++++++--------- fish/fish.h | 4 ++ src/generator.ml | 25 +++++++++--- 4 files changed, 143 insertions(+), 29 deletions(-) diff --git a/fish/cmds.c b/fish/cmds.c index d0ab20c..a3a1d0f 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 \n\nTouch acts like the L 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 a252516..d256c2b 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 \n"); + else if (strcasecmp (cmd, "cdrom") == 0) + printf ("cdrom - add a guest CD-ROM image to be examined\n" + " cdrom \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 09a9ef2..f98464a 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 */ diff --git a/src/generator.ml b/src/generator.ml index b26ea3c..75dcc79 100755 --- a/src/generator.ml +++ b/src/generator.ml @@ -466,7 +466,8 @@ and generate_fish_cmds () = (* list_commands function, which implements guestfish -h *) pr "void list_commands (void)\n"; pr "{\n"; - pr " printf (\"%%-20s %%s\\n\", \"Command\", \"Description\");\n"; + pr " printf (\" %%-16s %%s\\n\", \"Command\", \"Description\");\n"; + pr " list_builtin_commands ();\n"; List.iter ( fun (name, _, _, shortdesc, _) -> pr " printf (\"%%-20s %%s\\n\", \"%s\", \"%s\");\n" @@ -499,10 +500,24 @@ and generate_fish_cmds () = (" " ^ synopsis ^ "\n\n" ^ longdesc); pr " else\n" ) functions; - pr " {\n"; - pr " fprintf (stderr, \"%%s: command not known, use -h to list all commands\\n\", cmd);\n"; - pr " exit (1);\n"; - pr " }\n"; + pr " display_builtin_command (cmd);\n"; + pr "}\n"; + pr "\n"; + + (* run_action function *) + pr "int run_action (const char *cmd, int argc, char *argv[])\n"; + pr "{\n"; + List.iter ( + fun (name, style, _, _, _) -> + pr " if (strcasecmp (cmd, \"%s\") == 0)\n" name; + pr " printf (\"running %s ...\\n\");\n" name; + pr " else\n"; + ) functions; + pr " {\n"; + pr " fprintf (stderr, \"%%s: unknown command\\n\", cmd);\n"; + pr " return -1;\n"; + pr " }\n"; + pr " return 0;\n"; pr "}\n"; pr "\n" -- 1.8.3.1