[libvirt] How to add a new Hypervisor support
by Amudhan Gunasekaran
Hi,
I am investigating libvirt to find out whether adding a hypervisor support is possible. I went through libvirt.c and found that all the operations are done through the struct virConnect. But virConnect is not exposed to public. So, if I want to add a minimum support for VMWare and Hyper-V hypervisors, is it possible? If it is possible, how should I proceed.
Thanks,
Amudhan.
16 years, 7 months
[libvirt] [PATCH] plug two sound-related leaks
by Jim Meyering
This fixes the sole remaining leak exposed by "make check" vs. valgrind.
Actually it fixes two leaks, but the duplicate sound string one
isn't triggered by the tests.
>From 495abbe5adcb27187f4831a67f0821d62f36602e Mon Sep 17 00:00:00 2001
From: Jim Meyering <meyering(a)redhat.com>
Date: Thu, 22 May 2008 21:34:19 +0200
Subject: [PATCH] plug two sound-related leaks
* src/qemu_conf.c (qemudFreeVMDef): Also free def->sounds.
(qemudParseXML): Avoid leak also for duplicate sound string.
---
src/qemu_conf.c | 10 +++++++++-
1 files changed, 9 insertions(+), 1 deletions(-)
diff --git a/src/qemu_conf.c b/src/qemu_conf.c
index 15bf253..5c20023 100644
--- a/src/qemu_conf.c
+++ b/src/qemu_conf.c
@@ -215,6 +215,7 @@ void qemudFreeVMDef(struct qemud_vm_def *def) {
struct qemud_vm_input_def *input = def->inputs;
struct qemud_vm_chr_def *serial = def->serials;
struct qemud_vm_chr_def *parallel = def->parallels;
+ struct qemud_vm_sound_def *sound = def->sounds;
while (disk) {
struct qemud_vm_disk_def *prev = disk;
@@ -241,6 +242,11 @@ void qemudFreeVMDef(struct qemud_vm_def *def) {
parallel = parallel->next;
free(prev);
}
+ while (sound) {
+ struct qemud_vm_sound_def *prev = sound;
+ sound = sound->next;
+ free(prev);
+ }
xmlFree(def->keymap);
free(def);
}
@@ -2187,8 +2193,10 @@ static struct qemud_vm_def *qemudParseXML(virConnectPtr conn,
}
check = check->next;
}
- if (collision)
+ if (collision) {
+ free(sound);
continue;
+ }
def->nsounds++;
sound->next = NULL;
--
1.5.5.1.249.g26848
16 years, 7 months
[Libvir] ISCSI howto, example, etc?
by Mark Dehus
The documentation on the new storage feature is either a little short,
or I totally missed it. Anyway, I am looking for some help on how to
use it. If anyone could maybe give me an example xml file that would
be incredibly helpful, because based on the format description I can't
exactly figure out what information I am supposed to put where (for
ISCSI).
Thanks!
--
$ ./Mark
16 years, 7 months
[libvirt] Switch to using lcov for test coverage reports
by Daniel P. Berrange
I got fed up trying to figure out how to fix the coverage reports to merge
data from multiple runs correctly, so this patch rips out all our test
coverage support. In its place is a makefile rule which just calls out to
the lcov program. It requires lcov >= 1.6 since earlier versions were
too dumb to deal with .libs/ directories properly. This version has just
been submitted to Fedora updates repos.
Makefile.am | 26 +---
a/scripts/.cvsignore | 2
a/scripts/Makefile.am | 4
a/scripts/README | 3
a/scripts/coverage-report-entry.pl | 77 -------------
a/scripts/coverage-report.pl | 167 ----------------------------
a/scripts/coverage-report.xsl | 217 -------------------------------------
configure.in | 2
src/Makefile.am | 20 ---
9 files changed, 12 insertions(+), 506 deletions(-)
Dan.
diff -r ddd05d94cc2d Makefile.am
--- a/Makefile.am Thu May 22 17:13:05 2008 -0400
+++ b/Makefile.am Thu May 22 17:27:30 2008 -0400
@@ -1,7 +1,10 @@
## Process this file with automake to produce Makefile.in
+LCOV = lcov
+GENHTML = genhtml
+
SUBDIRS = gnulib/lib include src qemud proxy docs gnulib/tests \
- python tests po scripts
+ python tests po
ACLOCAL_AMFLAGS = -I m4 -I gnulib/m4
@@ -28,24 +31,15 @@
@(if [ "$(pythondir)" != "" ] ; then cd python ; \
$(MAKE) MAKEFLAGS+=--silent tests ; fi)
-cov: cov-recursive cov-am
+cov: clean-cov
+ mkdir $(top_builddir)/coverage
+ $(LCOV) -c -o $(top_builddir)/coverage/libvirt.info.tmp -d $(top_srcdir)/src -d $(top_srcdir)/qemud -d $(top_srcdir)/tests
+ $(LCOV) -r $(top_builddir)/coverage/libvirt.info.tmp -o $(top_builddir)/coverage/libvirt.info *usr*
+ rm $(top_builddir)/coverage/libvirt.info.tmp
+ $(GENHTML) -s -t "libvirt" -o $(top_builddir)/coverage --legend $(top_builddir)/coverage/libvirt.info
clean-cov:
rm -rf $(top_builddir)/coverage
- cd src && $(MAKE) $(AM_MAKEFLAGS) clean-cov
-
-cov-recursive:
- cd src && $(MAKE) $(AM_MAKEFLAGS) cov
-
-cov-am:
- rm -rf $(top_builddir)/coverage
- mkdir $(top_builddir)/coverage
- perl $(srcdir)/scripts/coverage-report.pl src/*.cov > $(top_builddir)/coverage/index.xml
- xsltproc $(srcdir)/scripts/coverage-report.xsl \
- $(top_builddir)/coverage/index.xml \
- > $(top_builddir)/coverage/index.html
- for i in $(top_builddir)/src/*.gcov ; do o=`echo $$i | sed -e 's,$(top_builddir)/src,coverage,'` ; \
- perl $(srcdir)/scripts/coverage-report-entry.pl $$i > $$o.html ; done
# disable this check
distuninstallcheck:
diff -r ddd05d94cc2d configure.in
--- a/configure.in Thu May 22 17:13:05 2008 -0400
+++ b/configure.in Thu May 22 17:27:30 2008 -0400
@@ -1001,7 +1001,7 @@
gnulib/lib/Makefile \
gnulib/tests/Makefile \
libvirt.pc libvirt.spec \
- po/Makefile.in scripts/Makefile \
+ po/Makefile.in \
include/libvirt/Makefile include/libvirt/libvirt.h \
python/Makefile python/tests/Makefile \
qemud/Makefile \
diff -r ddd05d94cc2d scripts/.cvsignore
--- a/scripts/.cvsignore Thu May 22 17:13:05 2008 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-Makefile
-Makefile.in
diff -r ddd05d94cc2d scripts/Makefile.am
--- a/scripts/Makefile.am Thu May 22 17:13:05 2008 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,4 +0,0 @@
-
-EXTRA_DIST = coverage-report.pl \
- coverage-report-entry.pl \
- coverage-report.xsl
diff -r ddd05d94cc2d scripts/README
--- a/scripts/README Thu May 22 17:13:05 2008 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,3 +0,0 @@
-This directory provides a collection of tools used in the
-build / test process. They are not installed / used after
-deployment.
diff -r ddd05d94cc2d scripts/coverage-report-entry.pl
--- a/scripts/coverage-report-entry.pl Thu May 22 17:13:05 2008 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,77 +0,0 @@
-#!/usr/bin/perl
-#
-# Copyright (C) 2006-2007 Daniel P. Berrange
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-#
-# Author: Daniel P. Berrange <berrange(a)redhat.com>
-#
-# coverage-report-entry.pl: convert gcov annotated source into HTML
-#
-# This script takes a gcov annotated source code files on STDIN
-# converts it to HTML, coloured according to coverage, and sends
-# it to STDOUT
-
-print <<EOF;
-<html>
-<head>
-<title>Coverage report for $ARGV[0]</title>
-<style type="text/css">
- span.perfect {
- background: rgb(0,255,0);
- }
- span.terrible {
- background: rgb(255,0,0);
- }
-</style>
-</head>
-<body>
-<h1>Coverage report for $ARGV[0]</h1>
-
-<pre>
-EOF
-
-
-while (<>) {
- s/&/&/g;
- s/</</g;
- s/>/>/g;
-
- if (/^\s*function (\S+) called (\d+) returned \d+% blocks executed \d+%/) {
- my $class = $2 > 0 ? "perfect" : "terrible";
- $_ = "<span class=\"$class\" id=\"" . $1 . "\">$_</span>";
- } elsif (/^\s*branch\s+\d+\s+taken\s+(\d+)%\s+.*$/) {
- my $class = $1 > 0 ? "perfect" : "terrible";
- $_ = "<span class=\"$class\">$_</span>";
- } elsif (/^\s*branch\s+\d+\s+never executed.*$/) {
- my $class = "terrible";
- $_ = "<span class=\"$class\">$_</span>";
- } elsif (/^\s*call\s+\d+\s+never executed.*$/) {
- my $class = "terrible";
- $_ = "<span class=\"$class\">$_</span>";
- } elsif (/^\s*call\s+\d+\s+returned\s+(\d+)%.*$/) {
- my $class = $1 > 0 ? "perfect" : "terrible";
- $_ = "<span class=\"$class\">$_</span>";
- }
-
-
- print;
-}
-
-print <<EOF;
-</pre>
-</body>
-</html>
-EOF
diff -r ddd05d94cc2d scripts/coverage-report.pl
--- a/scripts/coverage-report.pl Thu May 22 17:13:05 2008 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,167 +0,0 @@
-#!/usr/bin/perl
-#
-# Copyright (C) 2006-2007 Daniel P. Berrange
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-#
-# Author: Daniel P. Berrange <berrange(a)redhat.com>
-#
-# coverage-report.pl: generate XML coverage summary report
-#
-# This script takes a listof gcov .cov files as args, and generates
-# an XML document summarizing the coverage per function and per
-# source file.
-
-use warnings;
-use strict;
-
-my %coverage = ( function => {}, file => {} );
-
-my @functionBlackList = (
- "__memcpy",
- "__memmove",
- "__memset",
- "__strcat",
- "__strcpy",
- "__strncpy",
- "__strsep",
- "__strtok"
- );
-
-my %filemap;
-
-my $type;
-my $name;
-
-my @functions;
-
-while (<>) {
- if (/^Function '(.*)'\s*$/) {
- $type = "function";
- $name = $1;
- $coverage{$type}->{$name} = {};
- push @functions, $name;
- } elsif (/^File '(.*?)'\s*$/) {
- $type = "file";
- $name = $1;
- $coverage{$type}->{$name} = {};
-
- foreach my $func (@functions) {
- $coverage{"function"}->{$func}->{file} = $name;
- }
- @functions = ();
- } elsif (/^Lines executed:(.*)%\s*of\s*(\d+)\s*$/) {
- $coverage{$type}->{$name}->{lines} = $2;
- $coverage{$type}->{$name}->{linesCoverage} = $1;
- } elsif (/^No executable lines\s*$/) {
- $coverage{$type}->{$name}->{lines} = 0;
- $coverage{$type}->{$name}->{linesCoverage} = "100.00";
- } elsif (/^Branches executed:(.*)%\s*of\s*(\d+)\s*$/) {
- $coverage{$type}->{$name}->{branches} = $2;
- $coverage{$type}->{$name}->{branchesCoverage} = $1;
- } elsif (/^Taken at least once:(.*)%\s*of\s*(\d+)\s*$/) {
- $coverage{$type}->{$name}->{conds} = $2;
- $coverage{$type}->{$name}->{condsCoverage} = $1;
- } elsif (/^Calls executed:(.*)%\s*of\s*(\d+)\s*$/) {
- $coverage{$type}->{$name}->{calls} = $2;
- $coverage{$type}->{$name}->{callsCoverage} = $1;
- } elsif (/^No branches$/) {
- $coverage{$type}->{$name}->{branches} = 0;
- $coverage{$type}->{$name}->{branchesCoverage} = "100.00";
- $coverage{$type}->{$name}->{conds} = 0;
- $coverage{$type}->{$name}->{condsCoverage} = "100.00";
- } elsif (/^No calls$/) {
- $coverage{$type}->{$name}->{calls} = 0;
- $coverage{$type}->{$name}->{callsCoverage} = "100.00";
- } elsif (/^\s*(.*):creating '(.*)'\s*$/) {
- $filemap{$1} = $2;
- } elsif (/^\s*$/) {
- # nada
- } else {
- warn "unexpected input [$_]\n";
- }
-}
-
-my %summary;
-foreach my $type ("function", "file") {
- $summary{$type} = {};
- foreach my $m ("lines", "branches", "conds", "calls") {
- my $totalGot = 0;
- my $totalMiss = 0;
- my $count = 0;
- foreach my $func (keys %{$coverage{function}}) {
- my $blacklisted = 0;
- foreach my $blackName (@functionBlackList) {
- $blacklisted = 1 if $func =~ /^$blackName/;
- }
- next if $blacklisted;
-
- $count++;
- my $got = $coverage{function}->{$func}->{$m};
- $totalGot += $got;
- my $miss = $got * $coverage{function}->{$func}->{$m ."Coverage"} / 100;
- $totalMiss += $miss;
- }
- $summary{$type}->{$m} = sprintf("%d", $totalGot);
- if ($totalGot == 0) {
- $summary{$type}->{$m . "Coverage"} = "100.00";
- } else {
- $summary{$type}->{$m . "Coverage"} = sprintf("%.2f", $totalMiss / $totalGot * 100);
- }
- }
-}
-
-
-
-print "<coverage>\n";
-
-foreach my $type ("function", "file") {
- printf "<%ss>\n", $type;
- foreach my $name (sort { $a cmp $b } keys %{$coverage{$type}}) {
- if ($type eq "file") {
- next if $name =~ m,^/usr,;
- } else {
- my $blacklisted = 0;
- foreach my $blackName (@functionBlackList) {
- $blacklisted = 1 if $name =~ /^$blackName/;
- }
- next if $blacklisted;
- }
-
- my $rec = $coverage{$type}->{$name};
- printf " <entry name=\"%s\" details=\"%s\">\n", $name, ($type eq "file" ? $filemap{$name} : $filemap{$rec->{file}});
- printf " <lines count=\"%s\" coverage=\"%s\"/>\n", $rec->{lines}, $rec->{linesCoverage};
- if (exists $rec->{branches}) {
- printf " <branches count=\"%s\" coverage=\"%s\"/>\n", $rec->{branches}, $rec->{branchesCoverage};
- }
- if (exists $rec->{conds}) {
- printf " <conditions count=\"%s\" coverage=\"%s\"/>\n", $rec->{conds}, $rec->{condsCoverage};
- }
- if (exists $rec->{calls}) {
- printf " <calls count=\"%s\" coverage=\"%s\"/>\n", $rec->{calls}, $rec->{callsCoverage};
- }
- print " </entry>\n";
- }
-
- printf " <summary>\n";
- printf " <lines count=\"%s\" coverage=\"%s\"/>\n", $summary{$type}->{lines}, $summary{$type}->{linesCoverage};
- printf " <branches count=\"%s\" coverage=\"%s\"/>\n", $summary{$type}->{branches}, $summary{$type}->{branchesCoverage};
- printf " <conditions count=\"%s\" coverage=\"%s\"/>\n", $summary{$type}->{conds}, $summary{$type}->{condsCoverage};
- printf " <calls count=\"%s\" coverage=\"%s\"/>\n", $summary{$type}->{calls}, $summary{$type}->{callsCoverage};
- printf " </summary>\n";
- printf "</%ss>\n", $type;
-}
-
-print "</coverage>\n";
diff -r ddd05d94cc2d scripts/coverage-report.xsl
--- a/scripts/coverage-report.xsl Thu May 22 17:13:05 2008 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,217 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- version="1.0">
-
- <xsl:output method="html"/>
-
- <xsl:template match="coverage">
- <html>
- <head>
- <title>Coverage report</title>
- <style type="text/css">
- tbody tr.odd td.label {
- border-top: 1px solid rgb(128,128,128);
- border-bottom: 1px solid rgb(128,128,128);
- }
- tbody tr.odd td.label {
- background: rgb(200,200,200);
- }
-
- thead, tfoot {
- background: rgb(60,60,60);
- color: white;
- font-weight: bold;
- }
-
- tr td.perfect {
- background: rgb(0,255,0);
- color: black;
- }
- tr td.excellant {
- background: rgb(140,255,140);
- color: black;
- }
- tr td.good {
- background: rgb(160,255,0);
- color: black;
- }
- tr td.poor {
- background: rgb(255,160,0);
- color: black;
- }
- tr td.bad {
- background: rgb(255,140,140);
- color: black;
- }
- tr td.terrible {
- background: rgb(255,0,0);
- color: black;
- }
- </style>
- </head>
- <body>
- <h1>Coverage report</h1>
- <xsl:apply-templates/>
- </body>
- </html>
- </xsl:template>
-
- <xsl:template match="functions">
- <h2>Function coverage</h2>
- <xsl:call-template name="content">
- <xsl:with-param name="type" select="'function'"/>
- </xsl:call-template>
- </xsl:template>
-
-
- <xsl:template match="files">
- <h2>File coverage</h2>
- <xsl:call-template name="content">
- <xsl:with-param name="type" select="'file'"/>
- </xsl:call-template>
- </xsl:template>
-
- <xsl:template name="content">
- <xsl:param name="type"/>
- <table>
- <thead>
- <tr>
- <th>Name</th>
- <th>Lines</th>
- <th>Branches</th>
- <th>Conditions</th>
- <th>Calls</th>
- </tr>
- </thead>
- <tbody>
- <xsl:for-each select="entry">
- <xsl:call-template name="entry">
- <xsl:with-param name="type" select="$type"/>
- <xsl:with-param name="class">
- <xsl:choose>
- <xsl:when test="position() mod 2">
- <xsl:text>odd</xsl:text>
- </xsl:when>
- <xsl:otherwise>
- <xsl:text>even</xsl:text>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:with-param>
- </xsl:call-template>
- </xsl:for-each>
- </tbody>
- <tfoot>
- <xsl:for-each select="summary">
- <xsl:call-template name="entry">
- <xsl:with-param name="type" select="'summary'"/>
- <xsl:with-param name="class">
- <xsl:choose>
- <xsl:when test="position() mod 2">
- <xsl:text>odd</xsl:text>
- </xsl:when>
- <xsl:otherwise>
- <xsl:text>even</xsl:text>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:with-param>
- </xsl:call-template>
- </xsl:for-each>
- </tfoot>
- </table>
- </xsl:template>
-
- <xsl:template name="entry">
- <xsl:param name="type"/>
- <xsl:param name="class"/>
- <tr class="{$class}">
- <xsl:choose>
- <xsl:when test="$type = 'function'">
- <td class="label"><a href="{@details}.html#{(a)name}"><xsl:value-of select="@name"/></a></td>
- </xsl:when>
- <xsl:when test="$type = 'file'">
- <td class="label"><a href="{(a)details}.html"><xsl:value-of select="@name"/></a></td>
- </xsl:when>
- <xsl:otherwise>
- <td class="label">Summary</td>
- </xsl:otherwise>
- </xsl:choose>
-
- <xsl:if test="count(lines)">
- <xsl:apply-templates select="lines"/>
- </xsl:if>
- <xsl:if test="not(count(lines))">
- <xsl:call-template name="missing"/>
- </xsl:if>
-
- <xsl:if test="count(branches)">
- <xsl:apply-templates select="branches"/>
- </xsl:if>
- <xsl:if test="not(count(branches))">
- <xsl:call-template name="missing"/>
- </xsl:if>
-
- <xsl:if test="count(conditions)">
- <xsl:apply-templates select="conditions"/>
- </xsl:if>
- <xsl:if test="not(count(conditions))">
- <xsl:call-template name="missing"/>
- </xsl:if>
-
- <xsl:if test="count(calls)">
- <xsl:apply-templates select="calls"/>
- </xsl:if>
- <xsl:if test="not(count(calls))">
- <xsl:call-template name="missing"/>
- </xsl:if>
-
- </tr>
- </xsl:template>
-
- <xsl:template match="lines">
- <xsl:call-template name="row"/>
- </xsl:template>
-
- <xsl:template match="branches">
- <xsl:call-template name="row"/>
- </xsl:template>
-
- <xsl:template match="conditions">
- <xsl:call-template name="row"/>
- </xsl:template>
-
- <xsl:template match="calls">
- <xsl:call-template name="row"/>
- </xsl:template>
-
- <xsl:template name="missing">
- <td></td>
- </xsl:template>
-
- <xsl:template name="row">
- <xsl:variable name="quality">
- <xsl:choose>
- <xsl:when test="@coverage = 100">
- <xsl:text>perfect</xsl:text>
- </xsl:when>
- <xsl:when test="@coverage >= 80.0">
- <xsl:text>excellant</xsl:text>
- </xsl:when>
- <xsl:when test="@coverage >= 60.0">
- <xsl:text>good</xsl:text>
- </xsl:when>
- <xsl:when test="@coverage >= 40.0">
- <xsl:text>poor</xsl:text>
- </xsl:when>
- <xsl:when test="@coverage >= 20.0">
- <xsl:text>bad</xsl:text>
- </xsl:when>
- <xsl:otherwise>
- <xsl:text>terrible</xsl:text>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:variable>
-
- <td class="{$quality}"><xsl:value-of select="@coverage"/>% of <xsl:value-of select="@count"/></td>
- </xsl:template>
-
-</xsl:stylesheet>
diff -r ddd05d94cc2d src/Makefile.am
--- a/src/Makefile.am Thu May 22 17:13:05 2008 -0400
+++ b/src/Makefile.am Thu May 22 17:27:30 2008 -0400
@@ -149,22 +149,4 @@
EXTRA_DIST += parthelper.c
endif
-cov: clean-cov
- for i in $(CLIENT_SOURCES); do \
- case $$i in *.c) ;; *) continue;; esac; \
- b=$$(basename $$i .c); \
- o_files=; \
- for i in '' _test; do \
- g="$(LV_LIBTOOL_OBJDIR)/libvirt$${i}_la-$$b.gcda"; \
- o="$(LV_LIBTOOL_OBJDIR)/libvirt$${i}_la-$$b.o"; \
- test -f "$$o" -a -f "$$g" \
- && o_files="$$o_files $$o"; \
- done; \
- test -n "$$o_files" \
- && gcov -o $(LV_LIBTOOL_OBJDIR) -b -f $$o_files > $$b.cov; \
- done
-
-clean-cov:
- rm -f *.cov *.gcov
-
-CLEANFILES = *.cov *.gcov .libs/*.gcda .libs/*.gcno *.gcno *.gcda
+CLEANFILES = *.gcov .libs/*.gcda .libs/*.gcno *.gcno *.gcda
--
|: Red Hat, Engineering, Boston -o- http://people.redhat.com/berrange/ :|
|: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|
16 years, 7 months
[libvirt] Storage api problem
by sarveswara rao mygapula
Hi,
I am just trying to use libvirt storage api from python terminal, and i am
getting the following error.
>>> import libvirt
>>> con = libvirt.open(<my uri using ssh>)
>>> con.numOfDefinedStoragePools()
libvir: Remote error : Broken pipe
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.5/libvirt.py", line 1022, in
numOfDefinedStoragePools
ret = libvirtmod.virConnectNumOfDefinedStoragePools(self._o)
AttributeError: 'module' object has no attribute
'virConnectNumOfDefinedStoragePools'
>>>
I have checked in the libvirt.c file and the function
"virConnectNumOfDefinedStoragePools(virConnectPtr conn)" is implemented.
Thanks,
16 years, 7 months
[libvirt] PATCH: Fix a small bug in rpcgen_fix.pl script
by Richard W.M. Jones
There's a warning about type-punning in CVS libvirt.
We normally rewrite the code generated by glibc rpcgen to avoid these
warnings, but because the variable in question has a name containing
an uppercase letter, and because the regexp we're using is
case-sensitive and only matches lowercase identifiers, the rewrite
wasn't happening.
Attached patch fixes this.
Rich.
--
Richard Jones, Emerging Technologies, Red Hat http://et.redhat.com/~rjones
virt-top is 'top' for virtual machines. Tiny program with many
powerful monitoring features, net stats, disk stats, logging, etc.
http://et.redhat.com/~rjones/virt-top
16 years, 7 months
[libvirt] PATCH: Misc fixes to qparams
by Daniel P. Berrange
I found a couple more small bugs in the qparams code
- In the qparam_query_parse() method, after appending each (name,value)
pair of params, it failed to free the temporary buffers for the
(name,value) pair.
- Did not allow for ';' as a valid query parameter separator
- In a couple of OOM cleanup scenarios it failed to free buffers allocated
earlier on
In looking at this I decide we ought to have a test suite for this code
so I'm also including one. It has 100% coverage of all the non-OOM code
paths. The test case now passes when run under valgrind
[berrange@t60wlan libvirt-numa]$ diffstat .hg/patches/qparam-test
b/tests/qparamtest.c | 224 +++++++++++++++++++++++++++++++++++++++++++++
scripts/coverage-report.pl | 3
src/qparams.c | 26 ++++-
tests/Makefile.am | 8 +
4 files changed, 253 insertions(+), 8 deletions(-)
Dan.
diff -r aa244ae10e9e scripts/coverage-report.pl
--- a/scripts/coverage-report.pl Wed May 21 19:13:06 2008 -0400
+++ b/scripts/coverage-report.pl Wed May 21 19:42:55 2008 -0400
@@ -65,6 +65,9 @@
} elsif (/^Lines executed:(.*)%\s*of\s*(\d+)\s*$/) {
$coverage{$type}->{$name}->{lines} = $2;
$coverage{$type}->{$name}->{linesCoverage} = $1;
+ } elsif (/^No executable lines\s*$/) {
+ $coverage{$type}->{$name}->{lines} = 0;
+ $coverage{$type}->{$name}->{linesCoverage} = "100.00";
} elsif (/^Branches executed:(.*)%\s*of\s*(\d+)\s*$/) {
$coverage{$type}->{$name}->{branches} = $2;
$coverage{$type}->{$name}->{branchesCoverage} = $1;
diff -r aa244ae10e9e src/qparams.c
--- a/src/qparams.c Wed May 21 19:13:06 2008 -0400
+++ b/src/qparams.c Wed May 21 19:42:55 2008 -0400
@@ -166,7 +166,7 @@
qparam_query_parse (const char *query)
{
struct qparam_set *ps;
- const char *name, *value, *end, *eq;
+ const char *end, *eq;
ps = new_qparam_set (0, NULL);
if (!ps) return NULL;
@@ -174,9 +174,14 @@
if (!query || query[0] == '\0') return ps;
while (*query) {
+ char *name = NULL, *value = NULL;
+
/* Find the next separator, or end of the string. */
end = strchr (query, '&');
- if (!end) end = query + strlen (query);
+ if (!end)
+ end = strchr (query, ';');
+ if (!end)
+ end = query + strlen (query);
/* Find the first '=' character between here and end. */
eq = strchr (query, '=');
@@ -191,7 +196,6 @@
*/
else if (!eq) {
name = xmlURIUnescapeString (query, end - query, NULL);
- value = "";
if (!name) goto out_of_memory;
}
/* Or if we have "name=" here (works around annoying
@@ -199,7 +203,6 @@
*/
else if (eq+1 == end) {
name = xmlURIUnescapeString (query, eq - query, NULL);
- value = "";
if (!name) goto out_of_memory;
}
/* If the '=' character is at the beginning then we have
@@ -211,12 +214,23 @@
/* Otherwise it's "name=value". */
else {
name = xmlURIUnescapeString (query, eq - query, NULL);
+ if (!name)
+ goto out_of_memory;
value = xmlURIUnescapeString (eq+1, end - (eq+1), NULL);
- if (!name || !value) goto out_of_memory;
+ if (!value) {
+ VIR_FREE(name);
+ goto out_of_memory;
+ }
}
/* Append to the parameter set. */
- if (append_qparam (ps, name, value) == -1) goto out_of_memory;
+ if (append_qparam (ps, name, value ? value : "") == -1) {
+ VIR_FREE(name);
+ VIR_FREE(value);
+ goto out_of_memory;
+ }
+ VIR_FREE(name);
+ VIR_FREE(value);
next:
query = end;
diff -r aa244ae10e9e tests/Makefile.am
--- a/tests/Makefile.am Wed May 21 19:13:06 2008 -0400
+++ b/tests/Makefile.am Wed May 21 19:42:55 2008 -0400
@@ -41,7 +41,7 @@
noinst_PROGRAMS = xmlrpctest xml2sexprtest sexpr2xmltest virshtest conftest \
reconnect xmconfigtest xencapstest qemuxml2argvtest qemuxml2xmltest \
- nodeinfotest statstest
+ nodeinfotest statstest qparamtest
test_scripts = \
daemon-conf \
@@ -53,7 +53,7 @@
TESTS = xml2sexprtest sexpr2xmltest virshtest test_conf.sh xmconfigtest \
xencapstest qemuxml2argvtest qemuxml2xmltest nodeinfotest \
- statstest $(test_scripts)
+ statstest qparamtest $(test_scripts)
if ENABLE_XEN_TESTS
TESTS += reconnect
endif
@@ -130,6 +130,10 @@
statstest.c testutils.h testutils.c
statstest_LDADD = $(LDADDS)
+qparamtest_SOURCES = \
+ qparamtest.c testutils.h testutils.c
+qparamtest_LDADD = $(LDADDS)
+
reconnect_SOURCES = \
reconnect.c
reconnect_LDADD = $(LDADDS)
diff -r aa244ae10e9e tests/qparamtest.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/qparamtest.c Wed May 21 19:42:55 2008 -0400
@@ -0,0 +1,224 @@
+#include <config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "testutils.h"
+#include "qparams.h"
+#include "util.h"
+
+struct qparamParseDataEntry {
+ const char *name;
+ const char *value;
+};
+
+struct qparamParseData {
+ const char *queryIn;
+ const char *queryOut;
+ int nparams;
+ const struct qparamParseDataEntry *params;
+};
+
+static int
+qparamParseTest(const void *data)
+{
+ const struct qparamParseData *expect = data;
+ struct qparam_set *actual = qparam_query_parse(expect->queryIn);
+ int ret = -1, i;
+ if (!actual)
+ return -1;
+
+ if (actual->n != expect->nparams)
+ goto fail;
+
+ for (i = 0 ; i < actual->n ; i++) {
+ if (!STREQ(expect->params[i].name,
+ actual->p[i].name))
+ goto fail;
+ if (!STREQ(expect->params[i].value,
+ actual->p[i].value))
+ goto fail;
+ }
+
+ ret = 0;
+
+fail:
+ free_qparam_set(actual);
+ return ret;
+}
+
+static int
+qparamFormatTest(const void *data)
+{
+ const struct qparamParseData *expect = data;
+ struct qparam_set *actual = qparam_query_parse(expect->queryIn);
+ char *output = NULL;
+ int ret = -1;
+
+ if (!actual)
+ return -1;
+
+ output = qparam_get_query(actual);
+ if (!output)
+ goto fail;
+
+ if (!STREQ(output, expect->queryOut))
+ goto fail;
+
+ ret = 0;
+
+fail:
+ free(output);
+ free_qparam_set(actual);
+ return ret;
+}
+
+static int
+qparamBuildTest(const void *data)
+{
+ const struct qparamParseData *expect = data;
+ struct qparam_set *actual = new_qparam_set(0, NULL);
+ int ret = -1, i;
+ if (!actual)
+ return -1;
+
+ for (i = 0 ; i < expect->nparams ; i++) {
+ if (append_qparam(actual,
+ expect->params[i].name,
+ expect->params[i].value) < 0)
+ goto fail;
+ }
+
+ if (actual->n != expect->nparams)
+ goto fail;
+
+ for (i = 0 ; i < actual->n ; i++) {
+ if (!STREQ(expect->params[i].name,
+ actual->p[i].name))
+ goto fail;
+ if (!STREQ(expect->params[i].value,
+ actual->p[i].value))
+ goto fail;
+ }
+
+ ret = 0;
+
+fail:
+ free_qparam_set(actual);
+ return ret;
+}
+
+
+static int
+qparamTestNewVargs(const void *data ATTRIBUTE_UNUSED)
+{
+ struct qparam_set *actual = new_qparam_set(0, "foo", "one", "bar", "two", NULL);
+ int ret = -1;
+ if (!actual)
+ return -1;
+
+ if (actual->n != 2)
+ goto fail;
+
+ if (!STREQ(actual->p[0].name, "foo"))
+ goto fail;
+
+ if (!STREQ(actual->p[0].value, "one"))
+ goto fail;
+
+ if (!STREQ(actual->p[1].name, "bar"))
+ goto fail;
+
+ if (!STREQ(actual->p[1].value, "two"))
+ goto fail;
+
+ ret = 0;
+
+fail:
+ free_qparam_set(actual);
+ return ret;
+}
+
+static int
+qparamTestAddVargs(const void *data ATTRIBUTE_UNUSED)
+{
+ struct qparam_set *actual = new_qparam_set(0, NULL);
+ int ret = -1;
+ if (!actual)
+ return -1;
+
+ if (append_qparams(actual, "foo", "one", "bar", "two", NULL) < 0)
+ goto fail;
+
+ if (actual->n != 2)
+ goto fail;
+
+ if (!STREQ(actual->p[0].name, "foo"))
+ goto fail;
+
+ if (!STREQ(actual->p[0].value, "one"))
+ goto fail;
+
+ if (!STREQ(actual->p[1].name, "bar"))
+ goto fail;
+
+ if (!STREQ(actual->p[1].value, "two"))
+ goto fail;
+
+ ret = 0;
+
+fail:
+ free_qparam_set(actual);
+ return ret;
+}
+
+static const struct qparamParseDataEntry params1[] = { { "foo", "one" }, { "bar", "two" } };
+static const struct qparamParseDataEntry params2[] = { { "foo", "one" }, { "foo", "two" } };
+static const struct qparamParseDataEntry params3[] = { { "foo", "&one" }, { "bar", "&two" } };
+static const struct qparamParseDataEntry params4[] = { { "foo", "" } };
+static const struct qparamParseDataEntry params5[] = { { "foo", "one two" } };
+static const struct qparamParseDataEntry params6[] = { { "foo", "one" } };
+
+int
+main(void)
+{
+ int ret = 0;
+
+#define DO_TEST(queryIn,queryOut,params) \
+ do { \
+ struct qparamParseData info = { \
+ queryIn, \
+ queryOut ? queryOut : queryIn, \
+ sizeof(params)/sizeof(params[0]), \
+ params }; \
+ if (virtTestRun("Parse " queryIn, \
+ 1, qparamParseTest, &info) < 0) \
+ ret = -1; \
+ if (virtTestRun("Format " queryIn, \
+ 1, qparamFormatTest, &info) < 0) \
+ ret = -1; \
+ if (virtTestRun("Build " queryIn, \
+ 1, qparamBuildTest, &info) < 0) \
+ ret = -1; \
+ } while (0)
+
+
+ DO_TEST("foo=one&bar=two", NULL, params1);
+ DO_TEST("foo=one&foo=two", NULL, params2);
+ DO_TEST("foo=one&&foo=two", "foo=one&foo=two", params2);
+ DO_TEST("foo=one;foo=two", "foo=one&foo=two", params2);
+ DO_TEST("foo", "foo=", params4);
+ DO_TEST("foo=", NULL, params4);
+ DO_TEST("foo=&", "foo=", params4);
+ DO_TEST("foo=&&", "foo=", params4);
+ DO_TEST("foo=one%20two", NULL, params5);
+ DO_TEST("=bogus&foo=one", "foo=one", params6);
+
+ if (virtTestRun("New vargs", 1, qparamTestNewVargs, NULL) < 0)
+ ret = -1;
+ if (virtTestRun("Add vargs", 1, qparamTestAddVargs, NULL) < 0)
+ ret = -1;
+
+ exit(ret==0 ? EXIT_SUCCESS : EXIT_FAILURE);
+}
--
|: Red Hat, Engineering, Boston -o- http://people.redhat.com/berrange/ :|
|: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|
16 years, 7 months