mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-10-07 15:34:05 +03:00
Compare commits
15 Commits
v2.0.0
...
v1.3.1-mai
Author | SHA1 | Date | |
---|---|---|---|
|
be5d96d547 | ||
|
980109c41c | ||
|
84d35ef500 | ||
|
b25ca8143a | ||
|
ec7040c000 | ||
|
6a293aa29e | ||
|
598845b4f6 | ||
|
5f71b6ed14 | ||
|
7ed7246b4c | ||
|
2d5370eba6 | ||
|
73c3997f0f | ||
|
f464e07f21 | ||
|
d8cc67931c | ||
|
bce46d6a89 | ||
|
58832fe437 |
36
.gitignore
vendored
36
.gitignore
vendored
@@ -1,7 +1,5 @@
|
||||
*#*#
|
||||
*.#*#
|
||||
*.[18]
|
||||
*.[18].in
|
||||
*.a
|
||||
*.cov
|
||||
*.exe
|
||||
@@ -11,7 +9,6 @@
|
||||
*.gcov
|
||||
*.html
|
||||
*.i
|
||||
*.init
|
||||
*.la
|
||||
*.lo
|
||||
*.loT
|
||||
@@ -21,8 +18,6 @@
|
||||
*.pyc
|
||||
*.rej
|
||||
*.s
|
||||
*.service
|
||||
*.socket
|
||||
*.swp
|
||||
*~
|
||||
.#*
|
||||
@@ -43,6 +38,7 @@
|
||||
/NEWS
|
||||
/aclocal.m4
|
||||
/autom4te.cache
|
||||
/build-aux
|
||||
/build-aux/
|
||||
/build/
|
||||
/confdefs.h
|
||||
@@ -61,7 +57,13 @@
|
||||
/daemon/libvirt_qemud
|
||||
/daemon/libvirtd
|
||||
/daemon/libvirtd*.logrotate
|
||||
/daemon/libvirtd.8
|
||||
/daemon/libvirtd.8.in
|
||||
/daemon/libvirtd.init
|
||||
/daemon/libvirtd.pod
|
||||
/daemon/libvirtd.policy
|
||||
/daemon/libvirtd.service
|
||||
/daemon/libvirtd.socket
|
||||
/daemon/test_libvirtd.aug
|
||||
/docs/aclperms.htmlinc
|
||||
/docs/apibuild.py.stamp
|
||||
@@ -74,12 +76,6 @@
|
||||
/docs/libvirt-refs.xml
|
||||
/docs/search.php
|
||||
/docs/todo.html.in
|
||||
/examples/admin/client_close
|
||||
/examples/admin/client_info
|
||||
/examples/admin/client_limits
|
||||
/examples/admin/list_clients
|
||||
/examples/admin/list_servers
|
||||
/examples/admin/threadpool_params
|
||||
/examples/object-events/event-test
|
||||
/examples/dominfo/info1
|
||||
/examples/domsuspend/suspend
|
||||
@@ -93,7 +89,7 @@
|
||||
/gnulib/tests/*
|
||||
/include/libvirt/libvirt-common.h
|
||||
/libtool
|
||||
/libvirt-*.tar.xz
|
||||
/libvirt-*.tar.gz
|
||||
/libvirt-[0-9]*
|
||||
/libvirt*.pc
|
||||
/libvirt.spec
|
||||
@@ -160,22 +156,29 @@
|
||||
/src/util/virkeymaps.h
|
||||
/src/virt-aa-helper
|
||||
/src/virtlockd
|
||||
/src/virtlockd.8
|
||||
/src/virtlockd.8.in
|
||||
/src/virtlockd.init
|
||||
/src/virtlogd
|
||||
/src/virtlogd.8
|
||||
/src/virtlogd.8.in
|
||||
/src/virtlogd.init
|
||||
/tests/*.log
|
||||
/tests/*.pid
|
||||
/tests/*.trs
|
||||
/tests/*test
|
||||
/tests/commandhelper
|
||||
/tests/qemucapsprobe
|
||||
!/tests/virsh-self-test
|
||||
/tests/*test
|
||||
!/tests/*schematest
|
||||
!/tests/virt-aa-helper-test
|
||||
/tests/objectlocking
|
||||
/tests/objectlocking-files.txt
|
||||
/tests/objectlocking.cm[ix]
|
||||
/tests/reconnect
|
||||
/tests/ssh
|
||||
/tests/test_file_access.txt
|
||||
/tests/test_conf
|
||||
/tools/*.[18]
|
||||
/tools/libvirt-guests.init
|
||||
/tools/libvirt-guests.service
|
||||
/tools/libvirt-guests.sh
|
||||
/tools/virt-login-shell
|
||||
/tools/virsh
|
||||
@@ -202,7 +205,6 @@ stamp-h
|
||||
stamp-h.in
|
||||
stamp-h1
|
||||
tags
|
||||
!/build-aux/*.pl
|
||||
!/gnulib/lib/Makefile.am
|
||||
!/gnulib/tests/Makefile.am
|
||||
!/m4/virt-*.m4
|
||||
|
2
.gnulib
2
.gnulib
Submodule .gnulib updated: 246b3b2880...6cc32c63e8
@@ -15,6 +15,7 @@ Claudio Bley <claudio.bley@gmail.com>
|
||||
Cole Robinson <crobinso@redhat.com>
|
||||
Daniel Berrange <berrange@redhat.com>
|
||||
Daniel Veillard <veillard@redhat.com>
|
||||
Dmitry Guryanov <dguryanov@parallels.com>
|
||||
Doug Goldstein <cardoe@gentoo.org>
|
||||
Eric Blake <eblake@redhat.com>
|
||||
Erik Skultety <eskultet@redhat.com>
|
||||
@@ -28,7 +29,6 @@ Laine Stump <laine@redhat.com>
|
||||
Mark McLoughlin <markmc@redhat.com>
|
||||
Martin Kletzander <mkletzan@redhat.com>
|
||||
Matthias Bolte <matthias.bolte@googlemail.com>
|
||||
Maxim Nestratov <mnestratov@virtuozzo.com>
|
||||
Michal Prívozník <mprivozn@redhat.com>
|
||||
Pavel Hrdina <phrdina@redhat.com>
|
||||
Peter Krempa <pkrempa@redhat.com>
|
||||
@@ -45,7 +45,6 @@ Chris Lalancette <clalance@redhat.com>
|
||||
Dan Smith <danms@us.ibm.com>
|
||||
Dave Allan <dallan@redhat.com>
|
||||
Dave Leskovec <dlesko@linux.vnet.ibm.com>
|
||||
Dmitry Guryanov <dguryanov@parallels.com>
|
||||
Guannan Ren <gren@redhat.com>
|
||||
Jim Meyering <meyering@redhat.com>
|
||||
John Levon <john.levon@sun.com>
|
||||
|
11
HACKING
11
HACKING
@@ -152,17 +152,6 @@ There is also a "./run" script at the top level, to make it easier to run
|
||||
programs that have not yet been installed, as well as to wrap invocations of
|
||||
various tests under gdb or Valgrind.
|
||||
|
||||
When running our test suite it may happen that the test result is
|
||||
nondeterministic because of the test suite relying on a particular file in the
|
||||
system being accessible or having some specific value. To catch this kind of
|
||||
errors, the test suite has a module for that prints any path touched that
|
||||
fulfils constraints described above into a file. To enable it just set
|
||||
"VIR_TEST_FILE_ACCESS" environment variable. Then
|
||||
"VIR_TEST_FILE_ACCESS_OUTPUT" environment variable can alter location where
|
||||
the file is stored.
|
||||
|
||||
VIR_TEST_FILE_ACCESS=1 VIR_TEST_FILE_ACCESS_OUTPUT="/tmp/file_access.txt" ./qemuxml2argvtest
|
||||
|
||||
|
||||
|
||||
(9) The Valgrind test should produce similar output to "make check". If the output
|
||||
|
17
Makefile.am
17
Makefile.am
@@ -19,12 +19,9 @@
|
||||
LCOV = lcov
|
||||
GENHTML = genhtml
|
||||
|
||||
SUBDIRS = . gnulib/lib include/libvirt src daemon tools docs gnulib/tests \
|
||||
SUBDIRS = . gnulib/lib include src daemon tools docs gnulib/tests \
|
||||
tests po examples
|
||||
|
||||
XZ_OPT ?= -v -T0
|
||||
export XZ_OPT
|
||||
|
||||
ACLOCAL_AMFLAGS = -I m4
|
||||
|
||||
EXTRA_DIST = \
|
||||
@@ -44,7 +41,7 @@ EXTRA_DIST = \
|
||||
AUTHORS.in
|
||||
|
||||
pkgconfigdir = $(libdir)/pkgconfig
|
||||
pkgconfig_DATA = libvirt.pc libvirt-qemu.pc libvirt-lxc.pc libvirt-admin.pc
|
||||
pkgconfig_DATA = libvirt.pc libvirt-qemu.pc libvirt-lxc.pc
|
||||
|
||||
NEWS: $(top_srcdir)/docs/news.xsl $(top_srcdir)/docs/news.html.in
|
||||
$(AM_V_GEN)if [ -x $(XSLTPROC) ] ; then \
|
||||
@@ -66,15 +63,12 @@ $(top_srcdir)/HACKING: $(top_srcdir)/docs/hacking1.xsl \
|
||||
> $@-t && mv $@-t $@ ; fi;
|
||||
|
||||
rpm: clean
|
||||
@(unset CDPATH ; $(MAKE) dist && rpmbuild -ta $(distdir).tar.xz)
|
||||
@(unset CDPATH ; $(MAKE) dist && rpmbuild -ta $(distdir).tar.gz)
|
||||
|
||||
check-local: all tests
|
||||
|
||||
check-access:
|
||||
@($(MAKE) $(AM_MAKEFLAGS) -C tests check-access)
|
||||
|
||||
cov: clean-cov
|
||||
$(MKDIR_P) $(top_builddir)/coverage
|
||||
mkdir $(top_builddir)/coverage
|
||||
$(LCOV) -c -o $(top_builddir)/coverage/libvirt.info.tmp \
|
||||
-d $(top_builddir)/src -d $(top_builddir)/daemon \
|
||||
-d $(top_builddir)/tests
|
||||
@@ -89,6 +83,9 @@ clean-cov:
|
||||
|
||||
MAINTAINERCLEANFILES = .git-module-status
|
||||
|
||||
# disable this check
|
||||
distuninstallcheck:
|
||||
|
||||
dist-hook: gen-ChangeLog gen-AUTHORS
|
||||
|
||||
# Generate the ChangeLog file (with all entries since the switch to git)
|
||||
|
@@ -113,11 +113,3 @@ NON_REENTRANT += inet_nsap_ntoa
|
||||
NON_REENTRANT += inet_ntoa
|
||||
NON_REENTRANT += inet_ntop
|
||||
NON_REENTRANT += inet_pton
|
||||
|
||||
# Separate two nothings by space to get one space in a variable
|
||||
space =
|
||||
space +=
|
||||
# The space needs to be in a variable otherwise it would be ignored.
|
||||
# And there must be no spaces around the commas because they would
|
||||
# not be ignored, logically.
|
||||
NON_REENTRANT_RE=$(subst $(space),|,$(NON_REENTRANT))
|
||||
|
@@ -56,7 +56,7 @@ exec 3>&-
|
||||
test "$st" = 0
|
||||
test -x /usr/bin/lcov && make cov
|
||||
|
||||
rm -f *.tar.xz
|
||||
rm -f *.tar.gz
|
||||
make dist
|
||||
|
||||
if test -n "$AUTOBUILD_COUNTER" ; then
|
||||
|
@@ -1,6 +1,6 @@
|
||||
#! /bin/sh
|
||||
# Print a version string.
|
||||
scriptversion=2016-01-24.06; # UTC
|
||||
scriptversion=2014-12-08.12; # UTC
|
||||
|
||||
# Bootstrap this package from checked-out sources.
|
||||
|
||||
@@ -42,7 +42,7 @@ export LC_ALL
|
||||
|
||||
local_gl_dir=gl
|
||||
|
||||
# Honor $PERL, but work even if there is none.
|
||||
# Honour $PERL, but work even if there is none
|
||||
PERL="${PERL-perl}"
|
||||
|
||||
me=$0
|
||||
@@ -1021,6 +1021,6 @@ echo "$0: done. Now you can run './configure'."
|
||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
||||
# time-stamp-start: "scriptversion="
|
||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
||||
# time-stamp-time-zone: "UTC0"
|
||||
# time-stamp-time-zone: "UTC"
|
||||
# time-stamp-end: "; # UTC"
|
||||
# End:
|
||||
|
@@ -120,7 +120,6 @@ time_r
|
||||
timegm
|
||||
ttyname_r
|
||||
uname
|
||||
unsetenv
|
||||
useless-if-before-free
|
||||
usleep
|
||||
vasprintf
|
||||
|
@@ -1,6 +1,6 @@
|
||||
#!/usr/bin/perl
|
||||
#
|
||||
# check-spacing.pl: Report any usage of 'function (..args..)'
|
||||
# bracket-spacing.pl: Report any usage of 'function (..args..)'
|
||||
# Also check for other syntax issues, such as correct use of ';'
|
||||
#
|
||||
# This library is free software; you can redistribute it and/or
|
||||
@@ -43,7 +43,7 @@ foreach my $file (@ARGV) {
|
||||
$data =~ s/'[";,=]'/'X'/g;
|
||||
|
||||
# Kill any quoted strings
|
||||
$data =~ s,"(?:[^\\\"]|\\.)*","XXX",g;
|
||||
$data =~ s,"([^\\\"]|\\.)*","XXX",g;
|
||||
|
||||
# Kill any C++ style comments
|
||||
$data =~ s,//.*$,//,;
|
||||
@@ -91,8 +91,8 @@ foreach my $file (@ARGV) {
|
||||
my $kw = $1;
|
||||
|
||||
# Allow space after keywords only
|
||||
if ($kw =~ /^(?:if|for|while|switch|return)$/) {
|
||||
$tmpdata =~ s/(?:$kw\s\()/XXX(/;
|
||||
if ($kw =~ /^(if|for|while|switch|return)$/) {
|
||||
$tmpdata =~ s/($kw\s\()/XXX(/;
|
||||
} else {
|
||||
print "Whitespace after non-keyword:\n";
|
||||
print "$file:$.: $line";
|
||||
@@ -101,8 +101,10 @@ foreach my $file (@ARGV) {
|
||||
}
|
||||
}
|
||||
|
||||
# Require whitespace immediately after keywords
|
||||
if ($data =~ /\b(?:if|for|while|switch|return)\(/) {
|
||||
# Require whitespace immediately after keywords,
|
||||
# but none after the opening bracket
|
||||
if ($data =~ /\b(if|for|while|switch|return)\(/ ||
|
||||
$data =~ /\b(if|for|while|switch|return)\s+\(\s/) {
|
||||
print "No whitespace after keyword:\n";
|
||||
print "$file:$.: $line";
|
||||
$ret = 1;
|
||||
@@ -116,10 +118,8 @@ foreach my $file (@ARGV) {
|
||||
}
|
||||
|
||||
# Forbid whitespace following ( or prior to )
|
||||
# but allow whitespace before ) on a single line
|
||||
# (optionally followed by a semicolon)
|
||||
if (($data =~ /\s\)/ && not $data =~ /^\s+\);?$/) ||
|
||||
$data =~ /\((?!$)\s/) {
|
||||
if ($data =~ /\S\s+\)/ ||
|
||||
$data =~ /\(\s+\S/) {
|
||||
print "Whitespace after '(' or before ')':\n";
|
||||
print "$file:$.: $line";
|
||||
$ret = 1;
|
||||
@@ -135,13 +135,10 @@ foreach my $file (@ARGV) {
|
||||
# errno == EINTR)
|
||||
# ;
|
||||
#
|
||||
if ($data =~ /\s[;,]/) {
|
||||
unless ($data =~ /\S; ; / ||
|
||||
$data =~ /^\s+;/) {
|
||||
print "Whitespace before semicolon or comma:\n";
|
||||
print "$file:$.: $line";
|
||||
$ret = 1;
|
||||
}
|
||||
if ($data =~ /[^;\s]\s+[;,]/) {
|
||||
print "Whitespace before (semi)colon:\n";
|
||||
print "$file:$.: $line";
|
||||
$ret = 1;
|
||||
}
|
||||
|
||||
# Require EOL, macro line continuation, or whitespace after ";".
|
||||
@@ -160,8 +157,11 @@ foreach my $file (@ARGV) {
|
||||
}
|
||||
|
||||
# Require spaces around assignment '=', compounds and '=='
|
||||
if ($data =~ /[^ ]\b[!<>&|\-+*\/%\^=]?=/ ||
|
||||
$data =~ /=[^= \\\n]/) {
|
||||
# with the exception of virAssertCmpInt()
|
||||
$tmpdata = $data;
|
||||
$tmpdata =~ s/(virAssertCmpInt\(.* ).?=,/$1op,/;
|
||||
if ($tmpdata =~ /[^ ]\b[!<>&|\-+*\/%\^=]?=[^=]/ ||
|
||||
$tmpdata =~ /=[^= \\\n]/) {
|
||||
print "Spacing around '=' or '==':\n";
|
||||
print "$file:$.: $line";
|
||||
$ret = 1;
|
@@ -1,26 +0,0 @@
|
||||
#!/usr/bin/perl
|
||||
|
||||
use strict;
|
||||
|
||||
my $file = " ";
|
||||
my $ret = 0;
|
||||
my %includes = ( );
|
||||
my $lineno = 0;
|
||||
|
||||
while (<>) {
|
||||
if (not $file eq $ARGV) {
|
||||
%includes = ( );
|
||||
$file = $ARGV;
|
||||
$lineno = 0;
|
||||
}
|
||||
$lineno++;
|
||||
if (/^# *include *[<"]([^>"]*\.h)[">]/) {
|
||||
$includes{$1}++;
|
||||
if ($includes{$1} == 2) {
|
||||
$ret = 1;
|
||||
print STDERR "$ARGV:$lineno: $_";
|
||||
print STDERR "Do not include a header more than once per file\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
exit $ret;
|
190
cfg.mk
190
cfg.mk
@@ -64,7 +64,6 @@ local-checks-to-skip = \
|
||||
sc_prohibit_quote_without_use \
|
||||
sc_prohibit_quotearg_without_use \
|
||||
sc_prohibit_stat_st_blocks \
|
||||
sc_prohibit_undesirable_word_seq \
|
||||
sc_root_tests \
|
||||
sc_space_tab \
|
||||
sc_sun_os_names \
|
||||
@@ -309,7 +308,7 @@ sc_flags_usage:
|
||||
| grep -c '\(long\|unsigned\) flags')" != 4 && \
|
||||
{ echo '$(ME): new API should use "unsigned int flags"' 1>&2; \
|
||||
exit 1; } || :
|
||||
@prohibit=' flags ATTRIBUTE_UNUSED' \
|
||||
@prohibit=' flags ''ATTRIBUTE_UNUSED' \
|
||||
halt='flags should be checked with virCheckFlags' \
|
||||
$(_sc_search_regexp)
|
||||
@prohibit='^[^@]*([^d] (int|long long)|[^dg] long) flags[;,)]' \
|
||||
@@ -352,8 +351,8 @@ sc_prohibit_mkstemp:
|
||||
# access with X_OK accepts directories, but we can't exec() those.
|
||||
# access with F_OK or R_OK is okay, though.
|
||||
sc_prohibit_access_xok:
|
||||
@prohibit='access(at)? *\(.*X_OK' \
|
||||
halt='use virFileIsExecutable instead of access(,X_OK)' \
|
||||
@prohibit='access''(at)? *\(.*X_OK' \
|
||||
halt='use virFileIsExecutable instead of access''(,X_OK)' \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
# Similar to the gnulib maint.mk rule for sc_prohibit_strcmp
|
||||
@@ -362,7 +361,7 @@ snp_ = strncmp *\(.+\)
|
||||
sc_prohibit_strncmp:
|
||||
@prohibit='! *strncmp *\(|\<$(snp_) *[!=]=|[!=]= *$(snp_)' \
|
||||
exclude=':# *define STR(N?EQLEN|PREFIX)\(' \
|
||||
halt='use STREQLEN or STRPREFIX instead of strncmp' \
|
||||
halt='use STREQLEN or STRPREFIX instead of str''ncmp' \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
# strtol and friends are too easy to misuse
|
||||
@@ -380,7 +379,7 @@ sc_prohibit_strtol:
|
||||
# But for plain %s, virAsprintf is overkill compared to strdup.
|
||||
sc_prohibit_asprintf:
|
||||
@prohibit='\<v?a[s]printf\>' \
|
||||
halt='use virAsprintf, not asprintf' \
|
||||
halt='use virAsprintf, not as'printf \
|
||||
$(_sc_search_regexp)
|
||||
@prohibit='virAsprintf.*, *"%s",' \
|
||||
halt='use VIR_STRDUP instead of virAsprintf with "%s"' \
|
||||
@@ -407,7 +406,7 @@ sc_prohibit_risky_id_promotion:
|
||||
# since gnulib has more guarantees for snprintf portability
|
||||
sc_prohibit_sprintf:
|
||||
@prohibit='\<[s]printf\>' \
|
||||
halt='use snprintf, not sprintf' \
|
||||
halt='use snprintf, not s'printf \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
sc_prohibit_readlink:
|
||||
@@ -421,9 +420,9 @@ sc_prohibit_gethostname:
|
||||
$(_sc_search_regexp)
|
||||
|
||||
sc_prohibit_readdir:
|
||||
@prohibit='\b(read|close|open)dir *\(' \
|
||||
@prohibit='\breaddir *\(' \
|
||||
exclude='exempt from syntax-check' \
|
||||
halt='use virDirOpen, virDirRead and VIR_DIR_CLOSE' \
|
||||
halt='use virDirRead, not readdir' \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
sc_prohibit_gettext_noop:
|
||||
@@ -432,36 +431,43 @@ sc_prohibit_gettext_noop:
|
||||
$(_sc_search_regexp)
|
||||
|
||||
sc_prohibit_VIR_ERR_NO_MEMORY:
|
||||
@prohibit='\<VIR_ERR_NO_MEMORY\>' \
|
||||
halt='use virReportOOMError, not VIR_ERR_NO_MEMORY' \
|
||||
@prohibit='\<V''IR_ERR_NO_MEMORY\>' \
|
||||
halt='use virReportOOMError, not V'IR_ERR_NO_MEMORY \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
sc_prohibit_PATH_MAX:
|
||||
@prohibit='\<PATH_MAX\>' \
|
||||
halt='dynamically allocate paths, do not use PATH_MAX' \
|
||||
@prohibit='\<P''ATH_MAX\>' \
|
||||
halt='dynamically allocate paths, do not use P'ATH_MAX \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
# Use a subshell for each function, to give the optimal warning message.
|
||||
include $(srcdir)/Makefile.nonreentrant
|
||||
sc_prohibit_nonreentrant:
|
||||
@prohibit="\\<(${NON_REENTRANT_RE}) *\\(" \
|
||||
halt="use re-entrant functions (usually ending with _r)" \
|
||||
$(_sc_search_regexp)
|
||||
@fail=0 ; \
|
||||
for i in $(NON_REENTRANT) ; \
|
||||
do \
|
||||
(prohibit="\\<$$i *\\(" \
|
||||
halt="use $${i}_r, not $$i" \
|
||||
$(_sc_search_regexp) \
|
||||
) || fail=1; \
|
||||
done ; \
|
||||
exit $$fail
|
||||
|
||||
sc_prohibit_select:
|
||||
@prohibit='\<select *\(' \
|
||||
halt='use poll(), not select()' \
|
||||
@prohibit="\\<select *\\(" \
|
||||
halt="use poll(), not se""lect()" \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
# Prohibit the inclusion of <ctype.h>.
|
||||
sc_prohibit_ctype_h:
|
||||
@prohibit='^# *include *<ctype\.h>' \
|
||||
halt='use c-ctype.h instead of ctype.h' \
|
||||
halt="don't use ctype.h; instead, use c-ctype.h" \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
# Insist on correct types for [pug]id.
|
||||
sc_correct_id_types:
|
||||
@prohibit='\<(int|long) *[pug]id\>' \
|
||||
halt='use pid_t for pid, uid_t for uid, gid_t for gid' \
|
||||
halt="use pid_t for pid, uid_t for uid, gid_t for gid" \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
# "const fooPtr a" is the same as "foo * const a", even though it is
|
||||
@@ -497,12 +503,12 @@ ctype_re = isalnum|isalpha|isascii|isblank|iscntrl|isdigit|isgraph|islower\
|
||||
|
||||
sc_avoid_ctype_macros:
|
||||
@prohibit='\b($(ctype_re)) *\(' \
|
||||
halt='use c-ctype.h instead of ctype macros' \
|
||||
halt="don't use ctype macros (use c-ctype.h)" \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
sc_avoid_strcase:
|
||||
@prohibit='\bstrn?case(cmp|str) *\(' \
|
||||
halt='use c-strcase.h instead of raw strcase functions' \
|
||||
halt="don't use raw strcase functions (use c-strcase instead)" \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
sc_prohibit_virBufferAdd_with_string_literal:
|
||||
@@ -566,13 +572,12 @@ sc_prohibit_int_index:
|
||||
|
||||
sc_prohibit_int_ijk:
|
||||
@prohibit='\<(int|unsigned) ([^(=]* )*(i|j|k)\>(\s|,|;)' \
|
||||
exclude='exempt from syntax-check' \
|
||||
halt='use size_t, not int/unsigned int for loop vars i, j, k' \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
sc_prohibit_loop_iijjkk:
|
||||
@prohibit='\<(int|unsigned) ([^=]+ )*(ii|jj|kk)\>(\s|,|;)' \
|
||||
halt='use i, j, k for loop iterators, not ii, jj, kk' \
|
||||
halt='use i, j, k for loop iterators, not ii, jj, kk' \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
# RHEL 5 gcc can't grok "for (int i..."
|
||||
@@ -737,7 +742,7 @@ sc_copyright_format:
|
||||
@prohibit='Copyright [^(].*Red 'Hat \
|
||||
halt='consistently use (C) in Red Hat copyright' \
|
||||
$(_sc_search_regexp)
|
||||
@prohibit='\<RedHat\>' \
|
||||
@prohibit='\<Red''Hat\>' \
|
||||
halt='spell Red Hat as two words' \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
@@ -804,7 +809,7 @@ sc_require_enum_last_marker:
|
||||
sc_prohibit_semicolon_at_eol_in_python:
|
||||
@prohibit='^[^#].*\;$$' \
|
||||
in_vc_files='\.py$$' \
|
||||
halt='python does not require to end lines with a semicolon' \
|
||||
halt="Don't use semicolon at eol in python files" \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
# mymain() in test files should use return, not exit, for nicer output
|
||||
@@ -814,6 +819,30 @@ sc_prohibit_exit_in_tests:
|
||||
halt='use return, not exit(), in tests' \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
# Don't include duplicate header in the source (either *.c or *.h)
|
||||
sc_prohibit_duplicate_header:
|
||||
@fail=0; for i in $$($(VC_LIST_EXCEPT) | grep '\.[chx]$$'); do \
|
||||
awk '/# *include.*\.h/ { \
|
||||
match($$0, /[<"][^>"]*[">]/); \
|
||||
arr[substr($$0, RSTART + 1, RLENGTH - 2)]++; \
|
||||
} \
|
||||
END { \
|
||||
for (key in arr) { \
|
||||
if (arr[key] > 1) { \
|
||||
fail=1; \
|
||||
printf("%d %s are included\n", arr[key], key); \
|
||||
} \
|
||||
} \
|
||||
if (fail == 1) { \
|
||||
printf("duplicate header(s) in " FILENAME "\n"); \
|
||||
exit 1; \
|
||||
} \
|
||||
}' $$i || fail=1; \
|
||||
done; \
|
||||
if test $$fail -eq 1; then \
|
||||
{ echo '$(ME): avoid duplicate headers' 1>&2; exit 1; } \
|
||||
fi;
|
||||
|
||||
# Don't include "libvirt/*.h" in "" form.
|
||||
sc_prohibit_include_public_headers_quote:
|
||||
@prohibit='# *include *"libvirt/.*\.h"' \
|
||||
@@ -887,7 +916,7 @@ sc_prohibit_virConnectOpen_in_virsh:
|
||||
sc_require_space_before_label:
|
||||
@prohibit='^( ?)?[_a-zA-Z0-9]+:$$' \
|
||||
in_vc_files='\.[ch]$$' \
|
||||
halt='Top-level labels should be indented by one space' \
|
||||
halt="Top-level labels should be indented by one space" \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
# Allow for up to three spaces before the label: this is to avoid running
|
||||
@@ -896,14 +925,14 @@ sc_require_space_before_label:
|
||||
sc_prohibit_space_in_label:
|
||||
@prohibit='^ {0,3}[_a-zA-Z0-9]+ +:$$' \
|
||||
in_vc_files='\.[ch]$$' \
|
||||
halt='There should be no space between label name and colon' \
|
||||
halt="There should be no space between label name and colon" \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
# Doesn't catch all cases of mismatched braces across if-else, but it helps
|
||||
sc_require_if_else_matching_braces:
|
||||
@prohibit='( else( if .*\))? {|} else( if .*\))?$$)' \
|
||||
in_vc_files='\.[chx]$$' \
|
||||
halt='if one side of if-else uses {}, both sides must use it' \
|
||||
halt="if one side of if-else uses {}, both sides must use it" \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
sc_curly_braces_style:
|
||||
@@ -963,7 +992,7 @@ sc_prohibit_static_zero_init:
|
||||
sc_prohibit_devname:
|
||||
@prohibit='\bdevname\b' \
|
||||
exclude='sc_prohibit_devname' \
|
||||
halt='avoid using devname as FreeBSD exports the symbol' \
|
||||
halt='avoid using 'devname' as FreeBSD exports the symbol' \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
sc_prohibit_system_error_with_vir_err:
|
||||
@@ -977,7 +1006,7 @@ sc_prohibit_system_error_with_vir_err:
|
||||
sc_prohibit_virXXXFree:
|
||||
@prohibit='\bvir(Domain|Network|NodeDevice|StorageVol|StoragePool|Stream|Secret|NWFilter|Interface|DomainSnapshot)Free\b' \
|
||||
exclude='sc_prohibit_virXXXFree' \
|
||||
halt='avoid using virXXXFree, use virObjectUnref instead' \
|
||||
halt='avoid using 'virXXXFree', use 'virObjectUnref' instead' \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
sc_prohibit_sysconf_pagesize:
|
||||
@@ -988,7 +1017,7 @@ sc_prohibit_sysconf_pagesize:
|
||||
sc_prohibit_pthread_create:
|
||||
@prohibit='\bpthread_create\b' \
|
||||
exclude='sc_prohibit_pthread_create' \
|
||||
halt='avoid using pthread_create, use virThreadCreate instead' \
|
||||
halt="avoid using 'pthread_create', use 'virThreadCreate' instead" \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
sc_prohibit_not_streq:
|
||||
@@ -1001,32 +1030,6 @@ sc_prohibit_not_strneq:
|
||||
halt='Use STREQ instead of !STRNEQ' \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
sc_prohibit_verbose_strcat:
|
||||
@prohibit='strncat\([^,]*,\s+([^,]*),\s+strlen\(\1\)\)' \
|
||||
in_vc_files='\.[ch]$$' \
|
||||
halt='Use strcat(a, b) instead of strncat(a, b, strlen(b))' \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
# Ensure that each .c file containing a "main" function also
|
||||
# calls virGettextInitialize
|
||||
sc_gettext_init:
|
||||
@require='virGettextInitialize *\(' \
|
||||
in_vc_files='\.c$$' \
|
||||
containing='\<main *(' \
|
||||
halt='the above files do not call virGettextInitialize' \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
# <dt> is mostly used to document symbols, in which case it should contain
|
||||
# a <code> element. The regular expression below trades speed and readability
|
||||
# for accuracy, and won't catch someone trying to stick a <canvas> inside a
|
||||
# <dt>, but that's what code reviews are for :)
|
||||
sc_prohibit_dt_without_code:
|
||||
@prohibit='<dt>([^<]|<[^c])' \
|
||||
exclude='exempt from syntax-check' \
|
||||
in_vc_files='docs/.*$$' \
|
||||
halt='Use <code> inside <dt> when documenting symbols' \
|
||||
$(_sc_search_regexp)
|
||||
|
||||
# We don't use this feature of maint.mk.
|
||||
prev_version_file = /dev/null
|
||||
|
||||
@@ -1074,24 +1077,28 @@ _autogen:
|
||||
|
||||
# regenerate HACKING as part of the syntax-check
|
||||
ifneq ($(_gl-Makefile),)
|
||||
syntax-check: $(top_srcdir)/HACKING spacing-check test-wrap-argv \
|
||||
prohibit-duplicate-header
|
||||
syntax-check: $(top_srcdir)/HACKING bracket-spacing-check test-wrap-argv
|
||||
endif
|
||||
|
||||
# Don't include duplicate header in the source (either *.c or *.h)
|
||||
prohibit-duplicate-header:
|
||||
$(AM_V_GEN)files=$$($(VC_LIST_EXCEPT) | grep '\.[chx]$$'); \
|
||||
$(PERL) -W $(top_srcdir)/build-aux/prohibit-duplicate-header.pl $$files
|
||||
|
||||
spacing-check:
|
||||
bracket-spacing-check:
|
||||
$(AM_V_GEN)files=`$(VC_LIST) | grep '\.c$$'`; \
|
||||
$(PERL) $(top_srcdir)/build-aux/check-spacing.pl $$files || \
|
||||
$(PERL) $(top_srcdir)/build-aux/bracket-spacing.pl $$files || \
|
||||
{ echo '$(ME): incorrect formatting, see HACKING for rules' 1>&2; \
|
||||
exit 1; }
|
||||
|
||||
test-wrap-argv:
|
||||
$(AM_V_GEN)files=`$(VC_LIST) | grep -E '\.(ldargs|args)'`; \
|
||||
$(PERL) $(top_srcdir)/tests/test-wrap-argv.pl --check $$files
|
||||
for file in $$files ; \
|
||||
do \
|
||||
$(PERL) $(top_srcdir)/tests/test-wrap-argv.pl $$file > $${file}-t ; \
|
||||
diff $$file $${file}-t; \
|
||||
res=$$? ; \
|
||||
rm $${file}-t ; \
|
||||
test $$res == 0 || { \
|
||||
echo "$(ME): Incorrect line wrapping in $$file" 1>&2; \
|
||||
echo "$(ME): Use test-wrap-argv.pl to wrap test data files" 1>&2; \
|
||||
exit 1; } \
|
||||
done
|
||||
|
||||
# sc_po_check can fail if generated files are not built first
|
||||
sc_po_check: \
|
||||
@@ -1119,18 +1126,13 @@ _test1=shunloadtest|virnettlscontexttest|virnettlssessiontest|vircgroupmock
|
||||
exclude_file_name_regexp--sc_avoid_write = \
|
||||
^(src/($(_src1))|daemon/libvirtd|tools/virsh-console|tests/($(_test1)))\.c$$
|
||||
|
||||
exclude_file_name_regexp--sc_bindtextdomain = .*
|
||||
|
||||
exclude_file_name_regexp--sc_gettext_init = ^(tests|examples)/
|
||||
|
||||
exclude_file_name_regexp--sc_copyright_format = \
|
||||
^cfg\.mk$$
|
||||
exclude_file_name_regexp--sc_bindtextdomain = ^(tests|examples)/
|
||||
|
||||
exclude_file_name_regexp--sc_copyright_usage = \
|
||||
^COPYING(|\.LESSER)$$
|
||||
|
||||
exclude_file_name_regexp--sc_flags_usage = \
|
||||
^(cfg\.mk|docs/|src/util/virnetdevtap\.c$$|tests/(vir(cgroup|pci|test|usb)|nss|qemuxml2argv)mock\.c$$)
|
||||
^(docs/|src/util/virnetdevtap\.c$$|tests/vir(cgroup|pci|usb)mock\.c$$)
|
||||
|
||||
exclude_file_name_regexp--sc_libvirt_unmarked_diagnostics = \
|
||||
^(src/rpc/gendispatch\.pl$$|tests/)
|
||||
@@ -1138,25 +1140,21 @@ exclude_file_name_regexp--sc_libvirt_unmarked_diagnostics = \
|
||||
exclude_file_name_regexp--sc_po_check = ^(docs/|src/rpc/gendispatch\.pl$$)
|
||||
|
||||
exclude_file_name_regexp--sc_prohibit_VIR_ERR_NO_MEMORY = \
|
||||
^(cfg\.mk|include/libvirt/virterror\.h|daemon/dispatch\.c|src/util/virerror\.c|docs/internals/oomtesting\.html\.in)$$
|
||||
^(include/libvirt/virterror\.h|daemon/dispatch\.c|src/util/virerror\.c|docs/internals/oomtesting\.html\.in)$$
|
||||
|
||||
exclude_file_name_regexp--sc_prohibit_PATH_MAX = \
|
||||
^cfg\.mk$$
|
||||
|
||||
exclude_file_name_regexp--sc_prohibit_access_xok = \
|
||||
^(cfg\.mk|src/util/virutil\.c)$$
|
||||
exclude_file_name_regexp--sc_prohibit_access_xok = ^src/util/virutil\.c$$
|
||||
|
||||
exclude_file_name_regexp--sc_prohibit_asprintf = \
|
||||
^(cfg\.mk|bootstrap.conf$$|examples/|src/util/virstring\.[ch]$$|tests/vircgroupmock\.c$$)
|
||||
^(bootstrap.conf$$|src/util/virstring\.[ch]$$|tests/vircgroupmock\.c$$)
|
||||
|
||||
exclude_file_name_regexp--sc_prohibit_strdup = \
|
||||
^(docs/|examples/|src/util/virstring\.c|tests/vir(netserverclient|cgroup)mock.c$$)
|
||||
|
||||
exclude_file_name_regexp--sc_prohibit_close = \
|
||||
(\.p[yl]$$|\.spec\.in$$|^docs/|^(src/util/virfile\.c|src/libvirt-stream\.c|tests/vir.+mock\.c)$$)
|
||||
(\.p[yl]$$|\.spec\.in$$|^docs/|^(src/util/virfile\.c|src/libvirt-stream\.c|tests/vir(cgroup|pci)mock\.c)$$)
|
||||
|
||||
exclude_file_name_regexp--sc_prohibit_empty_lines_at_EOF = \
|
||||
(^tests/(qemuhelp|virhostcpu|virpcitest)data/|\.diff|tests/virconfdata/no-newline\.conf$$)
|
||||
(^tests/(qemuhelp|nodeinfo|virpcitest)data/|\.diff$$)
|
||||
|
||||
_src2=src/(util/vircommand|libvirt|lxc/lxc_controller|locking/lock_daemon|logging/log_daemon)
|
||||
exclude_file_name_regexp--sc_prohibit_fork_wrappers = \
|
||||
@@ -1173,9 +1171,6 @@ exclude_file_name_regexp--sc_prohibit_newline_at_end_of_diagnostic = \
|
||||
exclude_file_name_regexp--sc_prohibit_nonreentrant = \
|
||||
^((po|tests)/|docs/.*(py|html\.in)|run.in$$|tools/wireshark/util/genxdrstub\.pl$$)
|
||||
|
||||
exclude_file_name_regexp--sc_prohibit_select = \
|
||||
^cfg\.mk$$
|
||||
|
||||
exclude_file_name_regexp--sc_prohibit_raw_allocation = \
|
||||
^(docs/hacking\.html\.in|src/util/viralloc\.[ch]|examples/.*|tests/(securityselinuxhelper|vircgroupmock)\.c|tools/wireshark/src/packet-libvirt\.c)$$
|
||||
|
||||
@@ -1185,13 +1180,11 @@ exclude_file_name_regexp--sc_prohibit_readlink = \
|
||||
exclude_file_name_regexp--sc_prohibit_setuid = ^src/util/virutil\.c$$
|
||||
|
||||
exclude_file_name_regexp--sc_prohibit_sprintf = \
|
||||
^(cfg\.mk|docs/hacking\.html\.in|.*\.stp|.*\.pl)$$
|
||||
(^docs/hacking\.html\.in|\.stp|\.pl)$$
|
||||
|
||||
exclude_file_name_regexp--sc_prohibit_strncpy = ^src/util/virstring\.c$$
|
||||
|
||||
exclude_file_name_regexp--sc_prohibit_strtol = ^examples/.*$$
|
||||
|
||||
exclude_file_name_regexp--sc_prohibit_gethostby = ^docs/nss.html.in$$
|
||||
exclude_file_name_regexp--sc_prohibit_strtol = ^examples/dom.*/.*\.c$$
|
||||
|
||||
exclude_file_name_regexp--sc_prohibit_xmlGetProp = ^src/util/virxml\.c$$
|
||||
|
||||
@@ -1206,7 +1199,7 @@ exclude_file_name_regexp--sc_require_config_h_first = \
|
||||
^(examples/|tools/virsh-edit\.c$$)
|
||||
|
||||
exclude_file_name_regexp--sc_trailing_blank = \
|
||||
/qemuhelpdata/|/sysinfodata/.*\.data|/virhostcpudata/.*\.cpuinfo$$
|
||||
/qemuhelpdata/|/sysinfodata/.*\.data|/nodeinfodata/.*\.cpuinfo$$
|
||||
|
||||
exclude_file_name_regexp--sc_unmarked_diagnostics = \
|
||||
^(docs/apibuild.py|tests/virt-aa-helper-test)$$
|
||||
@@ -1225,7 +1218,7 @@ exclude_file_name_regexp--sc_prohibit_include_public_headers_brackets = \
|
||||
^(tools/|examples/|include/libvirt/(virterror|libvirt(-(admin|qemu|lxc))?)\.h$$)
|
||||
|
||||
exclude_file_name_regexp--sc_prohibit_int_ijk = \
|
||||
^(src/remote_protocol-structs|src/remote/remote_protocol\.x|cfg\.mk|include/libvirt/libvirt.+|src/admin_protocol-structs|src/admin/admin_protocol\.x)$$
|
||||
^(src/remote_protocol-structs|src/remote/remote_protocol\.x|cfg\.mk|include/libvirt/libvirt.+)$$
|
||||
|
||||
exclude_file_name_regexp--sc_prohibit_getenv = \
|
||||
^tests/.*\.[ch]$$
|
||||
@@ -1237,7 +1230,7 @@ exclude_file_name_regexp--sc_prohibit_mixed_case_abbreviations = \
|
||||
^src/(vbox/vbox_CAPI.*.h|esx/esx_vi.(c|h)|esx/esx_storage_backend_iscsi.c)$$
|
||||
|
||||
exclude_file_name_regexp--sc_prohibit_empty_first_line = \
|
||||
^(README|daemon/THREADS\.txt|src/esx/README|docs/library.xen|tests/(vmwarever|virhostcpu)data/.*)$$
|
||||
^(README|daemon/THREADS\.txt|src/esx/README|docs/library.xen|tests/(vmwarever|nodeinfo)data/.*)$$
|
||||
|
||||
exclude_file_name_regexp--sc_prohibit_useless_translation = \
|
||||
^tests/virpolkittest.c
|
||||
@@ -1259,12 +1252,3 @@ exclude_file_name_regexp--sc_prohibit_not_streq = \
|
||||
|
||||
exclude_file_name_regexp--sc_prohibit_not_strneq = \
|
||||
^tests/.*\.[ch]$$
|
||||
|
||||
exclude_file_name_regexp--sc_prohibit_dt_without_code = \
|
||||
^docs/(newapi\.xsl|(apps|contact)\.html\.in)$$
|
||||
|
||||
exclude_file_name_regexp--sc_prohibit_always-defined_macros = \
|
||||
^tests/virtestmock.c$$
|
||||
|
||||
exclude_file_name_regexp--sc_prohibit_readdir = \
|
||||
^tests/.*mock\.c$$
|
||||
|
@@ -32,7 +32,6 @@
|
||||
# undef HAVE_LIBSASL2
|
||||
# undef WITH_CAPNG
|
||||
# undef WITH_CURL
|
||||
# undef WITH_DBUS
|
||||
# undef WITH_DTRACE_PROBES
|
||||
# undef WITH_GNUTLS
|
||||
# undef WITH_GNUTLS_GCRYPT
|
||||
@@ -40,32 +39,7 @@
|
||||
# undef WITH_NUMACTL
|
||||
# undef WITH_SASL
|
||||
# undef WITH_SSH2
|
||||
# undef WITH_SYSTEMD_DAEMON
|
||||
# undef WITH_VIRTUALPORT
|
||||
# undef WITH_YAJL
|
||||
# undef WITH_YAJL2
|
||||
#endif
|
||||
|
||||
/*
|
||||
* With the NSS module it's the same story as virt-login-shell. See the
|
||||
* explanation above.
|
||||
*/
|
||||
#ifdef LIBVIRT_NSS
|
||||
# undef HAVE_LIBDEVMAPPER_H
|
||||
# undef HAVE_LIBNL
|
||||
# undef HAVE_LIBNL3
|
||||
# undef HAVE_LIBSASL2
|
||||
# undef WITH_CAPNG
|
||||
# undef WITH_CURL
|
||||
# undef WITH_DTRACE_PROBES
|
||||
# undef WITH_GNUTLS
|
||||
# undef WITH_GNUTLS_GCRYPT
|
||||
# undef WITH_MACVTAP
|
||||
# undef WITH_NUMACTL
|
||||
# undef WITH_SASL
|
||||
# undef WITH_SSH2
|
||||
# undef WITH_VIRTUALPORT
|
||||
# undef WITH_SECDRIVER_SELINUX
|
||||
# undef WITH_SECDRIVER_APPARMOR
|
||||
# undef WITH_CAPNG
|
||||
#endif /* LIBVIRT_NSS */
|
||||
|
263
configure.ac
263
configure.ac
@@ -16,7 +16,7 @@ dnl You should have received a copy of the GNU Lesser General Public
|
||||
dnl License along with this library. If not, see
|
||||
dnl <http://www.gnu.org/licenses/>.
|
||||
|
||||
AC_INIT([libvirt], [2.0.0], [libvir-list@redhat.com], [], [http://libvirt.org])
|
||||
AC_INIT([libvirt], [1.3.1], [libvir-list@redhat.com], [], [http://libvirt.org])
|
||||
AC_CONFIG_SRCDIR([src/libvirt.c])
|
||||
AC_CONFIG_AUX_DIR([build-aux])
|
||||
AC_CONFIG_HEADERS([config.h])
|
||||
@@ -24,7 +24,7 @@ AH_BOTTOM([#include <config-post.h>])
|
||||
AC_CONFIG_MACRO_DIR([m4])
|
||||
dnl Make automake keep quiet about wildcards & other GNUmake-isms; also keep
|
||||
dnl quiet about the fact that we intentionally cater to automake 1.9
|
||||
AM_INIT_AUTOMAKE([-Wno-portability -Wno-obsolete tar-pax no-dist-gzip dist-xz subdir-objects])
|
||||
AM_INIT_AUTOMAKE([-Wno-portability -Wno-obsolete tar-ustar subdir-objects])
|
||||
dnl older automake's default of ARFLAGS=cru is noisy on newer binutils;
|
||||
dnl we don't really need the 'u' even in older toolchains. Then there is
|
||||
dnl older libtool, which spelled it AR_FLAGS
|
||||
@@ -117,7 +117,7 @@ fi
|
||||
|
||||
dnl Required minimum versions of all libs we depend on
|
||||
LIBXML_REQUIRED="2.6.0"
|
||||
GNUTLS_REQUIRED="2.2.0"
|
||||
GNUTLS_REQUIRED="1.0.25"
|
||||
POLKIT_REQUIRED="0.6"
|
||||
PARTED_REQUIRED="1.8.0"
|
||||
DEVMAPPER_REQUIRED=1.0.0
|
||||
@@ -144,8 +144,6 @@ AC_TYPE_UID_T
|
||||
dnl Support building Win32 DLLs (must appear *before* AM_PROG_LIBTOOL)
|
||||
AC_LIBTOOL_WIN32_DLL
|
||||
|
||||
AC_HEADER_MAJOR
|
||||
|
||||
m4_ifndef([LT_INIT], [
|
||||
AM_PROG_LIBTOOL
|
||||
], [
|
||||
@@ -256,9 +254,9 @@ LIBVIRT_CHECK_SANLOCK
|
||||
LIBVIRT_CHECK_SASL
|
||||
LIBVIRT_CHECK_SELINUX
|
||||
LIBVIRT_CHECK_SSH2
|
||||
LIBVIRT_CHECK_SYSTEMD_DAEMON
|
||||
LIBVIRT_CHECK_UDEV
|
||||
LIBVIRT_CHECK_WIRESHARK
|
||||
LIBVIRT_CHECK_NSS
|
||||
LIBVIRT_CHECK_YAJL
|
||||
|
||||
AC_MSG_CHECKING([for CPUID instruction])
|
||||
@@ -322,16 +320,15 @@ if test "x$lv_cv_pthread_sigmask_works" != xyes; then
|
||||
AC_DEFINE([FUNC_PTHREAD_SIGMASK_BROKEN], [1],
|
||||
[Define to 1 if pthread_sigmask is not a real function])
|
||||
fi
|
||||
LIBS=$old_LIBS
|
||||
LIBS=$old_libs
|
||||
|
||||
dnl Availability of various common headers (non-fatal if missing).
|
||||
AC_CHECK_HEADERS([pwd.h regex.h sys/un.h \
|
||||
AC_CHECK_HEADERS([pwd.h paths.h regex.h sys/un.h \
|
||||
sys/poll.h syslog.h mntent.h net/ethernet.h linux/magic.h \
|
||||
sys/un.h sys/syscall.h sys/sysctl.h netinet/tcp.h ifaddrs.h \
|
||||
libtasn1.h sys/ucred.h sys/mount.h])
|
||||
dnl Check whether endian provides handy macros.
|
||||
AC_CHECK_DECLS([htole64], [], [], [[#include <endian.h>]])
|
||||
AC_CHECK_FUNCS([stat stat64 __xstat __xstat64 lstat lstat64 __lxstat __lxstat64])
|
||||
|
||||
dnl We need to decide at configure time if libvirt will use real atomic
|
||||
dnl operations ("lock free") or emulated ones with a mutex.
|
||||
@@ -417,6 +414,10 @@ AC_CHECK_LIB([intl],[gettext],[])
|
||||
dnl Do we have rpcgen?
|
||||
AC_PATH_PROGS([RPCGEN], [rpcgen portable-rpcgen], [no])
|
||||
AM_CONDITIONAL([HAVE_RPCGEN], [test "x$ac_cv_path_RPCGEN" != "xno"])
|
||||
dnl Is this GLIBC's buggy rpcgen?
|
||||
AM_CONDITIONAL([HAVE_GLIBC_RPCGEN],
|
||||
[test "x$ac_cv_path_RPCGEN" != "xno" &&
|
||||
$ac_cv_path_RPCGEN -t </dev/null >/dev/null 2>&1])
|
||||
|
||||
dnl Miscellaneous external programs.
|
||||
AC_PATH_PROG([XMLLINT], [xmllint], [/usr/bin/xmllint])
|
||||
@@ -424,7 +425,6 @@ AC_PATH_PROG([XMLCATALOG], [xmlcatalog], [/usr/bin/xmlcatalog])
|
||||
AC_PATH_PROG([XSLTPROC], [xsltproc], [/usr/bin/xsltproc])
|
||||
AC_PATH_PROG([AUGPARSE], [augparse], [/usr/bin/augparse])
|
||||
AC_PROG_MKDIR_P
|
||||
AC_PROG_LN_S
|
||||
|
||||
dnl External programs that we can use if they are available.
|
||||
dnl We will hard-code paths to these programs unless we cannot
|
||||
@@ -533,6 +533,10 @@ AC_ARG_WITH([qemu],
|
||||
[AS_HELP_STRING([--with-qemu],
|
||||
[add QEMU/KVM support @<:@default=yes@:>@])])
|
||||
m4_divert_text([DEFAULTS], [with_qemu=yes])
|
||||
AC_ARG_WITH([uml],
|
||||
[AS_HELP_STRING([--with-uml],
|
||||
[add UML support @<:@default=check@:>@])])
|
||||
m4_divert_text([DEFAULTS], [with_uml=check])
|
||||
AC_ARG_WITH([openvz],
|
||||
[AS_HELP_STRING([--with-openvz],
|
||||
[add OpenVZ support @<:@default=check@:>@])])
|
||||
@@ -608,7 +612,51 @@ if test x"$enable_debug" = x"yes"; then
|
||||
AC_DEFINE([ENABLE_DEBUG], [], [whether debugging is enabled])
|
||||
fi
|
||||
|
||||
LIBVIRT_CHECK_INIT_SCRIPT
|
||||
|
||||
|
||||
dnl
|
||||
dnl init script flavor
|
||||
dnl
|
||||
AC_MSG_CHECKING([for init script flavor])
|
||||
AC_ARG_WITH([init-script],
|
||||
[AS_HELP_STRING([--with-init-script@<:@=STYLE@:>@],
|
||||
[Style of init script to install: redhat, systemd, systemd+redhat,
|
||||
upstart, check, none @<:@default=check@:>@])],
|
||||
[],[with_init_script=check])
|
||||
init_redhat=no
|
||||
init_systemd=no
|
||||
init_upstart=no
|
||||
case "$with_init_script" in
|
||||
systemd+redhat)
|
||||
init_redhat=yes
|
||||
init_systemd=yes
|
||||
;;
|
||||
systemd)
|
||||
init_systemd=yes
|
||||
;;
|
||||
upstart)
|
||||
init_upstart=yes
|
||||
;;
|
||||
redhat)
|
||||
init_redhat=yes
|
||||
;;
|
||||
none)
|
||||
;;
|
||||
check)
|
||||
if test "$cross_compiling" != yes && test -f /etc/redhat-release; then
|
||||
init_redhat=yes
|
||||
with_init_script=redhat
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
AC_MSG_ERROR([Unknown initscript flavour $with_init_script])
|
||||
;;
|
||||
esac
|
||||
AM_CONDITIONAL([LIBVIRT_INIT_SCRIPT_RED_HAT], test "$init_redhat" = "yes")
|
||||
AM_CONDITIONAL([LIBVIRT_INIT_SCRIPT_UPSTART], test "$init_upstart" = "yes")
|
||||
AM_CONDITIONAL([LIBVIRT_INIT_SCRIPT_SYSTEMD], test "$init_systemd" = "yes")
|
||||
AC_MSG_RESULT($with_init_script)
|
||||
|
||||
|
||||
AC_MSG_CHECKING([for whether to install sysctl config])
|
||||
AC_ARG_WITH([sysctl],
|
||||
@@ -867,11 +915,6 @@ if test "$with_libxl" != "no" ; then
|
||||
fi
|
||||
fi
|
||||
|
||||
# LIBXL_API_VERSION 4.4.0 introduced a new parameter to
|
||||
# libxl_domain_create_restore for specifying restore parameters.
|
||||
# The libxl driver will make use of this new parameter for specifying
|
||||
# the Xen migration stream version.
|
||||
LIBXL_CFLAGS="$LIBXL_CFLAGS -DLIBXL_API_VERSION=0x040400"
|
||||
LIBS="$old_LIBS"
|
||||
CFLAGS="$old_CFLAGS"
|
||||
|
||||
@@ -1054,12 +1097,6 @@ dnl
|
||||
|
||||
LIBVIRT_CHECK_LOGIN_SHELL
|
||||
|
||||
dnl
|
||||
dnl Check for virt-host-validate
|
||||
dnl
|
||||
|
||||
LIBVIRT_CHECK_HOST_VALIDATE
|
||||
|
||||
AM_CONDITIONAL([WITH_SETUID_RPC_CLIENT], [test "$with_lxc$with_login_shell" != "nono"])
|
||||
|
||||
dnl
|
||||
@@ -1074,6 +1111,56 @@ dnl
|
||||
|
||||
LIBVIRT_DRIVER_CHECK_BHYVE
|
||||
|
||||
dnl
|
||||
dnl check for shell that understands <> redirection without truncation,
|
||||
dnl needed by src/qemu/qemu_monitor_{text,json}.c.
|
||||
dnl
|
||||
if test "$with_qemu" = yes; then
|
||||
lv_wrapper_shell=
|
||||
AC_CACHE_CHECK([for shell that supports <> redirection],
|
||||
[lv_cv_wrapper_shell],
|
||||
[
|
||||
# If cross-compiling, guess that /bin/sh is good enough except for
|
||||
# Linux, where it might be dash 0.5.5 which is known broken; and on
|
||||
# Linux, we have a good chance that /bin/bash will exist.
|
||||
# If we guess wrong, a user can override the cache variable.
|
||||
# Going through /bin/bash is a slight slowdown if /bin/sh works.
|
||||
if test "$cross_compiling" = yes; then
|
||||
case $host_os in
|
||||
linux*) lv_cv_wrapper_shell=/bin/bash ;;
|
||||
*) lv_cv_wrapper_shell=/bin/sh ;;
|
||||
esac
|
||||
else
|
||||
for lv_cv_wrapper_shell in /bin/sh bash ksh zsh none; do
|
||||
test $lv_cv_wrapper_shell = none &&
|
||||
AC_MSG_ERROR([could not find decent shell])
|
||||
echo a > conftest.a
|
||||
($lv_cv_wrapper_shell -c ': 1<>conftest.a') 2>/dev/null &&
|
||||
case `cat conftest.a`.$lv_cv_wrapper_shell in
|
||||
a./*) break;; dnl /bin/sh is good enough
|
||||
a.*) dnl bash, ksh, and zsh all understand 'command', use that
|
||||
dnl to determine the absolute path of the shell
|
||||
lv_cv_wrapper_shell=`$lv_cv_wrapper_shell -c \
|
||||
"command -v $lv_cv_wrapper_shell"`
|
||||
case $lv_cv_wrapper_shell in
|
||||
/*) break;;
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
done
|
||||
rm -f conftest.a
|
||||
fi
|
||||
])
|
||||
if test "x$lv_cv_wrapper_shell" != x/bin/sh; then
|
||||
lv_wrapper_shell=$lv_cv_wrapper_shell
|
||||
fi
|
||||
if test "x$lv_wrapper_shell" != x; then
|
||||
AC_DEFINE_UNQUOTED([VIR_WRAPPER_SHELL], ["$lv_wrapper_shell"],
|
||||
[Define to the absolute path of a shell that does not truncate on
|
||||
<> redirection, if /bin/sh does not fit the bill])
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
dnl
|
||||
dnl check for kernel headers required by src/bridge.c
|
||||
@@ -1160,15 +1247,15 @@ AC_SUBST([LIBXML_CFLAGS])
|
||||
AC_SUBST([LIBXML_LIBS])
|
||||
|
||||
dnl xmlURI structure has query_raw?
|
||||
old_CFLAGS="$CFLAGS"
|
||||
old_LIBS="$LIBS"
|
||||
old_cflags="$CFLAGS"
|
||||
old_libs="$LIBS"
|
||||
CFLAGS="$CFLAGS $LIBXML_CFLAGS"
|
||||
LIBS="$LIBS $LIBXML_LIBS"
|
||||
AC_CHECK_MEMBER([struct _xmlURI.query_raw],
|
||||
[AC_DEFINE([HAVE_XMLURI_QUERY_RAW], [], [Have query_raw field in libxml2 xmlURI structure])],,
|
||||
[#include <libxml/uri.h>])
|
||||
CFLAGS="$old_CFLAGS"
|
||||
LIBS="$old_LIBS"
|
||||
CFLAGS="$old_cflags"
|
||||
LIBS="$old_libs"
|
||||
|
||||
dnl GnuTLS library
|
||||
AC_ARG_WITH([gnutls],
|
||||
@@ -1184,8 +1271,8 @@ if test "x$with_gnutls" != "xno"; then
|
||||
GNUTLS_LIBS="-L$with_gnutls/lib"
|
||||
fi
|
||||
fail=0
|
||||
old_CFLAGS="$CFLAGS"
|
||||
old_LIBS="$LIBS"
|
||||
old_cflags="$CFLAGS"
|
||||
old_libs="$LIBS"
|
||||
CFLAGS="$CFLAGS $GNUTLS_CFLAGS"
|
||||
LIBS="$LIBS $GNUTLS_LIBS"
|
||||
|
||||
@@ -1243,24 +1330,16 @@ if test "x$with_gnutls" != "xno"; then
|
||||
[set to 1 if it is known or assumed that GNUTLS uses gcrypt])
|
||||
fi
|
||||
|
||||
dnl gnutls 3.x moved some declarations to a new header
|
||||
AC_CHECK_HEADERS([gnutls/crypto.h], [], [], [[
|
||||
#include <gnutls/gnutls.h>
|
||||
]])
|
||||
|
||||
with_gnutls=yes
|
||||
fi
|
||||
|
||||
dnl GNUTLS_CFLAGS and GNUTLS_LIBS have probably been updated above,
|
||||
dnl and we need the final values for function probing to work
|
||||
CFLAGS="$old_CFLAGS $GNUTLS_CFLAGS"
|
||||
LIBS="$old_LIBS $GNUTLS_LIBS"
|
||||
|
||||
dnl gnutls 3.x moved some declarations to a new header
|
||||
AC_CHECK_HEADERS([gnutls/crypto.h], [], [], [[
|
||||
#include <gnutls/gnutls.h>
|
||||
]])
|
||||
|
||||
AC_CHECK_FUNCS([gnutls_rnd])
|
||||
AC_CHECK_FUNCS([gnutls_cipher_encrypt])
|
||||
|
||||
LIBS="$old_libs"
|
||||
CFLAGS="$old_CFLAGS"
|
||||
LIBS="$old_LIBS"
|
||||
fi
|
||||
|
||||
if test "x$with_gnutls" = "xyes" ; then
|
||||
@@ -1272,16 +1351,6 @@ AC_SUBST([GNUTLS_CFLAGS])
|
||||
AC_SUBST([GNUTLS_LIBS])
|
||||
|
||||
|
||||
AC_ARG_WITH([tls-priority],
|
||||
[AS_HELP_STRING([--with-tls-priority],
|
||||
[set the default TLS session priority string @<:@default=NORMAL@:>@])],
|
||||
[],
|
||||
[with_tls_priority=NORMAL])
|
||||
|
||||
AC_DEFINE_UNQUOTED([TLS_PRIORITY], ["$with_tls_priority"],
|
||||
[TLS default priority string])
|
||||
|
||||
|
||||
dnl PolicyKit library
|
||||
POLKIT_CFLAGS=
|
||||
POLKIT_LIBS=
|
||||
@@ -1411,8 +1480,8 @@ if test "$with_selinux" != "yes" ; then
|
||||
AC_MSG_ERROR([You must install the libselinux development package and enable SELinux with the --with-selinux=yes in order to compile libvirt --with-secdriver-selinux=yes])
|
||||
fi
|
||||
elif test "$with_secdriver_selinux" != "no"; then
|
||||
old_CFLAGS="$CFLAGS"
|
||||
old_LIBS="$LIBS"
|
||||
old_cflags="$CFLAGS"
|
||||
old_libs="$LIBS"
|
||||
CFLAGS="$CFLAGS $SELINUX_CFLAGS"
|
||||
LIBS="$CFLAGS $SELINUX_LIBS"
|
||||
|
||||
@@ -1420,8 +1489,8 @@ elif test "$with_secdriver_selinux" != "no"; then
|
||||
AC_CHECK_FUNC([selinux_virtual_domain_context_path], [], [fail=1])
|
||||
AC_CHECK_FUNC([selinux_virtual_image_context_path], [], [fail=1])
|
||||
AC_CHECK_FUNCS([selinux_lxc_contexts_path])
|
||||
CFLAGS="$old_CFLAGS"
|
||||
LIBS="$old_LIBS"
|
||||
CFLAGS="$old_cflags"
|
||||
LIBS="$old_libs"
|
||||
|
||||
if test "$fail" = "1" ; then
|
||||
if test "$with_secdriver_selinux" = "check" ; then
|
||||
@@ -1565,7 +1634,27 @@ dnl
|
||||
dnl Checks for the UML driver
|
||||
dnl
|
||||
|
||||
LIBVIRT_DRIVER_CHECK_UML
|
||||
if test "$with_libvirtd" = "no" ; then
|
||||
with_uml=no
|
||||
fi
|
||||
if test "$with_uml" = "yes" || test "$with_uml" = "check"; then
|
||||
AC_CHECK_HEADER([sys/inotify.h], [
|
||||
with_uml=yes
|
||||
], [
|
||||
if test "$with_uml" = "check"; then
|
||||
with_uml=no
|
||||
AC_MSG_NOTICE([<sys/inotify.h> is required for the UML driver, disabling it])
|
||||
else
|
||||
AC_MSG_ERROR([The <sys/inotify.h> is required for the UML driver. Upgrade your libc6.])
|
||||
fi
|
||||
])
|
||||
fi
|
||||
if test "$with_uml" = "yes" ; then
|
||||
AC_DEFINE_UNQUOTED([WITH_UML], 1, [whether UML driver is enabled])
|
||||
fi
|
||||
AM_CONDITIONAL([WITH_UML], [test "$with_uml" = "yes"])
|
||||
|
||||
|
||||
|
||||
dnl
|
||||
dnl check for PHYP
|
||||
@@ -1847,7 +1936,7 @@ else
|
||||
fi
|
||||
AM_CONDITIONAL([WITH_STORAGE_ISCSI], [test "$with_storage_iscsi" = "yes"])
|
||||
|
||||
if test "$with_storage_scsi" = "check" || test "$with_storage_scsi" = "yes"; then
|
||||
if test "$with_storage_scsi" = "check"; then
|
||||
with_storage_scsi=yes
|
||||
|
||||
AC_DEFINE_UNQUOTED([WITH_STORAGE_SCSI], 1,
|
||||
@@ -1855,16 +1944,13 @@ if test "$with_storage_scsi" = "check" || test "$with_storage_scsi" = "yes"; the
|
||||
fi
|
||||
AM_CONDITIONAL([WITH_STORAGE_SCSI], [test "$with_storage_scsi" = "yes"])
|
||||
|
||||
if test "$with_storage_mpath" = "check" || test "$with_storage_mpath" = "yes"; then
|
||||
if test "$with_storage_mpath" = "check"; then
|
||||
if test "$with_linux" = "yes"; then
|
||||
with_storage_mpath=yes
|
||||
|
||||
AC_DEFINE_UNQUOTED([WITH_STORAGE_MPATH], 1,
|
||||
[whether mpath backend for storage driver is enabled])
|
||||
else
|
||||
if test "$with_storage_mpath" = "yes"; then
|
||||
AC_MSG_ERROR([mpath storage is only supported on Linux])
|
||||
fi
|
||||
with_storage_mpath=no
|
||||
fi
|
||||
fi
|
||||
@@ -1925,6 +2011,14 @@ if test "$with_storage_gluster" = "yes"; then
|
||||
fi
|
||||
AM_CONDITIONAL([WITH_STORAGE_GLUSTER], [test "$with_storage_gluster" = "yes"])
|
||||
|
||||
if test "$with_storage_zfs" = "check"; then
|
||||
with_storage_zfs=$with_freebsd
|
||||
fi
|
||||
|
||||
if test "$with_storage_zfs" = "yes" && test "$with_freebsd" = "no"; then
|
||||
AC_MSG_ERROR([The ZFS storage driver can be enabled on FreeBSD only.])
|
||||
fi
|
||||
|
||||
if test "$with_storage_zfs" = "yes" ||
|
||||
test "$with_storage_zfs" = "check"; then
|
||||
AC_PATH_PROG([ZFS], [zfs], [], [$PATH:/sbin:/usr/sbin])
|
||||
@@ -1968,12 +2062,19 @@ LIBPARTED_LIBS=
|
||||
if test "$with_storage_disk" = "yes" ||
|
||||
test "$with_storage_disk" = "check"; then
|
||||
AC_PATH_PROG([PARTED], [parted], [], [$PATH:/sbin:/usr/sbin])
|
||||
AC_PATH_PROG([DMSETUP], [dmsetup], [], [$PATH:/sbin:/usr/sbin])
|
||||
if test -z "$PARTED" ; then
|
||||
PARTED_FOUND=no
|
||||
else
|
||||
PARTED_FOUND=yes
|
||||
fi
|
||||
|
||||
if test -z "$DMSETUP" ; then
|
||||
DMSETUP_FOUND=no
|
||||
else
|
||||
DMSETUP_FOUND=yes
|
||||
fi
|
||||
|
||||
if test "$PARTED_FOUND" = "yes" && test "x$PKG_CONFIG" != "x" ; then
|
||||
PKG_CHECK_MODULES([LIBPARTED], [libparted >= $PARTED_REQUIRED], [],
|
||||
[PARTED_FOUND=no])
|
||||
@@ -1992,12 +2093,12 @@ if test "$with_storage_disk" = "yes" ||
|
||||
fi
|
||||
|
||||
if test "$with_storage_disk" = "yes" &&
|
||||
test "$PARTED_FOUND" != "yes"; then
|
||||
AC_MSG_ERROR([Need parted for disk storage driver])
|
||||
test "$PARTED_FOUND:$DMSETUP_FOUND" != "yes:yes"; then
|
||||
AC_MSG_ERROR([Need both parted and dmsetup for disk storage driver])
|
||||
fi
|
||||
|
||||
if test "$with_storage_disk" = "check"; then
|
||||
if test "$PARTED_FOUND" != "yes"; then
|
||||
if test "$PARTED_FOUND:$DMSETUP_FOUND" != "yes:yes"; then
|
||||
with_storage_disk=no
|
||||
else
|
||||
with_storage_disk=yes
|
||||
@@ -2009,6 +2110,8 @@ if test "$with_storage_disk" = "yes" ||
|
||||
[whether Disk backend for storage driver is enabled])
|
||||
AC_DEFINE_UNQUOTED([PARTED],["$PARTED"],
|
||||
[Location or name of the parted program])
|
||||
AC_DEFINE_UNQUOTED([DMSETUP],["$DMSETUP"],
|
||||
[Location or name of the dmsetup program])
|
||||
fi
|
||||
fi
|
||||
AM_CONDITIONAL([WITH_STORAGE_DISK], [test "$with_storage_disk" = "yes"])
|
||||
@@ -2698,7 +2801,7 @@ AC_DEFINE_UNQUOTED([base64_encode_alloc],[libvirt_gl_base64_encode_alloc],[Hack
|
||||
AC_CONFIG_FILES([run],
|
||||
[chmod +x,-w run])
|
||||
AC_CONFIG_FILES([\
|
||||
Makefile src/Makefile include/libvirt/Makefile docs/Makefile \
|
||||
Makefile src/Makefile include/Makefile docs/Makefile \
|
||||
gnulib/lib/Makefile \
|
||||
gnulib/tests/Makefile \
|
||||
libvirt.pc \
|
||||
@@ -2725,7 +2828,7 @@ AC_MSG_NOTICE([Drivers])
|
||||
AC_MSG_NOTICE([])
|
||||
AC_MSG_NOTICE([ Xen: $with_xen])
|
||||
AC_MSG_NOTICE([ QEMU: $with_qemu])
|
||||
LIBVIRT_DRIVER_RESULT_UML
|
||||
AC_MSG_NOTICE([ UML: $with_uml])
|
||||
AC_MSG_NOTICE([ OpenVZ: $with_openvz])
|
||||
AC_MSG_NOTICE([ VMware: $with_vmware])
|
||||
AC_MSG_NOTICE([ VBox: $with_vbox])
|
||||
@@ -2795,9 +2898,9 @@ LIBVIRT_RESULT_SANLOCK
|
||||
LIBVIRT_RESULT_SASL
|
||||
LIBVIRT_RESULT_SELINUX
|
||||
LIBVIRT_RESULT_SSH2
|
||||
LIBVIRT_RESULT_SYSTEMD_DAEMON
|
||||
LIBVIRT_RESULT_UDEV
|
||||
LIBVIRT_RESULT_WIRESHARK
|
||||
LIBVIRT_RESULT_NSS
|
||||
LIBVIRT_RESULT_YAJL
|
||||
AC_MSG_NOTICE([ libxml: $LIBXML_CFLAGS $LIBXML_LIBS])
|
||||
AC_MSG_NOTICE([ dlopen: $DLOPEN_LIBS])
|
||||
@@ -2871,19 +2974,17 @@ AC_MSG_NOTICE([ Alloc OOM: $enable_oom])
|
||||
AC_MSG_NOTICE([])
|
||||
AC_MSG_NOTICE([Miscellaneous])
|
||||
AC_MSG_NOTICE([])
|
||||
AC_MSG_NOTICE([ Debug: $enable_debug])
|
||||
AC_MSG_NOTICE([ Use -Werror: $set_werror])
|
||||
AC_MSG_NOTICE([ Warning Flags: $WARN_CFLAGS])
|
||||
AC_MSG_NOTICE([ DTrace: $with_dtrace])
|
||||
AC_MSG_NOTICE([ numad: $with_numad])
|
||||
AC_MSG_NOTICE([ XML Catalog: $XML_CATALOG_FILE])
|
||||
LIBVIRT_RESULT_INIT_SCRIPT
|
||||
AC_MSG_NOTICE([ Char device locks: $with_chrdev_lock_files])
|
||||
AC_MSG_NOTICE([ Default Editor: $DEFAULT_EDITOR])
|
||||
AC_MSG_NOTICE([ Loader/NVRAM: $with_loader_nvram])
|
||||
AC_MSG_NOTICE([ virt-login-shell: $with_login_shell])
|
||||
AC_MSG_NOTICE([virt-host-validate: $with_host_validate])
|
||||
AC_MSG_NOTICE([ TLS priority: $with_tls_priority])
|
||||
AC_MSG_NOTICE([ Debug: $enable_debug])
|
||||
AC_MSG_NOTICE([ Use -Werror: $set_werror])
|
||||
AC_MSG_NOTICE([ Warning Flags: $WARN_CFLAGS])
|
||||
AC_MSG_NOTICE([ DTrace: $with_dtrace])
|
||||
AC_MSG_NOTICE([ numad: $with_numad])
|
||||
AC_MSG_NOTICE([ XML Catalog: $XML_CATALOG_FILE])
|
||||
AC_MSG_NOTICE([ Init script: $with_init_script])
|
||||
AC_MSG_NOTICE([Char device locks: $with_chrdev_lock_files])
|
||||
AC_MSG_NOTICE([ Default Editor: $DEFAULT_EDITOR])
|
||||
AC_MSG_NOTICE([ Loader/NVRAM: $with_loader_nvram])
|
||||
AC_MSG_NOTICE([ virt-login-shell: $with_login_shell])
|
||||
AC_MSG_NOTICE([])
|
||||
AC_MSG_NOTICE([Developer Tools])
|
||||
AC_MSG_NOTICE([])
|
||||
|
@@ -46,14 +46,6 @@ DAEMON_SOURCES = \
|
||||
|
||||
LIBVIRTD_CONF_SOURCES = libvirtd-config.c libvirtd-config.h
|
||||
|
||||
PODFILES = \
|
||||
libvirtd.pod \
|
||||
$(NULL)
|
||||
|
||||
MANINFILES = \
|
||||
libvirtd.8.in \
|
||||
$(NULL)
|
||||
|
||||
DISTCLEANFILES =
|
||||
EXTRA_DIST = \
|
||||
remote_dispatch.h \
|
||||
@@ -67,6 +59,7 @@ EXTRA_DIST = \
|
||||
libvirt.rules \
|
||||
libvirtd.sasl \
|
||||
libvirtd.service.in \
|
||||
libvirtd.socket.in \
|
||||
libvirtd.sysconf \
|
||||
libvirtd.sysctl \
|
||||
libvirtd.aug \
|
||||
@@ -77,8 +70,8 @@ EXTRA_DIST = \
|
||||
libvirtd.uml.logrotate.in \
|
||||
test_libvirtd.aug.in \
|
||||
THREADS.txt \
|
||||
$(PODFILES) \
|
||||
$(MANINFILES) \
|
||||
libvirtd.pod.in \
|
||||
libvirtd.8.in \
|
||||
$(DAEMON_SOURCES) \
|
||||
$(LIBVIRTD_CONF_SOURCES) \
|
||||
$(NULL)
|
||||
@@ -135,7 +128,7 @@ libvirtd_conf_la_LIBADD = $(LIBXML_LIBS)
|
||||
|
||||
noinst_LTLIBRARIES += libvirtd_admin.la
|
||||
libvirtd_admin_la_SOURCES = \
|
||||
admin.c admin.h admin_server.c admin_server.h
|
||||
admin_server.c admin_server.h
|
||||
|
||||
libvirtd_admin_la_CFLAGS = \
|
||||
$(AM_CFLAGS) \
|
||||
@@ -169,6 +162,13 @@ augeastests_DATA = test_libvirtd.aug
|
||||
|
||||
CLEANFILES += test_libvirtd.aug
|
||||
|
||||
libvirtd.8: $(srcdir)/libvirtd.8.in
|
||||
$(AM_V_GEN)sed \
|
||||
-e 's|[@]sysconfdir[@]|$(sysconfdir)|g' \
|
||||
-e 's|[@]localstatedir[@]|$(localstatedir)|g' \
|
||||
< $< > $@-t && \
|
||||
mv $@-t $@
|
||||
|
||||
libvirtd_SOURCES = $(DAEMON_SOURCES)
|
||||
|
||||
#-D_XOPEN_SOURCE=600 -D_XOPEN_SOURCE_EXTENDED=1 -D_POSIX_C_SOURCE=199506L
|
||||
@@ -233,10 +233,6 @@ if WITH_VBOX
|
||||
libvirtd_LDADD += ../src/libvirt_driver_vbox.la
|
||||
endif WITH_VBOX
|
||||
|
||||
if WITH_VZ
|
||||
libvirtd_LDADD += ../src/libvirt_driver_vz.la
|
||||
endif WITH_VZ
|
||||
|
||||
if WITH_STORAGE
|
||||
libvirtd_LDADD += ../src/libvirt_driver_storage.la
|
||||
endif WITH_STORAGE
|
||||
@@ -323,8 +319,7 @@ endif ! WITH_POLKIT
|
||||
|
||||
remote.c: $(DAEMON_GENERATED)
|
||||
remote.h: $(DAEMON_GENERATED)
|
||||
admin.c: $(DAEMON_GENERATED)
|
||||
admin.h: $(DAEMON_GENERATED)
|
||||
admin_server.c: $(DAEMON_GENERATED)
|
||||
|
||||
LOGROTATE_CONFS = libvirtd.qemu.logrotate libvirtd.lxc.logrotate \
|
||||
libvirtd.libxl.logrotate libvirtd.uml.logrotate \
|
||||
@@ -450,15 +445,18 @@ endif ! LIBVIRT_INIT_SCRIPT_UPSTART
|
||||
if LIBVIRT_INIT_SCRIPT_SYSTEMD
|
||||
|
||||
SYSTEMD_UNIT_DIR = $(prefix)/lib/systemd/system
|
||||
BUILT_SOURCES += libvirtd.service
|
||||
BUILT_SOURCES += libvirtd.service libvirtd.socket
|
||||
|
||||
install-init-systemd: install-sysconfig libvirtd.service
|
||||
install-init-systemd: install-sysconfig libvirtd.service libvirtd.socket
|
||||
$(MKDIR_P) $(DESTDIR)$(SYSTEMD_UNIT_DIR)
|
||||
$(INSTALL_DATA) libvirtd.service \
|
||||
$(DESTDIR)$(SYSTEMD_UNIT_DIR)/libvirtd.service
|
||||
$(INSTALL_DATA) libvirtd.socket \
|
||||
$(DESTDIR)$(SYSTEMD_UNIT_DIR)/libvirtd.socket
|
||||
|
||||
uninstall-init-systemd: uninstall-sysconfig
|
||||
rm -f $(DESTDIR)$(SYSTEMD_UNIT_DIR)/libvirtd.service
|
||||
rm -f $(DESTDIR)$(SYSTEMD_UNIT_DIR)/libvirtd.socket
|
||||
rmdir $(DESTDIR)$(SYSTEMD_UNIT_DIR) || :
|
||||
else ! LIBVIRT_INIT_SCRIPT_SYSTEMD
|
||||
install-init-systemd:
|
||||
@@ -482,6 +480,12 @@ libvirtd.service: libvirtd.service.in $(top_builddir)/config.status
|
||||
< $< > $@-t && \
|
||||
mv $@-t $@
|
||||
|
||||
libvirtd.socket: libvirtd.socket.in $(top_builddir)/config.status
|
||||
$(AM_V_GEN)sed \
|
||||
-e 's|[@]runstatedir[@]|$(runstatedir)|g' \
|
||||
< $< > $@-t && \
|
||||
mv $@-t $@
|
||||
|
||||
|
||||
check-local: check-augeas
|
||||
|
||||
@@ -505,24 +509,12 @@ install-data-local: install-data-sasl
|
||||
uninstall-local:: uninstall-data-sasl
|
||||
endif ! WITH_LIBVIRTD
|
||||
|
||||
POD2MAN = pod2man -c "Virtualization Support" -r "$(PACKAGE)-$(VERSION)"
|
||||
POD2MAN = pod2man -c "Virtualization Support" \
|
||||
-r "$(PACKAGE)-$(VERSION)" -s 8
|
||||
|
||||
%.8.in: %.pod
|
||||
$(AM_V_GEN)$(POD2MAN) --section=8 $< $@-t1 && \
|
||||
if grep 'POD ERROR' $@-t1; then rm $@-t1; exit 1; fi && \
|
||||
sed \
|
||||
-e 's|SYSCONFDIR|\@sysconfdir\@|g' \
|
||||
-e 's|LOCALSTATEDIR|\@localstatedir\@|g' \
|
||||
< $@-t1 > $@-t2 && \
|
||||
rm -f $@-t1 && \
|
||||
mv $@-t2 $@
|
||||
|
||||
%.8: %.8.in $(top_srcdir)/configure.ac
|
||||
$(AM_V_GEN)sed \
|
||||
-e 's|[@]sysconfdir[@]|$(sysconfdir)|g' \
|
||||
-e 's|[@]localstatedir[@]|$(localstatedir)|g' \
|
||||
< $< > $@-t && \
|
||||
mv $@-t $@
|
||||
$(srcdir)/libvirtd.8.in: libvirtd.pod.in $(top_srcdir)/configure.ac
|
||||
$(AM_V_GEN)$(POD2MAN) --name LIBVIRTD $< $@ \
|
||||
&& if grep 'POD ERROR' $@ ; then rm $@; exit 1; fi
|
||||
|
||||
# This is needed for clients too, so can't wrap in
|
||||
# the WITH_LIBVIRTD conditional
|
||||
@@ -543,4 +535,4 @@ endif ! WITH_SASL
|
||||
|
||||
CLEANFILES += $(BUILT_SOURCES) $(man8_MANS)
|
||||
CLEANFILES += *.cov *.gcov .libs/*.gcda .libs/*.gcno *.gcno *.gcda
|
||||
MAINTAINERCLEANFILES = $(MANINFILES) $(DAEMON_GENERATED)
|
||||
MAINTAINERCLEANFILES = $(srcdir)/libvirtd.8.in $(DAEMON_GENERATED)
|
||||
|
386
daemon/admin.c
386
daemon/admin.c
@@ -1,386 +0,0 @@
|
||||
/*
|
||||
* admin.c: handlers for admin RPC method calls
|
||||
*
|
||||
* Copyright (C) 2014-2016 Red Hat, Inc.
|
||||
*
|
||||
* 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, see
|
||||
* <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Author: Martin Kletzander <mkletzan@redhat.com>
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#include "internal.h"
|
||||
#include "libvirtd.h"
|
||||
#include "libvirt_internal.h"
|
||||
|
||||
#include "admin_protocol.h"
|
||||
#include "admin.h"
|
||||
#include "admin_server.h"
|
||||
#include "datatypes.h"
|
||||
#include "viralloc.h"
|
||||
#include "virerror.h"
|
||||
#include "virlog.h"
|
||||
#include "virnetdaemon.h"
|
||||
#include "virnetserver.h"
|
||||
#include "virstring.h"
|
||||
#include "virthreadjob.h"
|
||||
#include "virtypedparam.h"
|
||||
|
||||
#define VIR_FROM_THIS VIR_FROM_ADMIN
|
||||
|
||||
VIR_LOG_INIT("daemon.admin");
|
||||
|
||||
|
||||
void
|
||||
remoteAdmClientFreeFunc(void *data)
|
||||
{
|
||||
struct daemonAdmClientPrivate *priv = data;
|
||||
|
||||
virMutexDestroy(&priv->lock);
|
||||
virObjectUnref(priv->dmn);
|
||||
VIR_FREE(priv);
|
||||
}
|
||||
|
||||
void *
|
||||
remoteAdmClientInitHook(virNetServerClientPtr client ATTRIBUTE_UNUSED,
|
||||
void *opaque)
|
||||
{
|
||||
struct daemonAdmClientPrivate *priv;
|
||||
|
||||
if (VIR_ALLOC(priv) < 0)
|
||||
return NULL;
|
||||
|
||||
if (virMutexInit(&priv->lock) < 0) {
|
||||
VIR_FREE(priv);
|
||||
virReportSystemError(errno, "%s", _("unable to init mutex"));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* We don't necessarily need to ref this object right now as there
|
||||
* must be one ref being held throughout the life of the daemon,
|
||||
* but let's just be safe for future.
|
||||
*/
|
||||
priv->dmn = virObjectRef(opaque);
|
||||
|
||||
return priv;
|
||||
}
|
||||
|
||||
/* Helpers */
|
||||
|
||||
static virNetServerPtr
|
||||
get_nonnull_server(virNetDaemonPtr dmn, admin_nonnull_server srv)
|
||||
{
|
||||
return virNetDaemonGetServer(dmn, srv.name);
|
||||
}
|
||||
|
||||
static void
|
||||
make_nonnull_server(admin_nonnull_server *srv_dst,
|
||||
virNetServerPtr srv_src)
|
||||
{
|
||||
ignore_value(VIR_STRDUP_QUIET(srv_dst->name, virNetServerGetName(srv_src)));
|
||||
}
|
||||
|
||||
static virNetServerClientPtr
|
||||
get_nonnull_client(virNetServerPtr srv, admin_nonnull_client clnt)
|
||||
{
|
||||
return virNetServerGetClient(srv, clnt.id);
|
||||
}
|
||||
|
||||
static void
|
||||
make_nonnull_client(admin_nonnull_client *clt_dst,
|
||||
virNetServerClientPtr clt_src)
|
||||
{
|
||||
clt_dst->id = virNetServerClientGetID(clt_src);
|
||||
clt_dst->timestamp = virNetServerClientGetTimestamp(clt_src);
|
||||
clt_dst->transport = virNetServerClientGetTransport(clt_src);
|
||||
}
|
||||
|
||||
/* Functions */
|
||||
static int
|
||||
adminDispatchConnectOpen(virNetServerPtr server ATTRIBUTE_UNUSED,
|
||||
virNetServerClientPtr client,
|
||||
virNetMessagePtr msg ATTRIBUTE_UNUSED,
|
||||
virNetMessageErrorPtr rerr,
|
||||
struct admin_connect_open_args *args)
|
||||
{
|
||||
unsigned int flags;
|
||||
struct daemonAdmClientPrivate *priv =
|
||||
virNetServerClientGetPrivateData(client);
|
||||
int ret = -1;
|
||||
|
||||
VIR_DEBUG("priv=%p dmn=%p", priv, priv->dmn);
|
||||
virMutexLock(&priv->lock);
|
||||
|
||||
flags = args->flags;
|
||||
virCheckFlagsGoto(0, cleanup);
|
||||
|
||||
ret = 0;
|
||||
cleanup:
|
||||
if (ret < 0)
|
||||
virNetMessageSaveError(rerr);
|
||||
virMutexUnlock(&priv->lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int
|
||||
adminDispatchConnectClose(virNetServerPtr server ATTRIBUTE_UNUSED,
|
||||
virNetServerClientPtr client,
|
||||
virNetMessagePtr msg ATTRIBUTE_UNUSED,
|
||||
virNetMessageErrorPtr rerr ATTRIBUTE_UNUSED)
|
||||
{
|
||||
virNetServerClientDelayedClose(client);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
adminConnectGetLibVersion(virNetDaemonPtr dmn ATTRIBUTE_UNUSED,
|
||||
unsigned long long *libVer)
|
||||
{
|
||||
if (libVer)
|
||||
*libVer = LIBVIR_VERSION_NUMBER;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
adminDispatchServerGetThreadpoolParameters(virNetServerPtr server ATTRIBUTE_UNUSED,
|
||||
virNetServerClientPtr client,
|
||||
virNetMessagePtr msg ATTRIBUTE_UNUSED,
|
||||
virNetMessageErrorPtr rerr,
|
||||
struct admin_server_get_threadpool_parameters_args *args,
|
||||
struct admin_server_get_threadpool_parameters_ret *ret)
|
||||
{
|
||||
int rv = -1;
|
||||
virNetServerPtr srv = NULL;
|
||||
virTypedParameterPtr params = NULL;
|
||||
int nparams = 0;
|
||||
struct daemonAdmClientPrivate *priv =
|
||||
virNetServerClientGetPrivateData(client);
|
||||
|
||||
if (!(srv = virNetDaemonGetServer(priv->dmn, args->srv.name)))
|
||||
goto cleanup;
|
||||
|
||||
if (adminServerGetThreadPoolParameters(srv, ¶ms, &nparams,
|
||||
args->flags) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (nparams > ADMIN_SERVER_THREADPOOL_PARAMETERS_MAX) {
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("Number of threadpool parameters %d exceeds max "
|
||||
"allowed limit: %d"), nparams,
|
||||
ADMIN_SERVER_THREADPOOL_PARAMETERS_MAX);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (virTypedParamsSerialize(params, nparams,
|
||||
(virTypedParameterRemotePtr *) &ret->params.params_val,
|
||||
&ret->params.params_len, 0) < 0)
|
||||
goto cleanup;
|
||||
|
||||
rv = 0;
|
||||
cleanup:
|
||||
if (rv < 0)
|
||||
virNetMessageSaveError(rerr);
|
||||
|
||||
virTypedParamsFree(params, nparams);
|
||||
virObjectUnref(srv);
|
||||
return rv;
|
||||
}
|
||||
|
||||
static int
|
||||
adminDispatchServerSetThreadpoolParameters(virNetServerPtr server ATTRIBUTE_UNUSED,
|
||||
virNetServerClientPtr client,
|
||||
virNetMessagePtr msg ATTRIBUTE_UNUSED,
|
||||
virNetMessageErrorPtr rerr,
|
||||
struct admin_server_set_threadpool_parameters_args *args)
|
||||
{
|
||||
int rv = -1;
|
||||
virNetServerPtr srv = NULL;
|
||||
virTypedParameterPtr params = NULL;
|
||||
int nparams = 0;
|
||||
struct daemonAdmClientPrivate *priv =
|
||||
virNetServerClientGetPrivateData(client);
|
||||
|
||||
if (!(srv = virNetDaemonGetServer(priv->dmn, args->srv.name))) {
|
||||
virReportError(VIR_ERR_NO_SERVER,
|
||||
_("no server with matching name '%s' found"),
|
||||
args->srv.name);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (virTypedParamsDeserialize((virTypedParameterRemotePtr) args->params.params_val,
|
||||
args->params.params_len,
|
||||
ADMIN_SERVER_THREADPOOL_PARAMETERS_MAX,
|
||||
¶ms,
|
||||
&nparams) < 0)
|
||||
goto cleanup;
|
||||
|
||||
|
||||
if (adminServerSetThreadPoolParameters(srv, params,
|
||||
nparams, args->flags) < 0)
|
||||
goto cleanup;
|
||||
|
||||
rv = 0;
|
||||
cleanup:
|
||||
if (rv < 0)
|
||||
virNetMessageSaveError(rerr);
|
||||
|
||||
virTypedParamsFree(params, nparams);
|
||||
virObjectUnref(srv);
|
||||
return rv;
|
||||
}
|
||||
|
||||
static int
|
||||
adminDispatchClientGetInfo(virNetServerPtr server ATTRIBUTE_UNUSED,
|
||||
virNetServerClientPtr client,
|
||||
virNetMessagePtr msg ATTRIBUTE_UNUSED,
|
||||
virNetMessageErrorPtr rerr,
|
||||
struct admin_client_get_info_args *args,
|
||||
struct admin_client_get_info_ret *ret)
|
||||
{
|
||||
int rv = -1;
|
||||
virNetServerPtr srv = NULL;
|
||||
virNetServerClientPtr clnt = NULL;
|
||||
virTypedParameterPtr params = NULL;
|
||||
int nparams = 0;
|
||||
struct daemonAdmClientPrivate *priv =
|
||||
virNetServerClientGetPrivateData(client);
|
||||
|
||||
if (!(srv = virNetDaemonGetServer(priv->dmn, args->clnt.srv.name))) {
|
||||
virReportError(VIR_ERR_NO_SERVER,
|
||||
_("no server with matching name '%s' found"),
|
||||
args->clnt.srv.name);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (!(clnt = virNetServerGetClient(srv, args->clnt.id))) {
|
||||
virReportError(VIR_ERR_NO_CLIENT,
|
||||
_("no client with matching id '%llu' found"),
|
||||
(unsigned long long) args->clnt.id);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (adminClientGetInfo(clnt, ¶ms, &nparams, args->flags) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (nparams > ADMIN_CLIENT_INFO_PARAMETERS_MAX) {
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("Number of client info parameters %d exceeds max "
|
||||
"allowed limit: %d"), nparams,
|
||||
ADMIN_CLIENT_INFO_PARAMETERS_MAX);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (virTypedParamsSerialize(params, nparams,
|
||||
(virTypedParameterRemotePtr *) &ret->params.params_val,
|
||||
&ret->params.params_len,
|
||||
VIR_TYPED_PARAM_STRING_OKAY) < 0)
|
||||
goto cleanup;
|
||||
|
||||
rv = 0;
|
||||
|
||||
cleanup:
|
||||
if (rv < 0)
|
||||
virNetMessageSaveError(rerr);
|
||||
|
||||
virTypedParamsFree(params, nparams);
|
||||
virObjectUnref(clnt);
|
||||
virObjectUnref(srv);
|
||||
return rv;
|
||||
}
|
||||
|
||||
static int
|
||||
adminDispatchServerGetClientLimits(virNetServerPtr server ATTRIBUTE_UNUSED,
|
||||
virNetServerClientPtr client,
|
||||
virNetMessagePtr msg ATTRIBUTE_UNUSED,
|
||||
virNetMessageErrorPtr rerr ATTRIBUTE_UNUSED,
|
||||
admin_server_get_client_limits_args *args,
|
||||
admin_server_get_client_limits_ret *ret)
|
||||
{
|
||||
int rv = -1;
|
||||
virNetServerPtr srv = NULL;
|
||||
virTypedParameterPtr params = NULL;
|
||||
int nparams = 0;
|
||||
struct daemonAdmClientPrivate *priv =
|
||||
virNetServerClientGetPrivateData(client);
|
||||
|
||||
if (!(srv = virNetDaemonGetServer(priv->dmn, args->srv.name)))
|
||||
goto cleanup;
|
||||
|
||||
if (adminServerGetClientLimits(srv, ¶ms, &nparams, args->flags) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (nparams > ADMIN_SERVER_CLIENT_LIMITS_MAX) {
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR,
|
||||
_("Number of client processing parameters %d exceeds "
|
||||
"max allowed limit: %d"), nparams,
|
||||
ADMIN_SERVER_CLIENT_LIMITS_MAX);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (virTypedParamsSerialize(params, nparams,
|
||||
(virTypedParameterRemotePtr *) &ret->params.params_val,
|
||||
&ret->params.params_len, 0) < 0)
|
||||
goto cleanup;
|
||||
|
||||
rv = 0;
|
||||
cleanup:
|
||||
if (rv < 0)
|
||||
virNetMessageSaveError(rerr);
|
||||
|
||||
virTypedParamsFree(params, nparams);
|
||||
virObjectUnref(srv);
|
||||
return rv;
|
||||
}
|
||||
|
||||
static int
|
||||
adminDispatchServerSetClientLimits(virNetServerPtr server ATTRIBUTE_UNUSED,
|
||||
virNetServerClientPtr client,
|
||||
virNetMessagePtr msg ATTRIBUTE_UNUSED,
|
||||
virNetMessageErrorPtr rerr ATTRIBUTE_UNUSED,
|
||||
admin_server_set_client_limits_args *args)
|
||||
{
|
||||
int rv = -1;
|
||||
virNetServerPtr srv = NULL;
|
||||
virTypedParameterPtr params = NULL;
|
||||
int nparams = 0;
|
||||
struct daemonAdmClientPrivate *priv =
|
||||
virNetServerClientGetPrivateData(client);
|
||||
|
||||
if (!(srv = virNetDaemonGetServer(priv->dmn, args->srv.name))) {
|
||||
virReportError(VIR_ERR_NO_SERVER,
|
||||
_("no server with matching name '%s' found"),
|
||||
args->srv.name);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (virTypedParamsDeserialize((virTypedParameterRemotePtr) args->params.params_val,
|
||||
args->params.params_len,
|
||||
ADMIN_SERVER_CLIENT_LIMITS_MAX, ¶ms, &nparams) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (adminServerSetClientLimits(srv, params, nparams, args->flags) < 0)
|
||||
goto cleanup;
|
||||
|
||||
rv = 0;
|
||||
cleanup:
|
||||
if (rv < 0)
|
||||
virNetMessageSaveError(rerr);
|
||||
virTypedParamsFree(params, nparams);
|
||||
virObjectUnref(srv);
|
||||
return rv;
|
||||
}
|
||||
#include "admin_dispatch.h"
|
@@ -1,36 +0,0 @@
|
||||
/*
|
||||
* admin.h: handlers for admin RPC method calls
|
||||
*
|
||||
* Copyright (C) 2014-2016 Red Hat, Inc.
|
||||
*
|
||||
* 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, see
|
||||
* <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Author: Martin Kletzander <mkletzan@redhat.com>
|
||||
*/
|
||||
|
||||
#ifndef __LIBVIRTD_ADMIN_H__
|
||||
# define __LIBVIRTD_ADMIN_H__
|
||||
|
||||
# include "rpc/virnetserverprogram.h"
|
||||
# include "rpc/virnetserverclient.h"
|
||||
|
||||
|
||||
extern virNetServerProgramProc adminProcs[];
|
||||
extern size_t adminNProcs;
|
||||
|
||||
void remoteAdmClientFreeFunc(void *data);
|
||||
void *remoteAdmClientInitHook(virNetServerClientPtr client, void *opaque);
|
||||
|
||||
#endif /* __ADMIN_REMOTE_H__ */
|
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* admin_server.c: admin methods to manage daemons and clients
|
||||
* admin_server.c:
|
||||
*
|
||||
* Copyright (C) 2016 Red Hat, Inc.
|
||||
* Copyright (C) 2014-2015 Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
@@ -17,374 +17,110 @@
|
||||
* License along with this library. If not, see
|
||||
* <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Authors: Erik Skultety <eskultet@redhat.com>
|
||||
* Martin Kletzander <mkletzan@redhat.com>
|
||||
* Author: Martin Kletzander <mkletzan@redhat.com>
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
|
||||
#include "internal.h"
|
||||
#include "libvirtd.h"
|
||||
#include "libvirt_internal.h"
|
||||
|
||||
#include "admin_protocol.h"
|
||||
#include "admin_server.h"
|
||||
#include "datatypes.h"
|
||||
#include "viralloc.h"
|
||||
#include "virerror.h"
|
||||
#include "viridentity.h"
|
||||
#include "virlog.h"
|
||||
#include "virnetdaemon.h"
|
||||
#include "virnetserver.h"
|
||||
#include "virstring.h"
|
||||
#include "virthreadpool.h"
|
||||
#include "virtypedparam.h"
|
||||
#include "virthreadjob.h"
|
||||
|
||||
#define VIR_FROM_THIS VIR_FROM_ADMIN
|
||||
|
||||
VIR_LOG_INIT("daemon.admin_server");
|
||||
VIR_LOG_INIT("daemon.admin");
|
||||
|
||||
int
|
||||
adminConnectListServers(virNetDaemonPtr dmn,
|
||||
virNetServerPtr **servers,
|
||||
unsigned int flags)
|
||||
|
||||
void
|
||||
remoteAdmClientFreeFunc(void *data)
|
||||
{
|
||||
int ret = -1;
|
||||
virNetServerPtr *srvs = NULL;
|
||||
struct daemonAdmClientPrivate *priv = data;
|
||||
|
||||
virCheckFlags(0, -1);
|
||||
|
||||
if ((ret = virNetDaemonGetServers(dmn, &srvs)) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (servers) {
|
||||
*servers = srvs;
|
||||
srvs = NULL;
|
||||
}
|
||||
cleanup:
|
||||
if (ret > 0)
|
||||
virObjectListFreeCount(srvs, ret);
|
||||
return ret;
|
||||
virMutexDestroy(&priv->lock);
|
||||
virObjectUnref(priv->dmn);
|
||||
VIR_FREE(priv);
|
||||
}
|
||||
|
||||
virNetServerPtr
|
||||
adminConnectLookupServer(virNetDaemonPtr dmn,
|
||||
const char *name,
|
||||
unsigned int flags)
|
||||
void *
|
||||
remoteAdmClientInitHook(virNetServerClientPtr client ATTRIBUTE_UNUSED,
|
||||
void *opaque)
|
||||
{
|
||||
virCheckFlags(flags, NULL);
|
||||
struct daemonAdmClientPrivate *priv;
|
||||
|
||||
return virNetDaemonGetServer(dmn, name);
|
||||
}
|
||||
if (VIR_ALLOC(priv) < 0)
|
||||
return NULL;
|
||||
|
||||
int
|
||||
adminServerGetThreadPoolParameters(virNetServerPtr srv,
|
||||
virTypedParameterPtr *params,
|
||||
int *nparams,
|
||||
unsigned int flags)
|
||||
{
|
||||
int ret = -1;
|
||||
int maxparams = 0;
|
||||
size_t minWorkers;
|
||||
size_t maxWorkers;
|
||||
size_t nWorkers;
|
||||
size_t freeWorkers;
|
||||
size_t nPrioWorkers;
|
||||
size_t jobQueueDepth;
|
||||
virTypedParameterPtr tmpparams = NULL;
|
||||
|
||||
virCheckFlags(0, -1);
|
||||
|
||||
if (virNetServerGetThreadPoolParameters(srv, &minWorkers, &maxWorkers,
|
||||
&nWorkers, &freeWorkers,
|
||||
&nPrioWorkers,
|
||||
&jobQueueDepth) < 0) {
|
||||
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||
_("Unable to retrieve threadpool parameters"));
|
||||
goto cleanup;
|
||||
if (virMutexInit(&priv->lock) < 0) {
|
||||
VIR_FREE(priv);
|
||||
virReportSystemError(errno, "%s", _("unable to init mutex"));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (virTypedParamsAddUInt(&tmpparams, nparams,
|
||||
&maxparams, VIR_THREADPOOL_WORKERS_MIN,
|
||||
minWorkers) < 0)
|
||||
goto cleanup;
|
||||
/*
|
||||
* We don't necessarily need to ref this object right now as there
|
||||
* must be one ref being held throughout the life of the daemon,
|
||||
* but let's just be safe for future.
|
||||
*/
|
||||
priv->dmn = virObjectRef(opaque);
|
||||
|
||||
if (virTypedParamsAddUInt(&tmpparams, nparams,
|
||||
&maxparams, VIR_THREADPOOL_WORKERS_MAX,
|
||||
maxWorkers) < 0)
|
||||
goto cleanup;
|
||||
return priv;
|
||||
}
|
||||
|
||||
if (virTypedParamsAddUInt(&tmpparams, nparams,
|
||||
&maxparams, VIR_THREADPOOL_WORKERS_CURRENT,
|
||||
nWorkers) < 0)
|
||||
goto cleanup;
|
||||
/* Functions */
|
||||
static int
|
||||
adminDispatchConnectOpen(virNetServerPtr server ATTRIBUTE_UNUSED,
|
||||
virNetServerClientPtr client,
|
||||
virNetMessagePtr msg ATTRIBUTE_UNUSED,
|
||||
virNetMessageErrorPtr rerr,
|
||||
struct admin_connect_open_args *args)
|
||||
{
|
||||
unsigned int flags;
|
||||
struct daemonAdmClientPrivate *priv =
|
||||
virNetServerClientGetPrivateData(client);
|
||||
int ret = -1;
|
||||
|
||||
if (virTypedParamsAddUInt(&tmpparams, nparams,
|
||||
&maxparams, VIR_THREADPOOL_WORKERS_FREE,
|
||||
freeWorkers) < 0)
|
||||
goto cleanup;
|
||||
VIR_DEBUG("priv=%p dmn=%p", priv, priv->dmn);
|
||||
virMutexLock(&priv->lock);
|
||||
|
||||
if (virTypedParamsAddUInt(&tmpparams, nparams,
|
||||
&maxparams, VIR_THREADPOOL_WORKERS_PRIORITY,
|
||||
nPrioWorkers) < 0)
|
||||
goto cleanup;
|
||||
flags = args->flags;
|
||||
virCheckFlagsGoto(0, cleanup);
|
||||
|
||||
if (virTypedParamsAddUInt(&tmpparams, nparams,
|
||||
&maxparams, VIR_THREADPOOL_JOB_QUEUE_DEPTH,
|
||||
jobQueueDepth) < 0)
|
||||
goto cleanup;
|
||||
|
||||
*params = tmpparams;
|
||||
tmpparams = NULL;
|
||||
ret = 0;
|
||||
|
||||
cleanup:
|
||||
virTypedParamsFree(tmpparams, *nparams);
|
||||
if (ret < 0)
|
||||
virNetMessageSaveError(rerr);
|
||||
virMutexUnlock(&priv->lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int
|
||||
adminServerSetThreadPoolParameters(virNetServerPtr srv,
|
||||
virTypedParameterPtr params,
|
||||
int nparams,
|
||||
unsigned int flags)
|
||||
static int
|
||||
adminDispatchConnectClose(virNetServerPtr server ATTRIBUTE_UNUSED,
|
||||
virNetServerClientPtr client,
|
||||
virNetMessagePtr msg ATTRIBUTE_UNUSED,
|
||||
virNetMessageErrorPtr rerr ATTRIBUTE_UNUSED)
|
||||
{
|
||||
long long int minWorkers = -1;
|
||||
long long int maxWorkers = -1;
|
||||
long long int prioWorkers = -1;
|
||||
virTypedParameterPtr param = NULL;
|
||||
|
||||
virCheckFlags(0, -1);
|
||||
|
||||
if (virTypedParamsValidate(params, nparams,
|
||||
VIR_THREADPOOL_WORKERS_MIN,
|
||||
VIR_TYPED_PARAM_UINT,
|
||||
VIR_THREADPOOL_WORKERS_MAX,
|
||||
VIR_TYPED_PARAM_UINT,
|
||||
VIR_THREADPOOL_WORKERS_PRIORITY,
|
||||
VIR_TYPED_PARAM_UINT,
|
||||
NULL) < 0)
|
||||
return -1;
|
||||
|
||||
if ((param = virTypedParamsGet(params, nparams,
|
||||
VIR_THREADPOOL_WORKERS_MIN)))
|
||||
minWorkers = param->value.ui;
|
||||
|
||||
if ((param = virTypedParamsGet(params, nparams,
|
||||
VIR_THREADPOOL_WORKERS_MAX)))
|
||||
maxWorkers = param->value.ui;
|
||||
|
||||
if ((param = virTypedParamsGet(params, nparams,
|
||||
VIR_THREADPOOL_WORKERS_PRIORITY)))
|
||||
prioWorkers = param->value.ui;
|
||||
|
||||
if (virNetServerSetThreadPoolParameters(srv, minWorkers,
|
||||
maxWorkers, prioWorkers) < 0)
|
||||
return -1;
|
||||
|
||||
virNetServerClientDelayedClose(client);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
adminServerListClients(virNetServerPtr srv,
|
||||
virNetServerClientPtr **clients,
|
||||
unsigned int flags)
|
||||
static int
|
||||
adminConnectGetLibVersion(virNetDaemonPtr dmn ATTRIBUTE_UNUSED,
|
||||
unsigned long long *libVer)
|
||||
{
|
||||
int ret = -1;
|
||||
virNetServerClientPtr *clts;
|
||||
|
||||
virCheckFlags(0, -1);
|
||||
|
||||
if ((ret = virNetServerGetClients(srv, &clts)) < 0)
|
||||
return -1;
|
||||
|
||||
if (clients) {
|
||||
*clients = clts;
|
||||
clts = NULL;
|
||||
}
|
||||
|
||||
virObjectListFreeCount(clts, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
virNetServerClientPtr
|
||||
adminServerLookupClient(virNetServerPtr srv,
|
||||
unsigned long long id,
|
||||
unsigned int flags)
|
||||
{
|
||||
virCheckFlags(0, NULL);
|
||||
|
||||
return virNetServerGetClient(srv, id);
|
||||
}
|
||||
|
||||
int
|
||||
adminClientGetInfo(virNetServerClientPtr client,
|
||||
virTypedParameterPtr *params,
|
||||
int *nparams,
|
||||
unsigned int flags)
|
||||
{
|
||||
int ret = -1;
|
||||
int maxparams = 0;
|
||||
bool readonly;
|
||||
char *sock_addr = NULL;
|
||||
const char *attr = NULL;
|
||||
virTypedParameterPtr tmpparams = NULL;
|
||||
virIdentityPtr identity = NULL;
|
||||
|
||||
virCheckFlags(0, -1);
|
||||
|
||||
if (virNetServerClientGetInfo(client, &readonly,
|
||||
&sock_addr, &identity) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (virTypedParamsAddBoolean(&tmpparams, nparams, &maxparams,
|
||||
VIR_CLIENT_INFO_READONLY,
|
||||
readonly) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (!virNetServerClientIsLocal(client)) {
|
||||
if (virTypedParamsAddString(&tmpparams, nparams, &maxparams,
|
||||
VIR_CLIENT_INFO_SOCKET_ADDR,
|
||||
sock_addr) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (virIdentityGetSASLUserName(identity, &attr) < 0 ||
|
||||
(attr &&
|
||||
virTypedParamsAddString(&tmpparams, nparams, &maxparams,
|
||||
VIR_CLIENT_INFO_SASL_USER_NAME,
|
||||
attr) < 0))
|
||||
goto cleanup;
|
||||
|
||||
if (virIdentityGetX509DName(identity, &attr) < 0 ||
|
||||
(attr &&
|
||||
virTypedParamsAddString(&tmpparams, nparams, &maxparams,
|
||||
VIR_CLIENT_INFO_X509_DISTINGUISHED_NAME,
|
||||
attr) < 0))
|
||||
goto cleanup;
|
||||
} else {
|
||||
pid_t pid;
|
||||
uid_t uid;
|
||||
gid_t gid;
|
||||
if (virIdentityGetUNIXUserID(identity, &uid) < 0 ||
|
||||
virTypedParamsAddInt(&tmpparams, nparams, &maxparams,
|
||||
VIR_CLIENT_INFO_UNIX_USER_ID, uid) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (virIdentityGetUNIXUserName(identity, &attr) < 0 ||
|
||||
virTypedParamsAddString(&tmpparams, nparams, &maxparams,
|
||||
VIR_CLIENT_INFO_UNIX_USER_NAME,
|
||||
attr) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (virIdentityGetUNIXGroupID(identity, &gid) < 0 ||
|
||||
virTypedParamsAddInt(&tmpparams, nparams, &maxparams,
|
||||
VIR_CLIENT_INFO_UNIX_GROUP_ID, gid) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (virIdentityGetUNIXGroupName(identity, &attr) < 0 ||
|
||||
virTypedParamsAddString(&tmpparams, nparams, &maxparams,
|
||||
VIR_CLIENT_INFO_UNIX_GROUP_NAME,
|
||||
attr) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (virIdentityGetUNIXProcessID(identity, &pid) < 0 ||
|
||||
virTypedParamsAddInt(&tmpparams, nparams, &maxparams,
|
||||
VIR_CLIENT_INFO_UNIX_PROCESS_ID, pid) < 0)
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (virIdentityGetSELinuxContext(identity, &attr) < 0 ||
|
||||
(attr &&
|
||||
virTypedParamsAddString(&tmpparams, nparams, &maxparams,
|
||||
VIR_CLIENT_INFO_SELINUX_CONTEXT, attr) < 0))
|
||||
goto cleanup;
|
||||
|
||||
*params = tmpparams;
|
||||
tmpparams = NULL;
|
||||
ret = 0;
|
||||
|
||||
cleanup:
|
||||
virObjectUnref(identity);
|
||||
VIR_FREE(sock_addr);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int adminClientClose(virNetServerClientPtr client,
|
||||
unsigned int flags)
|
||||
{
|
||||
virCheckFlags(0, -1);
|
||||
|
||||
virNetServerClientClose(client);
|
||||
if (libVer)
|
||||
*libVer = LIBVIR_VERSION_NUMBER;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
adminServerGetClientLimits(virNetServerPtr srv,
|
||||
virTypedParameterPtr *params,
|
||||
int *nparams,
|
||||
unsigned int flags)
|
||||
{
|
||||
int ret = -1;
|
||||
int maxparams = 0;
|
||||
virTypedParameterPtr tmpparams = NULL;
|
||||
|
||||
virCheckFlags(0, -1);
|
||||
|
||||
if (virTypedParamsAddUInt(&tmpparams, nparams, &maxparams,
|
||||
VIR_SERVER_CLIENTS_MAX,
|
||||
virNetServerGetMaxClients(srv)) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (virTypedParamsAddUInt(&tmpparams, nparams, &maxparams,
|
||||
VIR_SERVER_CLIENTS_CURRENT,
|
||||
virNetServerGetCurrentClients(srv)) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (virTypedParamsAddUInt(&tmpparams, nparams, &maxparams,
|
||||
VIR_SERVER_CLIENTS_UNAUTH_MAX,
|
||||
virNetServerGetMaxUnauthClients(srv)) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (virTypedParamsAddUInt(&tmpparams, nparams, &maxparams,
|
||||
VIR_SERVER_CLIENTS_UNAUTH_CURRENT,
|
||||
virNetServerGetCurrentUnauthClients(srv)) < 0)
|
||||
goto cleanup;
|
||||
|
||||
*params = tmpparams;
|
||||
tmpparams = NULL;
|
||||
ret = 0;
|
||||
|
||||
cleanup:
|
||||
virTypedParamsFree(tmpparams, *nparams);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int
|
||||
adminServerSetClientLimits(virNetServerPtr srv,
|
||||
virTypedParameterPtr params,
|
||||
int nparams,
|
||||
unsigned int flags)
|
||||
{
|
||||
long long int maxClients = -1;
|
||||
long long int maxClientsUnauth = -1;
|
||||
virTypedParameterPtr param = NULL;
|
||||
|
||||
virCheckFlags(0, -1);
|
||||
|
||||
if (virTypedParamsValidate(params, nparams,
|
||||
VIR_SERVER_CLIENTS_MAX,
|
||||
VIR_TYPED_PARAM_UINT,
|
||||
VIR_SERVER_CLIENTS_UNAUTH_MAX,
|
||||
VIR_TYPED_PARAM_UINT,
|
||||
NULL) < 0)
|
||||
return -1;
|
||||
|
||||
if ((param = virTypedParamsGet(params, nparams,
|
||||
VIR_SERVER_CLIENTS_MAX)))
|
||||
maxClients = param->value.ui;
|
||||
|
||||
if ((param = virTypedParamsGet(params, nparams,
|
||||
VIR_SERVER_CLIENTS_UNAUTH_MAX)))
|
||||
maxClientsUnauth = param->value.ui;
|
||||
|
||||
if (virNetServerSetClientProcessingControls(srv, maxClients,
|
||||
maxClientsUnauth) < 0)
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
#include "admin_dispatch.h"
|
||||
|
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* admin_server.h: admin methods to manage daemons and clients
|
||||
* admin_server.h
|
||||
*
|
||||
* Copyright (C) 2016 Red Hat, Inc.
|
||||
* Copyright (C) 2014 Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
@@ -17,59 +17,20 @@
|
||||
* License along with this library. If not, see
|
||||
* <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Authors: Erik Skultety <eskultet@redhat.com>
|
||||
* Martin Kletzander <mkletzan@redhat.com>
|
||||
* Author: Martin Kletzander <mkletzan@redhat.com>
|
||||
*/
|
||||
|
||||
#ifndef __LIBVIRTD_ADMIN_SERVER_H__
|
||||
# define __LIBVIRTD_ADMIN_SERVER_H__
|
||||
#ifndef __LIBVIRTD_ADMIN_H__
|
||||
# define __LIBVIRTD_ADMIN_H__
|
||||
|
||||
# include "rpc/virnetdaemon.h"
|
||||
# include "rpc/virnetserver.h"
|
||||
# include "rpc/virnetserverprogram.h"
|
||||
# include "rpc/virnetserverclient.h"
|
||||
|
||||
int adminConnectListServers(virNetDaemonPtr dmn,
|
||||
virNetServerPtr **servers,
|
||||
unsigned int flags);
|
||||
|
||||
virNetServerPtr adminConnectLookupServer(virNetDaemonPtr dmn,
|
||||
const char *name,
|
||||
unsigned int flags);
|
||||
extern virNetServerProgramProc adminProcs[];
|
||||
extern size_t adminNProcs;
|
||||
|
||||
int
|
||||
adminServerGetThreadPoolParameters(virNetServerPtr srv,
|
||||
virTypedParameterPtr *params,
|
||||
int *nparams,
|
||||
unsigned int flags);
|
||||
int
|
||||
adminServerSetThreadPoolParameters(virNetServerPtr srv,
|
||||
virTypedParameterPtr params,
|
||||
int nparams,
|
||||
unsigned int flags);
|
||||
void remoteAdmClientFreeFunc(void *data);
|
||||
void *remoteAdmClientInitHook(virNetServerClientPtr client, void *opaque);
|
||||
|
||||
int adminServerListClients(virNetServerPtr srv,
|
||||
virNetServerClientPtr **clients,
|
||||
unsigned int flags);
|
||||
|
||||
virNetServerClientPtr adminServerLookupClient(virNetServerPtr srv,
|
||||
unsigned long long id,
|
||||
unsigned int flags);
|
||||
|
||||
int adminClientGetInfo(virNetServerClientPtr client,
|
||||
virTypedParameterPtr *params,
|
||||
int *nparams,
|
||||
unsigned int flags);
|
||||
|
||||
int adminClientClose(virNetServerClientPtr client,
|
||||
unsigned int flags);
|
||||
|
||||
int adminServerGetClientLimits(virNetServerPtr srv,
|
||||
virTypedParameterPtr *params,
|
||||
int *nparams,
|
||||
unsigned int flags);
|
||||
|
||||
int adminServerSetClientLimits(virNetServerPtr srv,
|
||||
virTypedParameterPtr params,
|
||||
int nparams,
|
||||
unsigned int flags);
|
||||
|
||||
#endif /* __LIBVIRTD_ADMIN_SERVER_H__ */
|
||||
#endif /* __ADMIN_REMOTE_H__ */
|
||||
|
@@ -280,7 +280,6 @@ daemonConfigNew(bool privileged ATTRIBUTE_UNUSED)
|
||||
data->min_workers = 5;
|
||||
data->max_workers = 20;
|
||||
data->max_clients = 5000;
|
||||
data->max_queued_clients = 1000;
|
||||
data->max_anonymous_clients = 20;
|
||||
|
||||
data->prio_workers = 5;
|
||||
@@ -367,7 +366,6 @@ daemonConfigFree(struct daemonConfig *data)
|
||||
tmp++;
|
||||
}
|
||||
VIR_FREE(data->sasl_allowed_username_list);
|
||||
VIR_FREE(data->tls_priority);
|
||||
|
||||
VIR_FREE(data->key_file);
|
||||
VIR_FREE(data->ca_file);
|
||||
@@ -375,7 +373,6 @@ daemonConfigFree(struct daemonConfig *data)
|
||||
VIR_FREE(data->crl_file);
|
||||
|
||||
VIR_FREE(data->host_uuid);
|
||||
VIR_FREE(data->host_uuid_source);
|
||||
VIR_FREE(data->log_filters);
|
||||
VIR_FREE(data->log_outputs);
|
||||
|
||||
@@ -443,7 +440,6 @@ daemonConfigLoadOptions(struct daemonConfig *data,
|
||||
&data->sasl_allowed_username_list, filename) < 0)
|
||||
goto error;
|
||||
|
||||
GET_CONF_STR(conf, filename, tls_priority);
|
||||
|
||||
GET_CONF_UINT(conf, filename, min_workers);
|
||||
GET_CONF_UINT(conf, filename, max_workers);
|
||||
@@ -466,7 +462,6 @@ daemonConfigLoadOptions(struct daemonConfig *data,
|
||||
GET_CONF_UINT(conf, filename, audit_logging);
|
||||
|
||||
GET_CONF_STR(conf, filename, host_uuid);
|
||||
GET_CONF_STR(conf, filename, host_uuid_source);
|
||||
|
||||
GET_CONF_UINT(conf, filename, log_level);
|
||||
GET_CONF_STR(conf, filename, log_filters);
|
||||
|
@@ -28,7 +28,6 @@
|
||||
|
||||
struct daemonConfig {
|
||||
char *host_uuid;
|
||||
char *host_uuid_source;
|
||||
|
||||
int listen_tls;
|
||||
int listen_tcp;
|
||||
@@ -56,7 +55,6 @@ struct daemonConfig {
|
||||
int tls_no_sanity_certificate;
|
||||
char **tls_allowed_dn_list;
|
||||
char **sasl_allowed_username_list;
|
||||
char *tls_priority;
|
||||
|
||||
char *key_file;
|
||||
char *cert_file;
|
||||
|
@@ -13,7 +13,7 @@ module Libvirtd =
|
||||
|
||||
let str_val = del /\"/ "\"" . store /[^\"]*/ . del /\"/ "\""
|
||||
let bool_val = store /0|1/
|
||||
let int_val = store /-?[0-9]+/
|
||||
let int_val = store /[0-9]+/
|
||||
let str_array_element = [ seq "el" . str_val ] . del /[ \t\n]*/ ""
|
||||
let str_array_val = counter "el" . array_start . ( str_array_element . ( array_sep . str_array_element ) * ) ? . array_end
|
||||
|
||||
@@ -53,7 +53,6 @@ module Libvirtd =
|
||||
| str_array_entry "tls_allowed_dn_list"
|
||||
| str_array_entry "sasl_allowed_username_list"
|
||||
| str_array_entry "access_drivers"
|
||||
| str_entry "tls_priority"
|
||||
|
||||
let processing_entry = int_entry "min_workers"
|
||||
| int_entry "max_workers"
|
||||
@@ -87,7 +86,6 @@ module Libvirtd =
|
||||
| bool_entry "admin_keepalive_required"
|
||||
|
||||
let misc_entry = str_entry "host_uuid"
|
||||
| str_entry "host_uuid_source"
|
||||
|
||||
(* Each enty in the config is one of the following three ... *)
|
||||
let entry = network_entry
|
||||
|
@@ -30,6 +30,7 @@
|
||||
#include <getopt.h>
|
||||
#include <stdlib.h>
|
||||
#include <grp.h>
|
||||
#include <locale.h>
|
||||
|
||||
#include "libvirt_internal.h"
|
||||
#include "virerror.h"
|
||||
@@ -43,7 +44,7 @@
|
||||
#include "libvirtd.h"
|
||||
#include "libvirtd-config.h"
|
||||
|
||||
#include "admin.h"
|
||||
#include "admin_server.h"
|
||||
#include "viruuid.h"
|
||||
#include "remote_driver.h"
|
||||
#include "viralloc.h"
|
||||
@@ -57,7 +58,6 @@
|
||||
#include "locking/lock_manager.h"
|
||||
#include "viraccessmanager.h"
|
||||
#include "virutil.h"
|
||||
#include "virgettext.h"
|
||||
|
||||
#ifdef WITH_DRIVER_MODULES
|
||||
# include "driver.h"
|
||||
@@ -102,9 +102,6 @@
|
||||
# include "nwfilter/nwfilter_driver.h"
|
||||
# endif
|
||||
#endif
|
||||
#ifdef WITH_VZ
|
||||
# include "vz/vz_driver.h"
|
||||
#endif
|
||||
|
||||
#include "configmake.h"
|
||||
|
||||
@@ -333,8 +330,6 @@ static int daemonErrorLogFilter(virErrorPtr err, int priority)
|
||||
case VIR_ERR_NO_DOMAIN_SNAPSHOT:
|
||||
case VIR_ERR_OPERATION_INVALID:
|
||||
case VIR_ERR_NO_DOMAIN_METADATA:
|
||||
case VIR_ERR_NO_SERVER:
|
||||
case VIR_ERR_NO_CLIENT:
|
||||
return VIR_LOG_DEBUG;
|
||||
}
|
||||
|
||||
@@ -395,9 +390,6 @@ static void daemonInitialize(void)
|
||||
# ifdef WITH_BHYVE
|
||||
virDriverLoadModule("bhyve");
|
||||
# endif
|
||||
# ifdef WITH_VZ
|
||||
virDriverLoadModule("vz");
|
||||
# endif
|
||||
#else
|
||||
# ifdef WITH_NETWORK
|
||||
networkRegister();
|
||||
@@ -438,9 +430,6 @@ static void daemonInitialize(void)
|
||||
# ifdef WITH_BHYVE
|
||||
bhyveRegister();
|
||||
# endif
|
||||
# ifdef WITH_VZ
|
||||
vzRegister();
|
||||
# endif
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -533,7 +522,8 @@ daemonSetupNetworking(virNetServerPtr srv,
|
||||
virNetServerAddService(srv, svcRO, NULL) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (sock_path_adm) {
|
||||
/* Temporarily disabled */
|
||||
if (sock_path_adm && false) {
|
||||
VIR_DEBUG("Registering unix socket %s", sock_path_adm);
|
||||
if (!(svcAdm = virNetServerServiceNewUNIX(sock_path_adm,
|
||||
unix_sock_adm_mask,
|
||||
@@ -542,7 +532,7 @@ daemonSetupNetworking(virNetServerPtr srv,
|
||||
#if WITH_GNUTLS
|
||||
NULL,
|
||||
#endif
|
||||
false,
|
||||
true,
|
||||
config->admin_max_queued_clients,
|
||||
config->admin_max_client_requests)))
|
||||
goto cleanup;
|
||||
@@ -584,7 +574,6 @@ daemonSetupNetworking(virNetServerPtr srv,
|
||||
config->cert_file,
|
||||
config->key_file,
|
||||
(const char *const*)config->tls_allowed_dn_list,
|
||||
config->tls_priority,
|
||||
config->tls_no_sanity_certificate ? false : true,
|
||||
config->tls_no_verify_certificate ? false : true)))
|
||||
goto cleanup;
|
||||
@@ -592,7 +581,6 @@ daemonSetupNetworking(virNetServerPtr srv,
|
||||
if (!(ctxt = virNetTLSContextNewServerPath(NULL,
|
||||
!privileged,
|
||||
(const char *const*)config->tls_allowed_dn_list,
|
||||
config->tls_priority,
|
||||
config->tls_no_sanity_certificate ? false : true,
|
||||
config->tls_no_verify_certificate ? false : true)))
|
||||
goto cleanup;
|
||||
@@ -1079,39 +1067,6 @@ static int migrateProfile(void)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int
|
||||
daemonSetupHostUUID(const struct daemonConfig *config)
|
||||
{
|
||||
static const char *machine_id = "/etc/machine-id";
|
||||
char buf[VIR_UUID_STRING_BUFLEN];
|
||||
const char *uuid;
|
||||
|
||||
if (config->host_uuid) {
|
||||
uuid = config->host_uuid;
|
||||
} else if (!config->host_uuid_source ||
|
||||
STREQ(config->host_uuid_source, "smbios")) {
|
||||
/* smbios UUID is fetched on demand in virGetHostUUID */
|
||||
return 0;
|
||||
} else if (STREQ(config->host_uuid_source, "machine-id")) {
|
||||
if (virFileReadBufQuiet(machine_id, buf, sizeof(buf)) < 0) {
|
||||
VIR_ERROR(_("Can't read %s"), machine_id);
|
||||
return -1;
|
||||
}
|
||||
|
||||
uuid = buf;
|
||||
} else {
|
||||
VIR_ERROR(_("invalid UUID source: %s"), config->host_uuid_source);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (virSetHostUUIDStr(uuid)) {
|
||||
VIR_ERROR(_("invalid host UUID: %s"), uuid);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Print command-line usage. */
|
||||
static void
|
||||
daemonUsage(const char *argv0, bool privileged)
|
||||
@@ -1217,7 +1172,9 @@ int main(int argc, char **argv) {
|
||||
{0, 0, 0, 0}
|
||||
};
|
||||
|
||||
if (virGettextInitialize() < 0 ||
|
||||
if (setlocale(LC_ALL, "") == NULL ||
|
||||
bindtextdomain(PACKAGE, LOCALEDIR) == NULL ||
|
||||
textdomain(PACKAGE) == NULL ||
|
||||
virInitialize() < 0) {
|
||||
fprintf(stderr, _("%s: initialization failed\n"), argv[0]);
|
||||
exit(EXIT_FAILURE);
|
||||
@@ -1316,8 +1273,12 @@ int main(int argc, char **argv) {
|
||||
/* Read the config file if it exists*/
|
||||
if (remote_config_file &&
|
||||
daemonConfigLoadFile(config, remote_config_file, implicit_conf) < 0) {
|
||||
VIR_ERROR(_("Can't load config file: %s: %s"),
|
||||
virGetLastErrorMessage(), remote_config_file);
|
||||
virErrorPtr err = virGetLastError();
|
||||
if (err && err->message)
|
||||
VIR_ERROR(_("Can't load config file: %s: %s"),
|
||||
err->message, remote_config_file);
|
||||
else
|
||||
VIR_ERROR(_("Can't load config file: %s"), remote_config_file);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
@@ -1327,8 +1288,9 @@ int main(int argc, char **argv) {
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
if (daemonSetupHostUUID(config) < 0) {
|
||||
VIR_ERROR(_("Can't setup host uuid"));
|
||||
if (config->host_uuid &&
|
||||
virSetHostUUIDStr(config->host_uuid) < 0) {
|
||||
VIR_ERROR(_("invalid host UUID: %s"), config->host_uuid);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
@@ -1420,8 +1382,7 @@ int main(int argc, char **argv) {
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (!(srv = virNetServerNew("libvirtd", 1,
|
||||
config->min_workers,
|
||||
if (!(srv = virNetServerNew(config->min_workers,
|
||||
config->max_workers,
|
||||
config->prio_workers,
|
||||
config->max_clients,
|
||||
@@ -1495,8 +1456,7 @@ int main(int argc, char **argv) {
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
if (!(srvAdm = virNetServerNew("admin", 1,
|
||||
config->admin_min_workers,
|
||||
if (!(srvAdm = virNetServerNew(config->admin_min_workers,
|
||||
config->admin_max_workers,
|
||||
0,
|
||||
config->admin_max_clients,
|
||||
|
@@ -77,6 +77,11 @@
|
||||
# UNIX socket access controls
|
||||
#
|
||||
|
||||
# Beware that if you are changing *any* of these options, and you use
|
||||
# socket activation with systemd, you need to adjust the settings in
|
||||
# the libvirtd.socket file as well since it could impose a security
|
||||
# risk if you rely on file permission checking only.
|
||||
|
||||
# Set the UNIX domain socket group ownership. This can be used to
|
||||
# allow a 'trusted' set of users access to management capabilities
|
||||
# without becoming root.
|
||||
@@ -242,7 +247,7 @@
|
||||
#tls_allowed_dn_list = ["DN1", "DN2"]
|
||||
|
||||
|
||||
# A whitelist of allowed SASL usernames. The format for username
|
||||
# A whitelist of allowed SASL usernames. The format for usernames
|
||||
# depends on the SASL authentication mechanism. Kerberos usernames
|
||||
# look like username@REALM
|
||||
#
|
||||
@@ -259,13 +264,6 @@
|
||||
#sasl_allowed_username_list = ["joe@EXAMPLE.COM", "fred@EXAMPLE.COM" ]
|
||||
|
||||
|
||||
# Override the compile time default TLS priority string. The
|
||||
# default is usually "NORMAL" unless overridden at build time.
|
||||
# Only set this is it is desired for libvirt to deviate from
|
||||
# the global default settings.
|
||||
#
|
||||
#tls_priority="NORMAL"
|
||||
|
||||
|
||||
#################################################################
|
||||
#
|
||||
@@ -283,8 +281,8 @@
|
||||
#max_queued_clients = 1000
|
||||
|
||||
# The maximum length of queue of accepted but not yet
|
||||
# authenticated clients. The default value is 20. Set this to
|
||||
# zero to turn this feature off.
|
||||
# authenticated clients. The default value is zero, meaning
|
||||
# the feature is disabled.
|
||||
#max_anonymous_clients = 20
|
||||
|
||||
# The minimum limit sets the number of workers to start up
|
||||
@@ -417,16 +415,10 @@
|
||||
|
||||
###################################################################
|
||||
# UUID of the host:
|
||||
# Host UUID is read from one of the sources specified in host_uuid_source.
|
||||
#
|
||||
# - 'smbios': fetch the UUID from 'dmidecode -s system-uuid'
|
||||
# - 'machine-id': fetch the UUID from /etc/machine-id
|
||||
#
|
||||
# The host_uuid_source default is 'smbios'. If 'dmidecode' does not provide
|
||||
# a valid UUID a temporary UUID will be generated.
|
||||
#
|
||||
# Another option is to specify host UUID in host_uuid.
|
||||
#
|
||||
# Provide the UUID of the host here in case the command
|
||||
# 'dmidecode -s system-uuid' does not provide a valid uuid. In case
|
||||
# 'dmidecode' does not provide a valid UUID and none is provided here, a
|
||||
# temporary UUID will be generated.
|
||||
# Keep the format of the example UUID below. UUID must not have all digits
|
||||
# be the same.
|
||||
|
||||
@@ -434,7 +426,6 @@
|
||||
# it with the output of the 'uuidgen' command and then
|
||||
# uncomment this entry
|
||||
#host_uuid = "00000000-0000-0000-0000-000000000000"
|
||||
#host_uuid_source = "smbios"
|
||||
|
||||
###################################################################
|
||||
# Keepalive protocol:
|
||||
|
@@ -60,9 +60,6 @@ struct daemonClientPrivate {
|
||||
size_t nnetworkEventCallbacks;
|
||||
daemonClientEventCallbackPtr *qemuEventCallbacks;
|
||||
size_t nqemuEventCallbacks;
|
||||
daemonClientEventCallbackPtr *storageEventCallbacks;
|
||||
size_t nstorageEventCallbacks;
|
||||
bool closeRegistered;
|
||||
|
||||
# if WITH_SASL
|
||||
virNetSASLSessionPtr sasl;
|
||||
|
@@ -4,7 +4,9 @@ libvirtd - libvirtd management daemon
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
B<libvirtd> [I<OPTION>]...
|
||||
B<libvirtd> [ -dlv ] [ -f config_file ] [ -p pid_file ] [ -t timeout_seconds ]
|
||||
|
||||
B<libvirtd> --version
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
@@ -1,8 +1,3 @@
|
||||
# NB we don't use socket activation. When libvirtd starts it will
|
||||
# spawn any virtual machines registered for autostart. We want this
|
||||
# to occur on every boot, regardless of whether any client connects
|
||||
# to a socket. Thus socket activation doesn't have any benefit
|
||||
|
||||
[Unit]
|
||||
Description=Virtualization daemon
|
||||
Before=libvirt-guests.service
|
||||
|
11
daemon/libvirtd.socket.in
Normal file
11
daemon/libvirtd.socket.in
Normal file
@@ -0,0 +1,11 @@
|
||||
[Socket]
|
||||
ListenStream=@runstatedir@/libvirt/libvirt-sock
|
||||
ListenStream=@runstatedir@/libvirt/libvirt-sock-ro
|
||||
|
||||
; The following settings must match libvirtd.conf file in order to
|
||||
; work as expected because libvirtd can't change them later.
|
||||
; SocketMode=0777 is safe only if authentication on the socket is set
|
||||
; up. For further information, please see the libvirtd.conf file.
|
||||
SocketMode=0777
|
||||
SocketUser=root
|
||||
SocketGroup=root
|
1392
daemon/remote.c
1392
daemon/remote.c
File diff suppressed because it is too large
Load Diff
161
daemon/stream.c
161
daemon/stream.c
@@ -42,15 +42,15 @@ struct daemonClientStream {
|
||||
|
||||
virStreamPtr st;
|
||||
int procedure;
|
||||
unsigned int serial;
|
||||
int serial;
|
||||
|
||||
bool recvEOF;
|
||||
bool closed;
|
||||
unsigned int recvEOF : 1;
|
||||
unsigned int closed : 1;
|
||||
|
||||
int filterID;
|
||||
|
||||
virNetMessagePtr rx;
|
||||
bool tx;
|
||||
int tx;
|
||||
|
||||
daemonClientStreamPtr next;
|
||||
};
|
||||
@@ -76,8 +76,6 @@ static void
|
||||
daemonStreamUpdateEvents(daemonClientStream *stream)
|
||||
{
|
||||
int newEvents = 0;
|
||||
if (stream->closed)
|
||||
return;
|
||||
if (stream->rx)
|
||||
newEvents |= VIR_STREAM_EVENT_WRITABLE;
|
||||
if (stream->tx && !stream->recvEOF)
|
||||
@@ -94,14 +92,14 @@ daemonStreamUpdateEvents(daemonClientStream *stream)
|
||||
* fast stream, but slow client
|
||||
*/
|
||||
static void
|
||||
daemonStreamMessageFinished(virNetMessagePtr msg,
|
||||
daemonStreamMessageFinished(virNetMessagePtr msg ATTRIBUTE_UNUSED,
|
||||
void *opaque)
|
||||
{
|
||||
daemonClientStream *stream = opaque;
|
||||
VIR_DEBUG("stream=%p proc=%d serial=%u",
|
||||
VIR_DEBUG("stream=%p proc=%d serial=%d",
|
||||
stream, msg->header.proc, msg->header.serial);
|
||||
|
||||
stream->tx = true;
|
||||
stream->tx = 1;
|
||||
daemonStreamUpdateEvents(stream);
|
||||
|
||||
daemonFreeClientStream(NULL, stream);
|
||||
@@ -199,8 +197,8 @@ daemonStreamEvent(virStreamPtr st, int events, void *opaque)
|
||||
(events & VIR_STREAM_EVENT_HANGUP)) {
|
||||
virNetMessagePtr msg;
|
||||
events &= ~(VIR_STREAM_EVENT_HANGUP);
|
||||
stream->tx = false;
|
||||
stream->recvEOF = true;
|
||||
stream->tx = 0;
|
||||
stream->recvEOF = 1;
|
||||
if (!(msg = virNetMessageNew(false))) {
|
||||
daemonRemoveClientStream(client, stream);
|
||||
virNetServerClientClose(client);
|
||||
@@ -229,7 +227,7 @@ daemonStreamEvent(virStreamPtr st, int events, void *opaque)
|
||||
virNetMessageError rerr;
|
||||
|
||||
memset(&rerr, 0, sizeof(rerr));
|
||||
stream->closed = true;
|
||||
stream->closed = 1;
|
||||
virStreamEventRemoveCallback(stream->st);
|
||||
virStreamAbort(stream->st);
|
||||
if (events & VIR_STREAM_EVENT_HANGUP)
|
||||
@@ -295,7 +293,7 @@ daemonStreamFilter(virNetServerClientPtr client ATTRIBUTE_UNUSED,
|
||||
msg->header.serial != stream->serial)
|
||||
goto cleanup;
|
||||
|
||||
VIR_DEBUG("Incoming client=%p, rx=%p, serial=%u, proc=%d, status=%d",
|
||||
VIR_DEBUG("Incoming client=%p, rx=%p, serial=%d, proc=%d, status=%d",
|
||||
client, stream->rx, msg->header.proc,
|
||||
msg->header.serial, msg->header.status);
|
||||
|
||||
@@ -326,7 +324,7 @@ daemonCreateClientStream(virNetServerClientPtr client,
|
||||
daemonClientStream *stream;
|
||||
daemonClientPrivatePtr priv = virNetServerClientGetPrivateData(client);
|
||||
|
||||
VIR_DEBUG("client=%p, proc=%d, serial=%u, st=%p",
|
||||
VIR_DEBUG("client=%p, proc=%d, serial=%d, st=%p",
|
||||
client, header->proc, header->serial, st);
|
||||
|
||||
if (VIR_ALLOC(stream) < 0)
|
||||
@@ -362,7 +360,7 @@ int daemonFreeClientStream(virNetServerClientPtr client,
|
||||
if (stream->refs)
|
||||
return 0;
|
||||
|
||||
VIR_DEBUG("client=%p, proc=%d, serial=%u",
|
||||
VIR_DEBUG("client=%p, proc=%d, serial=%d",
|
||||
client, stream->procedure, stream->serial);
|
||||
|
||||
virObjectUnref(stream->prog);
|
||||
@@ -400,7 +398,7 @@ int daemonAddClientStream(virNetServerClientPtr client,
|
||||
daemonClientStream *stream,
|
||||
bool transmit)
|
||||
{
|
||||
VIR_DEBUG("client=%p, proc=%d, serial=%u, st=%p, transmit=%d",
|
||||
VIR_DEBUG("client=%p, proc=%d, serial=%d, st=%p, transmit=%d",
|
||||
client, stream->procedure, stream->serial, stream->st, transmit);
|
||||
daemonClientPrivatePtr priv = virNetServerClientGetPrivateData(client);
|
||||
|
||||
@@ -424,7 +422,7 @@ int daemonAddClientStream(virNetServerClientPtr client,
|
||||
}
|
||||
|
||||
if (transmit)
|
||||
stream->tx = true;
|
||||
stream->tx = 1;
|
||||
|
||||
virMutexLock(&priv->lock);
|
||||
stream->next = priv->streams;
|
||||
@@ -450,7 +448,7 @@ int
|
||||
daemonRemoveClientStream(virNetServerClientPtr client,
|
||||
daemonClientStream *stream)
|
||||
{
|
||||
VIR_DEBUG("client=%p, proc=%d, serial=%u, st=%p",
|
||||
VIR_DEBUG("client=%p, proc=%d, serial=%d, st=%p",
|
||||
client, stream->procedure, stream->serial, stream->st);
|
||||
daemonClientPrivatePtr priv = virNetServerClientGetPrivateData(client);
|
||||
daemonClientStream *curr = priv->streams;
|
||||
@@ -463,7 +461,6 @@ daemonRemoveClientStream(virNetServerClientPtr client,
|
||||
}
|
||||
|
||||
if (!stream->closed) {
|
||||
stream->closed = true;
|
||||
virStreamEventRemoveCallback(stream->st);
|
||||
virStreamAbort(stream->st);
|
||||
}
|
||||
@@ -494,7 +491,6 @@ daemonRemoveAllClientStreams(daemonClientStream *stream)
|
||||
tmp = stream->next;
|
||||
|
||||
if (!stream->closed) {
|
||||
stream->closed = true;
|
||||
virStreamEventRemoveCallback(stream->st);
|
||||
virStreamAbort(stream->st);
|
||||
}
|
||||
@@ -519,7 +515,7 @@ daemonStreamHandleWriteData(virNetServerClientPtr client,
|
||||
{
|
||||
int ret;
|
||||
|
||||
VIR_DEBUG("client=%p, stream=%p, proc=%d, serial=%u, len=%zu, offset=%zu",
|
||||
VIR_DEBUG("client=%p, stream=%p, proc=%d, serial=%d, len=%zu, offset=%zu",
|
||||
client, stream, msg->header.proc, msg->header.serial,
|
||||
msg->bufferLength, msg->bufferOffset);
|
||||
|
||||
@@ -542,10 +538,7 @@ daemonStreamHandleWriteData(virNetServerClientPtr client,
|
||||
memset(&rerr, 0, sizeof(rerr));
|
||||
|
||||
VIR_INFO("Stream send failed");
|
||||
stream->closed = true;
|
||||
virStreamEventRemoveCallback(stream->st);
|
||||
virStreamAbort(stream->st);
|
||||
|
||||
stream->closed = 1;
|
||||
return virNetServerProgramSendReplyError(stream->prog,
|
||||
client,
|
||||
msg,
|
||||
@@ -572,10 +565,10 @@ daemonStreamHandleFinish(virNetServerClientPtr client,
|
||||
{
|
||||
int ret;
|
||||
|
||||
VIR_DEBUG("client=%p, stream=%p, proc=%d, serial=%u",
|
||||
VIR_DEBUG("client=%p, stream=%p, proc=%d, serial=%d",
|
||||
client, stream, msg->header.proc, msg->header.serial);
|
||||
|
||||
stream->closed = true;
|
||||
stream->closed = 1;
|
||||
virStreamEventRemoveCallback(stream->st);
|
||||
ret = virStreamFinish(stream->st);
|
||||
|
||||
@@ -609,42 +602,31 @@ daemonStreamHandleAbort(virNetServerClientPtr client,
|
||||
daemonClientStream *stream,
|
||||
virNetMessagePtr msg)
|
||||
{
|
||||
VIR_DEBUG("client=%p, stream=%p, proc=%d, serial=%u",
|
||||
VIR_DEBUG("client=%p, stream=%p, proc=%d, serial=%d",
|
||||
client, stream, msg->header.proc, msg->header.serial);
|
||||
int ret;
|
||||
bool raise_error = false;
|
||||
virNetMessageError rerr;
|
||||
|
||||
stream->closed = true;
|
||||
memset(&rerr, 0, sizeof(rerr));
|
||||
|
||||
stream->closed = 1;
|
||||
virStreamEventRemoveCallback(stream->st);
|
||||
ret = virStreamAbort(stream->st);
|
||||
virStreamAbort(stream->st);
|
||||
|
||||
if (msg->header.status == VIR_NET_ERROR) {
|
||||
VIR_INFO("stream aborted at client request");
|
||||
raise_error = (ret < 0);
|
||||
virReportError(VIR_ERR_RPC,
|
||||
"%s", _("stream aborted at client request"));
|
||||
} else {
|
||||
VIR_WARN("unexpected stream status %d", msg->header.status);
|
||||
virReportError(VIR_ERR_RPC,
|
||||
_("stream aborted with unexpected status %d"),
|
||||
msg->header.status);
|
||||
raise_error = true;
|
||||
}
|
||||
|
||||
if (raise_error) {
|
||||
virNetMessageError rerr;
|
||||
memset(&rerr, 0, sizeof(rerr));
|
||||
return virNetServerProgramSendReplyError(remoteProgram,
|
||||
client,
|
||||
msg,
|
||||
&rerr,
|
||||
&msg->header);
|
||||
} else {
|
||||
/* Send zero-length confirm */
|
||||
return virNetServerProgramSendStreamData(stream->prog,
|
||||
client,
|
||||
msg,
|
||||
stream->procedure,
|
||||
stream->serial,
|
||||
NULL, 0);
|
||||
}
|
||||
return virNetServerProgramSendReplyError(remoteProgram,
|
||||
client,
|
||||
msg,
|
||||
&rerr,
|
||||
&msg->header);
|
||||
}
|
||||
|
||||
|
||||
@@ -727,12 +709,9 @@ static int
|
||||
daemonStreamHandleRead(virNetServerClientPtr client,
|
||||
daemonClientStream *stream)
|
||||
{
|
||||
virNetMessagePtr msg = NULL;
|
||||
virNetMessageError rerr;
|
||||
char *buffer;
|
||||
size_t bufferLen = VIR_NET_MESSAGE_LEGACY_PAYLOAD_MAX;
|
||||
int ret = -1;
|
||||
int rv;
|
||||
int ret;
|
||||
|
||||
VIR_DEBUG("client=%p, stream=%p tx=%d closed=%d",
|
||||
client, stream, stream->tx, stream->closed);
|
||||
@@ -749,48 +728,50 @@ daemonStreamHandleRead(virNetServerClientPtr client,
|
||||
if (!stream->tx)
|
||||
return 0;
|
||||
|
||||
memset(&rerr, 0, sizeof(rerr));
|
||||
|
||||
if (VIR_ALLOC_N(buffer, bufferLen) < 0)
|
||||
return -1;
|
||||
|
||||
if (!(msg = virNetMessageNew(false)))
|
||||
goto cleanup;
|
||||
|
||||
rv = virStreamRecv(stream->st, buffer, bufferLen);
|
||||
if (rv == -2) {
|
||||
ret = virStreamRecv(stream->st, buffer, bufferLen);
|
||||
if (ret == -2) {
|
||||
/* Should never get this, since we're only called when we know
|
||||
* we're readable, but hey things change... */
|
||||
} else if (rv < 0) {
|
||||
if (virNetServerProgramSendStreamError(remoteProgram,
|
||||
client,
|
||||
msg,
|
||||
&rerr,
|
||||
stream->procedure,
|
||||
stream->serial) < 0)
|
||||
goto cleanup;
|
||||
msg = NULL;
|
||||
} else {
|
||||
stream->tx = false;
|
||||
if (rv == 0)
|
||||
stream->recvEOF = true;
|
||||
ret = 0;
|
||||
} else if (ret < 0) {
|
||||
virNetMessagePtr msg;
|
||||
virNetMessageError rerr;
|
||||
|
||||
msg->cb = daemonStreamMessageFinished;
|
||||
msg->opaque = stream;
|
||||
stream->refs++;
|
||||
if (virNetServerProgramSendStreamData(remoteProgram,
|
||||
client,
|
||||
msg,
|
||||
stream->procedure,
|
||||
stream->serial,
|
||||
buffer, rv) < 0)
|
||||
goto cleanup;
|
||||
msg = NULL;
|
||||
memset(&rerr, 0, sizeof(rerr));
|
||||
|
||||
if (!(msg = virNetMessageNew(false)))
|
||||
ret = -1;
|
||||
else
|
||||
ret = virNetServerProgramSendStreamError(remoteProgram,
|
||||
client,
|
||||
msg,
|
||||
&rerr,
|
||||
stream->procedure,
|
||||
stream->serial);
|
||||
} else {
|
||||
virNetMessagePtr msg;
|
||||
stream->tx = 0;
|
||||
if (ret == 0)
|
||||
stream->recvEOF = 1;
|
||||
if (!(msg = virNetMessageNew(false)))
|
||||
ret = -1;
|
||||
|
||||
if (msg) {
|
||||
msg->cb = daemonStreamMessageFinished;
|
||||
msg->opaque = stream;
|
||||
stream->refs++;
|
||||
ret = virNetServerProgramSendStreamData(remoteProgram,
|
||||
client,
|
||||
msg,
|
||||
stream->procedure,
|
||||
stream->serial,
|
||||
buffer, ret);
|
||||
}
|
||||
}
|
||||
|
||||
ret = 0;
|
||||
cleanup:
|
||||
VIR_FREE(buffer);
|
||||
virNetMessageFree(msg);
|
||||
return ret;
|
||||
}
|
||||
|
@@ -26,6 +26,8 @@
|
||||
|
||||
# include "libvirtd.h"
|
||||
|
||||
|
||||
|
||||
daemonClientStream *
|
||||
daemonCreateClientStream(virNetServerClientPtr client,
|
||||
virStreamPtr st,
|
||||
|
@@ -35,7 +35,6 @@ module Test_libvirtd =
|
||||
{ "1" = "joe@EXAMPLE.COM" }
|
||||
{ "2" = "fred@EXAMPLE.COM" }
|
||||
}
|
||||
{ "tls_priority" = "NORMAL" }
|
||||
{ "max_clients" = "5000" }
|
||||
{ "max_queued_clients" = "1000" }
|
||||
{ "max_anonymous_clients" = "20" }
|
||||
@@ -56,7 +55,6 @@ module Test_libvirtd =
|
||||
{ "audit_level" = "2" }
|
||||
{ "audit_logging" = "1" }
|
||||
{ "host_uuid" = "00000000-0000-0000-0000-000000000000" }
|
||||
{ "host_uuid_source" = "smbios" }
|
||||
{ "keepalive_interval" = "5" }
|
||||
{ "keepalive_count" = "5" }
|
||||
{ "keepalive_required" = "1" }
|
||||
|
@@ -28,7 +28,6 @@ apihtml = \
|
||||
$(apihtml_generated)
|
||||
|
||||
apihtml_generated = \
|
||||
html/libvirt-libvirt-common.html \
|
||||
html/libvirt-libvirt-domain.html \
|
||||
html/libvirt-libvirt-domain-snapshot.html \
|
||||
html/libvirt-libvirt-event.html \
|
||||
@@ -71,6 +70,8 @@ devhelpxsl = devhelp/devhelp.xsl devhelp/html.xsl
|
||||
|
||||
png = \
|
||||
32favicon.png \
|
||||
footer_corner.png \
|
||||
footer_pattern.png \
|
||||
libvirt-header-bg.png \
|
||||
libvirt-header-logo.png \
|
||||
libvirtLogo.png \
|
||||
@@ -80,6 +81,7 @@ png = \
|
||||
libvirt-driver-arch.png \
|
||||
libvirt-object-model.png \
|
||||
madeWith.png \
|
||||
et.png \
|
||||
migration-managed-direct.png \
|
||||
migration-managed-p2p.png \
|
||||
migration-native.png \
|
||||
@@ -132,8 +134,7 @@ apidir = $(pkgdatadir)/api
|
||||
api_DATA = \
|
||||
libvirt-api.xml \
|
||||
libvirt-qemu-api.xml \
|
||||
libvirt-lxc-api.xml \
|
||||
libvirt-admin-api.xml
|
||||
libvirt-lxc-api.xml
|
||||
|
||||
fig = \
|
||||
libvirt-net-logical.fig \
|
||||
@@ -156,7 +157,7 @@ EXTRA_DIST= \
|
||||
hacking1.xsl hacking2.xsl wrapstring.xsl \
|
||||
$(dot_html) $(dot_html_in) $(gif) $(apihtml) $(apipng) \
|
||||
$(devhelphtml) $(devhelppng) $(devhelpcss) $(devhelpxsl) \
|
||||
$(xml) $(qemu_xml) $(lxc_xml) $(admin_xml) $(fig) $(png) $(css) \
|
||||
$(xml) $(qemu_xml) $(lxc_xml) $(fig) $(png) $(css) \
|
||||
$(patches) $(dot_php_in) $(dot_php_code_in) $(dot_php)\
|
||||
$(internals_html_in) $(internals_html) \
|
||||
sitemap.html.in aclperms.htmlinc \
|
||||
@@ -219,21 +220,21 @@ $(srcdir)/hvsupport.html.in: $(srcdir)/hvsupport.pl $(api_DATA) \
|
||||
%.png: %.fig
|
||||
convert -rotate 90 $< $@
|
||||
|
||||
%.html.tmp: %.html.in site.xsl subsite.xsl page.xsl \
|
||||
sitemap.html.in $(acl_generated)
|
||||
internals/%.html.tmp: internals/%.html.in subsite.xsl page.xsl sitemap.html.in
|
||||
@if [ -x $(XSLTPROC) ] ; then \
|
||||
echo "Generating $@"; \
|
||||
$(MKDIR_P) internals; \
|
||||
name=`echo $@ | sed -e 's/.tmp//'`; \
|
||||
$(XSLTPROC) --stringparam pagename $$name --nonet \
|
||||
$(top_srcdir)/docs/subsite.xsl $< > $@ \
|
||||
|| { rm $@ && exit 1; }; fi
|
||||
|
||||
%.html.tmp: %.html.in site.xsl page.xsl sitemap.html.in $(acl_generated)
|
||||
@if [ -x $(XSLTPROC) ] ; then \
|
||||
echo "Generating $@"; \
|
||||
name=`echo $@ | sed -e 's/.tmp//'`; \
|
||||
dir=`dirname $@` ; \
|
||||
if test "$$dir" = "."; \
|
||||
then \
|
||||
style=site.xsl; \
|
||||
else \
|
||||
$(MKDIR_P) $$dir; \
|
||||
style=subsite.xsl; \
|
||||
fi; \
|
||||
$(XSLTPROC) --stringparam pagename $$name --nonet \
|
||||
$(top_srcdir)/docs/$$style $< > $@ \
|
||||
$(top_srcdir)/docs/site.xsl $< > $@ \
|
||||
|| { rm $@ && exit 1; }; fi
|
||||
|
||||
%.html: %.html.tmp
|
||||
@@ -326,7 +327,7 @@ $(APIBUILD_STAMP): $(srcdir)/apibuild.py \
|
||||
$(top_srcdir)/src/util/virerror.c \
|
||||
$(top_srcdir)/src/util/virevent.c \
|
||||
$(top_srcdir)/src/util/virtypedparam.c
|
||||
$(AM_V_GEN)srcdir=$(srcdir) builddir=$(builddir) $(PYTHON) $(APIBUILD)
|
||||
$(AM_V_GEN)srcdir=$(srcdir) $(PYTHON) $(APIBUILD)
|
||||
touch $@
|
||||
|
||||
|
||||
@@ -365,15 +366,8 @@ install-data-local:
|
||||
$(INSTALL_DATA) $(srcdir)/libvirtLogo.png $(DESTDIR)$(pkgdatadir)
|
||||
|
||||
uninstall-local:
|
||||
for f in $(css) $(dot_html) $(gif) $(png); do \
|
||||
rm -f $(DESTDIR)$(HTML_DIR)/$$f; \
|
||||
done
|
||||
for h in $(apihtml); do rm -f $(DESTDIR)$(HTML_DIR)/$$h; done
|
||||
for p in $(apipng); do rm -f $(DESTDIR)$(HTML_DIR)/$$p; done
|
||||
for f in $(internals_html); do \
|
||||
rm -f $(DESTDIR)$(HTML_DIR)/$$f; \
|
||||
done
|
||||
for h in $(apihtml); do rm $(DESTDIR)$(HTML_DIR)/$$h; done
|
||||
for p in $(apipng); do rm $(DESTDIR)$(HTML_DIR)/$$p; done
|
||||
for f in $(devhelphtml) $(devhelppng) $(devhelpcss); do \
|
||||
rm -f $(DESTDIR)$(DEVHELP_DIR)/$$(basename $$f); \
|
||||
rm $(DESTDIR)$(DEVHELP_DIR)/$$(basename $$f); \
|
||||
done
|
||||
rm -f $(DESTDIR)$(pkgdatadir)/libvirtLogo.png
|
||||
|
113
docs/apibuild.py
113
docs/apibuild.py
@@ -21,7 +21,6 @@ debugsym=None
|
||||
# C parser analysis code
|
||||
#
|
||||
included_files = {
|
||||
"libvirt-common.h": "header with general libvirt API definitions",
|
||||
"libvirt-domain.h": "header with general libvirt API definitions",
|
||||
"libvirt-domain-snapshot.h": "header with general libvirt API definitions",
|
||||
"libvirt-event.h": "header with general libvirt API definitions",
|
||||
@@ -112,12 +111,6 @@ ignored_macros = {
|
||||
"_virMemoryParameter": "backward compatibility macro for virTypedParameter",
|
||||
}
|
||||
|
||||
# macros that should be completely skipped
|
||||
hidden_macros = {
|
||||
"VIR_DEPRECATED": "internal macro to mark deprecated apis",
|
||||
"VIR_EXPORT_VAR": "internal macro to mark exported vars",
|
||||
}
|
||||
|
||||
def escape(raw):
|
||||
raw = string.replace(raw, '&', '&')
|
||||
raw = string.replace(raw, '<', '<')
|
||||
@@ -240,11 +233,6 @@ class index:
|
||||
self.references = {}
|
||||
self.info = {}
|
||||
|
||||
def warning(self, msg):
|
||||
global warnings
|
||||
warnings = warnings + 1
|
||||
print msg
|
||||
|
||||
def add_ref(self, name, header, module, static, type, lineno, info=None, extra=None, conditionals = None):
|
||||
if name[0:2] == '__':
|
||||
return None
|
||||
@@ -1046,11 +1034,6 @@ class CParser:
|
||||
name = string.split(name, '(') [0]
|
||||
except:
|
||||
pass
|
||||
|
||||
# skip hidden macros
|
||||
if name in hidden_macros:
|
||||
return token
|
||||
|
||||
strValue = None
|
||||
if len(lst) == 1 and lst[0][0] == '"' and lst[0][-1] == '"':
|
||||
strValue = lst[0][1:-1]
|
||||
@@ -1398,8 +1381,7 @@ class CParser:
|
||||
token = self.token()
|
||||
while token[0] != "sep" or (token[1] != ',' and
|
||||
token[1] != '}'):
|
||||
# We might be dealing with '1U << 12' here
|
||||
value = value + re.sub("^(\d+)U$","\\1", token[1])
|
||||
value = value + token[1]
|
||||
token = self.token()
|
||||
else:
|
||||
try:
|
||||
@@ -2585,65 +2567,52 @@ class docBuilder:
|
||||
output.close()
|
||||
|
||||
|
||||
class app:
|
||||
def warning(self, msg):
|
||||
global warnings
|
||||
warnings = warnings + 1
|
||||
print msg
|
||||
|
||||
def rebuild(self, name):
|
||||
if name not in ["libvirt", "libvirt-qemu", "libvirt-lxc", "libvirt-admin"]:
|
||||
self.warning("rebuild() failed, unknown module %s" % name)
|
||||
return None
|
||||
builder = None
|
||||
srcdir = os.path.abspath((os.environ["srcdir"]))
|
||||
builddir = os.path.abspath((os.environ["builddir"]))
|
||||
if srcdir == builddir:
|
||||
builddir = None
|
||||
if glob.glob(srcdir + "/../src/libvirt.c") != [] :
|
||||
if not quiet:
|
||||
print "Rebuilding API description for %s" % name
|
||||
dirs = [srcdir + "/../src",
|
||||
srcdir + "/../src/util",
|
||||
srcdir + "/../include/libvirt"]
|
||||
if builddir:
|
||||
dirs.append(builddir + "/../include/libvirt")
|
||||
if glob.glob(srcdir + "/../include/libvirt/libvirt.h") == [] :
|
||||
dirs.append("../include/libvirt")
|
||||
builder = docBuilder(name, srcdir, dirs, [])
|
||||
elif glob.glob("src/libvirt.c") != [] :
|
||||
if not quiet:
|
||||
print "Rebuilding API description for %s" % name
|
||||
builder = docBuilder(name, srcdir,
|
||||
["src", "src/util", "include/libvirt"],
|
||||
[])
|
||||
else:
|
||||
self.warning("rebuild() failed, unable to guess the module")
|
||||
return None
|
||||
builder.scan()
|
||||
builder.analyze()
|
||||
builder.serialize()
|
||||
return builder
|
||||
|
||||
#
|
||||
# for debugging the parser
|
||||
#
|
||||
def parse(self, filename):
|
||||
parser = CParser(filename)
|
||||
idx = parser.parse()
|
||||
return idx
|
||||
def rebuild(name):
|
||||
if name not in ["libvirt", "libvirt-qemu", "libvirt-lxc", "libvirt-admin"]:
|
||||
self.warning("rebuild() failed, unknown module %s") % name
|
||||
return None
|
||||
builder = None
|
||||
srcdir = os.environ["srcdir"]
|
||||
if glob.glob(srcdir + "/../src/libvirt.c") != [] :
|
||||
if not quiet:
|
||||
print "Rebuilding API description for %s" % name
|
||||
dirs = [srcdir + "/../src",
|
||||
srcdir + "/../src/util",
|
||||
srcdir + "/../include/libvirt"]
|
||||
if glob.glob(srcdir + "/../include/libvirt/libvirt.h") == [] :
|
||||
dirs.append("../include/libvirt")
|
||||
builder = docBuilder(name, srcdir, dirs, [])
|
||||
elif glob.glob("src/libvirt.c") != [] :
|
||||
if not quiet:
|
||||
print "Rebuilding API description for %s" % name
|
||||
builder = docBuilder(name, srcdir,
|
||||
["src", "src/util", "include/libvirt"],
|
||||
[])
|
||||
else:
|
||||
self.warning("rebuild() failed, unable to guess the module")
|
||||
return None
|
||||
builder.scan()
|
||||
builder.analyze()
|
||||
builder.serialize()
|
||||
return builder
|
||||
|
||||
#
|
||||
# for debugging the parser
|
||||
#
|
||||
def parse(filename):
|
||||
parser = CParser(filename)
|
||||
idx = parser.parse()
|
||||
return idx
|
||||
|
||||
if __name__ == "__main__":
|
||||
app = app()
|
||||
if len(sys.argv) > 1:
|
||||
debug = 1
|
||||
app.parse(sys.argv[1])
|
||||
parse(sys.argv[1])
|
||||
else:
|
||||
app.rebuild("libvirt")
|
||||
app.rebuild("libvirt-qemu")
|
||||
app.rebuild("libvirt-lxc")
|
||||
app.rebuild("libvirt-admin")
|
||||
rebuild("libvirt")
|
||||
rebuild("libvirt-qemu")
|
||||
rebuild("libvirt-lxc")
|
||||
rebuild("libvirt-admin")
|
||||
if warnings > 0:
|
||||
sys.exit(2)
|
||||
else:
|
||||
|
@@ -2,7 +2,7 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<body>
|
||||
<h1>Applications using libvirt</h1>
|
||||
<h1>Applications using <strong>libvirt</strong></h1>
|
||||
|
||||
<p>
|
||||
This page provides an illustration of the wide variety of
|
||||
|
@@ -57,13 +57,13 @@
|
||||
</p>
|
||||
|
||||
<dl>
|
||||
<dt><code>pid</code></dt>
|
||||
<dt>pid</dt>
|
||||
<dd>Process ID of the libvirtd daemon generating the audit record.</dd>
|
||||
<dt><code>uid</code></dt>
|
||||
<dt>uid</dt>
|
||||
<dd>User ID of the libvirtd daemon process generating the audit record.</dd>
|
||||
<dt><code>subj</code></dt>
|
||||
<dt>subj</dt>
|
||||
<dd>Security context of the libvirtd daemon process generating the audit record.</dd>
|
||||
<dt><code>msg</code></dt>
|
||||
<dt>msg</dt>
|
||||
<dd>String containing a list of key=value pairs specific to the type of audit record being reported.</dd>
|
||||
</dl>
|
||||
|
||||
@@ -72,21 +72,21 @@
|
||||
</p>
|
||||
|
||||
<dl>
|
||||
<dt><code>virt</code></dt>
|
||||
<dt>virt</dt>
|
||||
<dd>Type of virtualization driver used. One of <code>qemu</code> or <code>lxc</code></dd>
|
||||
<dt><code>vm</code></dt>
|
||||
<dt>vm</dt>
|
||||
<dd>Host driver unique name of the guest</dd>
|
||||
<dt><code>uuid</code></dt>
|
||||
<dt>uuid</dt>
|
||||
<dd>Globally unique identifier for the guest</dd>
|
||||
<dt><code>exe</code></dt>
|
||||
<dt>exe</dt>
|
||||
<dd>Path of the libvirtd daemon</dd>
|
||||
<dt><code>hostname</code></dt>
|
||||
<dt>hostname</dt>
|
||||
<dd>Currently unused</dd>
|
||||
<dt><code>addr</code></dt>
|
||||
<dt>addr</dt>
|
||||
<dd>Currently unused</dd>
|
||||
<dt><code>terminal</code></dt>
|
||||
<dt>terminal</dt>
|
||||
<dd>Currently unused</dd>
|
||||
<dt><code>res</code></dt>
|
||||
<dt>res</dt>
|
||||
<dd>Result of the action, either <code>success</code> or <code>failed</code></dd>
|
||||
</dl>
|
||||
|
||||
@@ -98,15 +98,15 @@
|
||||
</p>
|
||||
|
||||
<dl>
|
||||
<dt><code>op</code></dt>
|
||||
<dt>op</dt>
|
||||
<dd>Type of operation performed. One of <code>start</code>, <code>stop</code> or <code>init</code></dd>
|
||||
<dt><code>reason</code></dt>
|
||||
<dt>reason</dt>
|
||||
<dd>The reason which caused the operation to happen</dd>
|
||||
<dt><code>vm-pid</code></dt>
|
||||
<dt>vm-pid</dt>
|
||||
<dd>ID of the primary/leading process associated with the guest</dd>
|
||||
<dt><code>init-pid</code></dt>
|
||||
<dt>init-pid</dt>
|
||||
<dd>ID of the <code>init</code> process in a container. Only if <code>op=init</code> and <code>virt=lxc</code></dd>
|
||||
<dt><code>pid-ns</code></dt>
|
||||
<dt>pid-ns</dt>
|
||||
<dd>Namespace ID of the <code>init</code> process in a container. Only if <code>op=init</code> and <code>virt=lxc</code></dd>
|
||||
</dl>
|
||||
|
||||
@@ -118,11 +118,11 @@
|
||||
</p>
|
||||
|
||||
<dl>
|
||||
<dt><code>model</code></dt>
|
||||
<dt>model</dt>
|
||||
<dd>The security driver type. One of <code>selinux</code> or <code>apparmor</code></dd>
|
||||
<dt><code>vm-ctx</code></dt>
|
||||
<dt>vm-ctx</dt>
|
||||
<dd>Security context for the guest process</dd>
|
||||
<dt><code>img-ctx</code></dt>
|
||||
<dt>img-ctx</dt>
|
||||
<dd>Security context for the guest disk images and other assigned host resources</dd>
|
||||
</dl>
|
||||
|
||||
@@ -144,13 +144,13 @@
|
||||
</p>
|
||||
|
||||
<dl>
|
||||
<dt><code>reason</code></dt>
|
||||
<dt>reason</dt>
|
||||
<dd>The reason which caused the resource to be assigned to happen</dd>
|
||||
<dt><code>resrc</code></dt>
|
||||
<dt>resrc</dt>
|
||||
<dd>The type of resource assigned. Set to <code>vcpu</code></dd>
|
||||
<dt><code>old-vcpu</code></dt>
|
||||
<dt>old-vcpu</dt>
|
||||
<dd>Original vCPU count, or 0</dd>
|
||||
<dt><code>new-vcpu</code></dt>
|
||||
<dt>new-vcpu</dt>
|
||||
<dd>Updated vCPU count</dd>
|
||||
</dl>
|
||||
|
||||
@@ -162,13 +162,13 @@
|
||||
</p>
|
||||
|
||||
<dl>
|
||||
<dt><code>reason</code></dt>
|
||||
<dt>reason</dt>
|
||||
<dd>The reason which caused the resource to be assigned to happen</dd>
|
||||
<dt><code>resrc</code></dt>
|
||||
<dt>resrc</dt>
|
||||
<dd>The type of resource assigned. Set to <code>mem</code></dd>
|
||||
<dt><code>old-mem</code></dt>
|
||||
<dt>old-mem</dt>
|
||||
<dd>Original memory size in bytes, or 0</dd>
|
||||
<dt><code>new-mem</code></dt>
|
||||
<dt>new-mem</dt>
|
||||
<dd>Updated memory size in bytes</dd>
|
||||
</dl>
|
||||
|
||||
@@ -178,13 +178,13 @@
|
||||
</p>
|
||||
|
||||
<dl>
|
||||
<dt><code>reason</code></dt>
|
||||
<dt>reason</dt>
|
||||
<dd>The reason which caused the resource to be assigned to happen</dd>
|
||||
<dt><code>resrc</code></dt>
|
||||
<dt>resrc</dt>
|
||||
<dd>The type of resource assigned. Set to <code>disk</code></dd>
|
||||
<dt><code>old-disk</code></dt>
|
||||
<dt>old-disk</dt>
|
||||
<dd>Original host file or device path acting as the disk backing file</dd>
|
||||
<dt><code>new-disk</code></dt>
|
||||
<dt>new-disk</dt>
|
||||
<dd>Updated host file or device path acting as the disk backing file</dd>
|
||||
</dl>
|
||||
|
||||
@@ -195,13 +195,13 @@
|
||||
</p>
|
||||
|
||||
<dl>
|
||||
<dt><code>reason</code></dt>
|
||||
<dt>reason</dt>
|
||||
<dd>The reason which caused the resource to be assigned to happen</dd>
|
||||
<dt><code>resrc</code></dt>
|
||||
<dt>resrc</dt>
|
||||
<dd>The type of resource assigned. Set to <code>net</code></dd>
|
||||
<dt><code>old-net</code></dt>
|
||||
<dt>old-net</dt>
|
||||
<dd>Original MAC address of the guest network interface</dd>
|
||||
<dt><code>new-net</code></dt>
|
||||
<dt>new-net</dt>
|
||||
<dd>Updated MAC address of the guest network interface</dd>
|
||||
</dl>
|
||||
|
||||
@@ -211,13 +211,13 @@
|
||||
</p>
|
||||
|
||||
<dl>
|
||||
<dt><code>reason</code></dt>
|
||||
<dt>reason</dt>
|
||||
<dd>The reason which caused the resource to be assigned to happen</dd>
|
||||
<dt><code>resrc</code></dt>
|
||||
<dt>resrc</dt>
|
||||
<dd>The type of resource assigned. Set to <code>net</code></dd>
|
||||
<dt><code>net</code></dt>
|
||||
<dt>net</dt>
|
||||
<dd>MAC address of the host network interface</dd>
|
||||
<dt><code>rdev</code></dt>
|
||||
<dt>rdev</dt>
|
||||
<dd>Name of the host network interface</dd>
|
||||
</dl>
|
||||
|
||||
@@ -227,13 +227,13 @@
|
||||
</p>
|
||||
|
||||
<dl>
|
||||
<dt><code>reason</code></dt>
|
||||
<dt>reason</dt>
|
||||
<dd>The reason which caused the resource to be assigned to happen</dd>
|
||||
<dt><code>resrc</code></dt>
|
||||
<dt>resrc</dt>
|
||||
<dd>The type of resource assigned. Set to <code>fs</code></dd>
|
||||
<dt><code>old-fs</code></dt>
|
||||
<dt>old-fs</dt>
|
||||
<dd>Original host directory, file or device path backing the filesystem </dd>
|
||||
<dt><code>new-fs</code></dt>
|
||||
<dt>new-fs</dt>
|
||||
<dd>Updated host directory, file or device path backing the filesystem</dd>
|
||||
</dl>
|
||||
|
||||
@@ -243,15 +243,15 @@
|
||||
</p>
|
||||
|
||||
<dl>
|
||||
<dt><code>reason</code></dt>
|
||||
<dt>reason</dt>
|
||||
<dd>The reason which caused the resource to be assigned to happen</dd>
|
||||
<dt><code>resrc</code></dt>
|
||||
<dt>resrc</dt>
|
||||
<dd>The type of resource assigned. Set to <code>hostdev</code> or <code>dev</code></dd>
|
||||
<dt><code>dev</code></dt>
|
||||
<dt>dev</dt>
|
||||
<dd>The unique bus identifier of the USB, PCI or SCSI device, if <code>resrc=dev</code></dd>
|
||||
<dt><code>disk</code></dt>
|
||||
<dt>disk</dt>
|
||||
<dd>The path of the block device assigned to the guest, if <code>resrc=hostdev</code></dd>
|
||||
<dt><code>chardev</code></dt>
|
||||
<dt>chardev</dt>
|
||||
<dd>The path of the character device assigned to the guest, if <code>resrc=hostdev</code></dd>
|
||||
</dl>
|
||||
|
||||
@@ -261,11 +261,11 @@
|
||||
</p>
|
||||
|
||||
<dl>
|
||||
<dt><code>reason</code></dt>
|
||||
<dt>reason</dt>
|
||||
<dd>The reason which caused the resource to be assigned to happen</dd>
|
||||
<dt><code>resrc</code></dt>
|
||||
<dt>resrc</dt>
|
||||
<dd>The type of resource assigned. Set to <code>tpm</code></dd>
|
||||
<dt><code>device</code></dt>
|
||||
<dt>device</dt>
|
||||
<dd>The path of the host TPM device assigned to the guest</dd>
|
||||
</dl>
|
||||
|
||||
@@ -275,13 +275,13 @@
|
||||
</p>
|
||||
|
||||
<dl>
|
||||
<dt><code>reason</code></dt>
|
||||
<dt>reason</dt>
|
||||
<dd>The reason which caused the resource to be assigned to happen</dd>
|
||||
<dt><code>resrc</code></dt>
|
||||
<dt>resrc</dt>
|
||||
<dd>The type of resource assigned. Set to <code>rng</code></dd>
|
||||
<dt><code>old-rng</code></dt>
|
||||
<dt>old-rng</dt>
|
||||
<dd>Original path of the host entropy source for the RNG</dd>
|
||||
<dt><code>new-rng</code></dt>
|
||||
<dt>new-rng</dt>
|
||||
<dd>Updated path of the host entropy source for the RNG</dd>
|
||||
</dl>
|
||||
|
||||
@@ -291,13 +291,13 @@
|
||||
</p>
|
||||
|
||||
<dl>
|
||||
<dt><code>reason</code></dt>
|
||||
<dt>reason</dt>
|
||||
<dd>The reason which caused the resource to be assigned to happen</dd>
|
||||
<dt><code>resrc</code></dt>
|
||||
<dt>resrc</dt>
|
||||
<dd>The type of resource assigned. Set to <code>chardev</code></dd>
|
||||
<dt><code>old-chardev</code></dt>
|
||||
<dt>old-chardev</dt>
|
||||
<dd>Original path of the backing character device for given emulated device</dd>
|
||||
<dt><code>new-chardev</code></dt>
|
||||
<dt>new-chardev</dt>
|
||||
<dd>Updated path of the backing character device for given emulated device</dd>
|
||||
</dl>
|
||||
|
||||
@@ -307,15 +307,15 @@
|
||||
</p>
|
||||
|
||||
<dl>
|
||||
<dt><code>reason</code></dt>
|
||||
<dt>reason</dt>
|
||||
<dd>The reason which caused the resource to be assigned to happen</dd>
|
||||
<dt><code>resrc</code></dt>
|
||||
<dt>resrc</dt>
|
||||
<dd>The type of resource assigned. Set to <code>smartcard</code></dd>
|
||||
<dt><code>old-smartcard</code></dt>
|
||||
<dt>old-smartcard</dt>
|
||||
<dd>Original path of the backing character device, certificate store or
|
||||
"nss-smartcard-device" for host smartcard passthrough.
|
||||
</dd>
|
||||
<dt><code>new-smartcard</code></dt>
|
||||
<dt>new-smartcard</dt>
|
||||
<dd>Updated path of the backing character device, certificate store or
|
||||
"nss-smartcard-device" for host smartcard passthrough.
|
||||
</dd>
|
||||
@@ -327,13 +327,13 @@
|
||||
</p>
|
||||
|
||||
<dl>
|
||||
<dt><code>reason</code></dt>
|
||||
<dt>reason</dt>
|
||||
<dd>The reason which caused the resource to be assigned to happen</dd>
|
||||
<dt><code>resrc</code></dt>
|
||||
<dt>resrc</dt>
|
||||
<dd>The type of resource assigned. Set to <code>redir</code></dd>
|
||||
<dt><code>bus</code></dt>
|
||||
<dt>bus</dt>
|
||||
<dd>The bus type, only <code>usb</code> allowed</dd>
|
||||
<dt><code>device</code></dt>
|
||||
<dt>device</dt>
|
||||
<dd>The device type, only <code>USB redir</code> allowed</dd>
|
||||
</dl>
|
||||
|
||||
@@ -344,11 +344,11 @@
|
||||
</p>
|
||||
|
||||
<dl>
|
||||
<dt><code>reason</code></dt>
|
||||
<dt>reason</dt>
|
||||
<dd>The reason which caused the resource to be assigned to happen</dd>
|
||||
<dt><code>resrc</code></dt>
|
||||
<dt>resrc</dt>
|
||||
<dd>The type of resource assigned. Set to <code>cgroup</code></dd>
|
||||
<dt><code>cgroup</code></dt>
|
||||
<dt>cgroup</dt>
|
||||
<dd>The name of the cgroup controller</dd>
|
||||
</dl>
|
||||
|
||||
|
@@ -76,11 +76,7 @@ password=letmein
|
||||
|
||||
[credentials-dev]
|
||||
username=joe
|
||||
password=hello
|
||||
|
||||
[credentials-defgrp]
|
||||
username=defuser
|
||||
password=defpw</pre>
|
||||
password=hello</pre>
|
||||
|
||||
<p>
|
||||
The second set of groups provide mappings of credentials to
|
||||
@@ -94,8 +90,7 @@ credentials=$CREDENTIALS</pre>
|
||||
|
||||
<p>
|
||||
For example, following the previous example, here is how to
|
||||
map some machines. For convenience libvirt supports a default
|
||||
mapping of credentials to machines:
|
||||
list some machines
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
@@ -111,15 +106,8 @@ credentials=test
|
||||
[auth-libvirt-prod1.example.com]
|
||||
credentials=prod
|
||||
|
||||
[auth-libvirt-default]
|
||||
credentials=defgrp
|
||||
|
||||
[auth-esx-dev1.example.com]
|
||||
credentials=dev
|
||||
|
||||
[auth-esx-default]
|
||||
credentials=defgrp</pre>
|
||||
|
||||
credentials=dev</pre>
|
||||
|
||||
<p>
|
||||
The following service types are known to libvirt
|
||||
|
@@ -13,7 +13,7 @@
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
$ xz -c libvirt-x.x.x.tar.xz | tar xvf -
|
||||
$ gunzip -c libvirt-x.x.x.tar.gz | tar xvf -
|
||||
$ cd libvirt-x.x.x
|
||||
$ ./configure</pre>
|
||||
|
||||
|
@@ -28,67 +28,24 @@
|
||||
</p>
|
||||
|
||||
<ul>
|
||||
<li><a href="ftp://libvirt.org/libvirt/libvirt-git-snapshot.tar.xz">libvirt.org FTP server</a></li>
|
||||
<li><a href="http://libvirt.org/sources/libvirt-git-snapshot.tar.xz">libvirt.org HTTP server</a></li>
|
||||
<li><a href="ftp://libvirt.org/libvirt/libvirt-git-snapshot.tar.gz">libvirt.org FTP server</a></li>
|
||||
<li><a href="http://libvirt.org/sources/libvirt-git-snapshot.tar.gz">libvirt.org HTTP server</a></li>
|
||||
</ul>
|
||||
|
||||
<h2><a name="schedule">Primary release schedule</a></h2>
|
||||
|
||||
<p>
|
||||
Libvirt follows a time based plan, with releases made once a month
|
||||
on the 1st of each month give or take a few days. The only exception
|
||||
is at the start of the year where there are two 6 weeks gaps (first
|
||||
release in the middle of Jan, then skip the Feb release), giving
|
||||
a total of 11 releases a year.
|
||||
</p>
|
||||
|
||||
<h2><a name="numbering">Release numbering</a></h2>
|
||||
|
||||
<p>
|
||||
Since libvirt 2.0.0, a time based version numbering rule
|
||||
is applied. As such, the changes in version number have
|
||||
do not have any implications with respect to the scope of
|
||||
features or bugfixes included, the stability of the code,
|
||||
or the API / ABI compatibility (libvirt API / ABI is guaranteed
|
||||
stable forever). The rules applied for changing the libvirt
|
||||
version number are:
|
||||
</p>
|
||||
|
||||
<dl>
|
||||
<dt><code>major</code></dt>
|
||||
<dd>incremented by 1 for the first release of the year (the
|
||||
Jan 15th release)</dd>
|
||||
<dt><code>minor</code></dt>
|
||||
<dd>incremented by 1 for each monthly release from git master</dd>
|
||||
<dt><code>micro</code></dt>
|
||||
<dd>always 0 for releases from git master, incremented by 1
|
||||
for each stable maintenance release</dd>
|
||||
</dl>
|
||||
|
||||
<p>
|
||||
Prior to 2.0.0, the major/minor numbers were incremented
|
||||
fairly arbitrarily, and maintenance releases appended a
|
||||
fourth digit.
|
||||
</p>
|
||||
|
||||
<h2><a name="maintenance">Maintenance releases</a></h2>
|
||||
<p>
|
||||
In the git repository are several stable maintenance branches,
|
||||
matching the
|
||||
pattern <code>v<i>major</i>.<i>minor</i>-maint</code>;
|
||||
pattern <code>v<i>major</i>.<i>minor</i>.<i>micro</i>-maint</code>;
|
||||
these branches are forked off the corresponding
|
||||
<code>v<i>major</i>.<i>minor</i>.0</code> formal
|
||||
<code>v<i>major</i>.<i>minor</i>.<i>micro</i></code> formal
|
||||
release, and may have further releases of the
|
||||
form <code>v<i>major</i>.<i>minor</i>.<i>micro</i></code>.
|
||||
form <code>v<i>major</i>.<i>minor</i>.<i>micro</i>.<i>rel</i></code>.
|
||||
These maintenance branches should only contain bug fixes, and no
|
||||
new features, backported from the master branch, and are
|
||||
supported as long as at least one downstream distribution
|
||||
expresses interest in a given branch. These maintenance
|
||||
branches are considered during CVE analysis. In contrast
|
||||
to the primary releases which are made once a month, there
|
||||
is no formal schedule for the maintenance releases, which
|
||||
are made whenever there is a need to make available key
|
||||
bugfixes to downstream consumers.
|
||||
branches are considered during CVE analysis.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
|
@@ -80,15 +80,15 @@ to be provided by all container technologies on Linux.
|
||||
</p>
|
||||
|
||||
<dl>
|
||||
<dt><code>container</code></dt>
|
||||
<dt>container</dt>
|
||||
<dd>The fixed string <code>libvirt-lxc</code> to identify libvirt as the creator</dd>
|
||||
<dt><code>container_uuid</code></dt>
|
||||
<dt>container_uuid</dt>
|
||||
<dd>The UUID assigned to the container by libvirt</dd>
|
||||
<dt><code>PATH</code></dt>
|
||||
<dt>PATH</dt>
|
||||
<dd>The fixed string <code>/bin:/usr/bin</code></dd>
|
||||
<dt><code>TERM</code></dt>
|
||||
<dt>TERM</dt>
|
||||
<dd>The fixed string <code>linux</code></dd>
|
||||
<dt><code>HOME</code></dt>
|
||||
<dt>HOME</dt>
|
||||
<dd>The fixed string <code>/</code></dd>
|
||||
</dl>
|
||||
|
||||
@@ -98,11 +98,11 @@ environment variables are also provided
|
||||
</p>
|
||||
|
||||
<dl>
|
||||
<dt><code>LIBVIRT_LXC_NAME</code></dt>
|
||||
<dt>LIBVIRT_LXC_NAME</dt>
|
||||
<dd>The name assigned to the container by libvirt</dd>
|
||||
<dt><code>LIBVIRT_LXC_UUID</code></dt>
|
||||
<dt>LIBVIRT_LXC_UUID</dt>
|
||||
<dd>The UUID assigned to the container by libvirt</dd>
|
||||
<dt><code>LIBVIRT_LXC_CMDLINE</code></dt>
|
||||
<dt>LIBVIRT_LXC_CMDLINE</dt>
|
||||
<dd>The unparsed command line arguments specified in the container configuration.
|
||||
Use of this is discouraged, in favour of passing arguments directly to the
|
||||
container init process via the <code>initarg</code> config element.</dd>
|
||||
|
BIN
docs/et.png
Normal file
BIN
docs/et.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 9.5 KiB |
BIN
docs/footer_corner.png
Normal file
BIN
docs/footer_corner.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.3 KiB |
BIN
docs/footer_pattern.png
Normal file
BIN
docs/footer_pattern.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 817 B |
@@ -73,19 +73,19 @@
|
||||
<dd>This expresses what kind of operating system the hypervisor
|
||||
is able to run. Possible values are:
|
||||
<dl>
|
||||
<dt><code>xen</code></dt>
|
||||
<dt>xen</dt>
|
||||
<dd>for XEN</dd>
|
||||
|
||||
<dt><code>linux</code></dt>
|
||||
<dt>linux</dt>
|
||||
<dd>legacy alias for <code>xen</code></dd>
|
||||
|
||||
<dt><code>hvm</code></dt>
|
||||
<dt>hvm</dt>
|
||||
<dd>Unmodified operating system</dd>
|
||||
|
||||
<dt><code>exe</code></dt>
|
||||
<dt>exe</dt>
|
||||
<dd>Container based virtualization</dd>
|
||||
|
||||
<dt><code>uml</code></dt>
|
||||
<dt>uml</dt>
|
||||
<dd>User Mode Linux</dd>
|
||||
</dl>
|
||||
</dd>
|
||||
@@ -97,37 +97,37 @@
|
||||
<dd>This optional element encases possible features that can be used
|
||||
with a guest of described type. Possible subelements are:
|
||||
<dl>
|
||||
<dt><code>pae</code></dt><dd>If present, 32-bit guests can use PAE
|
||||
<dt>pae</dt><dd>If present, 32-bit guests can use PAE
|
||||
address space extensions, <span class="since">since
|
||||
0.4.1</span></dd>
|
||||
<dt><code>nonpae</code></dt><dd>If present, 32-bit guests can be run
|
||||
<dt>nonpae</dt><dd>If present, 32-bit guests can be run
|
||||
without requiring PAE, <span class="since">since
|
||||
0.4.1</span></dd>
|
||||
<dt><code>ia64_be</code></dt><dd>If present, IA64 guests can be run in
|
||||
<dt>ia64_be</dt><dd>If present, IA64 guests can be run in
|
||||
big-endian mode, <span class="since">since 0.4.1</span></dd>
|
||||
<dt><code>acpi</code></dt><dd>If this element is present,
|
||||
<dt>acpi</dt><dd>If this element is present,
|
||||
the <code>default</code> attribute describes whether the
|
||||
hypervisor exposes ACPI to the guest by default, and
|
||||
the <code>toggle</code> attribute describes whether the
|
||||
user can override this
|
||||
default. <span class="since">Since 0.4.1</span></dd>
|
||||
<dt><code>apic</code></dt><dd>If this element is present,
|
||||
<dt>apic</dt><dd>If this element is present,
|
||||
the <code>default</code> attribute describes whether the
|
||||
hypervisor exposes APIC to the guest by default, and
|
||||
the <code>toggle</code> attribute describes whether the
|
||||
user can override this
|
||||
default. <span class="since">Since 0.4.1</span></dd>
|
||||
<dt><code>cpuselection</code></dt><dd>If this element is present, the
|
||||
<dt>cpuselection</dt><dd>If this element is present, the
|
||||
hypervisor supports the <code><cpu></code> element
|
||||
within a domain definition for fine-grained control over
|
||||
the CPU presented to the
|
||||
guest. <span class="since">Since 0.7.5</span></dd>
|
||||
<dt><code>deviceboot</code></dt><dd>If this element is present,
|
||||
<dt>deviceboot</dt><dd>If this element is present,
|
||||
the <code><boot order='...'/></code> element can
|
||||
be used inside devices, rather than the older boot
|
||||
specification by category. <span class="since">Since
|
||||
0.8.8</span></dd>
|
||||
<dt><code>disksnapshot</code></dt><dd>If this element is present,
|
||||
<dt>disksnapshot</dt><dd>If this element is present,
|
||||
the <code>default</code> attribute describes whether
|
||||
external disk snapshots are supported. If absent,
|
||||
external snapshots may still be supported, but it
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -61,18 +61,18 @@
|
||||
</domainCapabilities>
|
||||
</pre>
|
||||
<dl>
|
||||
<dt><code>path</code></dt>
|
||||
<dt>path</dt>
|
||||
<dd>The full path to the emulator binary.</dd>
|
||||
|
||||
<dt><code>domain</code></dt>
|
||||
<dt>domain</dt>
|
||||
<dd>Describes the <a href="formatdomain.html#elements">virtualization
|
||||
type</a> (or so called domain type).</dd>
|
||||
|
||||
<dt><code>machine</code></dt>
|
||||
<dt>machine</dt>
|
||||
<dd>The domain's <a href="formatdomain.html#elementsOSBIOS">machine
|
||||
type</a>.</dd>
|
||||
|
||||
<dt><code>arch</code></dt>
|
||||
<dt>arch</dt>
|
||||
<dd>The domain's <a href="formatdomain.html#elementsOSBIOS">
|
||||
architecture</a>.</dd>
|
||||
|
||||
@@ -92,7 +92,7 @@
|
||||
</pre>
|
||||
|
||||
<dl>
|
||||
<dt><code>vcpu</code></dt>
|
||||
<dt>vcpu</dt>
|
||||
<dd>The maximum number of supported virtual CPUs</dd>
|
||||
</dl>
|
||||
|
||||
@@ -126,18 +126,18 @@
|
||||
<p>For the <code>loader</code> element, the following can occur:</p>
|
||||
|
||||
<dl>
|
||||
<dt><code>value</code></dt>
|
||||
<dt>value</dt>
|
||||
<dd>List of known loader paths. Currently this is only used
|
||||
to advertise known locations of OVMF binaries for qemu. Binaries
|
||||
will only be listed if they actually exist on disk.</dd>
|
||||
|
||||
<dt><code>type</code></dt>
|
||||
<dt>type</dt>
|
||||
<dd>Whether loader is a typical BIOS (<code>rom</code>) or
|
||||
an UEFI binary (<code>pflash</code>). This refers to
|
||||
<code>type</code> attribute of the <loader/>
|
||||
element.</dd>
|
||||
|
||||
<dt><code>readonly</code></dt>
|
||||
<dt>readonly</dt>
|
||||
<dd>Options for the <code>readonly</code> attribute of the
|
||||
<loader/> element.</dd>
|
||||
</dl>
|
||||
@@ -145,7 +145,7 @@
|
||||
<h3><a name="elementsDevices">Devices</a></h3>
|
||||
|
||||
<p>
|
||||
Another set of XML elements describe the supported devices and their
|
||||
The final set of XML elements describe the supported devices and their
|
||||
capabilities. All devices occur as children of the main
|
||||
<code>devices</code> element.
|
||||
</p>
|
||||
@@ -175,7 +175,7 @@
|
||||
<code>floppy</code>, or <code>lun</code>.</p>
|
||||
|
||||
<h4><a name="elementsDisks">Hard drives, floppy disks, CDROMs</a></h4>
|
||||
<p>Disk capabilities are exposed under the <code>disk</code> element. For
|
||||
<p>Disk capabilities are exposed under <code>disk</code> element. For
|
||||
instance:</p>
|
||||
|
||||
<pre>
|
||||
@@ -207,72 +207,15 @@
|
||||
</pre>
|
||||
|
||||
<dl>
|
||||
<dt><code>diskDevice</code></dt>
|
||||
<dt>diskDevice</dt>
|
||||
<dd>Options for the <code>device</code> attribute of the <disk/>
|
||||
element.</dd>
|
||||
|
||||
<dt><code>bus</code></dt>
|
||||
<dt>bus</dt>
|
||||
<dd>Options for the <code>bus</code> attribute of the <target/>
|
||||
element for a <disk/>.</dd>
|
||||
</dl>
|
||||
|
||||
|
||||
<h4><a name="elementsGraphics">Graphical framebuffers</a></h4>
|
||||
<p>Graphics device capabilities are exposed under the
|
||||
<code>graphics</code> element. For instance:</p>
|
||||
|
||||
<pre>
|
||||
<domainCapabilities>
|
||||
...
|
||||
<devices>
|
||||
<graphics supported='yes'>
|
||||
<enum name='type'>
|
||||
<value>sdl</value>
|
||||
<value>vnc</value>
|
||||
<value>spice</value>
|
||||
</enum>
|
||||
</graphics>
|
||||
...
|
||||
</devices>
|
||||
</domainCapabilities>
|
||||
</pre>
|
||||
|
||||
<dl>
|
||||
<dt><code>type</code></dt>
|
||||
<dd>Options for the <code>type</code> attribute of the <graphics/>
|
||||
element.</dd>
|
||||
</dl>
|
||||
|
||||
|
||||
<h4><a name="elementsVideo">Video device</a></h4>
|
||||
<p>Video device capabilities are exposed under the
|
||||
<code>video</code> element. For instance:</p>
|
||||
|
||||
<pre>
|
||||
<domainCapabilities>
|
||||
...
|
||||
<devices>
|
||||
<video supported='yes'>
|
||||
<enum name='modelType'>
|
||||
<value>vga</value>
|
||||
<value>cirrus</value>
|
||||
<value>vmvga</value>
|
||||
<value>qxl</value>
|
||||
<value>virtio</value>
|
||||
</enum>
|
||||
</video>
|
||||
...
|
||||
</devices>
|
||||
</domainCapabilities>
|
||||
</pre>
|
||||
|
||||
<dl>
|
||||
<dt><code>modelType</code></dt>
|
||||
<dd>Options for the <code>type</code> attribute of the
|
||||
<video><model> element.</dd>
|
||||
</dl>
|
||||
|
||||
|
||||
<h4><a name="elementsHostDev">Host device assignment</a></h4>
|
||||
<p>Some host devices can be passed through to a guest (e.g. USB, PCI and
|
||||
SCSI). Well, only if the following is enabled:</p>
|
||||
@@ -314,66 +257,25 @@
|
||||
</pre>
|
||||
|
||||
<dl>
|
||||
<dt><code>mode</code></dt>
|
||||
<dt>mode</dt>
|
||||
<dd>Options for the <code>mode</code> attribute of the <hostdev/>
|
||||
element.</dd>
|
||||
|
||||
<dt><code>startupPolicy</code></dt>
|
||||
<dt>startupPolicy</dt>
|
||||
<dd>Options for the <code>startupPolicy</code> attribute of the
|
||||
<hostdev/> element.</dd>
|
||||
|
||||
<dt><code>subsysType</code></dt>
|
||||
<dt>subsysType</dt>
|
||||
<dd>Options for the <code>type</code> attribute of the <hostdev/>
|
||||
element in case of <code>mode="subsystem"</code>.</dd>
|
||||
|
||||
<dt><code>capsType</code></dt>
|
||||
<dt>capsType</dt>
|
||||
<dd>Options for the <code>type</code> attribute of the <hostdev/>
|
||||
element in case of <code>mode="capabilities"</code>.</dd>
|
||||
|
||||
<dt><code>pciBackend</code></dt>
|
||||
<dt>pciBackend</dt>
|
||||
<dd>Options for the <code>name</code> attribute of the <driver/>
|
||||
element.</dd>
|
||||
</dl>
|
||||
|
||||
<h3><a name="elementsFeatures">Features</a></h3>
|
||||
|
||||
<p>One more set of XML elements describe the supported features and
|
||||
their capabilities. All features occur as children of the main
|
||||
<code>features</code> element.</p>
|
||||
|
||||
<pre>
|
||||
<domainCapabilities>
|
||||
...
|
||||
<features>
|
||||
<gic supported='yes'>
|
||||
<enum name='version'>
|
||||
<value>2</value>
|
||||
<value>3</value>
|
||||
</enum>
|
||||
</gic>
|
||||
</features>
|
||||
</domainCapabilities>
|
||||
</pre>
|
||||
|
||||
<p>Reported capabilities are expressed as an enumerated list of
|
||||
possible values for each of the elements or attributes. For example, the
|
||||
<code>gic</code> element has an attribute <code>version</code> which can
|
||||
support the values <code>2</code> or <code>3</code>.</p>
|
||||
|
||||
<p>For information about the purpose of each feature, see the
|
||||
<a href="formatdomain.html#elementsFeatures">relevant section</a> in
|
||||
the domain XML documentation.
|
||||
</p>
|
||||
|
||||
<h4><a name="elementsGIC">GIC capabilities</a></h4>
|
||||
|
||||
<p>GIC capabilities are exposed under the <code>gic</code> element.</p>
|
||||
|
||||
<dl>
|
||||
<dt><code>version</code></dt>
|
||||
<dd>Options for the <code>version</code> attribute of the
|
||||
<code>gic</code> element.</dd>
|
||||
</dl>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
@@ -54,14 +54,13 @@
|
||||
The format must be RFC 4122 compliant, eg <code>3e3fce45-4f53-4fa7-bb32-11f34168b82b</code>.
|
||||
If omitted when defining/creating a new network, a random
|
||||
UUID is generated. <span class="since">Since 0.3.0</span></dd>
|
||||
<dt><code>ipv6</code></dt>
|
||||
<dd>When set to <code>yes</code>, the optional parameter
|
||||
<code>ipv6</code> enables
|
||||
<dt><code>ipv6='yes'</code></dt>
|
||||
<dd>The new, optional parameter <code>ipv6='yes'</code> enables
|
||||
a network definition with no IPv6 gateway addresses specified
|
||||
to have guest-to-guest communications. For further information,
|
||||
see the example below for the example with no gateway addresses.
|
||||
<span class="since">Since 1.0.1</span></dd>
|
||||
<dt><code>trustGuestRxFilters</code></dt>
|
||||
<dt><code>trustGuestRxFilters='yes'</code></dt>
|
||||
<dd>The optional parameter <code>trustGuestRxFilters</code> can
|
||||
be used to set that attribute of the same name for each domain
|
||||
interface connected to this network (<span class="since">since
|
||||
@@ -608,47 +607,31 @@
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
If (and only if) the network connection used by the guest
|
||||
supports VLAN tagging transparent to the guest, an
|
||||
optional <code><vlan></code> element can specify one or
|
||||
more VLAN tags to apply to the guest's network
|
||||
traffic <span class="since">Since 0.10.0</span>. Network
|
||||
connections that support guest-transparent VLAN tagging include
|
||||
1) type='bridge' interfaces connected to an Open vSwitch bridge
|
||||
<span class="since">Since 0.10.0</span>, 2) SRIOV Virtual
|
||||
Functions (VF) used via type='hostdev' (direct device
|
||||
assignment) <span class="since">Since 0.10.0</span>, and 3)
|
||||
SRIOV VFs used via type='direct' with mode='passthrough'
|
||||
(macvtap "passthru" mode) <span class="since">Since
|
||||
1.3.5</span>. All other connection types, including standard
|
||||
If (and only if) the network type supports vlan tagging
|
||||
transparent to the guest, an optional <code><vlan></code>
|
||||
element can specify one or more vlan tags to apply to the
|
||||
traffic of all guests using this
|
||||
network <span class="since">Since 0.10.0</span>. (openvswitch
|
||||
and type='hostdev' SR-IOV networks do support transparent vlan
|
||||
tagging of guest traffic; everything else, including standard
|
||||
linux bridges and libvirt's own virtual networks, <b>do not</b>
|
||||
support it. 802.1Qbh (vn-link) and 802.1Qbg (VEPA) switches
|
||||
provide their own way (outside of libvirt) to tag guest traffic
|
||||
onto a specific VLAN. Each tag is given in a
|
||||
separate <code><tag></code> subelement
|
||||
of <code><vlan></code> (for example: <code><tag
|
||||
id='42'/></code>). For VLAN trunking of multiple tags (which
|
||||
is supported only on Open vSwitch connections),
|
||||
multiple <code><tag></code> subelements can be specified,
|
||||
which implies that the user wants to do VLAN trunking on the
|
||||
interface for all the specified tags. In the case that VLAN
|
||||
trunking of a single tag is desired, the optional
|
||||
attribute <code>trunk='yes'</code> can be added to the toplevel
|
||||
<code><vlan></code> element to differentiate trunking of a
|
||||
single tag from normal tagging.
|
||||
onto specific vlans.) As expected, the <code>tag</code>
|
||||
attribute specifies which vlan tag to use. If a network has more
|
||||
than one <code><vlan></code> element defined, it is
|
||||
assumed that the user wants to do VLAN trunking using all the
|
||||
specified tags. In the case that vlan trunking with a single tag
|
||||
is desired, the optional attribute <code>trunk='yes'</code> can
|
||||
be added to the vlan element.
|
||||
</p>
|
||||
<p>
|
||||
For network connections using Open vSwitch it is also possible
|
||||
to configure 'native-tagged' and 'native-untagged' VLAN modes
|
||||
<span class="since">Since 1.1.0.</span> This is done with the
|
||||
optional <code>nativeMode</code> attribute on
|
||||
the <code><tag></code> subelement: <code>nativeMode</code>
|
||||
may be set to 'tagged' or 'untagged'. The <code>id</code>
|
||||
attribute of the <code><tag></code> subelement
|
||||
containing <code>nativeMode</code> sets which VLAN is considered
|
||||
to be the "native" VLAN for this interface, and
|
||||
the <code>nativeMode</code> attribute determines whether or not
|
||||
traffic for that VLAN will be tagged.
|
||||
For network connections using openvswitch it is possible to
|
||||
configure the 'native-tagged' and 'native-untagged' vlan modes
|
||||
<span class="since">Since 1.1.0</span>. This uses the optional
|
||||
<code>nativeMode</code> attribute on the <code><tag></code>
|
||||
element: <code>nativeMode</code> may be set to 'tagged' or
|
||||
'untagged'. The id attribute of the element sets the native vlan.
|
||||
</p>
|
||||
<p>
|
||||
<code><vlan></code> elements can also be specified in
|
||||
|
@@ -97,38 +97,27 @@
|
||||
<dd>
|
||||
This optional element can occur multiple times. If it
|
||||
exists, it has a mandatory <code>type</code> attribute
|
||||
which will be set to:
|
||||
<dl>
|
||||
<dt><code>physical_function</code></dt>
|
||||
<dd>
|
||||
That means there will be a single <code>address</code>
|
||||
subelement which contains the PCI address of the SRIOV
|
||||
Physical Function (PF) that is the parent of this device
|
||||
(and this device is, by implication, an SRIOV Virtual
|
||||
Function (VF)).
|
||||
</dd>
|
||||
<dt><code>virtual_function</code></dt>
|
||||
<dd>
|
||||
In this case this device is an SRIOV PF, and the capability
|
||||
element will have a list of <code>address</code>
|
||||
subelements, one for each VF on this PF. If the host system
|
||||
supports reporting it (via the "sriov_maxvfs" file in the
|
||||
device's sysfs directory) the capability element will also
|
||||
have an attribute named <code>maxCount</code> which is the
|
||||
maximum number of SRIOV VFs supported by this device, which
|
||||
could be higher than the number of VFs that are curently
|
||||
active <span class="since">since 1.3.0</span>; in this case,
|
||||
even if there are currently no active VFs the
|
||||
virtual_functions capabililty will still be shown.
|
||||
</dd>
|
||||
<dt><code>pci-bridge</code> or <code>cardbus-bridge</code></dt>
|
||||
<dd>
|
||||
This shows merely that the lower 7 bits of PCI header type
|
||||
have either value of 1 or 2 respectively. Usually this
|
||||
means such device cannot be used for PCI passthrough.
|
||||
<span class="since">Since 1.3.3</span>
|
||||
</dd>
|
||||
</dl>
|
||||
which will be set to
|
||||
either <code>physical_function</code>
|
||||
or <code>virtual_functions</code>. If the type
|
||||
is <code>physical_function</code>, there will be a
|
||||
single <code>address</code> subelement which contains
|
||||
the PCI address of the SRIOV Physical Function (PF)
|
||||
that is the parent of this device (and this device is,
|
||||
by implication, an SRIOV Virtual Function (VF)). If
|
||||
the type is <code>virtual_functions</code>, then this
|
||||
device is an SRIOV PF, and the capability element will
|
||||
have a list of <code>address</code> subelements, one
|
||||
for each VF on this PF. If the host system supports
|
||||
reporting it (via the "sriov_maxvfs" file in the
|
||||
device's sysfs directory) the capability element will
|
||||
also have an attribute named <code>maxCount</code>
|
||||
which is the maximum number of SRIOV VFs supported by
|
||||
this device, which could be higher than the number of
|
||||
VFs that are curently active <span class="since">since
|
||||
1.3.0</span>; in this case, even if there are
|
||||
currently no active VFs the virtual_functions
|
||||
capabililty will still be shown.
|
||||
</dd>
|
||||
<dt><code>numa</code></dt>
|
||||
<dd>
|
||||
|
@@ -1779,9 +1779,9 @@
|
||||
<br/><br/>
|
||||
</p>
|
||||
|
||||
<h5><a name="nwfelemsRulesProtoMiscv6">ESP, AH, UDPLITE, 'ALL' over IPv6</a></h5>
|
||||
<h5><a name="nwfelemsRulesProtoMiscv6">IGMP, ESP, AH, UDPLITE, 'ALL' over IPv6</a></h5>
|
||||
<p>
|
||||
Protocol ID: <code>esp-ipv6</code>, <code>ah-ipv6</code>, <code>udplite-ipv6</code>, <code>all-ipv6</code>
|
||||
Protocol ID: <code>igmp-ipv6</code>, <code>esp-ipv6</code>, <code>ah-ipv6</code>, <code>udplite-ipv6</code>, <code>all-ipv6</code>
|
||||
<br/>
|
||||
Note: The chain parameter is ignored for this type of traffic
|
||||
and should either be omitted or set to <code>root</code>.
|
||||
|
@@ -123,9 +123,9 @@
|
||||
Secret 1b40a534-8301-45d5-b1aa-11894ebb1735 created
|
||||
#
|
||||
# virsh secret-list
|
||||
UUID Usage
|
||||
UUID Usage
|
||||
-----------------------------------------------------------
|
||||
1b40a534-8301-45d5-b1aa-11894ebb1735 cephx ceph_example
|
||||
1b40a534-8301-45d5-b1aa-11894ebb1735 cephx ceph_example
|
||||
#
|
||||
# CEPHPHRASE=`printf %s "pass phrase" | base64`
|
||||
# virsh secret-set-value 1b40a534-8301-45d5-b1aa-11894ebb1735 $CEPHPHRASE
|
||||
@@ -209,9 +209,9 @@
|
||||
Secret c4dbe20b-b1a3-4ac1-b6e6-2ac97852ebb6 created
|
||||
|
||||
# virsh secret-list
|
||||
UUID Usage
|
||||
UUID Usage
|
||||
-----------------------------------------------------------
|
||||
c4dbe20b-b1a3-4ac1-b6e6-2ac97852ebb6 iscsi libvirtiscsi
|
||||
c4dbe20b-b1a3-4ac1-b6e6-2ac97852ebb6 iscsi libvirtiscsi
|
||||
|
||||
# MYSECRET=`printf %s "mysecret" | base64`
|
||||
# virsh secret-set-value c4dbe20b-b1a3-4ac1-b6e6-2ac97852ebb6 $MYSECRET
|
||||
|
@@ -12,7 +12,7 @@
|
||||
There are several types of snapshots:
|
||||
</p>
|
||||
<dl>
|
||||
<dt>disk snapshot</dt> <!-- exempt from syntax-check -->
|
||||
<dt>disk snapshot</dt>
|
||||
<dd>Contents of disks (whether a subset or all disks associated
|
||||
with the domain) are saved at a given point of time, and can
|
||||
be restored back to that state. On a running guest, a disk
|
||||
@@ -26,14 +26,14 @@
|
||||
since the snapshot in a single file) and external (the
|
||||
snapshot is one file, and the changes since the snapshot are
|
||||
in another file).</dd>
|
||||
<dt>memory state (or VM state)</dt> <!-- exempt from syntax-check -->
|
||||
<dt>memory state (or VM state)</dt>
|
||||
<dd>Tracks only the state of RAM and all other resources in use
|
||||
by the VM. If the disks are unmodified between the time a VM
|
||||
state snapshot is taken and restored, then the guest will
|
||||
resume in a consistent state; but if the disks are modified
|
||||
externally in the meantime, this is likely to lead to data
|
||||
corruption.</dd>
|
||||
<dt>system checkpoint</dt> <!-- exempt from syntax-check -->
|
||||
<dt>system checkpoint</dt>
|
||||
<dd>A combination of disk snapshots for all disks as well as VM
|
||||
memory state, which can be used to resume the guest from where it
|
||||
left off with symptoms similar to hibernation (that is, TCP
|
||||
|
@@ -87,14 +87,6 @@
|
||||
</source>
|
||||
...</pre>
|
||||
|
||||
<pre>
|
||||
...
|
||||
<source>
|
||||
<device path='/dev/mapper/mpatha' part_separator='no'/>
|
||||
<format type='gpt'/>
|
||||
</source>
|
||||
...</pre>
|
||||
|
||||
<pre>
|
||||
...
|
||||
<source>
|
||||
@@ -126,20 +118,10 @@
|
||||
(pool types <code>fs</code>, <code>logical</code>, <code>disk</code>,
|
||||
<code>iscsi</code>, <code>zfs</code>).
|
||||
May be repeated multiple times depending on backend driver. Contains
|
||||
a required attribute <code>path</code> which is either the fully
|
||||
a single attribute <code>path</code> which is either the fully
|
||||
qualified path to the block device node or for <code>iscsi</code>
|
||||
the iSCSI Qualified Name (IQN).
|
||||
<span class="since">Since 0.4.1</span>
|
||||
<p>An optional attribute <code>part_separator</code> for each
|
||||
<code>path</code> may be supplied. Valid values for the attribute
|
||||
may be either "yes" or "no". This attribute is to be used for a
|
||||
<code>disk</code> pool type using a <code>path</code> to a
|
||||
device mapper multipath device. Setting the attribute to "yes"
|
||||
causes libvirt to attempt to generate and find target volume path's
|
||||
using a "p" separator. The default algorithm used by device mapper
|
||||
is to add the "p" separator only when the source device path ends
|
||||
with a number.
|
||||
<span class="since">Since 1.3.1</span></p></dd>
|
||||
<span class="since">Since 0.4.1</span></dd>
|
||||
<dt><code>dir</code></dt>
|
||||
<dd>Provides the source for pools backed by directories (pool
|
||||
types <code>dir</code>, <code>netfs</code>, <code>gluster</code>),
|
||||
@@ -486,7 +468,7 @@
|
||||
A storage volume will generally be either a file or a device
|
||||
node; <span class="since">since 1.2.0</span>, an optional
|
||||
output-only attribute <code>type</code> lists the actual type
|
||||
(file, block, dir, network, netdir or ploop), which is also available
|
||||
(file, block, dir, network, or netdir), which is also available
|
||||
from <code>virStorageVolGetInfo()</code>. The storage volume
|
||||
XML format is available <span class="since">since 0.4.1</span>
|
||||
</p>
|
||||
|
@@ -2,75 +2,71 @@ body {
|
||||
margin: 0em;
|
||||
padding: 0px;
|
||||
color: rgb(0,0,0);
|
||||
font-family: sans-serif;
|
||||
font-size: 90%;
|
||||
font-family: Verdana, Arial, Helvetica, sans-serif;
|
||||
font-size: smaller;
|
||||
background: #ffffff;
|
||||
}
|
||||
|
||||
p, ul, ol, dl {
|
||||
padding: 0px;
|
||||
margin: 0px;
|
||||
line-height: 150%;
|
||||
}
|
||||
|
||||
p {
|
||||
ol,ul {
|
||||
margin-left: 3em;
|
||||
}
|
||||
|
||||
ol,ul,dl,p {
|
||||
margin-top: 1em;
|
||||
margin-bottom: 1em;
|
||||
}
|
||||
|
||||
ul, ol {
|
||||
margin-left: 2em;
|
||||
p:first-line {
|
||||
margin-right: 1em;
|
||||
}
|
||||
|
||||
dt {
|
||||
div.body p:first-letter {
|
||||
font-size: 1.2em;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
h1,h2,h3,h4,h5,h6 {
|
||||
font-weight: bold;
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
margin-top: 0.5em;
|
||||
}
|
||||
|
||||
div.footer {
|
||||
margin-top: 1em;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 2em;
|
||||
}
|
||||
h2 {
|
||||
font-size: 1.6em;
|
||||
}
|
||||
h3 {
|
||||
font-size: 1.4em;
|
||||
}
|
||||
h4 {
|
||||
font-size: 1.2em;
|
||||
}
|
||||
h5 {
|
||||
font-size: 1em;
|
||||
}
|
||||
h6 {
|
||||
font-size: 0.8em;
|
||||
}
|
||||
|
||||
dl dt {
|
||||
margin-left: 1em;
|
||||
margin-right: 2em;
|
||||
}
|
||||
|
||||
dt code {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
dl dd {
|
||||
margin-left: 2em;
|
||||
margin-right: 2em;
|
||||
margin-bottom: 0.5em;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
font-weight: bold;
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
margin-bottom: 0.25em;
|
||||
border-bottom: 1px solid #aaa;
|
||||
}
|
||||
|
||||
h1 {
|
||||
margin-top: 0em;
|
||||
font-size: 1.6em;
|
||||
}
|
||||
|
||||
h2 {
|
||||
margin-top: 1.0em;
|
||||
font-size: 1.4em;
|
||||
}
|
||||
|
||||
h3 {
|
||||
margin-top: 1.0em;
|
||||
font-size: 1.2em;
|
||||
}
|
||||
|
||||
h4 {
|
||||
margin-top: 1.0em;
|
||||
font-size: 1.1em;
|
||||
}
|
||||
|
||||
h5 {
|
||||
margin-top: 0.75em;
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
h6 {
|
||||
margin-top: 0.75em;
|
||||
font-size: 0.8em;
|
||||
}
|
||||
|
@@ -189,19 +189,6 @@
|
||||
under gdb or Valgrind.
|
||||
</p>
|
||||
|
||||
<p>When running our test suite it may happen that the test result is
|
||||
nondeterministic because of the test suite relying on a particular file
|
||||
in the system being accessible or having some specific value. To catch
|
||||
this kind of errors, the test suite has a module for that prints any
|
||||
path touched that fulfils constraints described above
|
||||
into a file. To enable it just set
|
||||
<code>VIR_TEST_FILE_ACCESS</code> environment variable.
|
||||
Then <code>VIR_TEST_FILE_ACCESS_OUTPUT</code> environment
|
||||
variable can alter location where the file is stored.</p>
|
||||
<pre>
|
||||
VIR_TEST_FILE_ACCESS=1 VIR_TEST_FILE_ACCESS_OUTPUT="/tmp/file_access.txt" ./qemuxml2argvtest
|
||||
</pre>
|
||||
|
||||
</li>
|
||||
<li><p>The Valgrind test should produce similar output to
|
||||
<code>make check</code>. If the output has traces within libvirt
|
||||
|
@@ -14,7 +14,6 @@
|
||||
<li>Introduction to basic rules and guidelines for
|
||||
<a href="hacking.html">hacking</a> on libvirt code</li>
|
||||
<li>Guide to adding <a href="api_extension.html">public APIs</a></li>
|
||||
<li>Insight into libvirt <a href="internals/eventloop.html">event loop and worker pool</a></li>
|
||||
<li>Approach for <a href="internals/command.html">spawning commands</a>
|
||||
from libvirt driver code</li>
|
||||
<li>The libvirt <a href="internals/rpc.html">RPC infrastructure</a></li>
|
||||
|
@@ -1,106 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<body>
|
||||
<h1>Libvirt's event loop</h1>
|
||||
|
||||
<ul id="toc"></ul>
|
||||
|
||||
<p>
|
||||
This page describes the event loop approach used in
|
||||
libvirt. Both server and client.
|
||||
</p>
|
||||
|
||||
<h2><a name="event_loop">Event driven programming</a></h2>
|
||||
|
||||
<p>Traditionally, a program simply ran once, then terminated.
|
||||
This type of program was very common in the early days of
|
||||
computing, and lacked any form of user interactivity. This is
|
||||
still used frequently, particularly in small one purpose
|
||||
programs.</p>
|
||||
|
||||
<p>However, that approach is not suitable for all the types
|
||||
of applications. For instance graphical applications spend
|
||||
most of their run time waiting for an input from user. Only
|
||||
after it happened (in our example a button was clicked, a key
|
||||
pressed, etc.) an event is generated to which they respond
|
||||
by executing desired function. If generalized, this is how
|
||||
many long running programs (daemons) work. Even those who are
|
||||
not waiting for direct user input and have no graphical
|
||||
interface. Such as Libvirt.</p>
|
||||
|
||||
<img alt="event loop" src="http://libvirt.org/git/?p=libvirt-media.git;a=blob_plain;f=png/event_loop_simple.png;hb=HEAD"/>
|
||||
|
||||
<p>In Libvirt this approach is used in combination with
|
||||
<code>poll(2)</code> as all the communication with its
|
||||
clients (and domains it manages too) happens through sockets.
|
||||
Therefore whenever new client connects, it is given exclusive
|
||||
file descriptor which is then watched for incoming events,
|
||||
e.g. messages. </p>
|
||||
|
||||
<h2><a name="api">The event loop API</a></h2>
|
||||
|
||||
<p>To work with event loop from our code we have plenty of
|
||||
APIs.</p>
|
||||
|
||||
<ul>
|
||||
<li><code>virEventAddHandle</code>: Registers a
|
||||
callback for monitoring file handle events.</li>
|
||||
<li><code>virEventUpdateHandle</code>: Change set of events
|
||||
monitored file handle is being watched for.</li>
|
||||
<li><code>virEventRemoveHandle</code>: Unregisters
|
||||
previously registered file handle so that it is no
|
||||
longer monitored for any events.</li>
|
||||
<li><code>virEventAddTimeout</code>: Registers a
|
||||
callback for timer event.</li>
|
||||
<li><code>virEventUpdateTimeout</code>: Changes frequency
|
||||
for a timer.</li>
|
||||
<li><code>virEventRemoveTimeout</code>: Unregisters
|
||||
a timer.</li>
|
||||
</ul>
|
||||
|
||||
<p>For more information on these APIs continue reading <a
|
||||
href="../html/libvirt-libvirt-event.html">here</a>.</p>
|
||||
|
||||
<h2><a name="worker_pool">Worker pool</a></h2>
|
||||
|
||||
<p>Looking back at the image above we can see one big
|
||||
limitation. While processing a message event loop is blocked
|
||||
and for an outside observer unresponsive. This is not
|
||||
acceptable for Libvirt. Therefore we have came up with the
|
||||
following solution.</p>
|
||||
|
||||
<img alt="event loop" src="http://libvirt.org/git/?p=libvirt-media.git;a=blob_plain;f=png/event_loop_worker.png;hb=HEAD"/>
|
||||
|
||||
<p>The event loop does only necessary minimum and hand over
|
||||
message processing to another thread. In fact, there can be
|
||||
as many processing threads as configured increasing
|
||||
processing power.</p>
|
||||
|
||||
<p>To break this high level description into smaller pieces,
|
||||
here is what happens when user calls an API:</p>
|
||||
<ol>
|
||||
<li>User (or management application) calls a Libvirt API.
|
||||
Depending on the connection URI, this may or may not
|
||||
involve server. Well, for the sake of our
|
||||
demonstration we assume the former.</li>
|
||||
<li>Remote driver encodes the API among it's arguments
|
||||
into an <a href="rpc.html">RPC message</a> and sends
|
||||
it to the server.</li>
|
||||
<li>Here, server is waiting in <code>poll(2)</code> for
|
||||
an event, like incoming message.</li>
|
||||
<li>As soon as the first bytes of message are received,
|
||||
even loop wakes up and server starts reading the
|
||||
whole message.</li>
|
||||
<li>Once fully read, the event loop notifies threads
|
||||
known as worker threads from which one picks the incoming
|
||||
message, decodes and process it.</li>
|
||||
<li>As soon as API execution is finished, a reply is sent
|
||||
to the client.</li>
|
||||
</ol>
|
||||
|
||||
<p>In case that there's no free worker to process an incoming
|
||||
message in step 5, message is placed at the end of a message
|
||||
queue and is processed in next iteration.</p>
|
||||
</body>
|
||||
</html>
|
@@ -1,4 +1,12 @@
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
h1 {
|
||||
font-weight: normal;
|
||||
color: #3c857c;
|
||||
}
|
||||
h1 strong {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
h2, h3, h4, h5, h6 {
|
||||
color: #3c857c;
|
||||
}
|
||||
|
||||
@@ -47,6 +55,12 @@ h1, h2, h3, h4, h5, h6 {
|
||||
padding: 0px;
|
||||
margin: 0px;
|
||||
border: 0px;
|
||||
font-weight: bold;
|
||||
font-size: 1.2em;
|
||||
}
|
||||
|
||||
#menu li ul li {
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
#menu ul li a, #menu ul li span {
|
||||
@@ -80,7 +94,6 @@ h1, h2, h3, h4, h5, h6 {
|
||||
#menu ul.l1 li .inactive {
|
||||
border-left: 6px solid #dfebea;
|
||||
}
|
||||
|
||||
#menu ul.l1 li .active {
|
||||
border-left: 6px solid #a5c6c2;
|
||||
}
|
||||
@@ -96,6 +109,7 @@ h1, h2, h3, h4, h5, h6 {
|
||||
padding-left: 3em;
|
||||
}
|
||||
|
||||
|
||||
#headerLogo {
|
||||
position: absolute;
|
||||
top: 0px;
|
||||
@@ -104,7 +118,6 @@ h1, h2, h3, h4, h5, h6 {
|
||||
width: 400px;
|
||||
background: url(libvirt-header-logo.png);
|
||||
}
|
||||
|
||||
#headerSearch {
|
||||
position: absolute;
|
||||
top: 0px;
|
||||
@@ -129,6 +142,7 @@ h1, h2, h3, h4, h5, h6 {
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
|
||||
#sitemap ul li {
|
||||
list-style: none;
|
||||
}
|
||||
@@ -163,6 +177,7 @@ a {
|
||||
color: #566866;
|
||||
}
|
||||
|
||||
|
||||
div.api {
|
||||
border: 1px solid #999999;
|
||||
background: #eeeeee;
|
||||
@@ -188,6 +203,7 @@ div.api table td, div.variablelist table td {
|
||||
padding-left: 1em;
|
||||
}
|
||||
|
||||
|
||||
h1 a, h2 a, h3 a, h4 a, h5 a {
|
||||
color: inherit;
|
||||
text-decoration: inherit;
|
||||
@@ -227,6 +243,36 @@ p.image {
|
||||
background: #c5dbd8;
|
||||
}
|
||||
|
||||
#footer {
|
||||
clear: both;
|
||||
position: relative;
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
border: 0px;
|
||||
width: 100%;
|
||||
height: 180px;
|
||||
background: #FFFFFF;
|
||||
/* background: #757575; */
|
||||
}
|
||||
/* This is hidden from IE <= 6 because it can't do transparency */
|
||||
/* body > #footer {
|
||||
background: #757575 url(footer_pattern.png) repeat-x;
|
||||
} */
|
||||
|
||||
#footer p {
|
||||
position: absolute;
|
||||
top: 0px;
|
||||
left: 0px;
|
||||
margin: 0px;
|
||||
border: 0px solid red;
|
||||
width: 220px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
#footer p a img {
|
||||
border: 0px;
|
||||
}
|
||||
|
||||
#projects {
|
||||
margin: 0px;
|
||||
border: 0px;
|
||||
@@ -236,6 +282,7 @@ p.image {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
|
||||
#projects dl {
|
||||
margin: 0px;
|
||||
border: 0px solid white;
|
||||
@@ -244,6 +291,10 @@ p.image {
|
||||
top: 0px;
|
||||
left: 0px;
|
||||
}
|
||||
/* This is hidden from IE <= 6 because it can't do transparency */
|
||||
head:first-child+body #projects dl {
|
||||
background: url(footer_corner.png) no-repeat ! important;
|
||||
}
|
||||
|
||||
#projects #p1 {
|
||||
margin-left: 25%;
|
||||
@@ -268,15 +319,16 @@ p.image {
|
||||
#projects #p1 dt, #projects #p1 dd {
|
||||
width: 33%;
|
||||
}
|
||||
|
||||
#projects #p2 dt, #projects #p2 dd {
|
||||
width: 50%;
|
||||
}
|
||||
|
||||
#projects #p3 dt, #projects #p3 dd {
|
||||
width: 99%;
|
||||
}
|
||||
|
||||
#projects {
|
||||
}
|
||||
|
||||
#projects span {
|
||||
font-size: 0.8em;
|
||||
display: block;
|
||||
@@ -300,6 +352,13 @@ p.image {
|
||||
color: #ccc;
|
||||
}
|
||||
|
||||
|
||||
#sponsor {
|
||||
color: #757575;
|
||||
text-decoration: inherit;
|
||||
font-size: 1.2em;
|
||||
}
|
||||
|
||||
span.since {
|
||||
color: #3c857c;
|
||||
font-style: italic;
|
||||
@@ -345,7 +404,6 @@ table.data tr.head th {
|
||||
table.data tbody td {
|
||||
background: rgb(240,240,240);
|
||||
}
|
||||
|
||||
table.data tbody td.y {
|
||||
background: rgb(220,255,220);
|
||||
text-align: center;
|
||||
|
@@ -23,19 +23,19 @@
|
||||
</p>
|
||||
|
||||
<dl>
|
||||
<dt><code>nop</code></dt>
|
||||
<dt>nop</dt>
|
||||
<dd>This is a "no op" implementation which does absolutely
|
||||
nothing. This can be used if mutual exclusion between
|
||||
virtual machines is not required, or if it is being
|
||||
solved at another level in the management stack.</dd>
|
||||
<dt><code><a href="locking-lockd.html">lockd</a></code></dt>
|
||||
<dt><a href="locking-lockd.html">lockd</a></dt>
|
||||
<dd>This is the current preferred implementation shipped
|
||||
with libvirt. It uses the <code>virtlockd</code> daemon
|
||||
to manage locks using the POSIX fcntl() advisory locking
|
||||
capability. As such it requires a shared filesystem of
|
||||
some kind be accessible to all hosts which share the
|
||||
same image storage.</dd>
|
||||
<dt><code><a href="locking-sanlock.html">sanlock</a></code></dt>
|
||||
<dt><a href="locking-sanlock.html">sanlock</a></dt>
|
||||
<dd>This is an alternative implementation preferred by
|
||||
the oVirt project. It uses a disk paxos algorithm for
|
||||
maintaining continuously renewed leases. In the default
|
||||
|
@@ -475,7 +475,7 @@
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
Supported by Xen, QEMU, VMware and VirtualBox drivers
|
||||
Supported by Xen, QEMU, VMWare and VirtualBox drivers
|
||||
</p>
|
||||
|
||||
<h3><a name="scenarionativepeer2peer">Native migration, client to and peer2peer between, two libvirtd servers</a></h3>
|
||||
|
File diff suppressed because it is too large
Load Diff
5149
docs/news.html.in
5149
docs/news.html.in
File diff suppressed because it is too large
Load Diff
141
docs/nss.html.in
141
docs/nss.html.in
@@ -1,141 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<body>
|
||||
<h1>Libvirt NSS module</h1>
|
||||
|
||||
<ul id="toc"></ul>
|
||||
|
||||
<p>
|
||||
When it comes to managing guests and executing commands inside them, logging
|
||||
into guest operating system and doing the job is convenient. Users are used
|
||||
to ssh in this case. Ideally:
|
||||
</p>
|
||||
|
||||
<code>ssh user@virtualMachine</code>
|
||||
|
||||
<p>
|
||||
would be nice. But depending on virtual network configuration it might not
|
||||
be always possible. For instance, when using libvirt NATed network it's
|
||||
dnsmasq (spawned by libvirt) who assigns IP addresses to domains. But by
|
||||
default, the dnsmasq process is then not consulted when it comes to host
|
||||
name translation. Users work around this problem by configuring their
|
||||
libvirt network to assign static IP addresses and maintaining
|
||||
<code>/etc/hosts</code> file in sync. But this puts needless burden onto
|
||||
users. This is where NSS module comes handy.
|
||||
</p>
|
||||
|
||||
<h2><a name="Installation">Installation</a></h2>
|
||||
|
||||
<p>
|
||||
Installing the module is really easy:
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
# yum install libvirt-nss
|
||||
</pre>
|
||||
|
||||
<h2><a name="Configuration">Configuration</a></h2>
|
||||
|
||||
<p>
|
||||
Enabling the module is really easy. Just add <b>libvirt</b> into
|
||||
<code>/etc/nsswitch.conf</code> file. For instance:
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
$ cat /etc/nsswitch.conf
|
||||
# /etc/nsswitch.conf:
|
||||
passwd: compat
|
||||
shadow: compat
|
||||
group: compat
|
||||
hosts: files libvirt dns
|
||||
# ...
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
So, in this specific case, whenever ssh program is looking up the host user
|
||||
is trying to connect to, <b>files</b> module is consulted first (which
|
||||
boils down to looking up the host name in <code>/etc/hosts</code> file), if
|
||||
not found <b>libvirt</b> module is consulted then. The DNS is the last
|
||||
effort then, if none of the previous modules matched the host in question.
|
||||
Therefore users should consider the order in which they want the modules to
|
||||
lookup given host name.
|
||||
</p>
|
||||
|
||||
<h2><a name="Internals">How does it work?</a></h2>
|
||||
|
||||
<p>
|
||||
Whenever an Unix process wants to do a host name translation
|
||||
<a href="http://linux.die.net/man/3/gethostbyname"><code>gethostbyname()</code></a>
|
||||
or some variant of it is called. This is a glibc function that takes a
|
||||
string containing the host name, crunch it and produces a list of IP
|
||||
addresses assigned to that host. Now, glibc developers made a really good
|
||||
decision when implementing the internals of the function when they decided
|
||||
to make the function pluggable. Since there can be several sources for the
|
||||
records (e.g. <code>/etc/hosts</code> file, DNS, LDAP, etc.) it would not
|
||||
make much sense to create one big implementation containing all possible
|
||||
cases. What they have done instead is this pluggable mechanism. Small
|
||||
plugins implementing nothing but specific technology for lookup process are
|
||||
provided and the function then calls those plugins. There is just one
|
||||
configuration file that instructs the lookup function in which order should
|
||||
the plugins be called and which plugins should be loaded. For more info
|
||||
reading <a href="https://en.wikipedia.org/wiki/Name_Service_Switch">wiki
|
||||
page</a> is recommended.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
And this is point where libvirt comes in. Libvirt provides plugin for the
|
||||
NSS ecosystem. For some time now libvirt keeps a list of assigned IP
|
||||
addresses for libvirt networks. The NSS plugin does no more than search the
|
||||
list trying to find matching record for given host name. When found,
|
||||
matching IP address is returned to the caller. If not found, translation
|
||||
process continues with the next plugin configured. At this point it is
|
||||
important to stress the order in which plugins are called. Users should be
|
||||
aware that a hostname might match in multiple plugins and right after first
|
||||
match, translation process is terminated and no other plugin is consulted.
|
||||
Therefore, if there are two different records for the same host name users
|
||||
should carefully chose the lookup order.
|
||||
</p>
|
||||
|
||||
<h2><a name="Limitations">Limitations</a></h2>
|
||||
|
||||
<ol>
|
||||
<li>The libvirt NSS module matches only hostnames provided by guest. If
|
||||
the libvirt name and one advertised by guest differs, the latter is
|
||||
matched.</li>
|
||||
<li>The module works only in that cases where IP addresses are assigned by
|
||||
dnsmasq spawned by libvirt. Libvirt NATed networks are typical
|
||||
example.</li>
|
||||
</ol>
|
||||
|
||||
<p>
|
||||
These limitation are result of libvirt's internal implementation. While
|
||||
libvirt can report IP addresses regardless of their origin, a public API
|
||||
must be used to obtain those. However, for the API a connection object is
|
||||
required. Doing that for every name translation request would be too
|
||||
costly. Fortunately, libvirt spawns dnsmasq for NATed networks. Not only
|
||||
that, it provides small executable that on each IP address space change
|
||||
updates an internal list of addresses thus keeping it in sync. The NSS
|
||||
module then merely consults the list trying to find the match. Users can
|
||||
view the list themselves:
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
virsh net-dhcp-leases $network
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
where <code>$network</code> iterates through all running networks. So the module
|
||||
does merely the same as
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
virsh domifaddr --source lease $domain
|
||||
</pre>
|
||||
|
||||
<p>
|
||||
If there's no record for either of the aforementioned commands, it's very
|
||||
likely that NSS module won't find anything and vice versa.
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
@@ -163,6 +163,12 @@
|
||||
<xsl:apply-templates select="/html:html/html:body/*" mode="content"/>
|
||||
</div>
|
||||
</div>
|
||||
<div id="footer">
|
||||
<p id="sponsor">
|
||||
Sponsored by:<br/>
|
||||
<a href="http://et.redhat.com/"><img src="{$href_base}et.png" alt="Project sponsored by Red Hat Emerging Technology"/></a>
|
||||
</p>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
</xsl:template>
|
||||
|
@@ -102,7 +102,7 @@ much slower than, say, direct hypervisor calls. </li>
|
||||
Remote libvirt supports a range of transports:
|
||||
</p>
|
||||
<dl>
|
||||
<dt><code>tls</code></dt>
|
||||
<dt> tls </dt>
|
||||
<dd><a href="http://en.wikipedia.org/wiki/Transport_Layer_Security" title="Transport Layer Security">TLS</a>
|
||||
1.0 (SSL 3.1) authenticated and encrypted TCP/IP socket, usually
|
||||
listening on a public port number. To use this you will need to
|
||||
@@ -110,7 +110,7 @@ Remote libvirt supports a range of transports:
|
||||
server certificates</a>.
|
||||
The standard port is 16514.
|
||||
</dd>
|
||||
<dt><code>unix</code></dt>
|
||||
<dt> unix </dt>
|
||||
<dd> Unix domain socket. Since this is only accessible on the
|
||||
local machine, it is not encrypted, and uses Unix permissions or
|
||||
SELinux for authentication.
|
||||
@@ -119,7 +119,7 @@ Remote libvirt supports a range of transports:
|
||||
<code>/var/run/libvirt/libvirt-sock-ro</code> (the latter
|
||||
for read-only connections).
|
||||
</dd>
|
||||
<dt><code>ssh</code></dt>
|
||||
<dt> ssh </dt>
|
||||
<dd> Transported over an ordinary
|
||||
<a href="http://www.openssh.com/" title="OpenSSH homepage">ssh
|
||||
(secure shell)</a> connection.
|
||||
@@ -130,15 +130,15 @@ Remote libvirt supports a range of transports:
|
||||
<a href="http://mah.everybody.org/docs/ssh" title="Using ssh-agent with ssh">ssh-agent</a>)
|
||||
otherwise programs which use
|
||||
this transport will stop to ask for a password. </dd>
|
||||
<dt><code>ext</code></dt>
|
||||
<dt> ext </dt>
|
||||
<dd> Any external program which can make a connection to the
|
||||
remote machine by means outside the scope of libvirt. </dd>
|
||||
<dt><code>tcp</code></dt>
|
||||
<dt> tcp </dt>
|
||||
<dd> Unencrypted TCP/IP socket. Not recommended for production
|
||||
use, this is normally disabled, but an administrator can enable
|
||||
it for testing or use over a trusted network.
|
||||
The standard port is 16509. </dd>
|
||||
<dt><code>libssh2</code></dt>
|
||||
<dt> libssh2 </dt>
|
||||
<dd> Transport over the SSH protocol using
|
||||
<a href="http://libssh2.org/" title="libssh2 homepage">libssh2</a> instead
|
||||
of the OpenSSH binary. This transport uses the libvirt authentication callback for
|
||||
@@ -228,19 +228,6 @@ Note that parameter values must be
|
||||
<td colspan="2"/>
|
||||
<td> Example: <code>name=qemu:///system</code> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<code>tls_priority</code>
|
||||
</td>
|
||||
<td> tls </td>
|
||||
<td>
|
||||
A vaid GNUTLS priority string
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2"/>
|
||||
<td> Example: <code>tls_priority=NORMAL:-VERS-SSL3.0</code> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<code>command</code>
|
||||
@@ -725,7 +712,7 @@ cp clientcert.pem /etc/pki/libvirt/clientcert.pem
|
||||
<a name="Remote_TLS_troubleshooting">Troubleshooting TLS certificate problems</a>
|
||||
</h4>
|
||||
<dl>
|
||||
<dt>failed to verify client's certificate</dt> <!-- exempt from syntax-check -->
|
||||
<dt> failed to verify client's certificate </dt>
|
||||
<dd>
|
||||
<p>
|
||||
On the server side, run the libvirtd server with
|
||||
|
@@ -32,7 +32,7 @@
|
||||
</data>
|
||||
</define>
|
||||
|
||||
<define name="uint8">
|
||||
<define name="uint8range">
|
||||
<choice>
|
||||
<data type="string">
|
||||
<param name="pattern">0x[0-9a-fA-F]{1,2}</param>
|
||||
@@ -43,18 +43,7 @@
|
||||
</data>
|
||||
</choice>
|
||||
</define>
|
||||
<define name="uint16">
|
||||
<choice>
|
||||
<data type="string">
|
||||
<param name="pattern">(0x)?[0-9a-fA-F]{1,4}</param>
|
||||
</data>
|
||||
<data type='int'>
|
||||
<param name="minInclusive">0</param>
|
||||
<param name="maxInclusive">65535</param>
|
||||
</data>
|
||||
</choice>
|
||||
</define>
|
||||
<define name="uint24">
|
||||
<define name="uint24range">
|
||||
<choice>
|
||||
<data type="string">
|
||||
<param name="pattern">0x[0-9a-fA-F]{1,6}</param>
|
||||
@@ -83,21 +72,15 @@
|
||||
<ref name="pciDomain"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<optional>
|
||||
<attribute name="bus">
|
||||
<ref name="pciBus"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<optional>
|
||||
<attribute name="slot">
|
||||
<ref name="pciSlot"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<optional>
|
||||
<attribute name="function">
|
||||
<ref name="pciFunc"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<attribute name="bus">
|
||||
<ref name="pciBus"/>
|
||||
</attribute>
|
||||
<attribute name="slot">
|
||||
<ref name="pciSlot"/>
|
||||
</attribute>
|
||||
<attribute name="function">
|
||||
<ref name="pciFunc"/>
|
||||
</attribute>
|
||||
<optional>
|
||||
<attribute name="multifunction">
|
||||
<ref name="virOnOff"/>
|
||||
@@ -284,32 +267,24 @@
|
||||
</define>
|
||||
|
||||
<define name="pciDomain">
|
||||
<ref name="uint16"/>
|
||||
<data type="string">
|
||||
<param name="pattern">(0x)?[0-9a-fA-F]{1,4}</param>
|
||||
</data>
|
||||
</define>
|
||||
<define name="pciBus">
|
||||
<ref name="uint8"/>
|
||||
<data type="string">
|
||||
<param name="pattern">(0x)?[0-9a-fA-F]{1,2}</param>
|
||||
</data>
|
||||
</define>
|
||||
<define name="pciSlot">
|
||||
<choice>
|
||||
<data type="string">
|
||||
<param name="pattern">(0x)?[0-1]?[0-9a-fA-F]</param>
|
||||
</data>
|
||||
<data type="int">
|
||||
<param name="minInclusive">0</param>
|
||||
<param name="maxInclusive">31</param>
|
||||
</data>
|
||||
</choice>
|
||||
<data type="string">
|
||||
<param name="pattern">(0x)?[0-1]?[0-9a-fA-F]</param>
|
||||
</data>
|
||||
</define>
|
||||
<define name="pciFunc">
|
||||
<choice>
|
||||
<data type="string">
|
||||
<param name="pattern">(0x)?[0-7]</param>
|
||||
</data>
|
||||
<data type="int">
|
||||
<param name="minInclusive">0</param>
|
||||
<param name="maxInclusive">7</param>
|
||||
</data>
|
||||
</choice>
|
||||
<data type="string">
|
||||
<param name="pattern">(0x)?[0-7]</param>
|
||||
</data>
|
||||
</define>
|
||||
|
||||
<define name='wwn'>
|
||||
|
@@ -31,9 +31,6 @@
|
||||
<optional>
|
||||
<ref name='devices'/>
|
||||
</optional>
|
||||
<optional>
|
||||
<ref name='features'/>
|
||||
</optional>
|
||||
</interleave>
|
||||
</element>
|
||||
</define>
|
||||
@@ -72,8 +69,6 @@
|
||||
<element name='devices'>
|
||||
<interleave>
|
||||
<ref name='disk'/>
|
||||
<ref name='graphics'/>
|
||||
<ref name='video'/>
|
||||
<ref name='hostdev'/>
|
||||
</interleave>
|
||||
</element>
|
||||
@@ -86,20 +81,6 @@
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<define name='graphics'>
|
||||
<element name='graphics'>
|
||||
<ref name='supported'/>
|
||||
<ref name='enum'/>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<define name='video'>
|
||||
<element name='video'>
|
||||
<ref name='supported'/>
|
||||
<ref name='enum'/>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<define name='hostdev'>
|
||||
<element name='hostdev'>
|
||||
<ref name='supported'/>
|
||||
@@ -107,21 +88,6 @@
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<define name='features'>
|
||||
<element name='features'>
|
||||
<interleave>
|
||||
<ref name='gic'/>
|
||||
</interleave>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<define name='gic'>
|
||||
<element name='gic'>
|
||||
<ref name='supported'/>
|
||||
<ref name='enum'/>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<define name='value'>
|
||||
<zeroOrMore>
|
||||
<element name='value'>
|
||||
|
@@ -55,9 +55,6 @@
|
||||
<optional>
|
||||
<ref name="pm"/>
|
||||
</optional>
|
||||
<optional>
|
||||
<ref name="perf"/>
|
||||
</optional>
|
||||
<optional>
|
||||
<ref name="idmap"/>
|
||||
</optional>
|
||||
@@ -306,9 +303,6 @@
|
||||
<optional>
|
||||
<ref name="bios"/>
|
||||
</optional>
|
||||
<optional>
|
||||
<ref name="acpiTable"/>
|
||||
</optional>
|
||||
</interleave>
|
||||
</element>
|
||||
</define>
|
||||
@@ -398,32 +392,6 @@
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<!--
|
||||
Enable or disable perf events for the domain. For each
|
||||
of the events the following rules apply:
|
||||
on: the event will be forcefully enabled
|
||||
off: the event will be forcefully disabled
|
||||
not specified: the event will be disabled by default
|
||||
-->
|
||||
<define name="perf">
|
||||
<element name="perf">
|
||||
<oneOrMore>
|
||||
<element name="event">
|
||||
<attribute name="name">
|
||||
<choice>
|
||||
<value>cmt</value>
|
||||
<value>mbmt</value>
|
||||
<value>mbml</value>
|
||||
</choice>
|
||||
</attribute>
|
||||
<attribute name="enabled">
|
||||
<ref name="virYesNo"/>
|
||||
</attribute>
|
||||
</element>
|
||||
</oneOrMore>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<!--
|
||||
The Identifiers can be:
|
||||
- an optional id attribute with a number on the domain element
|
||||
@@ -701,16 +669,6 @@
|
||||
<ref name="cpushares"/>
|
||||
</element>
|
||||
</optional>
|
||||
<optional>
|
||||
<element name="global_period">
|
||||
<ref name="cpuperiod"/>
|
||||
</element>
|
||||
</optional>
|
||||
<optional>
|
||||
<element name="global_quota">
|
||||
<ref name="cpuquota"/>
|
||||
</element>
|
||||
</optional>
|
||||
<optional>
|
||||
<element name="period">
|
||||
<ref name="cpuperiod"/>
|
||||
@@ -1170,16 +1128,14 @@
|
||||
<optional>
|
||||
<element name="vendor">
|
||||
<data type="string">
|
||||
<!-- All printable characters -->
|
||||
<param name="pattern">[ -~]{0,8}</param>
|
||||
<param name="pattern">[x20-x7E]{0,8}</param>
|
||||
</data>
|
||||
</element>
|
||||
</optional>
|
||||
<optional>
|
||||
<element name="product">
|
||||
<data type="string">
|
||||
<!-- All printable characters -->
|
||||
<param name="pattern">[ -~]{0,16}</param>
|
||||
<param name="pattern">[x20-x7E]{0,16}</param>
|
||||
</data>
|
||||
</element>
|
||||
</optional>
|
||||
@@ -1620,9 +1576,6 @@
|
||||
<optional>
|
||||
<ref name="driverIOThread"/>
|
||||
</optional>
|
||||
<optional>
|
||||
<ref name="detect_zeroes"/>
|
||||
</optional>
|
||||
<empty/>
|
||||
</element>
|
||||
</define>
|
||||
@@ -1643,7 +1596,6 @@
|
||||
<define name="driverCache">
|
||||
<attribute name="cache">
|
||||
<choice>
|
||||
<value>default</value>
|
||||
<value>none</value>
|
||||
<value>writeback</value>
|
||||
<value>writethrough</value>
|
||||
@@ -1707,22 +1659,11 @@
|
||||
<ref name="unsignedInt"/>
|
||||
</attribute>
|
||||
</define>
|
||||
<define name="detect_zeroes">
|
||||
<attribute name='detect_zeroes'>
|
||||
<choice>
|
||||
<value>off</value>
|
||||
<value>on</value>
|
||||
<value>unmap</value>
|
||||
</choice>
|
||||
</attribute>
|
||||
</define>
|
||||
<define name="controller">
|
||||
<element name="controller">
|
||||
<optional>
|
||||
<attribute name="index">
|
||||
<ref name="unsignedInt"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<attribute name="index">
|
||||
<ref name="unsignedInt"/>
|
||||
</attribute>
|
||||
<interleave>
|
||||
<optional>
|
||||
<ref name="alias"/>
|
||||
@@ -1762,8 +1703,7 @@
|
||||
</attribute>
|
||||
</optional>
|
||||
</group>
|
||||
<!-- usb has an optional attribute "model",
|
||||
and optional subelements "master" and "ports" -->
|
||||
<!-- usb has an optional attribute "model", and optional subelement "master" -->
|
||||
<group>
|
||||
<attribute name="type">
|
||||
<value>usb</value>
|
||||
@@ -1788,11 +1728,6 @@
|
||||
<optional>
|
||||
<ref name="usbmaster"/>
|
||||
</optional>
|
||||
<optional>
|
||||
<attribute name="ports">
|
||||
<ref name="unsignedInt"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
</group>
|
||||
<!-- pci has an optional attribute "model" -->
|
||||
<group>
|
||||
@@ -1813,10 +1748,6 @@
|
||||
<value>x3130-upstream</value>
|
||||
<!-- implementations of 'pcie-switch-downstream-port' -->
|
||||
<value>xio3130-downstream</value>
|
||||
<!-- implementations of 'pci-expander-bus' -->
|
||||
<value>pxb</value>
|
||||
<!-- implementations of 'pcie-expander-bus' -->
|
||||
<value>pxb-pcie</value>
|
||||
</choice>
|
||||
</attribute>
|
||||
<empty/>
|
||||
@@ -1826,29 +1757,20 @@
|
||||
<element name="target">
|
||||
<optional>
|
||||
<attribute name='chassisNr'>
|
||||
<ref name='uint8'/>
|
||||
<ref name='uint8range'/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<optional>
|
||||
<attribute name="chassis">
|
||||
<ref name='uint8'/>
|
||||
<ref name='uint8range'/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<optional>
|
||||
<attribute name="port">
|
||||
<ref name='uint8'/>
|
||||
<ref name='uint8range'/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<optional>
|
||||
<attribute name='busNr'>
|
||||
<ref name='uint8'/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<optional>
|
||||
<element name='node'>
|
||||
<ref name='unsignedInt'/>
|
||||
</element>
|
||||
</optional>
|
||||
<empty/>
|
||||
</element>
|
||||
</optional>
|
||||
<!-- *-root controllers have an optional element "pcihole64"-->
|
||||
@@ -1874,8 +1796,6 @@
|
||||
<value>pcie-root-port</value>
|
||||
<value>pcie-switch-upstream-port</value>
|
||||
<value>pcie-switch-downstream-port</value>
|
||||
<value>pci-expander-bus</value>
|
||||
<value>pcie-expander-bus</value>
|
||||
</choice>
|
||||
</attribute>
|
||||
</group>
|
||||
@@ -1918,9 +1838,6 @@
|
||||
<optional>
|
||||
<ref name="ioeventfd"/>
|
||||
</optional>
|
||||
<optional>
|
||||
<ref name="driverIOThread"/>
|
||||
</optional>
|
||||
</element>
|
||||
</optional>
|
||||
</interleave>
|
||||
@@ -2142,6 +2059,9 @@
|
||||
<interleave>
|
||||
<optional>
|
||||
<element name="source">
|
||||
<attribute name="dev">
|
||||
<ref name="deviceName"/>
|
||||
</attribute>
|
||||
<empty/>
|
||||
</element>
|
||||
</optional>
|
||||
@@ -2420,7 +2340,27 @@
|
||||
<empty/>
|
||||
</element>
|
||||
</optional>
|
||||
<ref name="interface-ip-info"/>
|
||||
<zeroOrMore>
|
||||
<element name="ip">
|
||||
<attribute name="address">
|
||||
<ref name="ipAddr"/>
|
||||
</attribute>
|
||||
<optional>
|
||||
<attribute name="family">
|
||||
<ref name="addr-family"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<optional>
|
||||
<attribute name="prefix">
|
||||
<ref name="ipPrefix"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<empty/>
|
||||
</element>
|
||||
</zeroOrMore>
|
||||
<zeroOrMore>
|
||||
<ref name="route"/>
|
||||
</zeroOrMore>
|
||||
<optional>
|
||||
<element name="script">
|
||||
<attribute name="path">
|
||||
@@ -2609,33 +2549,6 @@
|
||||
</optional>
|
||||
</interleave>
|
||||
</define>
|
||||
|
||||
<!--
|
||||
All ip-related info for either the host or guest side of an interface
|
||||
-->
|
||||
<define name="interface-ip-info">
|
||||
<zeroOrMore>
|
||||
<element name="ip">
|
||||
<attribute name="address">
|
||||
<ref name="ipAddr"/>
|
||||
</attribute>
|
||||
<optional>
|
||||
<attribute name="family">
|
||||
<ref name="addr-family"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<optional>
|
||||
<attribute name="prefix">
|
||||
<ref name="ipPrefix"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<empty/>
|
||||
</element>
|
||||
</zeroOrMore>
|
||||
<zeroOrMore>
|
||||
<ref name="route"/>
|
||||
</zeroOrMore>
|
||||
</define>
|
||||
<!--
|
||||
An emulator description is just a path to the binary used for the task
|
||||
-->
|
||||
@@ -2645,7 +2558,10 @@
|
||||
</element>
|
||||
</define>
|
||||
<!--
|
||||
A graphic description (SPICE, VNC, SDL, ...)
|
||||
A graphic description, currently in Xen only 2 types are supported:
|
||||
- sdl with optional display, xauth and fullscreen
|
||||
- vnc with a required port and optional listen IP address, password
|
||||
and keymap
|
||||
-->
|
||||
<define name="graphic">
|
||||
<element name="graphics">
|
||||
@@ -2907,14 +2823,6 @@
|
||||
<empty/>
|
||||
</element>
|
||||
</optional>
|
||||
<optional>
|
||||
<element name="gl">
|
||||
<attribute name="enable">
|
||||
<ref name="virYesNo"/>
|
||||
</attribute>
|
||||
<empty/>
|
||||
</element>
|
||||
</optional>
|
||||
</interleave>
|
||||
</group>
|
||||
<group>
|
||||
@@ -2975,11 +2883,9 @@
|
||||
<attribute name="type">
|
||||
<value>address</value>
|
||||
</attribute>
|
||||
<optional>
|
||||
<attribute name="address">
|
||||
<ref name="addrIPorName"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<attribute name="address">
|
||||
<ref name="addrIPorName"/>
|
||||
</attribute>
|
||||
</group>
|
||||
<group>
|
||||
<attribute name="type">
|
||||
@@ -2994,21 +2900,6 @@
|
||||
</attribute>
|
||||
</optional>
|
||||
</group>
|
||||
<group>
|
||||
<attribute name="type">
|
||||
<value>socket</value>
|
||||
</attribute>
|
||||
<optional>
|
||||
<attribute name="socket">
|
||||
<ref name="absFilePath"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
</group>
|
||||
<group>
|
||||
<attribute name="type">
|
||||
<value>none</value>
|
||||
</attribute>
|
||||
</group>
|
||||
</choice>
|
||||
</element>
|
||||
</zeroOrMore>
|
||||
@@ -3047,11 +2938,6 @@
|
||||
<ref name="unsignedInt"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<optional>
|
||||
<attribute name="vram64">
|
||||
<ref name="unsignedInt"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
</group>
|
||||
</choice>
|
||||
<optional>
|
||||
@@ -3390,18 +3276,6 @@
|
||||
</optional>
|
||||
</element>
|
||||
</optional>
|
||||
<optional>
|
||||
<element name="log">
|
||||
<attribute name="file">
|
||||
<ref name="absFilePath"/>
|
||||
</attribute>
|
||||
<optional>
|
||||
<attribute name="append">
|
||||
<ref name="virOnOff"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
</element>
|
||||
</optional>
|
||||
</define>
|
||||
<!--
|
||||
The description for a console
|
||||
@@ -4014,7 +3888,27 @@
|
||||
<ref name="deviceName"/>
|
||||
</element>
|
||||
</element>
|
||||
<ref name="interface-ip-info"/>
|
||||
<zeroOrMore>
|
||||
<element name="ip">
|
||||
<attribute name="address">
|
||||
<ref name="ipAddr"/>
|
||||
</attribute>
|
||||
<optional>
|
||||
<attribute name="family">
|
||||
<ref name="addr-family"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<optional>
|
||||
<attribute name="prefix">
|
||||
<ref name="ipPrefix"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<empty/>
|
||||
</element>
|
||||
</zeroOrMore>
|
||||
<zeroOrMore>
|
||||
<ref name="route"/>
|
||||
</zeroOrMore>
|
||||
</interleave>
|
||||
</define>
|
||||
|
||||
@@ -4214,11 +4108,7 @@
|
||||
</optional>
|
||||
<optional>
|
||||
<element name="hap">
|
||||
<optional>
|
||||
<attribute name="state">
|
||||
<ref name="virOnOff"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<empty/>
|
||||
</element>
|
||||
</optional>
|
||||
<optional>
|
||||
@@ -4264,11 +4154,7 @@
|
||||
<element name="gic">
|
||||
<optional>
|
||||
<attribute name="version">
|
||||
<choice>
|
||||
<value>host</value>
|
||||
<value>2</value>
|
||||
<value>3</value>
|
||||
</choice>
|
||||
<ref name="positiveInteger"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
</element>
|
||||
@@ -4523,21 +4409,6 @@
|
||||
</data>
|
||||
</define>
|
||||
|
||||
<define name="acpiTable">
|
||||
<element name="acpi">
|
||||
<zeroOrMore>
|
||||
<element name="table">
|
||||
<attribute name="type">
|
||||
<choice>
|
||||
<value>slic</value>
|
||||
</choice>
|
||||
</attribute>
|
||||
<ref name="absFilePath"/>
|
||||
</element>
|
||||
</zeroOrMore>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<define name="smbios">
|
||||
<element name="smbios">
|
||||
<attribute name="mode">
|
||||
@@ -4729,7 +4600,8 @@
|
||||
<value>random</value>
|
||||
</attribute>
|
||||
<choice>
|
||||
<ref name='absFilePath'/>
|
||||
<value>/dev/random</value>
|
||||
<value>/dev/hwrng</value>
|
||||
<empty/>
|
||||
</choice>
|
||||
</group>
|
||||
@@ -4986,43 +4858,6 @@
|
||||
</optional>
|
||||
</element>
|
||||
</optional>
|
||||
<optional>
|
||||
<element name="vpindex">
|
||||
<ref name="featurestate"/>
|
||||
</element>
|
||||
</optional>
|
||||
<optional>
|
||||
<element name="runtime">
|
||||
<ref name="featurestate"/>
|
||||
</element>
|
||||
</optional>
|
||||
<optional>
|
||||
<element name="synic">
|
||||
<ref name="featurestate"/>
|
||||
</element>
|
||||
</optional>
|
||||
<optional>
|
||||
<element name="stimer">
|
||||
<ref name="featurestate"/>
|
||||
</element>
|
||||
</optional>
|
||||
<optional>
|
||||
<element name="reset">
|
||||
<ref name="featurestate"/>
|
||||
</element>
|
||||
</optional>
|
||||
<optional>
|
||||
<element name="vendor_id">
|
||||
<ref name="featurestate"/>
|
||||
<optional>
|
||||
<attribute name="value">
|
||||
<data type="string">
|
||||
<param name='pattern'>[^,]{0,12}</param>
|
||||
</data>
|
||||
</attribute>
|
||||
</optional>
|
||||
</element>
|
||||
</optional>
|
||||
</interleave>
|
||||
</element>
|
||||
</define>
|
||||
@@ -5559,7 +5394,6 @@
|
||||
<value>isa</value>
|
||||
<value>pseries</value>
|
||||
<value>hyperv</value>
|
||||
<value>s390</value>
|
||||
</choice>
|
||||
</attribute>
|
||||
</optional>
|
||||
|
@@ -19,17 +19,17 @@
|
||||
<element name="parameters">
|
||||
<optional>
|
||||
<attribute name="managerid">
|
||||
<ref name="uint8"/>
|
||||
<ref name="uint8range"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<optional>
|
||||
<attribute name="typeid">
|
||||
<ref name="uint24"/>
|
||||
<ref name="uint24range"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<optional>
|
||||
<attribute name="typeidversion">
|
||||
<ref name="uint8"/>
|
||||
<ref name="uint8range"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<optional>
|
||||
@@ -97,17 +97,17 @@
|
||||
<element name="parameters">
|
||||
<optional>
|
||||
<attribute name="managerid">
|
||||
<ref name="uint8"/>
|
||||
<ref name="uint8range"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<optional>
|
||||
<attribute name="typeid">
|
||||
<ref name="uint24"/>
|
||||
<ref name="uint24range"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<optional>
|
||||
<attribute name="typeidversion">
|
||||
<ref name="uint8"/>
|
||||
<ref name="uint8range"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<optional>
|
||||
|
@@ -40,7 +40,6 @@
|
||||
<ref name="capusbinterface"/>
|
||||
<ref name="capnet"/>
|
||||
<ref name="capscsihost"/>
|
||||
<ref name="capscsitarget"/>
|
||||
<ref name="capscsi"/>
|
||||
<ref name="capstorage"/>
|
||||
</choice>
|
||||
@@ -143,24 +142,8 @@
|
||||
<value>virt_functions</value>
|
||||
</attribute>
|
||||
<optional>
|
||||
<attribute name='maxCount'>
|
||||
<ref name='unsignedInt'/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<zeroOrMore>
|
||||
<ref name='address'/>
|
||||
</zeroOrMore>
|
||||
</element>
|
||||
</optional>
|
||||
|
||||
<optional>
|
||||
<element name='capability'>
|
||||
<attribute name='type'>
|
||||
<choice>
|
||||
<value>pci-bridge</value>
|
||||
<value>cardbus-bridge</value>
|
||||
</choice>
|
||||
</attribute>
|
||||
</optional>
|
||||
</element>
|
||||
</optional>
|
||||
|
||||
@@ -388,16 +371,6 @@
|
||||
</optional>
|
||||
</define>
|
||||
|
||||
<define name='capscsitarget'>
|
||||
<attribute name='type'>
|
||||
<value>scsi_target</value>
|
||||
</attribute>
|
||||
|
||||
<element name='target'>
|
||||
<text/>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<define name='capscsi'>
|
||||
<attribute name='type'>
|
||||
<value>scsi</value>
|
||||
|
@@ -578,12 +578,12 @@
|
||||
<interleave>
|
||||
<optional>
|
||||
<attribute name="type">
|
||||
<ref name="uint8"/>
|
||||
<ref name="uint8range"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<optional>
|
||||
<attribute name="code">
|
||||
<ref name="uint8"/>
|
||||
<ref name="uint8range"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
</interleave>
|
||||
@@ -593,22 +593,22 @@
|
||||
<interleave>
|
||||
<optional>
|
||||
<attribute name="type">
|
||||
<ref name="uint8"/>
|
||||
<ref name="uint8range"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<optional>
|
||||
<attribute name="typeend">
|
||||
<ref name="uint8"/>
|
||||
<ref name="uint8range"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<optional>
|
||||
<attribute name="code">
|
||||
<ref name="uint8"/>
|
||||
<ref name="uint8range"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<optional>
|
||||
<attribute name="codeend">
|
||||
<ref name="uint8"/>
|
||||
<ref name="uint8range"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
</interleave>
|
||||
@@ -642,12 +642,12 @@
|
||||
<define name="stp-attributes">
|
||||
<optional>
|
||||
<attribute name="type">
|
||||
<ref name="uint8"/>
|
||||
<ref name="uint8range"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<optional>
|
||||
<attribute name="flags">
|
||||
<ref name="uint8"/>
|
||||
<ref name="uint8range"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<optional>
|
||||
|
@@ -278,11 +278,6 @@
|
||||
<empty/>
|
||||
<ref name='devextents'/>
|
||||
</choice>
|
||||
<optional>
|
||||
<attribute name="part_separator">
|
||||
<ref name="virYesNo"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
|
@@ -120,10 +120,6 @@
|
||||
<a href="hooks.html">Hooks</a>
|
||||
<span>Hooks for system specific management</span>
|
||||
</li>
|
||||
<li>
|
||||
<a href="nss.html">NSS module</a>
|
||||
<span>Enable domain host name translation to IP addresses</span>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>
|
||||
@@ -304,10 +300,6 @@
|
||||
</ul>
|
||||
-->
|
||||
<ul>
|
||||
<li>
|
||||
<a href="html/libvirt-libvirt-common.html">Common</a>
|
||||
<span>common APIs for the libvirt library</span>
|
||||
</li>
|
||||
<li>
|
||||
<a href="html/libvirt-libvirt-domain.html">Domain</a>
|
||||
<span>domain APIs for the libvirt library</span>
|
||||
@@ -396,10 +388,6 @@
|
||||
<a href="api_extension.html">API extensions</a>
|
||||
<span>Adding new public libvirt APIs</span>
|
||||
</li>
|
||||
<li>
|
||||
<a href="internals/eventloop.html">Event loop and worker pool</a>
|
||||
<span>Libvirt's event loop and worker pool mode</span>
|
||||
</li>
|
||||
<li>
|
||||
<a href="internals/command.html">Spawning commands</a>
|
||||
<span>Spawning commands from libvirt driver code</span>
|
||||
|
@@ -161,7 +161,7 @@
|
||||
<li><code>qcow</code>: QEMU v1 disk image format</li>
|
||||
<li><code>qcow2</code>: QEMU v2 disk image format</li>
|
||||
<li><code>qed</code>: QEMU Enhanced Disk image format</li>
|
||||
<li><code>vmdk</code>: VMware disk image format</li>
|
||||
<li><code>vmdk</code>: VMWare disk image format</li>
|
||||
<li><code>vpc</code>: VirtualPC disk image format</li>
|
||||
</ul>
|
||||
<p>
|
||||
@@ -755,10 +755,8 @@
|
||||
|
||||
<h2><a name="StorageBackendZFS">ZFS pools</a></h2>
|
||||
<p>
|
||||
This provides a pool based on the ZFS filesystem. Initially it was developed
|
||||
for FreeBSD, and <span class="since">since 1.3.2</span> experimental support
|
||||
for <a href="http://zfsonlinux.org/">ZFS on Linux</a> version 0.6.4 or newer
|
||||
is available.
|
||||
This provides a pool based on the ZFS filesystem. It is currently
|
||||
supported on FreeBSD only.
|
||||
</p>
|
||||
|
||||
<p>A pool could either be created manually using the <code>zpool create</code>
|
||||
|
@@ -37,36 +37,21 @@ EXTRA_DIST = \
|
||||
INCLUDES = -I$(top_builddir)/include -I$(top_srcdir)/include -I$(top_srcdir) \
|
||||
-I$(top_builddir)/gnulib/lib -I$(top_srcdir)/gnulib/lib
|
||||
LDADD = $(STATIC_BINARIES) $(WARN_CFLAGS) $(COVERAGE_LDFLAGS) \
|
||||
$(top_builddir)/src/libvirt.la $(top_builddir)/gnulib/lib/libgnu.la \
|
||||
$(top_builddir)/src/libvirt-admin.la
|
||||
$(top_builddir)/src/libvirt.la $(top_builddir)/gnulib/lib/libgnu.la
|
||||
|
||||
noinst_PROGRAMS=dominfo/info1 dommigrate/dommigrate domsuspend/suspend \
|
||||
domtop/domtop hellolibvirt/hellolibvirt object-events/event-test \
|
||||
openauth/openauth rename/rename admin/list_servers admin/list_clients \
|
||||
admin/threadpool_params admin/client_limits admin/client_info \
|
||||
admin/client_close
|
||||
openauth/openauth rename/rename
|
||||
|
||||
dominfo_info1_SOURCES = dominfo/info1.c
|
||||
dommigrate_dommigrate_SOURCES = dommigrate/dommigrate.c
|
||||
domsuspend_suspend_SOURCES = domsuspend/suspend.c
|
||||
domtop_domtop_SOURCES = domtop/domtop.c
|
||||
hellolibvirt_hellolibvirt_SOURCES = hellolibvirt/hellolibvirt.c
|
||||
|
||||
object_events_event_test_CFLAGS = \
|
||||
$(WARN_CFLAGS) \
|
||||
$(NULL)
|
||||
object_events_event_test_SOURCES = object-events/event-test.c
|
||||
|
||||
openauth_openauth_SOURCES = openauth/openauth.c
|
||||
rename_rename_SOURCES = rename/rename.c
|
||||
|
||||
admin_list_servers_SOURCES = admin/list_servers.c
|
||||
admin_list_clients_SOURCES = admin/list_clients.c
|
||||
admin_threadpool_params_SOURCES = admin/threadpool_params.c
|
||||
admin_client_limits_SOURCES = admin/client_limits.c
|
||||
admin_client_info_SOURCES = admin/client_info.c
|
||||
admin_client_close_SOURCES = admin/client_close.c
|
||||
|
||||
if WITH_APPARMOR_PROFILES
|
||||
apparmordir = $(sysconfdir)/apparmor.d/
|
||||
apparmor_DATA = \
|
||||
@@ -100,5 +85,5 @@ uninstall-local::
|
||||
for f in $(FILTERS); do \
|
||||
rm -f "$(NWFILTER_DIR)/`basename $$f`"; \
|
||||
done
|
||||
-test -z "$(shell ls $(NWFILTER_DIR))" || rmdir $(NWFILTER_DIR)
|
||||
-test -z $(shell ls $(NWFILTER_DIR)) || rmdir $(NWFILTER_DIR)
|
||||
endif WITH_NWFILTER
|
||||
|
@@ -1,57 +0,0 @@
|
||||
#include<stdio.h>
|
||||
#include<stdlib.h>
|
||||
#include<libvirt/libvirt.h>
|
||||
#include<libvirt/libvirt-admin.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
int ret = -1;
|
||||
virAdmConnectPtr conn1 = NULL; /* admin connection */
|
||||
virConnectPtr conn2 = NULL; /* libvirt standard connection */
|
||||
virAdmServerPtr srv = NULL; /* which server is the client connected to */
|
||||
virAdmClientPtr clnt = NULL; /* which client to disconnect */
|
||||
|
||||
/* first, open a standard libvirt connection to the daemon */
|
||||
if (!(conn2 = virConnectOpen(NULL)))
|
||||
return -1;
|
||||
|
||||
/* next, open an admin connection that will be used to disconnect the
|
||||
* standard libvirt client
|
||||
*/
|
||||
if (!(conn1 = virAdmConnectOpen(NULL, 0)))
|
||||
goto cleanup;
|
||||
|
||||
/* a virAdmServerPtr handle is needed, so a server lookup is performed */
|
||||
if (!(srv = virAdmConnectLookupServer(conn1, "libvirtd", 0)))
|
||||
goto cleanup;
|
||||
|
||||
/* a virAdmClientPtr handle is also necessary, so lookup for client is
|
||||
* performed as well
|
||||
*/
|
||||
if (!(clnt = virAdmServerLookupClient(srv, 1, 0)))
|
||||
goto cleanup;
|
||||
|
||||
/* finally, use the client handle to disconnect the standard libvirt client
|
||||
* from libvirtd daemon
|
||||
*/
|
||||
if (virAdmClientClose(clnt, 0) < 0)
|
||||
goto cleanup;
|
||||
|
||||
ret = 0;
|
||||
cleanup:
|
||||
/* Once finished, both server and client handles need to be freed and
|
||||
* both connections @conn1 and @conn2 should be closed to free the
|
||||
* memory.
|
||||
* NOTE: Although @conn2 has been disconnected, unlike disconnecting by
|
||||
* calling virConnectClose which closes the connection voluntarily and
|
||||
* frees the object automatically, virAdmClientClose is a forceful
|
||||
* disconnect of another client (client can use it on itself as well).
|
||||
* Therefore no automatic deallocation of the object takes place and is
|
||||
* the callers responsibility to do so.
|
||||
*/
|
||||
virAdmClientFree(clnt);
|
||||
virAdmServerFree(srv);
|
||||
virAdmConnectClose(conn1);
|
||||
virConnectClose(conn2);
|
||||
return ret;
|
||||
}
|
@@ -1,165 +0,0 @@
|
||||
#define _GNU_SOURCE
|
||||
#include<stdio.h>
|
||||
#include<stdlib.h>
|
||||
#include<time.h>
|
||||
#include<string.h>
|
||||
#include<libvirt/libvirt-admin.h>
|
||||
|
||||
static const char *
|
||||
exampleTransportToString(int transport)
|
||||
{
|
||||
const char *str = NULL;
|
||||
|
||||
switch ((virClientTransport) transport) {
|
||||
case VIR_CLIENT_TRANS_UNIX:
|
||||
str = "unix";
|
||||
break;
|
||||
case VIR_CLIENT_TRANS_TCP:
|
||||
str = "tcp";
|
||||
break;
|
||||
case VIR_CLIENT_TRANS_TLS:
|
||||
str = "tls";
|
||||
break;
|
||||
}
|
||||
|
||||
return str ? str : "unknown";
|
||||
}
|
||||
|
||||
static char *
|
||||
exampleGetTimeStr(time_t then)
|
||||
{
|
||||
char *ret = NULL;
|
||||
struct tm timeinfo;
|
||||
|
||||
if (!localtime_r(&then, &timeinfo))
|
||||
return NULL;
|
||||
|
||||
if (!(ret = calloc(64, sizeof(char))))
|
||||
return NULL;
|
||||
|
||||
if (strftime(ret, 64, "%Y-%m-%d %H:%M:%S%z",
|
||||
&timeinfo) == 0) {
|
||||
free(ret);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static char *
|
||||
exampleGetTypedParamValue(virTypedParameterPtr item)
|
||||
{
|
||||
int ret = 0;
|
||||
char *str = NULL;
|
||||
|
||||
switch (item->type) {
|
||||
case VIR_TYPED_PARAM_INT:
|
||||
ret = asprintf(&str, "%d", item->value.i);
|
||||
break;
|
||||
|
||||
case VIR_TYPED_PARAM_UINT:
|
||||
ret = asprintf(&str, "%u", item->value.ui);
|
||||
break;
|
||||
|
||||
case VIR_TYPED_PARAM_LLONG:
|
||||
ret = asprintf(&str, "%lld", item->value.l);
|
||||
break;
|
||||
|
||||
case VIR_TYPED_PARAM_ULLONG:
|
||||
ret = asprintf(&str, "%llu", item->value.ul);
|
||||
break;
|
||||
|
||||
case VIR_TYPED_PARAM_DOUBLE:
|
||||
ret = asprintf(&str, "%f", item->value.d);
|
||||
break;
|
||||
|
||||
case VIR_TYPED_PARAM_BOOLEAN:
|
||||
str = strdup(item->value.b ? "yes" : "no");
|
||||
break;
|
||||
|
||||
case VIR_TYPED_PARAM_STRING:
|
||||
str = strdup(item->value.s);
|
||||
break;
|
||||
|
||||
default:
|
||||
fprintf(stderr, "unimplemented parameter type %d\n", item->type);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int ret = -1;
|
||||
virAdmConnectPtr conn = NULL;
|
||||
virAdmServerPtr srv = NULL; /* which server is the client connected to */
|
||||
virAdmClientPtr clnt = NULL; /* which client get identity for */
|
||||
virTypedParameterPtr params = NULL; /* where to store identity info */
|
||||
int nparams = 0;
|
||||
size_t i = 0;
|
||||
char *timestr = NULL;
|
||||
|
||||
if (argc != 3) {
|
||||
fprintf(stderr, "Two arguments, first specifying the server client is "
|
||||
"connected to and second, specifying the client's ID for which "
|
||||
"identity information should be retrieved, are expected\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* first, open a connection to the daemon */
|
||||
if (!(conn = virAdmConnectOpen(NULL, 0)))
|
||||
return -1;
|
||||
|
||||
/* first a virAdmServerPtr handle is necessary to obtain, that is done by
|
||||
* doing a lookup for specific server, argv[1] holds the server name
|
||||
*/
|
||||
if (!(srv = virAdmConnectLookupServer(conn, argv[1], 0)))
|
||||
goto cleanup;
|
||||
|
||||
/* next, virAdmClientPtr handle is necessary to obtain, that is done by
|
||||
* doing a lookup on a specific server, argv[2] holds the client's ID
|
||||
*/
|
||||
if (!(clnt = virAdmServerLookupClient(srv, strtoll(argv[2], NULL, 10), 0)))
|
||||
goto cleanup;
|
||||
|
||||
/* finally, retrieve @clnt's identity information */
|
||||
if (virAdmClientGetInfo(clnt, ¶ms, &nparams, 0) < 0)
|
||||
goto cleanup;
|
||||
|
||||
/* this information is provided by the client object itself, not by typed
|
||||
* params container; it is unnecessary to call virAdmClientGetInfo if only
|
||||
* ID, transport method, and timestamp are the required data
|
||||
*/
|
||||
if (!(timestr = exampleGetTimeStr(virAdmClientGetTimestamp(clnt))))
|
||||
goto cleanup;
|
||||
|
||||
printf("%-15s: %llu\n", "id", virAdmClientGetID(clnt));
|
||||
printf("%-15s: %s\n", "connection_time", timestr);
|
||||
printf("%-15s: %s\n", "transport",
|
||||
exampleTransportToString(virAdmClientGetTransport(clnt)));
|
||||
|
||||
/* this is the actual identity information retrieved in typed params
|
||||
* container
|
||||
*/
|
||||
for (i = 0; i < nparams; i++) {
|
||||
char *str = NULL;
|
||||
if (!(str = exampleGetTypedParamValue(¶ms[i])))
|
||||
goto cleanup;
|
||||
printf("%-15s: %s\n", params[i].field, str);
|
||||
free(str);
|
||||
}
|
||||
|
||||
ret = 0;
|
||||
cleanup:
|
||||
/* Once finished, free the typed params container, server and client
|
||||
* handles and close the connection properly, @conn will be deallocated
|
||||
* automatically
|
||||
*/
|
||||
virTypedParamsFree(params, nparams);
|
||||
virAdmClientFree(clnt);
|
||||
virAdmServerFree(srv);
|
||||
virAdmConnectClose(conn);
|
||||
free(timestr);
|
||||
return ret;
|
||||
}
|
@@ -1,63 +0,0 @@
|
||||
#include<stdio.h>
|
||||
#include<stdlib.h>
|
||||
#include<libvirt/libvirt-admin.h>
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int ret = -1;
|
||||
virAdmConnectPtr conn = NULL;
|
||||
virAdmServerPtr srv = NULL; /* which server to work with */
|
||||
virTypedParameterPtr params = NULL;
|
||||
int nparams = 0;
|
||||
size_t i;
|
||||
|
||||
if (argc != 2) {
|
||||
fprintf(stderr, "One argument specifying the server which to work "
|
||||
"with is expected\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* first, open a connection to the daemon */
|
||||
if (!(conn = virAdmConnectOpen(NULL, 0)))
|
||||
goto cleanup;
|
||||
|
||||
/* a server handle is necessary before any API regarding threadpool
|
||||
* parameters can be issued
|
||||
*/
|
||||
if (!(srv = virAdmConnectLookupServer(conn, argv[1], 0)))
|
||||
goto cleanup;
|
||||
|
||||
/* get the current client limits */
|
||||
if (virAdmServerGetClientLimits(srv, ¶ms, &nparams, 0) < 0)
|
||||
goto cleanup;
|
||||
|
||||
for (i = 0; i < nparams; i++)
|
||||
printf("%-15s: %d\n", params[i].field, params[i].value.ui);
|
||||
|
||||
virTypedParamsFree(params, nparams);
|
||||
params = NULL;
|
||||
nparams = 0;
|
||||
|
||||
/* set nclients_max to 100 and nclients_unauth_max to 20 */
|
||||
int maxparams = 0;
|
||||
if (virTypedParamsAddUInt(¶ms, &nparams, &maxparams,
|
||||
VIR_SERVER_CLIENTS_MAX, 100) < 0 ||
|
||||
virTypedParamsAddUInt(¶ms, &nparams, &maxparams,
|
||||
VIR_SERVER_CLIENTS_UNAUTH_MAX, 20) < 0)
|
||||
goto cleanup;
|
||||
|
||||
/* now, change the client limits on the server */
|
||||
if (virAdmServerSetClientLimits(srv, params, nparams, 0) < 0)
|
||||
goto cleanup;
|
||||
|
||||
ret = 0;
|
||||
cleanup:
|
||||
virTypedParamsFree(params, nparams);
|
||||
|
||||
/* Once finished deallocate the server handle and close the connection
|
||||
* properly, @conn will be deallocated automatically
|
||||
*/
|
||||
virAdmServerFree(srv);
|
||||
virAdmConnectClose(conn);
|
||||
return ret;
|
||||
}
|
@@ -1,111 +0,0 @@
|
||||
#include<stdio.h>
|
||||
#include<stdlib.h>
|
||||
#include<time.h>
|
||||
#include<libvirt/libvirt-admin.h>
|
||||
|
||||
static const char *
|
||||
exampleTransportToString(int transport)
|
||||
{
|
||||
const char *str = NULL;
|
||||
|
||||
switch ((virClientTransport) transport) {
|
||||
case VIR_CLIENT_TRANS_UNIX:
|
||||
str = "unix";
|
||||
break;
|
||||
case VIR_CLIENT_TRANS_TCP:
|
||||
str = "tcp";
|
||||
break;
|
||||
case VIR_CLIENT_TRANS_TLS:
|
||||
str = "tls";
|
||||
break;
|
||||
}
|
||||
|
||||
return str ? str : "unknown";
|
||||
}
|
||||
|
||||
static char *
|
||||
exampleGetTimeStr(time_t then)
|
||||
{
|
||||
char *ret = NULL;
|
||||
struct tm timeinfo;
|
||||
|
||||
if (!localtime_r(&then, &timeinfo))
|
||||
return NULL;
|
||||
|
||||
if (!(ret = calloc(64, sizeof(char))))
|
||||
return NULL;
|
||||
|
||||
if (strftime(ret, 64, "%Y-%m-%d %H:%M:%S%z",
|
||||
&timeinfo) == 0) {
|
||||
free(ret);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int ret = -1;
|
||||
virAdmConnectPtr conn = NULL;
|
||||
virAdmServerPtr srv = NULL; /* which server list the clients from */
|
||||
virAdmClientPtr *clients = NULL; /* where to store the servers */
|
||||
size_t i = 0;
|
||||
int count = 0;
|
||||
|
||||
if (argc != 2) {
|
||||
fprintf(stderr, "One argument specifying the server to list connected "
|
||||
"clients for is expected\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* first, open a connection to the daemon */
|
||||
if (!(conn = virAdmConnectOpen(NULL, 0)))
|
||||
return -1;
|
||||
|
||||
/* first a virAdmServerPtr handle is necessary to obtain, that is done by
|
||||
* doing a lookup for specific server, let's get a handle on "libvirtd"
|
||||
* server
|
||||
*/
|
||||
if (!(srv = virAdmConnectLookupServer(conn, argv[1], 0)))
|
||||
goto cleanup;
|
||||
|
||||
/* now get the currently connected clients to server @srv */
|
||||
if ((count = virAdmServerListClients(srv, &clients, 0)) < 0)
|
||||
goto cleanup;
|
||||
|
||||
/* let's print the currently connected clients and some basic info about
|
||||
* them, we have 2 options how to interate over the returned list,
|
||||
* use @count as the boundary or use the fact that @clients are guaranteed
|
||||
* to contain 1 extra element NULL;
|
||||
* this example uses the first option
|
||||
*/
|
||||
printf(" %-5s %-15s %-15s\n%s\n", "Id", "Transport", "Connected since",
|
||||
"--------------------------------------------------");
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
virAdmClientPtr client = clients[i];
|
||||
unsigned long long id = virAdmClientGetID(client);
|
||||
int transport = virAdmClientGetTransport(client);
|
||||
char * timestr = NULL;
|
||||
if (!(timestr =
|
||||
exampleGetTimeStr(virAdmClientGetTimestamp(client))))
|
||||
goto cleanup;
|
||||
|
||||
printf(" %-5llu %-15s %-15s\n", id,
|
||||
exampleTransportToString(transport), timestr);
|
||||
free(timestr);
|
||||
}
|
||||
|
||||
ret = 0;
|
||||
cleanup:
|
||||
/* Once finished, free the list of clients, free the server handle and
|
||||
* close the connection properly, @conn will be deallocated automatically
|
||||
*/
|
||||
for (i = 0; i < count; i++)
|
||||
virAdmClientFree(clients[i]);
|
||||
free(clients);
|
||||
virAdmServerFree(srv);
|
||||
virAdmConnectClose(conn);
|
||||
return ret;
|
||||
}
|
@@ -1,42 +0,0 @@
|
||||
#include<stdio.h>
|
||||
#include<stdlib.h>
|
||||
#include<libvirt/libvirt-admin.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
int ret = -1;
|
||||
virAdmConnectPtr conn = NULL;
|
||||
virAdmServerPtr *servers = NULL; /* where to store the servers */
|
||||
virAdmServerPtr *tmp = NULL;
|
||||
size_t i = 0;
|
||||
int count = 0;
|
||||
|
||||
/* first, open a connection to the daemon */
|
||||
if (!(conn = virAdmConnectOpen(NULL, 0)))
|
||||
goto cleanup;
|
||||
|
||||
/* get the available servers on the default daemon - libvirtd */
|
||||
if ((count = virAdmConnectListServers(conn, &servers, 0)) < 0)
|
||||
goto cleanup;
|
||||
|
||||
/* let's print the available servers, we have 2 options how to interate
|
||||
* over the returned list, use @count as the boundary or use the fact
|
||||
* that @servers are guaranteed to contain 1 extra element NULL;
|
||||
* this example uses the second option
|
||||
*/
|
||||
printf(" %-15s\n", "Server name");
|
||||
printf("---------------\n");
|
||||
for (tmp = servers; *tmp; tmp++)
|
||||
printf(" %-15s\n", virAdmServerGetName(*tmp));
|
||||
|
||||
ret = 0;
|
||||
cleanup:
|
||||
/* Once finished, free the list of servers and close the connection
|
||||
* properly, @conn will be deallocated automatically
|
||||
*/
|
||||
for (i = 0; i < count; i++)
|
||||
virAdmServerFree(servers[i]);
|
||||
free(servers);
|
||||
virAdmConnectClose(conn);
|
||||
return ret;
|
||||
}
|
@@ -1,65 +0,0 @@
|
||||
#include<stdio.h>
|
||||
#include<stdlib.h>
|
||||
#include<libvirt/libvirt-admin.h>
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int ret = -1;
|
||||
virAdmConnectPtr conn = NULL;
|
||||
virAdmServerPtr srv = NULL; /* which server to work with */
|
||||
virTypedParameterPtr params = NULL;
|
||||
int nparams = 0;
|
||||
size_t i;
|
||||
|
||||
if (argc != 2) {
|
||||
fprintf(stderr, "One argument specifying the server which to work "
|
||||
"with is expected\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* first, open a connection to the daemon */
|
||||
if (!(conn = virAdmConnectOpen(NULL, 0)))
|
||||
goto cleanup;
|
||||
|
||||
/* a server handle is necessary before any API regarding threadpool
|
||||
* parameters can be issued
|
||||
*/
|
||||
if (!(srv = virAdmConnectLookupServer(conn, argv[1], 0)))
|
||||
goto cleanup;
|
||||
|
||||
/* get the current threadpool parameters */
|
||||
if (virAdmServerGetThreadPoolParameters(srv, ¶ms, &nparams, 0) < 0)
|
||||
goto cleanup;
|
||||
|
||||
for (i = 0; i < nparams; i++)
|
||||
printf("%-15s: %d\n", params[i].field, params[i].value.ui);
|
||||
|
||||
virTypedParamsFree(params, nparams);
|
||||
params = NULL;
|
||||
nparams = 0;
|
||||
|
||||
/* let's set minWorkers to 10, maxWorkers to 15 and prioWorkers to 10 */
|
||||
int maxparams = 0;
|
||||
if (virTypedParamsAddUInt(¶ms, &nparams, &maxparams,
|
||||
VIR_THREADPOOL_WORKERS_MIN, 10) < 0 ||
|
||||
virTypedParamsAddUInt(¶ms, &nparams, &maxparams,
|
||||
VIR_THREADPOOL_WORKERS_MAX, 15) < 0 ||
|
||||
virTypedParamsAddUInt(¶ms, &nparams, &maxparams,
|
||||
VIR_THREADPOOL_WORKERS_PRIORITY, 10) < 0)
|
||||
goto cleanup;
|
||||
|
||||
/* now, change the threadpool settings to some different values */
|
||||
if (virAdmServerSetThreadPoolParameters(srv, params, nparams, 0) < 0)
|
||||
goto cleanup;
|
||||
|
||||
ret = 0;
|
||||
cleanup:
|
||||
virTypedParamsFree(params, nparams);
|
||||
|
||||
/* Once finished deallocate the server handle and close the connection
|
||||
* properly, @conn will be deallocated automatically
|
||||
*/
|
||||
virAdmServerFree(srv);
|
||||
virAdmConnectClose(conn);
|
||||
return ret;
|
||||
}
|
@@ -45,7 +45,6 @@
|
||||
/bin/* PUx,
|
||||
/sbin/* PUx,
|
||||
/usr/bin/* PUx,
|
||||
/usr/sbin/virtlogd pix,
|
||||
/usr/sbin/* PUx,
|
||||
/lib/udev/scsi_id PUx,
|
||||
/usr/{lib,lib64}/xen-common/bin/xen-toolstack PUx,
|
||||
|
@@ -34,21 +34,6 @@
|
||||
|
||||
static int debug;
|
||||
|
||||
/* On mingw, there's a header file that poisons the well:
|
||||
*
|
||||
*
|
||||
* CC domtop.o
|
||||
*domtop.c:40:0: warning: "ERROR" redefined [enabled by default]
|
||||
* #define ERROR(...) \
|
||||
* ^
|
||||
*In file included from /usr/i686-w64-mingw32/sys-root/mingw/include/windows.h:71:0,
|
||||
* from /usr/i686-w64-mingw32/sys-root/mingw/include/winsock2.h:23,
|
||||
* from ../../gnulib/lib/unistd.h:48,
|
||||
* from domtop.c:35:
|
||||
* /usr/i686-w64-mingw32/sys-root/mingw/include/wingdi.h:75:0: note: this is the location of the previous definition
|
||||
* #define ERROR 0
|
||||
*/
|
||||
#undef ERROR
|
||||
#define ERROR(...) \
|
||||
do { \
|
||||
fprintf(stderr, "ERROR %s:%d : ", __FUNCTION__, __LINE__); \
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -18,11 +18,15 @@
|
||||
|
||||
virincdir = $(includedir)/libvirt
|
||||
|
||||
allheaders = $(wildcard $(srcdir)/*.h)
|
||||
virinc_HEADERS = $(filter-out $(srcdir)/libvirt-common.h, $(allheaders))
|
||||
virinc_HEADERS += libvirt-common.h
|
||||
allheaders = $(wildcard $(srcdir)/libvirt/*.h)
|
||||
virinc_HEADERS = $(filter-out $(srcdir)/libvirt/libvirt-admin.h \
|
||||
$(srcdir)/libvirt/libvirt-common.h, $(allheaders))
|
||||
virinc_HEADERS += libvirt/libvirt-common.h
|
||||
|
||||
EXTRA_DIST = libvirt-common.h.in
|
||||
EXTRA_DIST = libvirt/libvirt-common.h.in
|
||||
|
||||
# Temporarily disabled, but we need it for building
|
||||
EXTRA_DIST += libvirt/libvirt-admin.h
|
||||
|
||||
install-exec-hook:
|
||||
$(mkinstalldirs) $(DESTDIR)$(virincdir)
|
@@ -42,22 +42,6 @@ extern "C" {
|
||||
*/
|
||||
typedef struct _virAdmConnect virAdmConnect;
|
||||
|
||||
/**
|
||||
* virAdmServer:
|
||||
*
|
||||
* a virAdmServer is a private structure and client-side representation of
|
||||
* a remote server object
|
||||
*/
|
||||
typedef struct _virAdmServer virAdmServer;
|
||||
|
||||
/**
|
||||
* virAdmClient:
|
||||
*
|
||||
* a virAdmClient is a private structure and client-side representation of
|
||||
* a remote server's client object (as server sees clients connected to it)
|
||||
*/
|
||||
typedef struct _virAdmClient virAdmClient;
|
||||
|
||||
/**
|
||||
* virAdmConnectPtr:
|
||||
*
|
||||
@@ -67,34 +51,11 @@ typedef struct _virAdmClient virAdmClient;
|
||||
*/
|
||||
typedef virAdmConnect *virAdmConnectPtr;
|
||||
|
||||
/**
|
||||
* virAdmServerPtr:
|
||||
*
|
||||
* a virAdmServerPtr is a pointer to a virAdmServer structure,
|
||||
* this is the type used to reference client-side representation of a
|
||||
* remote server object throughout all the APIs.
|
||||
*/
|
||||
typedef virAdmServer *virAdmServerPtr;
|
||||
|
||||
/**
|
||||
* virAdmClientPtr:
|
||||
*
|
||||
* a virAdmClientPtr is a pointer to a virAdmClient structure,
|
||||
* this is the type used to reference client-side representation of a
|
||||
* client object throughout all the APIs.
|
||||
*/
|
||||
typedef virAdmClient *virAdmClientPtr;
|
||||
|
||||
int virAdmInitialize(void);
|
||||
virAdmConnectPtr virAdmConnectOpen(const char *name, unsigned int flags);
|
||||
int virAdmConnectClose(virAdmConnectPtr conn);
|
||||
|
||||
int virAdmConnectRef(virAdmConnectPtr conn);
|
||||
int virAdmConnectIsAlive(virAdmConnectPtr conn);
|
||||
int virAdmServerFree(virAdmServerPtr srv);
|
||||
|
||||
int virAdmConnectListServers(virAdmConnectPtr conn,
|
||||
virAdmServerPtr **servers,
|
||||
unsigned int flags);
|
||||
|
||||
int virAdmGetVersion(unsigned long long *libVer);
|
||||
|
||||
@@ -122,288 +83,6 @@ int virAdmConnectRegisterCloseCallback(virAdmConnectPtr conn,
|
||||
int virAdmConnectUnregisterCloseCallback(virAdmConnectPtr conn,
|
||||
virAdmConnectCloseFunc cb);
|
||||
|
||||
const char *virAdmServerGetName(virAdmServerPtr srv);
|
||||
|
||||
virAdmServerPtr virAdmConnectLookupServer(virAdmConnectPtr conn,
|
||||
const char *name,
|
||||
unsigned int flags);
|
||||
|
||||
/* Manage threadpool attributes */
|
||||
|
||||
/**
|
||||
* VIR_THREADPOOL_WORKERS_MIN:
|
||||
* Macro for the threadpool minWorkers limit: represents the bottom limit to
|
||||
* number of active workers in threadpool, as VIR_TYPED_PARAM_UINT.
|
||||
*/
|
||||
|
||||
# define VIR_THREADPOOL_WORKERS_MIN "minWorkers"
|
||||
|
||||
/**
|
||||
* VIR_THREADPOOL_WORKERS_MAX:
|
||||
* Macro for the threadpool maxWorkers limit: represents the upper limit to
|
||||
* number of active workers in threadpool, as VIR_TYPED_PARAM_UINT.
|
||||
* The value of this limit has to be greater than VIR_THREADPOOL_WORKERS_MIN
|
||||
* at all times.
|
||||
*/
|
||||
|
||||
# define VIR_THREADPOOL_WORKERS_MAX "maxWorkers"
|
||||
|
||||
/**
|
||||
* VIR_THREADPOOL_WORKERS_PRIORITY:
|
||||
* Macro for the threadpool nPrioWorkers attribute: represents the current number
|
||||
* of active priority workers in threadpool, as VIR_TYPED_PARAM_UINT.
|
||||
*/
|
||||
|
||||
# define VIR_THREADPOOL_WORKERS_PRIORITY "prioWorkers"
|
||||
|
||||
/**
|
||||
* VIR_THREADPOOL_WORKERS_FREE:
|
||||
* Macro for the threadpool freeWorkers attribute: represents the current number
|
||||
* of free workers available to accomplish a job, as VIR_TYPED_PARAM_UINT.
|
||||
*
|
||||
* NOTE: This attribute is read-only and any attempt to set it will be denied
|
||||
* by daemon
|
||||
*/
|
||||
|
||||
# define VIR_THREADPOOL_WORKERS_FREE "freeWorkers"
|
||||
|
||||
/**
|
||||
* VIR_THREADPOOL_WORKERS_CURRENT:
|
||||
* Macro for the threadpool nWorkers attribute: represents the current number
|
||||
* of active ordinary workers in threadpool, as VIR_TYPED_PARAM_UINT.
|
||||
*
|
||||
* NOTE: This attribute is read-only and any attempt to set it will be denied
|
||||
* by daemon
|
||||
*/
|
||||
|
||||
# define VIR_THREADPOOL_WORKERS_CURRENT "nWorkers"
|
||||
|
||||
/**
|
||||
* VIR_THREADPOOL_JOB_QUEUE_DEPTH:
|
||||
* Macro for the threadpool jobQueueDepth attribute: represents the current
|
||||
* number of jobs waiting in a queue to be processed, as VIR_TYPED_PARAM_UINT.
|
||||
*
|
||||
* NOTE: This attribute is read-only and any attempt to set it will be denied
|
||||
* by daemon
|
||||
*/
|
||||
|
||||
# define VIR_THREADPOOL_JOB_QUEUE_DEPTH "jobQueueDepth"
|
||||
|
||||
/* Tunables for a server workerpool */
|
||||
int virAdmServerGetThreadPoolParameters(virAdmServerPtr srv,
|
||||
virTypedParameterPtr *params,
|
||||
int *nparams,
|
||||
unsigned int flags);
|
||||
|
||||
int virAdmServerSetThreadPoolParameters(virAdmServerPtr srv,
|
||||
virTypedParameterPtr params,
|
||||
int nparams,
|
||||
unsigned int flags);
|
||||
|
||||
/* virAdmClient object accessors */
|
||||
unsigned long long virAdmClientGetID(virAdmClientPtr client);
|
||||
long long virAdmClientGetTimestamp(virAdmClientPtr client);
|
||||
int virAdmClientGetTransport(virAdmClientPtr client);
|
||||
int virAdmClientFree(virAdmClientPtr client);
|
||||
|
||||
typedef enum {
|
||||
VIR_CLIENT_TRANS_UNIX = 0, /* connection via UNIX socket */
|
||||
VIR_CLIENT_TRANS_TCP, /* connection via unencrypted TCP socket */
|
||||
VIR_CLIENT_TRANS_TLS, /* connection via encrypted TCP socket */
|
||||
|
||||
# ifdef VIR_ENUM_SENTINELS
|
||||
VIR_CLIENT_TRANS_LAST
|
||||
# endif
|
||||
} virClientTransport;
|
||||
|
||||
int virAdmServerListClients(virAdmServerPtr srv,
|
||||
virAdmClientPtr **clients,
|
||||
unsigned int flags);
|
||||
|
||||
virAdmClientPtr
|
||||
virAdmServerLookupClient(virAdmServerPtr srv,
|
||||
unsigned long long id,
|
||||
unsigned int flags);
|
||||
|
||||
/* Client identity info */
|
||||
|
||||
/**
|
||||
* VIR_CLIENT_INFO_READONLY:
|
||||
* Macro represents client's connection permission, whether the client is
|
||||
* connected in read-only mode or just the opposite - read-write,
|
||||
* as VIR_TYPED_PARAM_BOOLEAN.
|
||||
*
|
||||
* NOTE: This attribute is read-only and any attempt to set it will be denied
|
||||
* by daemon
|
||||
*/
|
||||
|
||||
# define VIR_CLIENT_INFO_READONLY "readonly"
|
||||
|
||||
/**
|
||||
* VIR_CLIENT_INFO_SOCKET_ADDR:
|
||||
* Macro represents clients network socket address in a standard URI format:
|
||||
* (IPv4|[IPv6]):port, as VIR_TYPED_PARAM_STRING.
|
||||
*
|
||||
* NOTE: This attribute is read-only and any attempt to set it will be denied
|
||||
* by daemon
|
||||
*/
|
||||
|
||||
# define VIR_CLIENT_INFO_SOCKET_ADDR "sock_addr"
|
||||
|
||||
/**
|
||||
* VIR_CLIENT_INFO_SASL_USER_NAME:
|
||||
* Macro represents client's SASL user name, if SASL authentication is enabled
|
||||
* on the remote host, as VIR_TYPED_PARAM_STRING.
|
||||
*
|
||||
* NOTE: This attribute is read-only and any attempt to set it will be denied
|
||||
* by daemon
|
||||
*/
|
||||
|
||||
# define VIR_CLIENT_INFO_SASL_USER_NAME "sasl_user_name"
|
||||
|
||||
/**
|
||||
* VIR_CLIENT_INFO_X509_DISTINGUISHED_NAME:
|
||||
* Macro represents the 'distinguished name' field in X509 certificate the
|
||||
* client used to establish a TLS session with remote host, as
|
||||
* VIR_TYPED_PARAM_STRING.
|
||||
*
|
||||
* NOTE: This attribute is read-only and any attempt to set it will be denied
|
||||
* by daemon
|
||||
*/
|
||||
|
||||
# define VIR_CLIENT_INFO_X509_DISTINGUISHED_NAME "tls_x509_dname"
|
||||
|
||||
/**
|
||||
* VIR_CLIENT_INFO_UNIX_USER_ID:
|
||||
* Macro represents UNIX UID the client process is running with. Only relevant
|
||||
* for clients connected locally, i.e. via a UNIX socket,
|
||||
* as VIR_TYPED_PARAM_INT.
|
||||
*
|
||||
* NOTE: This attribute is read-only and any attempt to set it will be denied
|
||||
* by daemon
|
||||
*/
|
||||
|
||||
# define VIR_CLIENT_INFO_UNIX_USER_ID "unix_user_id"
|
||||
|
||||
/**
|
||||
* VIR_CLIENT_INFO_UNIX_USER_NAME:
|
||||
* Macro represents the user name that is bound to the client process's UID it
|
||||
* is running with. Only relevant for clients connected locally, i.e. via a
|
||||
* UNIX socket, as VIR_TYPED_PARAM_STRING.
|
||||
*
|
||||
* NOTE: This attribute is read-only and any attempt to set it will be denied
|
||||
* by daemon
|
||||
*/
|
||||
|
||||
# define VIR_CLIENT_INFO_UNIX_USER_NAME "unix_user_name"
|
||||
|
||||
/**
|
||||
* VIR_CLIENT_INFO_UNIX_GROUP_ID:
|
||||
* Macro represents UNIX GID the client process is running with. Only relevant
|
||||
* for clients connected locally, i.e. via a UNIX socket,
|
||||
* as VIR_TYPED_PARAM_INT.
|
||||
*
|
||||
* NOTE: This attribute is read-only and any attempt to set it will be denied
|
||||
* by daemon
|
||||
*/
|
||||
|
||||
# define VIR_CLIENT_INFO_UNIX_GROUP_ID "unix_group_id"
|
||||
|
||||
/**
|
||||
* VIR_CLIENT_INFO_UNIX_GROUP_NAME:
|
||||
* Macro represents the group name that is bound to the client process's GID it
|
||||
* is running with. Only relevant for clients connected locally, i.e. via a
|
||||
* UNIX socket, as VIR_TYPED_PARAM_STRING.
|
||||
*
|
||||
* NOTE: This attribute is read-only and any attempt to set it will be denied
|
||||
* by daemon
|
||||
*/
|
||||
|
||||
# define VIR_CLIENT_INFO_UNIX_GROUP_NAME "unix_group_name"
|
||||
|
||||
/**
|
||||
* VIR_CLIENT_INFO_UNIX_PROCESS_ID:
|
||||
* Macro represents the client process's pid it is running with. Only relevant
|
||||
* for clients connected locally, i.e. via a UNIX socket,
|
||||
* as VIR_TYPED_PARAM_INT.
|
||||
*
|
||||
* NOTE: This attribute is read-only and any attempt to set it will be denied
|
||||
* by daemon
|
||||
*/
|
||||
|
||||
# define VIR_CLIENT_INFO_UNIX_PROCESS_ID "unix_process_id"
|
||||
|
||||
/**
|
||||
* VIR_CLIENT_INFO_SELINUX_CONTEXT:
|
||||
* Macro represents the client's (peer's) SELinux context and this can either
|
||||
* be at socket layer or at transport layer, depending on the connection type,
|
||||
* as VIR_TYPED_PARAM_STRING.
|
||||
*
|
||||
* NOTE: This attribute is read-only and any attempt to set it will be denied
|
||||
* by daemon
|
||||
*/
|
||||
|
||||
# define VIR_CLIENT_INFO_SELINUX_CONTEXT "selinux_context"
|
||||
|
||||
int virAdmClientGetInfo(virAdmClientPtr client,
|
||||
virTypedParameterPtr *params,
|
||||
int *nparams,
|
||||
unsigned int flags);
|
||||
|
||||
int virAdmClientClose(virAdmClientPtr client, unsigned int flags);
|
||||
|
||||
/* Manage per-server client limits */
|
||||
|
||||
/**
|
||||
* VIR_SERVER_CLIENTS_MAX:
|
||||
* Macro for per-server nclients_max limit: represents the upper limit to
|
||||
* number of clients connected to the server, as uint.
|
||||
*/
|
||||
|
||||
# define VIR_SERVER_CLIENTS_MAX "nclients_max"
|
||||
|
||||
/**
|
||||
* VIR_SERVER_CLIENTS_CURRENT:
|
||||
* Macro for per-server nclients attribute: represents the current number of
|
||||
* clients connected to the server, as VIR_TYPED_PARAM_UINT.
|
||||
*
|
||||
* NOTE: This attribute is read-only and any attempt to set it will be denied
|
||||
* by daemon
|
||||
*/
|
||||
|
||||
# define VIR_SERVER_CLIENTS_CURRENT "nclients"
|
||||
|
||||
/**
|
||||
* VIR_SERVER_CLIENTS_UNAUTH_MAX:
|
||||
* Macro for per-server nclients_unauth_max limit: represents the upper limit
|
||||
* to number of clients connected to the server, but not authenticated yet,
|
||||
* as VIR_TYPED_PARAM_UINT.
|
||||
*/
|
||||
|
||||
# define VIR_SERVER_CLIENTS_UNAUTH_MAX "nclients_unauth_max"
|
||||
|
||||
/**
|
||||
* VIR_SERVER_CLIENTS_UNAUTH_CURRENT:
|
||||
* Macro for per-server nclients_unauth attribute: represents the current
|
||||
* number of clients connected to the server, but not authenticated yet,
|
||||
* as VIR_TYPED_PARAM_UINT.
|
||||
*
|
||||
* NOTE: This attribute is read-only and any attempt to set it will be denied
|
||||
* by daemon
|
||||
*/
|
||||
|
||||
# define VIR_SERVER_CLIENTS_UNAUTH_CURRENT "nclients_unauth"
|
||||
|
||||
int virAdmServerGetClientLimits(virAdmServerPtr srv,
|
||||
virTypedParameterPtr *params,
|
||||
int *nparams,
|
||||
unsigned int flags);
|
||||
|
||||
int virAdmServerSetClientLimits(virAdmServerPtr srv,
|
||||
virTypedParameterPtr params,
|
||||
int nparams,
|
||||
unsigned int flags);
|
||||
|
||||
# ifdef __cplusplus
|
||||
}
|
||||
# endif
|
||||
|
@@ -1,9 +1,8 @@
|
||||
/*
|
||||
/* -*- c -*-
|
||||
* libvirt-common.h
|
||||
* Summary: common macros and enums for the libvirt and libvirt-admin library
|
||||
* Description: Provides common macros and enums needed by both libvirt and
|
||||
* libvirt-admin libraries
|
||||
* Author: Erik Skultety <eskultet@redhat.com>
|
||||
*
|
||||
* Copyright (C) 2015 Red Hat, Inc.
|
||||
*
|
||||
@@ -20,6 +19,8 @@
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library. If not, see
|
||||
* <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Author: Erik Skultety <eskultet@redhat.com>
|
||||
*/
|
||||
|
||||
#if !defined __VIR_LIBVIRT_H_INCLUDES__ && !defined __VIR_ADMIN_H_INCLUDES__
|
||||
@@ -119,173 +120,6 @@ typedef enum {
|
||||
# endif
|
||||
} virConnectCloseReason;
|
||||
|
||||
/**
|
||||
* virTypedParameterType:
|
||||
*
|
||||
* Express the type of a virTypedParameter
|
||||
*/
|
||||
typedef enum {
|
||||
VIR_TYPED_PARAM_INT = 1, /* integer case */
|
||||
VIR_TYPED_PARAM_UINT = 2, /* unsigned integer case */
|
||||
VIR_TYPED_PARAM_LLONG = 3, /* long long case */
|
||||
VIR_TYPED_PARAM_ULLONG = 4, /* unsigned long long case */
|
||||
VIR_TYPED_PARAM_DOUBLE = 5, /* double case */
|
||||
VIR_TYPED_PARAM_BOOLEAN = 6, /* boolean(character) case */
|
||||
VIR_TYPED_PARAM_STRING = 7, /* string case */
|
||||
|
||||
# ifdef VIR_ENUM_SENTINELS
|
||||
VIR_TYPED_PARAM_LAST
|
||||
# endif
|
||||
} virTypedParameterType;
|
||||
|
||||
/**
|
||||
* virTypedParameterFlags:
|
||||
*
|
||||
* Flags related to libvirt APIs that use virTypedParameter.
|
||||
*
|
||||
* These enums should not conflict with those of virDomainModificationImpact.
|
||||
*/
|
||||
typedef enum {
|
||||
/* 1 << 0 is reserved for virDomainModificationImpact */
|
||||
/* 1 << 1 is reserved for virDomainModificationImpact */
|
||||
|
||||
/* Older servers lacked the ability to handle string typed
|
||||
* parameters. Attempts to set a string parameter with an older
|
||||
* server will fail at the client, but attempts to retrieve
|
||||
* parameters must not return strings from a new server to an
|
||||
* older client, so this flag exists to identify newer clients to
|
||||
* newer servers. This flag is automatically set when needed, so
|
||||
* the user does not have to worry about it; however, manually
|
||||
* setting the flag can be used to reject servers that cannot
|
||||
* return typed strings, even if no strings would be returned.
|
||||
*/
|
||||
VIR_TYPED_PARAM_STRING_OKAY = 1 << 2,
|
||||
|
||||
} virTypedParameterFlags;
|
||||
|
||||
/**
|
||||
* VIR_TYPED_PARAM_FIELD_LENGTH:
|
||||
*
|
||||
* Macro providing the field length of virTypedParameter name
|
||||
*/
|
||||
# define VIR_TYPED_PARAM_FIELD_LENGTH 80
|
||||
|
||||
/**
|
||||
* virTypedParameter:
|
||||
*
|
||||
* A named parameter, including a type and value.
|
||||
*
|
||||
* The types virSchedParameter, virBlkioParameter, and
|
||||
* virMemoryParameter are aliases of this type, for use when
|
||||
* targeting libvirt earlier than 0.9.2.
|
||||
*/
|
||||
typedef struct _virTypedParameter virTypedParameter;
|
||||
|
||||
struct _virTypedParameter {
|
||||
char field[VIR_TYPED_PARAM_FIELD_LENGTH]; /* parameter name */
|
||||
int type; /* parameter type, virTypedParameterType */
|
||||
union {
|
||||
int i; /* type is INT */
|
||||
unsigned int ui; /* type is UINT */
|
||||
long long int l; /* type is LLONG */
|
||||
unsigned long long int ul; /* type is ULLONG */
|
||||
double d; /* type is DOUBLE */
|
||||
char b; /* type is BOOLEAN */
|
||||
char *s; /* type is STRING, may not be NULL */
|
||||
} value; /* parameter value */
|
||||
};
|
||||
|
||||
/**
|
||||
* virTypedParameterPtr:
|
||||
*
|
||||
* a pointer to a virTypedParameter structure.
|
||||
*/
|
||||
typedef virTypedParameter *virTypedParameterPtr;
|
||||
|
||||
virTypedParameterPtr virTypedParamsGet(virTypedParameterPtr params,
|
||||
int nparams,
|
||||
const char *name);
|
||||
int virTypedParamsGetInt(virTypedParameterPtr params,
|
||||
int nparams,
|
||||
const char *name,
|
||||
int *value);
|
||||
int virTypedParamsGetUInt(virTypedParameterPtr params,
|
||||
int nparams,
|
||||
const char *name,
|
||||
unsigned int *value);
|
||||
int virTypedParamsGetLLong(virTypedParameterPtr params,
|
||||
int nparams,
|
||||
const char *name,
|
||||
long long *value);
|
||||
int virTypedParamsGetULLong(virTypedParameterPtr params,
|
||||
int nparams,
|
||||
const char *name,
|
||||
unsigned long long *value);
|
||||
int virTypedParamsGetDouble(virTypedParameterPtr params,
|
||||
int nparams,
|
||||
const char *name,
|
||||
double *value);
|
||||
int virTypedParamsGetBoolean(virTypedParameterPtr params,
|
||||
int nparams,
|
||||
const char *name,
|
||||
int *value);
|
||||
int virTypedParamsGetString(virTypedParameterPtr params,
|
||||
int nparams,
|
||||
const char *name,
|
||||
const char **value);
|
||||
|
||||
int virTypedParamsAddInt(virTypedParameterPtr *params,
|
||||
int *nparams,
|
||||
int *maxparams,
|
||||
const char *name,
|
||||
int value);
|
||||
int virTypedParamsAddUInt(virTypedParameterPtr *params,
|
||||
int *nparams,
|
||||
int *maxparams,
|
||||
const char *name,
|
||||
unsigned int value);
|
||||
int virTypedParamsAddLLong(virTypedParameterPtr *params,
|
||||
int *nparams,
|
||||
int *maxparams,
|
||||
const char *name,
|
||||
long long value);
|
||||
int virTypedParamsAddULLong(virTypedParameterPtr *params,
|
||||
int *nparams,
|
||||
int *maxparams,
|
||||
const char *name,
|
||||
unsigned long long value);
|
||||
int virTypedParamsAddDouble(virTypedParameterPtr *params,
|
||||
int *nparams,
|
||||
int *maxparams,
|
||||
const char *name,
|
||||
double value);
|
||||
int virTypedParamsAddBoolean(virTypedParameterPtr *params,
|
||||
int *nparams,
|
||||
int *maxparams,
|
||||
const char *name,
|
||||
int value);
|
||||
int virTypedParamsAddString(virTypedParameterPtr *params,
|
||||
int *nparams,
|
||||
int *maxparams,
|
||||
const char *name,
|
||||
const char *value);
|
||||
int virTypedParamsAddStringList(virTypedParameterPtr *params,
|
||||
int *nparams,
|
||||
int *maxparams,
|
||||
const char *name,
|
||||
const char **values);
|
||||
int virTypedParamsAddFromString(virTypedParameterPtr *params,
|
||||
int *nparams,
|
||||
int *maxparams,
|
||||
const char *name,
|
||||
int type,
|
||||
const char *value);
|
||||
|
||||
void virTypedParamsClear(virTypedParameterPtr params,
|
||||
int nparams);
|
||||
void virTypedParamsFree(virTypedParameterPtr params,
|
||||
int nparams);
|
||||
|
||||
# ifdef __cplusplus
|
||||
}
|
||||
# endif
|
||||
|
@@ -90,7 +90,6 @@ typedef enum {
|
||||
VIR_DOMAIN_RUNNING_WAKEUP = 8, /* returned from pmsuspended due to
|
||||
wakeup event */
|
||||
VIR_DOMAIN_RUNNING_CRASHED = 9, /* resumed from crashed */
|
||||
VIR_DOMAIN_RUNNING_POSTCOPY = 10, /* running in post-copy migration mode */
|
||||
|
||||
# ifdef VIR_ENUM_SENTINELS
|
||||
VIR_DOMAIN_RUNNING_LAST
|
||||
@@ -118,8 +117,6 @@ typedef enum {
|
||||
VIR_DOMAIN_PAUSED_SNAPSHOT = 9, /* paused while creating a snapshot */
|
||||
VIR_DOMAIN_PAUSED_CRASHED = 10, /* paused due to a guest crash */
|
||||
VIR_DOMAIN_PAUSED_STARTING_UP = 11, /* the domain is being started */
|
||||
VIR_DOMAIN_PAUSED_POSTCOPY = 12, /* paused for post-copy migration */
|
||||
VIR_DOMAIN_PAUSED_POSTCOPY_FAILED = 13, /* paused after failed post-copy */
|
||||
|
||||
# ifdef VIR_ENUM_SENTINELS
|
||||
VIR_DOMAIN_PAUSED_LAST
|
||||
@@ -314,22 +311,6 @@ typedef enum {
|
||||
*/
|
||||
# define VIR_DOMAIN_SCHEDULER_CPU_SHARES "cpu_shares"
|
||||
|
||||
/**
|
||||
* VIR_DOMAIN_SCHEDULER_GLOBAL_PERIOD:
|
||||
*
|
||||
* Macro represents the enforcement period for a quota, in microseconds,
|
||||
* for whole domain, when using the posix scheduler, as a ullong.
|
||||
*/
|
||||
# define VIR_DOMAIN_SCHEDULER_GLOBAL_PERIOD "global_period"
|
||||
|
||||
/**
|
||||
* VIR_DOMAIN_SCHEDULER_GLOBAL_QUOTA:
|
||||
*
|
||||
* Macro represents the maximum bandwidth to be used within a period for
|
||||
* whole domain, when using the posix scheduler, as an llong.
|
||||
*/
|
||||
# define VIR_DOMAIN_SCHEDULER_GLOBAL_QUOTA "global_quota"
|
||||
|
||||
/**
|
||||
* VIR_DOMAIN_SCHEDULER_VCPU_PERIOD:
|
||||
*
|
||||
@@ -678,7 +659,6 @@ typedef enum {
|
||||
VIR_MIGRATE_ABORT_ON_ERROR = (1 << 12), /* abort migration on I/O errors happened during migration */
|
||||
VIR_MIGRATE_AUTO_CONVERGE = (1 << 13), /* force convergence */
|
||||
VIR_MIGRATE_RDMA_PIN_ALL = (1 << 14), /* RDMA memory pinning */
|
||||
VIR_MIGRATE_POSTCOPY = (1 << 15), /* enable (but do not start) post-copy migration */
|
||||
} virDomainMigrateFlags;
|
||||
|
||||
|
||||
@@ -726,21 +706,6 @@ typedef enum {
|
||||
*/
|
||||
# define VIR_MIGRATE_PARAM_DEST_XML "destination_xml"
|
||||
|
||||
/**
|
||||
* VIR_MIGRATE_PARAM_PERSIST_XML:
|
||||
*
|
||||
* virDomainMigrate* params field: the new persistent configuration to be used
|
||||
* for the domain on the destination host as VIR_TYPED_PARAM_STRING.
|
||||
* This field cannot be used to rename the domain during migration (use
|
||||
* VIR_MIGRATE_PARAM_DEST_NAME field for that purpose). Domain name in the
|
||||
* destination XML must match the original domain name.
|
||||
*
|
||||
* Omitting this parameter keeps the original domain persistent configuration.
|
||||
* Using this field with hypervisors that do not support changing domain
|
||||
* configuration during migration will result in a failure.
|
||||
*/
|
||||
# define VIR_MIGRATE_PARAM_PERSIST_XML "persistent_xml"
|
||||
|
||||
/**
|
||||
* VIR_MIGRATE_PARAM_BANDWIDTH:
|
||||
*
|
||||
@@ -792,78 +757,6 @@ typedef enum {
|
||||
*/
|
||||
# define VIR_MIGRATE_PARAM_MIGRATE_DISKS "migrate_disks"
|
||||
|
||||
/**
|
||||
* VIR_MIGRATE_PARAM_DISKS_PORT:
|
||||
*
|
||||
* virDomainMigrate* params field: port that destination server should use
|
||||
* for incoming disks migration. Type is VIR_TYPED_PARAM_INT. If set to 0 or
|
||||
* omitted, libvirt will choose a suitable default. At the moment this is only
|
||||
* supported by the QEMU driver.
|
||||
*/
|
||||
# define VIR_MIGRATE_PARAM_DISKS_PORT "disks_port"
|
||||
|
||||
/**
|
||||
* VIR_MIGRATE_PARAM_COMPRESSION:
|
||||
*
|
||||
* virDomainMigrate* params multiple field: name of the method used to
|
||||
* compress migration traffic. Supported compression methods: xbzrle, mt.
|
||||
* The parameter may be specified multiple times if more than one method
|
||||
* should be used.
|
||||
*/
|
||||
# define VIR_MIGRATE_PARAM_COMPRESSION "compression"
|
||||
|
||||
/**
|
||||
* VIR_MIGRATE_PARAM_COMPRESSION_MT_LEVEL:
|
||||
*
|
||||
* virDomainMigrate* params field: the level of compression for multithread
|
||||
* compression as VIR_TYPED_PARAM_INT. Accepted values are in range 0-9.
|
||||
* 0 is no compression, 1 is maximum speed and 9 is maximum compression.
|
||||
*/
|
||||
# define VIR_MIGRATE_PARAM_COMPRESSION_MT_LEVEL "compression.mt.level"
|
||||
|
||||
/**
|
||||
* VIR_MIGRATE_PARAM_COMPRESSION_MT_THREADS:
|
||||
*
|
||||
* virDomainMigrate* params field: the number of compression threads for
|
||||
* multithread compression as VIR_TYPED_PARAM_INT.
|
||||
*/
|
||||
# define VIR_MIGRATE_PARAM_COMPRESSION_MT_THREADS "compression.mt.threads"
|
||||
|
||||
/**
|
||||
* VIR_MIGRATE_PARAM_COMPRESSION_MT_DTHREADS:
|
||||
*
|
||||
* virDomainMigrate* params field: the number of decompression threads for
|
||||
* multithread compression as VIR_TYPED_PARAM_INT.
|
||||
*/
|
||||
# define VIR_MIGRATE_PARAM_COMPRESSION_MT_DTHREADS "compression.mt.dthreads"
|
||||
|
||||
/**
|
||||
* VIR_MIGRATE_PARAM_COMPRESSION_XBZRLE_CACHE:
|
||||
*
|
||||
* virDomainMigrate* params field: the size of page cache for xbzrle
|
||||
* compression as VIR_TYPED_PARAM_ULLONG.
|
||||
*/
|
||||
# define VIR_MIGRATE_PARAM_COMPRESSION_XBZRLE_CACHE "compression.xbzrle.cache"
|
||||
|
||||
/**
|
||||
* VIR_MIGRATE_PARAM_AUTO_CONVERGE_INITIAL:
|
||||
*
|
||||
* virDomainMigrate* params field: the initial percentage guest CPUs are
|
||||
* throttled to when auto-convergence decides migration is not converging.
|
||||
* As VIR_TYPED_PARAM_INT.
|
||||
*/
|
||||
# define VIR_MIGRATE_PARAM_AUTO_CONVERGE_INITIAL "auto_converge.initial"
|
||||
|
||||
/**
|
||||
* VIR_MIGRATE_PARAM_AUTO_CONVERGE_INCREMENT:
|
||||
*
|
||||
* virDomainMigrate* params field: the increment added to
|
||||
* VIR_MIGRATE_PARAM_AUTO_CONVERGE_INITIAL whenever the hypervisor decides
|
||||
* the current rate is not enough to ensure convergence of the migration.
|
||||
* As VIR_TYPED_PARAM_INT.
|
||||
*/
|
||||
# define VIR_MIGRATE_PARAM_AUTO_CONVERGE_INCREMENT "auto_converge.increment"
|
||||
|
||||
/* Domain migration. */
|
||||
virDomainPtr virDomainMigrate (virDomainPtr domain, virConnectPtr dconn,
|
||||
unsigned long flags, const char *dname,
|
||||
@@ -914,9 +807,6 @@ int virDomainMigrateGetMaxSpeed(virDomainPtr domain,
|
||||
unsigned long *bandwidth,
|
||||
unsigned int flags);
|
||||
|
||||
int virDomainMigrateStartPostCopy(virDomainPtr domain,
|
||||
unsigned int flags);
|
||||
|
||||
char * virConnectGetDomainCapabilities(virConnectPtr conn,
|
||||
const char *emulatorbin,
|
||||
const char *arch,
|
||||
@@ -1881,7 +1771,6 @@ typedef enum {
|
||||
VIR_DOMAIN_STATS_VCPU = (1 << 3), /* return domain virtual CPU info */
|
||||
VIR_DOMAIN_STATS_INTERFACE = (1 << 4), /* return domain interfaces info */
|
||||
VIR_DOMAIN_STATS_BLOCK = (1 << 5), /* return domain block info */
|
||||
VIR_DOMAIN_STATS_PERF = (1 << 6), /* return domain perf event info */
|
||||
} virDomainStatsTypes;
|
||||
|
||||
typedef enum {
|
||||
@@ -1897,7 +1786,7 @@ typedef enum {
|
||||
VIR_CONNECT_GET_ALL_DOMAINS_STATS_OTHER = VIR_CONNECT_LIST_DOMAINS_OTHER,
|
||||
|
||||
VIR_CONNECT_GET_ALL_DOMAINS_STATS_BACKING = 1 << 30, /* include backing chain for block stats */
|
||||
VIR_CONNECT_GET_ALL_DOMAINS_STATS_ENFORCE_STATS = 1U << 31, /* enforce requested stats */
|
||||
VIR_CONNECT_GET_ALL_DOMAINS_STATS_ENFORCE_STATS = 1 << 31, /* enforce requested stats */
|
||||
} virConnectGetAllDomainStatsFlags;
|
||||
|
||||
int virConnectGetAllDomainStats(virConnectPtr conn,
|
||||
@@ -1912,50 +1801,6 @@ int virDomainListGetStats(virDomainPtr *doms,
|
||||
|
||||
void virDomainStatsRecordListFree(virDomainStatsRecordPtr *stats);
|
||||
|
||||
/*
|
||||
* Perf Event API
|
||||
*/
|
||||
|
||||
/**
|
||||
* VIR_PERF_PARAM_CMT:
|
||||
*
|
||||
* Macro for typed parameter name that represents CMT perf event
|
||||
* which can be used to measure the usage of cache (bytes) by
|
||||
* applications running on the platform. It corresponds to the
|
||||
* "perf.cmt" field in the *Stats APIs.
|
||||
*/
|
||||
# define VIR_PERF_PARAM_CMT "cmt"
|
||||
|
||||
/**
|
||||
* VIR_PERF_PARAM_MBMT:
|
||||
*
|
||||
* Macro for typed parameter name that represents MBMT perf event
|
||||
* which can be used to monitor total system bandwidth (bytes/s)
|
||||
* from one level of cache to another. It corresponds to the
|
||||
* "perf.mbmt" field in the *Stats APIs.
|
||||
|
||||
*/
|
||||
# define VIR_PERF_PARAM_MBMT "mbmt"
|
||||
|
||||
/**
|
||||
* VIR_PERF_PARAM_MBML:
|
||||
*
|
||||
* Macro for typed parameter name that represents MBML perf event
|
||||
* which can be used to monitor the amount of data (bytes/s) sent
|
||||
* through the memory controller on the socket. It corresponds to
|
||||
* the "perf.mbml" field in the *Stats APIs.
|
||||
*/
|
||||
# define VIR_PERF_PARAM_MBML "mbml"
|
||||
|
||||
int virDomainGetPerfEvents(virDomainPtr dom,
|
||||
virTypedParameterPtr *params,
|
||||
int *nparams,
|
||||
unsigned int flags);
|
||||
int virDomainSetPerfEvents(virDomainPtr dom,
|
||||
virTypedParameterPtr params,
|
||||
int nparams,
|
||||
unsigned int flags);
|
||||
|
||||
/*
|
||||
* BlockJob API
|
||||
*/
|
||||
@@ -2485,7 +2330,6 @@ typedef enum {
|
||||
VIR_DOMAIN_EVENT_DEFINED_ADDED = 0, /* Newly created config file */
|
||||
VIR_DOMAIN_EVENT_DEFINED_UPDATED = 1, /* Changed config file */
|
||||
VIR_DOMAIN_EVENT_DEFINED_RENAMED = 2, /* Domain was renamed */
|
||||
VIR_DOMAIN_EVENT_DEFINED_FROM_SNAPSHOT = 3, /* Config was restored from a snapshot */
|
||||
|
||||
# ifdef VIR_ENUM_SENTINELS
|
||||
VIR_DOMAIN_EVENT_DEFINED_LAST
|
||||
@@ -2536,8 +2380,6 @@ typedef enum {
|
||||
VIR_DOMAIN_EVENT_SUSPENDED_RESTORED = 4, /* Restored from paused state file */
|
||||
VIR_DOMAIN_EVENT_SUSPENDED_FROM_SNAPSHOT = 5, /* Restored from paused snapshot */
|
||||
VIR_DOMAIN_EVENT_SUSPENDED_API_ERROR = 6, /* suspended after failure during libvirt API call */
|
||||
VIR_DOMAIN_EVENT_SUSPENDED_POSTCOPY = 7, /* suspended for post-copy migration */
|
||||
VIR_DOMAIN_EVENT_SUSPENDED_POSTCOPY_FAILED = 8, /* suspended after failed post-copy */
|
||||
|
||||
# ifdef VIR_ENUM_SENTINELS
|
||||
VIR_DOMAIN_EVENT_SUSPENDED_LAST
|
||||
@@ -2553,8 +2395,6 @@ typedef enum {
|
||||
VIR_DOMAIN_EVENT_RESUMED_UNPAUSED = 0, /* Normal resume due to admin unpause */
|
||||
VIR_DOMAIN_EVENT_RESUMED_MIGRATED = 1, /* Resumed for completion of migration */
|
||||
VIR_DOMAIN_EVENT_RESUMED_FROM_SNAPSHOT = 2, /* Resumed from snapshot */
|
||||
VIR_DOMAIN_EVENT_RESUMED_POSTCOPY = 3, /* Resumed, but migration is still
|
||||
running in post-copy mode */
|
||||
|
||||
# ifdef VIR_ENUM_SENTINELS
|
||||
VIR_DOMAIN_EVENT_RESUMED_LAST
|
||||
@@ -2985,14 +2825,6 @@ int virDomainAbortJob(virDomainPtr dom);
|
||||
*/
|
||||
# define VIR_DOMAIN_JOB_COMPRESSION_OVERFLOW "compression_overflow"
|
||||
|
||||
/**
|
||||
* VIR_DOMAIN_JOB_AUTO_CONVERGE_THROTTLE:
|
||||
*
|
||||
* virDomainGetJobStats field: current percentage guest CPUs are throttled
|
||||
* to when auto-convergence decided migration was not converging, as
|
||||
* VIR_TYPED_PARAM_INT.
|
||||
*/
|
||||
# define VIR_DOMAIN_JOB_AUTO_CONVERGE_THROTTLE "auto_converge_throttle"
|
||||
|
||||
|
||||
/**
|
||||
@@ -3279,12 +3111,8 @@ typedef void (*virConnectDomainEventBlockJobCallback)(virConnectPtr conn,
|
||||
* The reason describing why this callback is called
|
||||
*/
|
||||
typedef enum {
|
||||
VIR_DOMAIN_EVENT_DISK_CHANGE_MISSING_ON_START = 0,
|
||||
/* removable media changed to empty according to startup policy as source
|
||||
* was missing. oldSrcPath is set, newSrcPath is NULL */
|
||||
VIR_DOMAIN_EVENT_DISK_CHANGE_MISSING_ON_START = 0, /* oldSrcPath is set */
|
||||
VIR_DOMAIN_EVENT_DISK_DROP_MISSING_ON_START = 1,
|
||||
/* disk was dropped from domain as source file was missing.
|
||||
* oldSrcPath is set, newSrcPath is NULL */
|
||||
|
||||
# ifdef VIR_ENUM_SENTINELS
|
||||
VIR_DOMAIN_EVENT_DISK_CHANGE_LAST
|
||||
@@ -3455,70 +3283,6 @@ typedef void (*virConnectDomainEventDeviceAddedCallback)(virConnectPtr conn,
|
||||
const char *devAlias,
|
||||
void *opaque);
|
||||
|
||||
|
||||
/**
|
||||
* virConnectDomainEventDeviceRemovalFailedCallback:
|
||||
* @conn: connection object
|
||||
* @dom: domain on which the event occurred
|
||||
* @devAlias: device alias
|
||||
* @opaque: application specified data
|
||||
*
|
||||
* This callback occurs when it's certain that removal of a device failed.
|
||||
*
|
||||
* The callback signature to use when registering for an event of type
|
||||
* VIR_DOMAIN_EVENT_ID_DEVICE_REMOVAL_FAILED with
|
||||
* virConnectDomainEventRegisterAny().
|
||||
*/
|
||||
typedef void (*virConnectDomainEventDeviceRemovalFailedCallback)(virConnectPtr conn,
|
||||
virDomainPtr dom,
|
||||
const char *devAlias,
|
||||
void *opaque);
|
||||
|
||||
|
||||
/**
|
||||
* virConnectDomainEventMigrationIterationCallback:
|
||||
* @conn: connection object
|
||||
* @dom: domain on which the event occurred
|
||||
* @iteration: current iteration over domain's memory
|
||||
* @opaque: application specific data
|
||||
*
|
||||
* This callback occurs during live migration when a new iteration over
|
||||
* domain's memory starts. The @iteration value is increased by one every
|
||||
* time a new iteration is started to transfer memory pages dirtied since
|
||||
* the last iteration.
|
||||
*
|
||||
* The callback signature to use when registering for an event of type
|
||||
* VIR_DOMAIN_EVENT_ID_MIGRATION_ITERATION with
|
||||
* virConnectDomainEventRegisterAny().
|
||||
*/
|
||||
typedef void (*virConnectDomainEventMigrationIterationCallback)(virConnectPtr conn,
|
||||
virDomainPtr dom,
|
||||
int iteration,
|
||||
void *opaque);
|
||||
|
||||
/**
|
||||
* virConnectDomainEventJobCompletedCallback:
|
||||
* @conn: connection object
|
||||
* @dom: domain on which the event occurred
|
||||
* @params: job statistics stored as an array of virTypedParameter
|
||||
* @nparams: size of the params array
|
||||
* @opaque: application specific data
|
||||
*
|
||||
* This callback occurs when a job (such as migration) running on the domain
|
||||
* is completed. The params array will contain statistics of the just completed
|
||||
* job as virDomainGetJobStats would return. The callback must not free @params
|
||||
* (the array will be freed once the callback finishes).
|
||||
*
|
||||
* The callback signature to use when registering for an event of type
|
||||
* VIR_DOMAIN_EVENT_ID_JOB_COMPLETED with
|
||||
* virConnectDomainEventRegisterAny().
|
||||
*/
|
||||
typedef void (*virConnectDomainEventJobCompletedCallback)(virConnectPtr conn,
|
||||
virDomainPtr dom,
|
||||
virTypedParameterPtr params,
|
||||
int nparams,
|
||||
void *opaque);
|
||||
|
||||
/**
|
||||
* VIR_DOMAIN_TUNABLE_CPU_VCPUPIN:
|
||||
*
|
||||
@@ -3553,22 +3317,6 @@ typedef void (*virConnectDomainEventJobCompletedCallback)(virConnectPtr conn,
|
||||
*/
|
||||
# define VIR_DOMAIN_TUNABLE_CPU_CPU_SHARES "cputune.cpu_shares"
|
||||
|
||||
/**
|
||||
* VIR_DOMAIN_TUNABLE_CPU_GLOBAL_PERIOD:
|
||||
*
|
||||
* Macro represents the enforcement period for a quota, in microseconds,
|
||||
* for whole domain, when using the posix scheduler, as VIR_TYPED_PARAM_ULLONG.
|
||||
*/
|
||||
# define VIR_DOMAIN_TUNABLE_CPU_GLOBAL_PERIOD "cputune.global_period"
|
||||
|
||||
/**
|
||||
* VIR_DOMAIN_TUNABLE_CPU_GLOBAL_QUOTA:
|
||||
*
|
||||
* Macro represents the maximum bandwidth to be used within a period for
|
||||
* whole domain, when using the posix scheduler, as VIR_TYPED_PARAM_LLONG.
|
||||
*/
|
||||
# define VIR_DOMAIN_TUNABLE_CPU_GLOBAL_QUOTA "cputune.global_quota"
|
||||
|
||||
/**
|
||||
* VIR_DOMAIN_TUNABLE_CPU_VCPU_PERIOD:
|
||||
*
|
||||
@@ -3818,9 +3566,6 @@ typedef enum {
|
||||
VIR_DOMAIN_EVENT_ID_TUNABLE = 17, /* virConnectDomainEventTunableCallback */
|
||||
VIR_DOMAIN_EVENT_ID_AGENT_LIFECYCLE = 18,/* virConnectDomainEventAgentLifecycleCallback */
|
||||
VIR_DOMAIN_EVENT_ID_DEVICE_ADDED = 19, /* virConnectDomainEventDeviceAddedCallback */
|
||||
VIR_DOMAIN_EVENT_ID_MIGRATION_ITERATION = 20, /* virConnectDomainEventMigrationIterationCallback */
|
||||
VIR_DOMAIN_EVENT_ID_JOB_COMPLETED = 21, /* virConnectDomainEventJobCompletedCallback */
|
||||
VIR_DOMAIN_EVENT_ID_DEVICE_REMOVAL_FAILED = 22, /* virConnectDomainEventDeviceRemovalFailedCallback */
|
||||
|
||||
# ifdef VIR_ENUM_SENTINELS
|
||||
VIR_DOMAIN_EVENT_ID_LAST
|
||||
@@ -4124,14 +3869,4 @@ int virDomainRename(virDomainPtr dom,
|
||||
const char *new_name,
|
||||
unsigned int flags);
|
||||
|
||||
int virDomainGetGuestVcpus(virDomainPtr domain,
|
||||
virTypedParameterPtr *params,
|
||||
unsigned int *nparams,
|
||||
unsigned int flags);
|
||||
|
||||
int virDomainSetGuestVcpus(virDomainPtr domain,
|
||||
const char *cpumap,
|
||||
int state,
|
||||
unsigned int flags);
|
||||
|
||||
#endif /* __VIR_LIBVIRT_DOMAIN_H__ */
|
||||
|
@@ -140,6 +140,192 @@ struct _virSecurityModel {
|
||||
*/
|
||||
typedef virSecurityModel *virSecurityModelPtr;
|
||||
|
||||
/* Common data types shared among interfaces with name/type/value lists. */
|
||||
|
||||
/**
|
||||
* virTypedParameterType:
|
||||
*
|
||||
* Express the type of a virTypedParameter
|
||||
*/
|
||||
typedef enum {
|
||||
VIR_TYPED_PARAM_INT = 1, /* integer case */
|
||||
VIR_TYPED_PARAM_UINT = 2, /* unsigned integer case */
|
||||
VIR_TYPED_PARAM_LLONG = 3, /* long long case */
|
||||
VIR_TYPED_PARAM_ULLONG = 4, /* unsigned long long case */
|
||||
VIR_TYPED_PARAM_DOUBLE = 5, /* double case */
|
||||
VIR_TYPED_PARAM_BOOLEAN = 6, /* boolean(character) case */
|
||||
VIR_TYPED_PARAM_STRING = 7, /* string case */
|
||||
|
||||
# ifdef VIR_ENUM_SENTINELS
|
||||
VIR_TYPED_PARAM_LAST
|
||||
# endif
|
||||
} virTypedParameterType;
|
||||
|
||||
/**
|
||||
* virTypedParameterFlags:
|
||||
*
|
||||
* Flags related to libvirt APIs that use virTypedParameter.
|
||||
*
|
||||
* These enums should not conflict with those of virDomainModificationImpact.
|
||||
*/
|
||||
typedef enum {
|
||||
/* 1 << 0 is reserved for virDomainModificationImpact */
|
||||
/* 1 << 1 is reserved for virDomainModificationImpact */
|
||||
|
||||
/* Older servers lacked the ability to handle string typed
|
||||
* parameters. Attempts to set a string parameter with an older
|
||||
* server will fail at the client, but attempts to retrieve
|
||||
* parameters must not return strings from a new server to an
|
||||
* older client, so this flag exists to identify newer clients to
|
||||
* newer servers. This flag is automatically set when needed, so
|
||||
* the user does not have to worry about it; however, manually
|
||||
* setting the flag can be used to reject servers that cannot
|
||||
* return typed strings, even if no strings would be returned.
|
||||
*/
|
||||
VIR_TYPED_PARAM_STRING_OKAY = 1 << 2,
|
||||
|
||||
} virTypedParameterFlags;
|
||||
|
||||
/**
|
||||
* VIR_TYPED_PARAM_FIELD_LENGTH:
|
||||
*
|
||||
* Macro providing the field length of virTypedParameter name
|
||||
*/
|
||||
# define VIR_TYPED_PARAM_FIELD_LENGTH 80
|
||||
|
||||
/**
|
||||
* virTypedParameter:
|
||||
*
|
||||
* A named parameter, including a type and value.
|
||||
*
|
||||
* The types virSchedParameter, virBlkioParameter, and
|
||||
* virMemoryParameter are aliases of this type, for use when
|
||||
* targeting libvirt earlier than 0.9.2.
|
||||
*/
|
||||
typedef struct _virTypedParameter virTypedParameter;
|
||||
|
||||
struct _virTypedParameter {
|
||||
char field[VIR_TYPED_PARAM_FIELD_LENGTH]; /* parameter name */
|
||||
int type; /* parameter type, virTypedParameterType */
|
||||
union {
|
||||
int i; /* type is INT */
|
||||
unsigned int ui; /* type is UINT */
|
||||
long long int l; /* type is LLONG */
|
||||
unsigned long long int ul; /* type is ULLONG */
|
||||
double d; /* type is DOUBLE */
|
||||
char b; /* type is BOOLEAN */
|
||||
char *s; /* type is STRING, may not be NULL */
|
||||
} value; /* parameter value */
|
||||
};
|
||||
|
||||
/**
|
||||
* virTypedParameterPtr:
|
||||
*
|
||||
* a pointer to a virTypedParameter structure.
|
||||
*/
|
||||
typedef virTypedParameter *virTypedParameterPtr;
|
||||
|
||||
|
||||
virTypedParameterPtr
|
||||
virTypedParamsGet (virTypedParameterPtr params,
|
||||
int nparams,
|
||||
const char *name);
|
||||
int
|
||||
virTypedParamsGetInt (virTypedParameterPtr params,
|
||||
int nparams,
|
||||
const char *name,
|
||||
int *value);
|
||||
int
|
||||
virTypedParamsGetUInt (virTypedParameterPtr params,
|
||||
int nparams,
|
||||
const char *name,
|
||||
unsigned int *value);
|
||||
int
|
||||
virTypedParamsGetLLong (virTypedParameterPtr params,
|
||||
int nparams,
|
||||
const char *name,
|
||||
long long *value);
|
||||
int
|
||||
virTypedParamsGetULLong (virTypedParameterPtr params,
|
||||
int nparams,
|
||||
const char *name,
|
||||
unsigned long long *value);
|
||||
int
|
||||
virTypedParamsGetDouble (virTypedParameterPtr params,
|
||||
int nparams,
|
||||
const char *name,
|
||||
double *value);
|
||||
int
|
||||
virTypedParamsGetBoolean(virTypedParameterPtr params,
|
||||
int nparams,
|
||||
const char *name,
|
||||
int *value);
|
||||
int
|
||||
virTypedParamsGetString (virTypedParameterPtr params,
|
||||
int nparams,
|
||||
const char *name,
|
||||
const char **value);
|
||||
int
|
||||
virTypedParamsAddInt (virTypedParameterPtr *params,
|
||||
int *nparams,
|
||||
int *maxparams,
|
||||
const char *name,
|
||||
int value);
|
||||
int
|
||||
virTypedParamsAddUInt (virTypedParameterPtr *params,
|
||||
int *nparams,
|
||||
int *maxparams,
|
||||
const char *name,
|
||||
unsigned int value);
|
||||
int
|
||||
virTypedParamsAddLLong (virTypedParameterPtr *params,
|
||||
int *nparams,
|
||||
int *maxparams,
|
||||
const char *name,
|
||||
long long value);
|
||||
int
|
||||
virTypedParamsAddULLong (virTypedParameterPtr *params,
|
||||
int *nparams,
|
||||
int *maxparams,
|
||||
const char *name,
|
||||
unsigned long long value);
|
||||
int
|
||||
virTypedParamsAddDouble (virTypedParameterPtr *params,
|
||||
int *nparams,
|
||||
int *maxparams,
|
||||
const char *name,
|
||||
double value);
|
||||
int
|
||||
virTypedParamsAddBoolean(virTypedParameterPtr *params,
|
||||
int *nparams,
|
||||
int *maxparams,
|
||||
const char *name,
|
||||
int value);
|
||||
int
|
||||
virTypedParamsAddString (virTypedParameterPtr *params,
|
||||
int *nparams,
|
||||
int *maxparams,
|
||||
const char *name,
|
||||
const char *value);
|
||||
int
|
||||
virTypedParamsAddStringList(virTypedParameterPtr *params,
|
||||
int *nparams,
|
||||
int *maxparams,
|
||||
const char *name,
|
||||
const char **values);
|
||||
int
|
||||
virTypedParamsAddFromString(virTypedParameterPtr *params,
|
||||
int *nparams,
|
||||
int *maxparams,
|
||||
const char *name,
|
||||
int type,
|
||||
const char *value);
|
||||
void
|
||||
virTypedParamsClear (virTypedParameterPtr params,
|
||||
int nparams);
|
||||
void
|
||||
virTypedParamsFree (virTypedParameterPtr params,
|
||||
int nparams);
|
||||
|
||||
/* data types related to virNodePtr */
|
||||
|
||||
|
@@ -46,8 +46,6 @@ int virDomainLxcEnterSecurityLabel(virSecurityModelPtr model,
|
||||
virSecurityLabelPtr label,
|
||||
virSecurityLabelPtr oldlabel,
|
||||
unsigned int flags);
|
||||
int virDomainLxcEnterCGroup(virDomainPtr domain,
|
||||
unsigned int flags);
|
||||
|
||||
# ifdef __cplusplus
|
||||
}
|
||||
|
@@ -4,7 +4,7 @@
|
||||
* Description: Provides APIs for the management of storage pools and volumes
|
||||
* Author: Daniel Veillard <veillard@redhat.com>
|
||||
*
|
||||
* Copyright (C) 2006-2016 Red Hat, Inc.
|
||||
* Copyright (C) 2006-2014 Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
@@ -122,7 +122,6 @@ typedef enum {
|
||||
VIR_STORAGE_VOL_NETWORK = 3, /* Network volumes like RBD (RADOS Block Device) */
|
||||
VIR_STORAGE_VOL_NETDIR = 4, /* Network accessible directory that can
|
||||
* contain other network volumes */
|
||||
VIR_STORAGE_VOL_PLOOP = 5, /* Ploop based volumes */
|
||||
|
||||
# ifdef VIR_ENUM_SENTINELS
|
||||
VIR_STORAGE_VOL_LAST
|
||||
@@ -154,9 +153,6 @@ typedef enum {
|
||||
|
||||
VIR_STORAGE_VOL_WIPE_ALG_RANDOM = 8, /* 1-pass random */
|
||||
|
||||
VIR_STORAGE_VOL_WIPE_ALG_TRIM = 9, /* 1-pass, trim all data on the
|
||||
volume by using TRIM or DISCARD */
|
||||
|
||||
# ifdef VIR_ENUM_SENTINELS
|
||||
VIR_STORAGE_VOL_WIPE_ALG_LAST
|
||||
/*
|
||||
@@ -377,98 +373,5 @@ int virStorageVolResize (virStorageVolPtr vol,
|
||||
int virStoragePoolIsActive(virStoragePoolPtr pool);
|
||||
int virStoragePoolIsPersistent(virStoragePoolPtr pool);
|
||||
|
||||
/**
|
||||
* VIR_STORAGE_POOL_EVENT_CALLBACK:
|
||||
*
|
||||
* Used to cast the event specific callback into the generic one
|
||||
* for use for virConnectStoragePoolEventRegisterAny()
|
||||
*/
|
||||
# define VIR_STORAGE_POOL_EVENT_CALLBACK(cb)((virConnectStoragePoolEventGenericCallback)(cb))
|
||||
|
||||
/**
|
||||
* virStoragePoolEventID:
|
||||
*
|
||||
* An enumeration of supported eventId parameters for
|
||||
* virConnectStoragePoolEventRegisterAny(). Each event id determines which
|
||||
* signature of callback function will be used.
|
||||
*/
|
||||
typedef enum {
|
||||
VIR_STORAGE_POOL_EVENT_ID_LIFECYCLE = 0, /* virConnectStoragePoolEventLifecycleCallback */
|
||||
VIR_STORAGE_POOL_EVENT_ID_REFRESH = 1, /* virConnectStoragePoolEventGenericCallback */
|
||||
|
||||
# ifdef VIR_ENUM_SENTINELS
|
||||
VIR_STORAGE_POOL_EVENT_ID_LAST
|
||||
/*
|
||||
* NB: this enum value will increase over time as new events are
|
||||
* added to the libvirt API. It reflects the last event ID supported
|
||||
* by this version of the libvirt API.
|
||||
*/
|
||||
# endif
|
||||
} virStoragePoolEventID;
|
||||
|
||||
/**
|
||||
* virConnectStoragePoolEventGenericCallback:
|
||||
* @conn: the connection pointer
|
||||
* @pool: the pool pointer
|
||||
* @opaque: application specified data
|
||||
*
|
||||
* A generic storage pool event callback handler, for use with
|
||||
* virConnectStoragePoolEventRegisterAny(). Specific events usually
|
||||
* have a customization with extra parameters, often with @opaque being
|
||||
* passed in a different parameter position; use
|
||||
* VIR_STORAGE_POOL_EVENT_CALLBACK() when registering an appropriate handler.
|
||||
*/
|
||||
typedef void (*virConnectStoragePoolEventGenericCallback)(virConnectPtr conn,
|
||||
virStoragePoolPtr pool,
|
||||
void *opaque);
|
||||
|
||||
/* Use VIR_STORAGE_POOL_EVENT_CALLBACK() to cast the 'cb' parameter */
|
||||
int virConnectStoragePoolEventRegisterAny(virConnectPtr conn,
|
||||
virStoragePoolPtr pool, /* optional, to filter */
|
||||
int eventID,
|
||||
virConnectStoragePoolEventGenericCallback cb,
|
||||
void *opaque,
|
||||
virFreeCallback freecb);
|
||||
|
||||
int virConnectStoragePoolEventDeregisterAny(virConnectPtr conn,
|
||||
int callbackID);
|
||||
|
||||
/**
|
||||
* virStoragePoolEventLifecycleType:
|
||||
*
|
||||
* a virStoragePoolEventLifecycleType is emitted during storage pool
|
||||
* lifecycle events
|
||||
*/
|
||||
typedef enum {
|
||||
VIR_STORAGE_POOL_EVENT_DEFINED = 0,
|
||||
VIR_STORAGE_POOL_EVENT_UNDEFINED = 1,
|
||||
VIR_STORAGE_POOL_EVENT_STARTED = 2,
|
||||
VIR_STORAGE_POOL_EVENT_STOPPED = 3,
|
||||
|
||||
# ifdef VIR_ENUM_SENTINELS
|
||||
VIR_STORAGE_POOL_EVENT_LAST
|
||||
# endif
|
||||
} virStoragePoolEventLifecycleType;
|
||||
|
||||
/**
|
||||
* virConnectStoragePoolEventLifecycleCallback:
|
||||
* @conn: connection object
|
||||
* @pool: pool on which the event occurred
|
||||
* @event: The specific virStoragePoolEventLifeCycleType which occurred
|
||||
* @detail: contains some details on the reason of the event.
|
||||
* @opaque: application specified data
|
||||
*
|
||||
* This callback is called when a pool lifecycle action is performed, like start
|
||||
* or stop.
|
||||
*
|
||||
* The callback signature to use when registering for an event of type
|
||||
* VIR_STORAGE_POOL_EVENT_ID_LIFECYCLE with
|
||||
* virConnectStoragePoolEventRegisterAny()
|
||||
*/
|
||||
typedef void (*virConnectStoragePoolEventLifecycleCallback)(virConnectPtr conn,
|
||||
virStoragePoolPtr pool,
|
||||
int event,
|
||||
int detail,
|
||||
void *opaque);
|
||||
|
||||
#endif /* __VIR_LIBVIRT_STORAGE_H__ */
|
||||
|
@@ -4,7 +4,7 @@
|
||||
* Description: Provides the interfaces of the libvirt library to handle
|
||||
* errors raised while using the library.
|
||||
*
|
||||
* Copyright (C) 2006-2016 Red Hat, Inc.
|
||||
* Copyright (C) 2006-2015 Red Hat, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
@@ -128,9 +128,6 @@ typedef enum {
|
||||
VIR_FROM_THREAD = 61, /* Error from thread utils */
|
||||
VIR_FROM_ADMIN = 62, /* Error from admin backend */
|
||||
VIR_FROM_LOGGING = 63, /* Error from log manager */
|
||||
VIR_FROM_XENXL = 64, /* Error from Xen xl config code */
|
||||
|
||||
VIR_FROM_PERF = 65, /* Error from perf */
|
||||
|
||||
# ifdef VIR_ENUM_SENTINELS
|
||||
VIR_ERR_DOMAIN_LAST
|
||||
@@ -312,9 +309,6 @@ typedef enum {
|
||||
CPU*/
|
||||
VIR_ERR_XML_INVALID_SCHEMA = 92, /* XML document doesn't validate against schema */
|
||||
VIR_ERR_MIGRATE_FINISH_OK = 93, /* Finish API succeeded but it is expected to return NULL */
|
||||
VIR_ERR_AUTH_UNAVAILABLE = 94, /* authentication unavailable */
|
||||
VIR_ERR_NO_SERVER = 95, /* Server was not found */
|
||||
VIR_ERR_NO_CLIENT = 96, /* Client was not found */
|
||||
} virErrorNumber;
|
||||
|
||||
/**
|
||||
|
2109
libvirt.spec.in
2109
libvirt.spec.in
File diff suppressed because it is too large
Load Diff
@@ -26,7 +26,7 @@ AC_DEFUN([LIBVIRT_COMPILE_PIE],[
|
||||
;; dnl All code is position independent on Win32 target
|
||||
*)
|
||||
gl_COMPILER_OPTION_IF([-fPIE -DPIE -pie], [
|
||||
PIE_CFLAGS="-fPIE -DPIE"
|
||||
PIE_CFLAGS="-fPIE -DPIE -pie"
|
||||
PIE_LDFLAGS="-pie"
|
||||
])
|
||||
esac
|
||||
|
@@ -250,7 +250,7 @@ AC_DEFUN([LIBVIRT_COMPILE_WARNINGS],[
|
||||
|
||||
if test "$gl_cv_warn_c__Wlogical_op" = yes &&
|
||||
test "$lv_cv_gcc_wlogical_op_broken" = yes; then
|
||||
AC_DEFINE_UNQUOTED([BROKEN_GCC_WLOGICALOP_STRCHR], 1,
|
||||
AC_DEFINE_UNQUOTED([BROKEN_GCC_WLOGICALOP], 1,
|
||||
[Define to 1 if gcc -Wlogical-op reports false positives on strchr])
|
||||
fi
|
||||
|
||||
|
@@ -1,55 +0,0 @@
|
||||
dnl The UML driver
|
||||
dnl
|
||||
dnl Copyright (C) 2005-2015 Red Hat, Inc.
|
||||
dnl
|
||||
dnl This library is free software; you can redistribute it and/or
|
||||
dnl modify it under the terms of the GNU Lesser General Public
|
||||
dnl License as published by the Free Software Foundation; either
|
||||
dnl version 2.1 of the License, or (at your option) any later version.
|
||||
dnl
|
||||
dnl This library is distributed in the hope that it will be useful,
|
||||
dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
dnl Lesser General Public License for more details.
|
||||
dnl
|
||||
dnl You should have received a copy of the GNU Lesser General Public
|
||||
dnl License along with this library. If not, see
|
||||
dnl <http://www.gnu.org/licenses/>.
|
||||
dnl
|
||||
|
||||
AC_DEFUN([LIBVIRT_DRIVER_CHECK_UML],[
|
||||
AC_ARG_WITH([uml],
|
||||
[AS_HELP_STRING([--with-uml],
|
||||
[add UML support @<:@default=check@:>@])])
|
||||
m4_divert_text([DEFAULTS], [with_uml=check])
|
||||
|
||||
if test "$with_libvirtd" = "no" || test "$with_linux" = "no"; then
|
||||
if test "$with_uml" = "yes"; then
|
||||
AC_MSG_ERROR([The UML driver cannot be enabled])
|
||||
elif test "$with_uml" = "check"; then
|
||||
with_uml="no"
|
||||
fi
|
||||
fi
|
||||
|
||||
if test "$with_uml" = "yes" || test "$with_uml" = "check"; then
|
||||
AC_CHECK_HEADER([sys/inotify.h], [
|
||||
with_uml=yes
|
||||
], [
|
||||
if test "$with_uml" = "check"; then
|
||||
with_uml=no
|
||||
AC_MSG_NOTICE([<sys/inotify.h> is required for the UML driver, disabling it])
|
||||
else
|
||||
AC_MSG_ERROR([The <sys/inotify.h> is required for the UML driver. Upgrade your libc6.])
|
||||
fi
|
||||
])
|
||||
fi
|
||||
|
||||
if test "$with_uml" = "yes" ; then
|
||||
AC_DEFINE_UNQUOTED([WITH_UML], 1, [whether UML driver is enabled])
|
||||
fi
|
||||
AM_CONDITIONAL([WITH_UML], [test "$with_uml" = "yes"])
|
||||
])
|
||||
|
||||
AC_DEFUN([LIBVIRT_DRIVER_RESULT_UML],[
|
||||
AC_MSG_NOTICE([ UML: $with_uml])
|
||||
])
|
@@ -1,40 +0,0 @@
|
||||
dnl Copyright (C) 2015 SUSE LINUX Products GmbH, Nuernberg, Germany.
|
||||
dnl Copyright (C) 2016 Red Hat, Inc.
|
||||
dnl
|
||||
dnl This library is free software; you can redistribute it and/or
|
||||
dnl modify it under the terms of the GNU Lesser General Public
|
||||
dnl License as published by the Free Software Foundation; either
|
||||
dnl version 2.1 of the License, or (at your option) any later version.
|
||||
dnl
|
||||
dnl This library is distributed in the hope that it will be useful,
|
||||
dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
dnl Lesser General Public License for more details.
|
||||
dnl
|
||||
dnl You should have received a copy of the GNU Lesser General Public
|
||||
dnl License along with this library. If not, see
|
||||
dnl <http://www.gnu.org/licenses/>.
|
||||
|
||||
AC_DEFUN([LIBVIRT_CHECK_HOST_VALIDATE], [
|
||||
AC_ARG_WITH([host_validate],
|
||||
[AS_HELP_STRING([--with-host-validate],
|
||||
[build virt-host-validate @<:@default=check@:>@])])
|
||||
m4_divert_text([DEFAULTS], [with_host_validate=check])
|
||||
|
||||
if test "x$with_host_validate" != "xno"; then
|
||||
if test "x$with_win" = "xyes"; then
|
||||
if test "x$with_host_validate" = "xyes"; then
|
||||
AC_MSG_ERROR([virt-host-validate is not supported on Windows])
|
||||
else
|
||||
with_host_validate=no;
|
||||
fi
|
||||
else
|
||||
with_host_validate=yes;
|
||||
fi
|
||||
fi
|
||||
|
||||
if test "x$with_host_validate" = "xyes" ; then
|
||||
AC_DEFINE_UNQUOTED([WITH_HOST_VALIDATE], 1, [whether virt-host-validate is built])
|
||||
fi
|
||||
AM_CONDITIONAL([WITH_HOST_VALIDATE], [test "x$with_host_validate" = "xyes"])
|
||||
])
|
@@ -1,75 +0,0 @@
|
||||
dnl Init script type
|
||||
dnl
|
||||
dnl Copyright (C) 2005-2016 Red Hat, Inc.
|
||||
dnl
|
||||
dnl This library is free software; you can redistribute it and/or
|
||||
dnl modify it under the terms of the GNU Lesser General Public
|
||||
dnl License as published by the Free Software Foundation; either
|
||||
dnl version 2.1 of the License, or (at your option) any later version.
|
||||
dnl
|
||||
dnl This library is distributed in the hope that it will be useful,
|
||||
dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
dnl Lesser General Public License for more details.
|
||||
dnl
|
||||
dnl You should have received a copy of the GNU Lesser General Public
|
||||
dnl License along with this library. If not, see
|
||||
dnl <http://www.gnu.org/licenses/>.
|
||||
dnl
|
||||
|
||||
AC_DEFUN([LIBVIRT_CHECK_INIT_SCRIPT],[
|
||||
AC_ARG_WITH([init-script],
|
||||
[AS_HELP_STRING([--with-init-script@<:@=STYLE@:>@],
|
||||
[Style of init script to install: redhat, systemd, systemd+redhat,
|
||||
upstart, check, none @<:@default=check@:>@])],
|
||||
[],[with_init_script=check])
|
||||
|
||||
AC_MSG_CHECKING([for init script type])
|
||||
|
||||
init_redhat=no
|
||||
init_systemd=no
|
||||
init_upstart=no
|
||||
|
||||
if test "$with_init_script" = check && test "$cross_compiling" = yes; then
|
||||
with_init_script=none
|
||||
fi
|
||||
if test "$with_init_script" = check && type systemctl >/dev/null 2>&1; then
|
||||
with_init_script=systemd
|
||||
fi
|
||||
if test "$with_init_script" = check && test -f /etc/redhat-release; then
|
||||
with_init_script=redhat
|
||||
fi
|
||||
if test "$with_init_script" = check; then
|
||||
with_init_script=none
|
||||
fi
|
||||
|
||||
AS_CASE([$with_init_script],
|
||||
[systemd+redhat],[
|
||||
init_redhat=yes
|
||||
init_systemd=yes
|
||||
],
|
||||
[systemd],[
|
||||
init_systemd=yes
|
||||
],
|
||||
[upstart],[
|
||||
init_upstart=yes
|
||||
],
|
||||
[redhat],[
|
||||
init_redhat=yes
|
||||
],
|
||||
[none],[],
|
||||
[*],[
|
||||
AC_MSG_ERROR([Unknown initscript flavour $with_init_script])
|
||||
]
|
||||
)
|
||||
|
||||
AM_CONDITIONAL([LIBVIRT_INIT_SCRIPT_RED_HAT], test "$init_redhat" = "yes")
|
||||
AM_CONDITIONAL([LIBVIRT_INIT_SCRIPT_UPSTART], test "$init_upstart" = "yes")
|
||||
AM_CONDITIONAL([LIBVIRT_INIT_SCRIPT_SYSTEMD], test "$init_systemd" = "yes")
|
||||
|
||||
AC_MSG_RESULT($with_init_script)
|
||||
])
|
||||
|
||||
AC_DEFUN([LIBVIRT_RESULT_INIT_SCRIPT],[
|
||||
AC_MSG_NOTICE([ Init script: $with_init_script])
|
||||
])
|
@@ -21,9 +21,9 @@ AC_DEFUN([LIBVIRT_CHECK_LOGIN_SHELL], [
|
||||
m4_divert_text([DEFAULTS], [with_login_shell=check])
|
||||
|
||||
if test "x$with_login_shell" != "xno"; then
|
||||
if test "x$with_linux" != "xyes"; then
|
||||
if test "x$with_login_shell" = "xyes"; then
|
||||
AC_MSG_ERROR([virt-login-shell is supported on Linux only])
|
||||
if test "x$with_win" = "xyes"; then
|
||||
if "x$with_login_shell" = "yes"; then
|
||||
AC_MSG_ERROR([virt-login-shell is not supported on Windows])
|
||||
else
|
||||
with_login_shell=no;
|
||||
fi
|
||||
|
@@ -1,67 +0,0 @@
|
||||
dnl The libvirt nsswitch plugin
|
||||
dnl
|
||||
dnl Copyright (C) 2016 Red Hat, Inc.
|
||||
dnl
|
||||
dnl This library is free software; you can redistribute it and/or
|
||||
dnl modify it under the terms of the GNU Lesser General Public
|
||||
dnl License as published by the Free Software Foundation; either
|
||||
dnl version 2.1 of the License, or (at your option) any later version.
|
||||
dnl
|
||||
dnl This library is distributed in the hope that it will be useful,
|
||||
dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
dnl Lesser General Public License for more details.
|
||||
dnl
|
||||
dnl You should have received a copy of the GNU Lesser General Public
|
||||
dnl License along with this library. If not, see
|
||||
dnl <http://www.gnu.org/licenses/>.
|
||||
dnl
|
||||
|
||||
AC_DEFUN([LIBVIRT_CHECK_NSS],[
|
||||
AC_ARG_WITH([nss-plugin],
|
||||
[AS_HELP_STRING([--with-nss-plugin],
|
||||
[enable Name Service Switch plugin for resolving guest IP addresses])],
|
||||
[], [with_nss_plugin=check])
|
||||
|
||||
bsd_nss=no
|
||||
fail=0
|
||||
if test "x$with_nss_plugin" != "xno" ; then
|
||||
AC_CHECK_HEADERS([nss.h], [
|
||||
with_nss_plugin=yes
|
||||
],[
|
||||
if test "x$with_nss_plugin" = "xyes" ; then
|
||||
fail = 1
|
||||
fi
|
||||
])
|
||||
|
||||
if test $fail = 1 ; then
|
||||
AC_MSG_ERROR([Can't build nss plugin without nss.h])
|
||||
fi
|
||||
|
||||
if test "x$with_nss_plugin" = "xyes" ; then
|
||||
AC_DEFINE_UNQUOTED([NSS], 1, [whether nss plugin is enabled])
|
||||
|
||||
AC_CHECK_TYPE([struct gaih_addrtuple],
|
||||
[AC_DEFINE([HAVE_STRUCT_GAIH_ADDRTUPLE], [1],
|
||||
[Defined if struct gaih_addrtuple exists in nss.h])],
|
||||
[], [[#include <nss.h>
|
||||
]])
|
||||
|
||||
AC_CHECK_TYPES([ns_mtab, nss_module_unregister_fn],
|
||||
[AC_DEFINE([HAVE_BSD_NSS],
|
||||
[1],
|
||||
[whether using BSD style NSS])
|
||||
bsd_nss=yes
|
||||
],
|
||||
[],
|
||||
[#include <nsswitch.h>])
|
||||
fi
|
||||
fi
|
||||
|
||||
AM_CONDITIONAL(WITH_NSS, [test "x$with_nss_plugin" = "xyes"])
|
||||
AM_CONDITIONAL(WITH_BSD_NSS, [test "x$bsd_nss" = "xyes"])
|
||||
])
|
||||
|
||||
AC_DEFUN([LIBVIRT_RESULT_NSS],[
|
||||
LIBVIRT_RESULT([nss], [$with_nss_plugin])
|
||||
])
|
34
m4/virt-systemd-daemon.m4
Normal file
34
m4/virt-systemd-daemon.m4
Normal file
@@ -0,0 +1,34 @@
|
||||
dnl The libsystemd-daemon.so library
|
||||
dnl
|
||||
dnl Copyright (C) 2012-2013 Red Hat, Inc.
|
||||
dnl
|
||||
dnl This library is free software; you can redistribute it and/or
|
||||
dnl modify it under the terms of the GNU Lesser General Public
|
||||
dnl License as published by the Free Software Foundation; either
|
||||
dnl version 2.1 of the License, or (at your option) any later version.
|
||||
dnl
|
||||
dnl This library is distributed in the hope that it will be useful,
|
||||
dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
dnl Lesser General Public License for more details.
|
||||
dnl
|
||||
dnl You should have received a copy of the GNU Lesser General Public
|
||||
dnl License along with this library. If not, see
|
||||
dnl <http://www.gnu.org/licenses/>.
|
||||
dnl
|
||||
|
||||
AC_DEFUN([LIBVIRT_CHECK_SYSTEMD_DAEMON],[
|
||||
LIBVIRT_CHECK_PKG([SYSTEMD_DAEMON], [libsystemd-daemon], [0.27.1])
|
||||
|
||||
old_CFLAGS="$CFLAGS"
|
||||
old_LIBS="$LIBS"
|
||||
CFLAGS="$CFLAGS $SYSTEMD_DAEMON_CFLAGS"
|
||||
LIBS="$LIBS $SYSTEMD_DAEMON_LIBS"
|
||||
AC_CHECK_FUNCS([sd_notify])
|
||||
CFLAGS="$old_CFLAGS"
|
||||
LIBS="$old_LIBS"
|
||||
])
|
||||
|
||||
AC_DEFUN([LIBVIRT_RESULT_SYSTEMD_DAEMON],[
|
||||
LIBVIRT_RESULT_LIB([SYSTEMD_DAEMON])
|
||||
])
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user