On 10/12/2010 01:14 AM, Lai Jiangshan wrote:
Old virsh command parsing mashes all the args back into a string and
miss the quotes, this patches fix it. It is also needed for introducing
qemu-monitor-command which is very useful.
This patches uses the new vrshCommandParser abstraction and adds
s/vrsh/vsh/
+++ b/tools/virsh.c
@@ -10165,12 +10165,47 @@ vshCommandRun(vshControl *ctl, const vshCmd *cmd)
typedef struct __vshCommandParser {
int (*getNextArg)(vshControl *, struct __vshCommandParser *, char **);
+ /* vshCommandStringGetArg() */
char *pos;
+ /* vshCommandArgvGetArg() */
+ char **arg_pos;
+ char **arg_end;
If I was worried about memory, I'd consider making this a discriminated
union; but we don't instantiate too many vshCommandParser objects to be
worth worrying about the extra word of storage.
+/* ---------------
* Command string parsing
* ---------------
*/
@@ -10939,7 +10974,8 @@ static void
vshUsage(void)
{
const vshCmdDef *cmd;
- fprintf(stdout, _("\n%s [options] [commands]\n\n"
+ fprintf(stdout, _("\n%s [options]... [<command_string>]"
+ "\n%s [options]...<command> [args...]\n\n"
Hmm; we need a corresponding patch to virsh.pod.
ACK. Here's what I'm squashing as part of rebasing (yes, I documented
features that aren't in until later patches; oh well). And I'm posting
a followup patch that documents virsh's options, like -c.
diff --git i/tools/virsh.c w/tools/virsh.c
index 901b953..688705d 100644
--- i/tools/virsh.c
+++ w/tools/virsh.c
@@ -10203,7 +10203,7 @@ static int vshCommandParse(vshControl *ctl,
vshCommandParser *parser);
* ---------------
*/
-static int
+static vshCommandToken ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3)
vshCommandArgvGetArg(vshControl *ctl, vshCommandParser *parser, char
**res)
{
if (parser->arg_pos == parser->arg_end) {
diff --git i/tools/virsh.pod w/tools/virsh.pod
index e0471b1..209aa54 100644
--- i/tools/virsh.pod
+++ w/tools/virsh.pod
@@ -4,7 +4,9 @@ virsh - management user interface
=head1 SYNOPSIS
-virsh <subcommand> [args]
+B<virsh> [I<OPTION>]... [I<COMMAND_STRING>]
+
+B<virsh> [I<OPTION>]... I<COMMAND> [I<ARG>]...
=head1 DESCRIPTION
@@ -22,20 +24,25 @@ KVM, LXC, OpenVZ, VirtualBox, OpenNebula, and VMware
ESX.
The basic structure of most virsh usage is:
- virsh <command> <domain-id> [OPTIONS]
+ virsh <command> <domain-id> [ARG]...
Where I<command> is one of the commands listed below, I<domain-id>
is the numeric domain id, or the domain name (which will be internally
-translated to domain id), and I<OPTIONS> are command specific
+translated to domain id), and I<ARGS> are command specific
options. There are a few exceptions to this rule in the cases where
the command in question acts on all domains, the entire machine,
or directly on the xen hypervisor. Those exceptions will be clear for
each of those commands.
-The B<virsh> program can be used either to run one command at a time
-by giving the command as an argument on the command line, or as a shell
-if no command is given in the command line, it will then start a minimal
-interpreter waiting for your commands and the B<quit> command will then
exit
+The B<virsh> program can be used either to run one I<COMMAND> by giving the
+command and its arguments on the shell command line, or a I<COMMAND_STRING>
+which is a single shell argument consisting of multiple I<COMMAND> actions
+and their arguments joined with whitespace, and separated by semicolons
+between commands. Within I<COMMAND_STRING>, virsh understands the
+same single, double, and backslash escapes as the shell, although you must
+add another layer of shell escaping in creating the single shell argument.
+If no command is given in the command line, B<virsh> will then start a
minimal
+interpreter waiting for your commands, and the B<quit> command will
then exit
the program.
=head1 NOTES
--
Eric Blake eblake(a)redhat.com +1-801-349-2682
Libvirt virtualization library
http://libvirt.org