On Thu, Sep 09, 2010 at 08:52:13AM -0400, Chris Lalancette wrote:
On 09/09/10 - 04:52:25PM, Lai Jiangshan wrote:
> On 09/07/2010 09:22 PM, Chris Lalancette wrote:
> > On 09/07/10 - 04:08:13PM, Lai Jiangshan wrote:
> >> Hi, Chris,
> >>
> >> I saw virDomainQemuMonitorCommand() in libvirt-qemu.c,
> >> I think it will help me to send arbitrary qemu-monitor command to
> >> qemu via libvirtd.
> >>
> >> But how can I use virDomainQemuMonitorCommand()?
> >> Can I use it by just using current tools(virsh or other) without writing
any code?
> >
> > Unfortunately, no. There is a bug in the current virsh command that prevents
> > it from properly parsing the command-lines necessary to send monitor commands
> > to the qemu monitor. Until we fix that bug, we won't push the support
into
> > virsh.
> >
>
> Thanks,
>
> We need this feature, could you tell me the detail of the bug,
> we will try to fix it or do assists.
I've outlined it before on this list, but the gist of it is that the way that
virsh parses command-line arguments loses the formatting. Thus, if you were
enter a command like:
# virsh qemu-monitor-command f13guest "info cpus"
Then virsh main() will get 4 arguments:
argv[0] = "virsh";
argv[1] = "qemu-monitor-command";
argv[2] = "f13guest";
argv[3] = "info cpus";
So far, all is good. However, during the parsing of these command-line
arguments, virsh takes all of these arguments and smashes them back together
as a single string:
command = "virsh qemu-monitor-command f13guest info cpus";
And then it reparses the whole thing. Notice that we've lost the quoting,
though, so now it's an invalid command.
The problem is further complicated by some of the other features of virsh,
including the support for separating multiple commands with semicolons. For
example, the following is a legal command:
# virsh 'define D.xml; dumpxml D'
In any case, the answer is probably to re-write the command-line parsing of
virsh to not lose quoting. I have not had time to do this, so if you have
the time to look at it and make it work, patches are definitely appreciated!
While re-writing the command line mashing to not loose quotes would be
nice, the more obvious fix is to not mash all the args back into a
string at all. The virsh command ultimately wants char **argv, and we
already have char **argv. So doing a char ** -> char * -> char **
conversion is just insanity.
Daniel
--
|: Red Hat, Engineering, London -o-
http://people.redhat.com/berrange/ :|
|:
http://libvirt.org -o-
http://virt-manager.org -o-
http://deltacloud.org :|
|:
http://autobuild.org -o-
http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|