[libvirt] Question, how to use virDomainQemuMonitorCommand()

Daniel P. Berrange berrange at redhat.com
Thu Sep 9 13:07:09 UTC 2010


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 :|




More information about the libvir-list mailing list