mirror of
				https://gitlab.com/libvirt/libvirt.git
				synced 2025-11-03 08:24:18 +03:00 
			
		
		
		
	Compare commits
	
		
			3 Commits
		
	
	
		
			v4.1.0
			...
			v2.1-maint
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					e322b6f73d | ||
| 
						 | 
					dea40b4218 | ||
| 
						 | 
					f398d4b423 | 
@@ -1,40 +0,0 @@
 | 
			
		||||
-I@abs_top_builddir@
 | 
			
		||||
-I@abs_top_srcdir@
 | 
			
		||||
-I@abs_top_builddir@/gnulib/lib
 | 
			
		||||
-I@abs_top_srcdir@/gnulib/lib
 | 
			
		||||
-I@abs_top_builddir@/include
 | 
			
		||||
-I@abs_top_srcdir@/include
 | 
			
		||||
-I@abs_top_builddir@/src
 | 
			
		||||
-I@abs_top_srcdir@/src
 | 
			
		||||
-I@abs_top_builddir@/src/access
 | 
			
		||||
-I@abs_top_srcdir@/src/access
 | 
			
		||||
-I@abs_top_builddir@/src/admin
 | 
			
		||||
-I@abs_top_srcdir@/src/admin
 | 
			
		||||
-I@abs_top_builddir@/src/bhyve
 | 
			
		||||
-I@abs_top_srcdir@/src/bhyve
 | 
			
		||||
-I@abs_top_builddir@/src/conf
 | 
			
		||||
-I@abs_top_srcdir@/src/conf
 | 
			
		||||
-I@abs_top_builddir@/src/libxl
 | 
			
		||||
-I@abs_top_srcdir@/src/libxl
 | 
			
		||||
-I@abs_top_builddir@/src/locking
 | 
			
		||||
-I@abs_top_srcdir@/src/locking
 | 
			
		||||
-I@abs_top_builddir@/src/logging
 | 
			
		||||
-I@abs_top_srcdir@/src/logging
 | 
			
		||||
-I@abs_top_builddir@/src/lxc
 | 
			
		||||
-I@abs_top_srcdir@/src/lxc
 | 
			
		||||
-I@abs_top_builddir@/src/qemu
 | 
			
		||||
-I@abs_top_srcdir@/src/qemu
 | 
			
		||||
-I@abs_top_builddir@/src/remote
 | 
			
		||||
-I@abs_top_srcdir@/src/remote
 | 
			
		||||
-I@abs_top_builddir@/src/rpc
 | 
			
		||||
-I@abs_top_srcdir@/src/rpc
 | 
			
		||||
-I@abs_top_builddir@/src/secret
 | 
			
		||||
-I@abs_top_srcdir@/src/secret
 | 
			
		||||
-I@abs_top_builddir@/src/security
 | 
			
		||||
-I@abs_top_srcdir@/src/security
 | 
			
		||||
-I@abs_top_builddir@/src/util
 | 
			
		||||
-I@abs_top_srcdir@/src/util
 | 
			
		||||
-I@abs_top_builddir@/src/vmx
 | 
			
		||||
-I@abs_top_srcdir@/src/vmx
 | 
			
		||||
-I@abs_top_builddir@/src/xenconfig
 | 
			
		||||
-I@abs_top_srcdir@/src/xenconfig
 | 
			
		||||
							
								
								
									
										26
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										26
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -1,7 +1,7 @@
 | 
			
		||||
*#*#
 | 
			
		||||
*.#*#
 | 
			
		||||
*.[187]
 | 
			
		||||
*.[187].in
 | 
			
		||||
*.[18]
 | 
			
		||||
*.[18].in
 | 
			
		||||
*.a
 | 
			
		||||
*.cov
 | 
			
		||||
*.exe
 | 
			
		||||
@@ -26,7 +26,6 @@
 | 
			
		||||
*.swp
 | 
			
		||||
*~
 | 
			
		||||
.#*
 | 
			
		||||
.color_coded
 | 
			
		||||
.deps
 | 
			
		||||
.dirstamp
 | 
			
		||||
.gdb_history
 | 
			
		||||
@@ -36,7 +35,6 @@
 | 
			
		||||
.lvimrc
 | 
			
		||||
.memdump
 | 
			
		||||
.sc-start-sc_*
 | 
			
		||||
.ycm_extra_conf.py
 | 
			
		||||
/ABOUT-NLS
 | 
			
		||||
/AUTHORS
 | 
			
		||||
/ChangeLog
 | 
			
		||||
@@ -45,7 +43,7 @@
 | 
			
		||||
/NEWS
 | 
			
		||||
/aclocal.m4
 | 
			
		||||
/autom4te.cache
 | 
			
		||||
/build-aux/*
 | 
			
		||||
/build-aux/
 | 
			
		||||
/build/
 | 
			
		||||
/confdefs.h
 | 
			
		||||
/config.cache
 | 
			
		||||
@@ -59,6 +57,12 @@
 | 
			
		||||
/configure
 | 
			
		||||
/configure.lineno
 | 
			
		||||
/conftest.*
 | 
			
		||||
/daemon/*_dispatch.h
 | 
			
		||||
/daemon/libvirt_qemud
 | 
			
		||||
/daemon/libvirtd
 | 
			
		||||
/daemon/libvirtd*.logrotate
 | 
			
		||||
/daemon/libvirtd.policy
 | 
			
		||||
/daemon/test_libvirtd.aug
 | 
			
		||||
/docs/aclperms.htmlinc
 | 
			
		||||
/docs/apibuild.py.stamp
 | 
			
		||||
/docs/devhelp/libvirt.devhelp
 | 
			
		||||
@@ -68,7 +72,6 @@
 | 
			
		||||
/docs/libvirt-lxc-*.xml
 | 
			
		||||
/docs/libvirt-qemu-*.xml
 | 
			
		||||
/docs/libvirt-refs.xml
 | 
			
		||||
/docs/news.html.in
 | 
			
		||||
/docs/search.php
 | 
			
		||||
/docs/todo.html.in
 | 
			
		||||
/examples/admin/client_close
 | 
			
		||||
@@ -76,7 +79,6 @@
 | 
			
		||||
/examples/admin/client_limits
 | 
			
		||||
/examples/admin/list_clients
 | 
			
		||||
/examples/admin/list_servers
 | 
			
		||||
/examples/admin/logging
 | 
			
		||||
/examples/admin/threadpool_params
 | 
			
		||||
/examples/object-events/event-test
 | 
			
		||||
/examples/dominfo/info1
 | 
			
		||||
@@ -117,7 +119,6 @@
 | 
			
		||||
/src/access/viraccessapicheckqemu.h
 | 
			
		||||
/src/admin/admin_client.h
 | 
			
		||||
/src/admin/admin_protocol.[ch]
 | 
			
		||||
/src/admin/admin_server_dispatch_stubs.h
 | 
			
		||||
/src/esx/*.generated.*
 | 
			
		||||
/src/hyperv/*.generated.*
 | 
			
		||||
/src/libvirt*.def
 | 
			
		||||
@@ -133,9 +134,6 @@
 | 
			
		||||
/src/libvirt_*helper
 | 
			
		||||
/src/libvirt_*probes.h
 | 
			
		||||
/src/libvirt_lxc
 | 
			
		||||
/src/libvirtd
 | 
			
		||||
/src/libvirtd*.logrotate
 | 
			
		||||
/src/libvirtd.policy
 | 
			
		||||
/src/locking/libxl-lockd.conf
 | 
			
		||||
/src/locking/libxl-sanlock.conf
 | 
			
		||||
/src/locking/lock_daemon_dispatch_stubs.h
 | 
			
		||||
@@ -154,18 +152,15 @@
 | 
			
		||||
/src/qemu/test_libvirtd_qemu.aug
 | 
			
		||||
/src/remote/*_client_bodies.h
 | 
			
		||||
/src/remote/*_protocol.[ch]
 | 
			
		||||
/src/remote/*_stubs.h
 | 
			
		||||
/src/rpc/virkeepaliveprotocol.[ch]
 | 
			
		||||
/src/rpc/virnetprotocol.[ch]
 | 
			
		||||
/src/test_libvirt*.aug
 | 
			
		||||
/src/test_virtlockd.aug
 | 
			
		||||
/src/test_virtlogd.aug
 | 
			
		||||
/src/util/virkeycodetable*.h
 | 
			
		||||
/src/util/virkeynametable*.h
 | 
			
		||||
/src/util/virkeymaps.h
 | 
			
		||||
/src/virt-aa-helper
 | 
			
		||||
/src/virtlockd
 | 
			
		||||
/src/virtlogd
 | 
			
		||||
/src/virt-guest-shutdown.target
 | 
			
		||||
/tests/*.log
 | 
			
		||||
/tests/*.pid
 | 
			
		||||
/tests/*.trs
 | 
			
		||||
@@ -174,7 +169,6 @@
 | 
			
		||||
/tests/qemucapsprobe
 | 
			
		||||
!/tests/virsh-self-test
 | 
			
		||||
!/tests/virt-aa-helper-test
 | 
			
		||||
!/tests/virt-admin-self-test
 | 
			
		||||
/tests/objectlocking
 | 
			
		||||
/tests/objectlocking-files.txt
 | 
			
		||||
/tests/objectlocking.cm[ix]
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										3
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.gitmodules
									
									
									
									
										vendored
									
									
								
							@@ -1,6 +1,3 @@
 | 
			
		||||
[submodule "gnulib"]
 | 
			
		||||
	path = .gnulib
 | 
			
		||||
	url = git://git.sv.gnu.org/gnulib.git
 | 
			
		||||
[submodule "keycodemapdb"]
 | 
			
		||||
	path = src/keycodemapdb
 | 
			
		||||
	url = https://gitlab.com/keycodemap/keycodemapdb.git
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								.gnulib
									
									
									
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								.gnulib
									
									
									
									
									
								
							 Submodule .gnulib updated: 7e7c5c7952...68b6adebef
									
								
							
							
								
								
									
										1
									
								
								.mailmap
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								.mailmap
									
									
									
									
									
								
							@@ -61,4 +61,3 @@ Marco Bozzolan <redshift@gmx.com>
 | 
			
		||||
Pritesh Kothari <pritesh.kothari@sun.com>
 | 
			
		||||
Wang Yufei (James) <james.wangyufei@huawei.com>
 | 
			
		||||
Deepak C Shetty <dpkshetty@gmail.com>
 | 
			
		||||
Daniel P. Berrangé <berrange@redhat.com>
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										130
									
								
								.travis.yml
									
									
									
									
									
								
							
							
						
						
									
										130
									
								
								.travis.yml
									
									
									
									
									
								
							@@ -1,130 +0,0 @@
 | 
			
		||||
sudo: false
 | 
			
		||||
language: c
 | 
			
		||||
cache: ccache
 | 
			
		||||
 | 
			
		||||
matrix:
 | 
			
		||||
  include:
 | 
			
		||||
    - compiler: gcc
 | 
			
		||||
      dist: trusty
 | 
			
		||||
      env:
 | 
			
		||||
        - DISTCHECK_CONFIGURE_FLAGS="--with-init-script=upstart"
 | 
			
		||||
    - compiler: clang
 | 
			
		||||
      dist: trusty
 | 
			
		||||
      env:
 | 
			
		||||
        - DISTCHECK_CONFIGURE_FLAGS="--with-init-script=systemd"
 | 
			
		||||
    - compiler: clang
 | 
			
		||||
      os: osx
 | 
			
		||||
      script:
 | 
			
		||||
        # We can't run make distcheck/syntax-check because they
 | 
			
		||||
        # fail on macOS, but doing 'install' and 'dist' gives us
 | 
			
		||||
        # some useful coverage
 | 
			
		||||
        - make -j3 && make -j3 install && make -j3 dist
 | 
			
		||||
 | 
			
		||||
addons:
 | 
			
		||||
  apt:
 | 
			
		||||
    # Please keep this list sorted alphabetically
 | 
			
		||||
    packages:
 | 
			
		||||
      - augeas-tools
 | 
			
		||||
      - autoconf
 | 
			
		||||
      - automake
 | 
			
		||||
      - autopoint
 | 
			
		||||
      - ccache
 | 
			
		||||
      - dnsmasq-base
 | 
			
		||||
      - dwarves
 | 
			
		||||
      - ebtables
 | 
			
		||||
      - gcc
 | 
			
		||||
      - gettext
 | 
			
		||||
      - glusterfs-client
 | 
			
		||||
      - libacl1-dev
 | 
			
		||||
      - libapparmor-dev
 | 
			
		||||
      - libattr1-dev
 | 
			
		||||
      - libaudit-dev
 | 
			
		||||
      - libavahi-client-dev
 | 
			
		||||
      - libblkid-dev
 | 
			
		||||
      - libc-dev-bin
 | 
			
		||||
      - libc6-dev
 | 
			
		||||
      - libcap-ng-dev
 | 
			
		||||
      - libcurl4-gnutls-dev
 | 
			
		||||
      - libdbus-1-dev
 | 
			
		||||
      - libdevmapper-dev
 | 
			
		||||
      - libfuse-dev
 | 
			
		||||
      - libgnutls-dev
 | 
			
		||||
      - libnetcf-dev
 | 
			
		||||
      - libnl-3-dev
 | 
			
		||||
      - libnl-route-3-dev
 | 
			
		||||
      - libnuma-dev
 | 
			
		||||
      - libopenwsman-dev
 | 
			
		||||
      - libparted-dev
 | 
			
		||||
      - libpcap-dev
 | 
			
		||||
      - libpciaccess-dev
 | 
			
		||||
      - librbd-dev
 | 
			
		||||
      - libreadline-dev
 | 
			
		||||
      - libsasl2-dev
 | 
			
		||||
      - libselinux1-dev
 | 
			
		||||
      - libssh2-1-dev
 | 
			
		||||
      - libssh-dev
 | 
			
		||||
      - libtool
 | 
			
		||||
      - libudev-dev
 | 
			
		||||
      - libxen-dev
 | 
			
		||||
      - libxml2-dev
 | 
			
		||||
      - libxml2-utils
 | 
			
		||||
      - libyajl-dev
 | 
			
		||||
      - lvm2
 | 
			
		||||
      - make
 | 
			
		||||
#     - nfs-common    # broken on trusty since build #807 (2018-01-09)
 | 
			
		||||
      - open-iscsi
 | 
			
		||||
      - parted
 | 
			
		||||
      - patch
 | 
			
		||||
      - perl
 | 
			
		||||
      - pkg-config
 | 
			
		||||
      - policykit-1
 | 
			
		||||
      - qemu-utils
 | 
			
		||||
      - radvd
 | 
			
		||||
      - scrub
 | 
			
		||||
      - sheepdog
 | 
			
		||||
      - systemtap-sdt-dev
 | 
			
		||||
      - xsltproc
 | 
			
		||||
      - zfs-fuse
 | 
			
		||||
 | 
			
		||||
git:
 | 
			
		||||
  submodules: true
 | 
			
		||||
 | 
			
		||||
env:
 | 
			
		||||
  global:
 | 
			
		||||
    # The custom $PATH is just to pick up some extra binaries installed
 | 
			
		||||
    # through homebrew on macOS and it's completely harmless on Linux
 | 
			
		||||
    - PATH="/usr/local/opt/gettext/bin:/usr/local/opt/rpcgen/bin:$PATH"
 | 
			
		||||
    - VIR_TEST_DEBUG=1
 | 
			
		||||
 | 
			
		||||
before_install:
 | 
			
		||||
  - if [ "$TRAVIS_OS_NAME" == "osx" ]; then brew update && brew upgrade && brew install rpcgen yajl xz; fi
 | 
			
		||||
 | 
			
		||||
before_script:
 | 
			
		||||
  - ./autogen.sh --prefix=$(pwd)/install-root
 | 
			
		||||
 | 
			
		||||
script:
 | 
			
		||||
  - make -j3 && make -j3 syntax-check && make -j3 distcheck DISTCHECK_CONFIGURE_FLAGS=$DISTCHECK_CONFIGURE_FLAGS
 | 
			
		||||
 | 
			
		||||
after_failure:
 | 
			
		||||
  - echo '============================================================================'
 | 
			
		||||
  - 'if [ -f $(pwd)/tests/test-suite.log ]; then
 | 
			
		||||
        cat $(pwd)/tests/test-suite.log;
 | 
			
		||||
    else
 | 
			
		||||
        echo "=== NO LOG FILE FOUND ===";
 | 
			
		||||
    fi'
 | 
			
		||||
 | 
			
		||||
notifications:
 | 
			
		||||
  irc:
 | 
			
		||||
    # The channel name "irc.oftc.net#virt" is encrypted against libvirt/libvirt
 | 
			
		||||
    # to prevent IRC notifications from github forks. This was created using:
 | 
			
		||||
    # $ travis encrypt -r "libvirt/libvirt" "irc.oftc.net#virt"
 | 
			
		||||
    channels:
 | 
			
		||||
      - secure: "hUPdkLxX7nh75+clpnk4U0XLExLfV9DFKSvQSAUtf5JtDNMslj7AeOCf2wcbkNsEhkiF557odTAnov1s5m1w/yaa56zbjFAh5agzqRKya3QjqsrvlBKw/WuN+l82iMNLLeebTgCPAXrbAbGWH8YmYssp/7+eMsnKaVh84EQQNbMCHlLg6ovE26Fs18mZ6J5RC3OPa1vbv+xkdCHvGg/Oyp4K8bpU7RYyimA56jdxI/OfdTH9HxntHYSzykR7hDbyzZhdIlAUyRKReQVjcV5+R8fdDL/1imyGA/88KTztMeKXpZ5Rf+Ss3vYLZb6qsLLegCZ4AU/q0vvbWxjpZGJZoeyrVpfBTZdYGIzmLTMl9GYXXa/gDwFlbvRDiPDG4TIy6GlMUROinj7KRKEHu1fWRYu012ife5OjidxcwrTnz21vYaCv3AKWPpMPxwIzQPkY1hex9uLLX6z+TrAxxDLF+7UzRT9w2RLFBkLYlj2aDVrLAVb/ynRsxDz5CGzC61FSQVft2e308SkGjdn8YxvguCuXv+N70Fu1cvFyh5XYeHb4fbBRo0Ctzaec78leHlQvRGWKJxXDXRkE2lvvBc7YbBNSAYh7Fs8Y+zY7l7rMxvXdrt3nuaNQhe74V3yhxPDAld66qmAn9TYMmaZW2f5/KKKILLbCa0t2MxiAc6L2OI8="
 | 
			
		||||
    on_success: change
 | 
			
		||||
    on_failure: always
 | 
			
		||||
  email:
 | 
			
		||||
    # The list name 'libvirt-ci@redhat.com" is encrypted against libvirt/libvirt
 | 
			
		||||
    # to prevent IRC notifications from github forks. This was created using:
 | 
			
		||||
    # $ travis encrypt -r "libvirt/libvirt" "libvirt-ci@redhat.com"
 | 
			
		||||
    recipients:
 | 
			
		||||
      - secure: "QcU9eP96P0RlDNzVRZl/4sxyydPStGzECrpgJhr2IPB/7pHk23yaBrmUsq9S830tB+jwLGma1IscNB8uf7Sf7WY+cYIpfR8v030OffWnaipo/Gcs0dpnlfURWHjOFQI3RJzGEihsqvbwUFOwsM+3IDyO3qdWaiT6cN2Tj9ROlwYCySSX5YWzLyX7arBZ4lp8ESs7ohQaEwp2cegnMP2oGPJJe4SebvlCDjHZbjkU5aEradwUWnRQDJZWTKknpNLArVFxN2/ixp6f/MGY4DmkHoDweio6mHIPN5zTs5Jt32aiX6wDBa+bBa4v8TCRqzhYkQ63ZZhNV8bY5Uf9ufTdyvt96yIANyakd85b1QpMdAX76IyJi1l0/Uub6DTQZAcq3vK7iPjGeTVSpyoXrqTfGy4JxMjqDoocpWvv8ALX1wrYI/HfN2R2Aepw9jModTimOsebYhJ1yMhSt8qnh5AQNftGKL2JBKoA1LWdU2YJ5fO1bGjKNiVEkGFQTPYFWrYCUY5JcT+s5WCzNeMNm8s9na8liYhGl3WtS3rPr5M8bof+BMsBhG2hQ0loduc94x2GkvyhQZUgRbqrwNR+y4hn+rWFC3hBzzyiAULs43vY/PJ+eBdKEf3VAc0MkhQ8GgXGSA61fR6aXYonroI/WnBVItwDmUnnMfSziZXxk09GLl4="
 | 
			
		||||
@@ -1,45 +0,0 @@
 | 
			
		||||
flags = [
 | 
			
		||||
  '-I@abs_top_builddir@',
 | 
			
		||||
  '-I@abs_top_srcdir@',
 | 
			
		||||
  '-I@abs_top_builddir@/gnulib/lib',
 | 
			
		||||
  '-I@abs_top_srcdir@/gnulib/lib',
 | 
			
		||||
  '-I@abs_top_builddir@/include',
 | 
			
		||||
  '-I@abs_top_srcdir@/include',
 | 
			
		||||
  '-I@abs_top_builddir@/src',
 | 
			
		||||
  '-I@abs_top_srcdir@/src',
 | 
			
		||||
  '-I@abs_top_builddir@/src/access',
 | 
			
		||||
  '-I@abs_top_srcdir@/src/access',
 | 
			
		||||
  '-I@abs_top_builddir@/src/admin',
 | 
			
		||||
  '-I@abs_top_srcdir@/src/admin',
 | 
			
		||||
  '-I@abs_top_builddir@/src/bhyve',
 | 
			
		||||
  '-I@abs_top_srcdir@/src/bhyve',
 | 
			
		||||
  '-I@abs_top_builddir@/src/conf',
 | 
			
		||||
  '-I@abs_top_srcdir@/src/conf',
 | 
			
		||||
  '-I@abs_top_builddir@/src/libxl',
 | 
			
		||||
  '-I@abs_top_srcdir@/src/libxl',
 | 
			
		||||
  '-I@abs_top_builddir@/src/locking',
 | 
			
		||||
  '-I@abs_top_srcdir@/src/locking',
 | 
			
		||||
  '-I@abs_top_builddir@/src/logging',
 | 
			
		||||
  '-I@abs_top_srcdir@/src/logging',
 | 
			
		||||
  '-I@abs_top_builddir@/src/lxc',
 | 
			
		||||
  '-I@abs_top_srcdir@/src/lxc',
 | 
			
		||||
  '-I@abs_top_builddir@/src/qemu',
 | 
			
		||||
  '-I@abs_top_srcdir@/src/qemu',
 | 
			
		||||
  '-I@abs_top_builddir@/src/remote',
 | 
			
		||||
  '-I@abs_top_srcdir@/src/remote',
 | 
			
		||||
  '-I@abs_top_builddir@/src/rpc',
 | 
			
		||||
  '-I@abs_top_srcdir@/src/rpc',
 | 
			
		||||
  '-I@abs_top_builddir@/src/secret',
 | 
			
		||||
  '-I@abs_top_srcdir@/src/secret',
 | 
			
		||||
  '-I@abs_top_builddir@/src/security',
 | 
			
		||||
  '-I@abs_top_srcdir@/src/security',
 | 
			
		||||
  '-I@abs_top_builddir@/src/util',
 | 
			
		||||
  '-I@abs_top_srcdir@/src/util',
 | 
			
		||||
  '-I@abs_top_builddir@/src/vmx',
 | 
			
		||||
  '-I@abs_top_srcdir@/src/vmx',
 | 
			
		||||
  '-I@abs_top_builddir@/src/xenconfig',
 | 
			
		||||
  '-I@abs_top_srcdir@/src/xenconfig',
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
def FlagsForFile(filename, **kwargs):
 | 
			
		||||
  return { 'flags': flags, 'do_cache': True }
 | 
			
		||||
@@ -10,7 +10,6 @@ The primary maintainers and people with commit access rights:
 | 
			
		||||
Alex Jia <ajia@redhat.com>
 | 
			
		||||
Andrea Bolognani <abologna@redhat.com>
 | 
			
		||||
Cédric Bosdonnat <cbosdonnat@suse.com>
 | 
			
		||||
Christian Ehrhardt <christian.ehrhardt@canonical.com>
 | 
			
		||||
Christophe Fergeau <cfergeau@redhat.com>
 | 
			
		||||
Claudio Bley <claudio.bley@gmail.com>
 | 
			
		||||
Cole Robinson <crobinso@redhat.com>
 | 
			
		||||
@@ -61,6 +60,7 @@ Amit Shah <amit.shah@redhat.com>
 | 
			
		||||
Andrew Puch <apuch@redhat.com>
 | 
			
		||||
Anton Protopopov <aspsk2@gmail.com>
 | 
			
		||||
Ben Guthro <ben.guthro@gmail.com>
 | 
			
		||||
Christian Ehrhardt <ehrhardt@linux.vnet.ibm.com>
 | 
			
		||||
Daniel Hokka Zakrisson <daniel@hozac.com>
 | 
			
		||||
Dan Wendlandt <dan@nicira.com>
 | 
			
		||||
David Lively <dlively@virtualiron.com>
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										51
									
								
								Makefile.am
									
									
									
									
									
								
							
							
						
						
									
										51
									
								
								Makefile.am
									
									
									
									
									
								
							@@ -19,7 +19,7 @@
 | 
			
		||||
LCOV = lcov
 | 
			
		||||
GENHTML = genhtml
 | 
			
		||||
 | 
			
		||||
SUBDIRS = . gnulib/lib include/libvirt src tools docs gnulib/tests \
 | 
			
		||||
SUBDIRS = . gnulib/lib include/libvirt src daemon tools docs gnulib/tests \
 | 
			
		||||
  tests po examples
 | 
			
		||||
 | 
			
		||||
XZ_OPT ?= -v -T0
 | 
			
		||||
@@ -36,35 +36,34 @@ EXTRA_DIST = \
 | 
			
		||||
  libvirt-qemu.pc.in \
 | 
			
		||||
  libvirt-lxc.pc.in \
 | 
			
		||||
  libvirt-admin.pc.in \
 | 
			
		||||
  autobuild.sh \
 | 
			
		||||
  Makefile.nonreentrant \
 | 
			
		||||
  autogen.sh \
 | 
			
		||||
  cfg.mk \
 | 
			
		||||
  run.in \
 | 
			
		||||
  README.md \
 | 
			
		||||
  AUTHORS.in
 | 
			
		||||
 | 
			
		||||
pkgconfigdir = $(libdir)/pkgconfig
 | 
			
		||||
pkgconfig_DATA = libvirt.pc libvirt-qemu.pc libvirt-lxc.pc libvirt-admin.pc
 | 
			
		||||
 | 
			
		||||
NEWS: \
 | 
			
		||||
	  $(srcdir)/docs/news.xml \
 | 
			
		||||
	  $(srcdir)/docs/news-ascii.xsl \
 | 
			
		||||
	  $(srcdir)/docs/reformat-news.py
 | 
			
		||||
	$(AM_V_GEN) \
 | 
			
		||||
	if [ -x $(XSLTPROC) ]; then \
 | 
			
		||||
	  $(XSLTPROC) --nonet \
 | 
			
		||||
	    $(srcdir)/docs/news-ascii.xsl \
 | 
			
		||||
	    $(srcdir)/docs/news.xml \
 | 
			
		||||
	  >$@-tmp \
 | 
			
		||||
	    || { rm -f $@-tmp; exit 1; }; \
 | 
			
		||||
	  $(srcdir)/docs/reformat-news.py $@-tmp >$@ \
 | 
			
		||||
	    || { rm -f $@-tmp; exit 1; }; \
 | 
			
		||||
	  rm -f $@-tmp; \
 | 
			
		||||
	fi
 | 
			
		||||
EXTRA_DIST += \
 | 
			
		||||
	$(srcdir)/docs/news.xml \
 | 
			
		||||
	$(srcdir)/docs/news-ascii.xsl \
 | 
			
		||||
	$(srcdir)/docs/reformat-news.py
 | 
			
		||||
NEWS: $(top_srcdir)/docs/news.xsl $(top_srcdir)/docs/news.html.in
 | 
			
		||||
	$(AM_V_GEN)if [ -x $(XSLTPROC) ] ; then			\
 | 
			
		||||
	  $(XSLTPROC) --nonet $(top_srcdir)/docs/news.xsl	\
 | 
			
		||||
	     $(top_srcdir)/docs/news.html.in			\
 | 
			
		||||
	   | perl -0777 -pe 's/\n\n+$$/\n/'			\
 | 
			
		||||
	   | perl -pe 's/[ \t]+$$//'				\
 | 
			
		||||
	   > $@-t && mv $@-t $@ ; fi
 | 
			
		||||
 | 
			
		||||
$(top_srcdir)/HACKING: $(top_srcdir)/docs/hacking1.xsl \
 | 
			
		||||
			$(top_srcdir)/docs/hacking2.xsl \
 | 
			
		||||
			$(top_srcdir)/docs/wrapstring.xsl \
 | 
			
		||||
			$(top_srcdir)/docs/hacking.html.in
 | 
			
		||||
	$(AM_V_GEN)if [ -x $(XSLTPROC) ] ; then \
 | 
			
		||||
	   $(XSLTPROC) --nonet $(top_srcdir)/docs/hacking1.xsl \
 | 
			
		||||
		$(top_srcdir)/docs/hacking.html.in | \
 | 
			
		||||
	   $(XSLTPROC) --nonet $(top_srcdir)/docs/hacking2.xsl - \
 | 
			
		||||
	   | perl -0777 -pe 's/\n\n+$$/\n/' \
 | 
			
		||||
	   > $@-t && mv $@-t $@ ; fi;
 | 
			
		||||
 | 
			
		||||
rpm: clean
 | 
			
		||||
	@(unset CDPATH ; $(MAKE) dist && rpmbuild -ta $(distdir).tar.xz)
 | 
			
		||||
@@ -97,11 +96,11 @@ dist-hook: gen-ChangeLog gen-AUTHORS
 | 
			
		||||
gen_start_date = 2009-07-04
 | 
			
		||||
.PHONY: gen-ChangeLog
 | 
			
		||||
gen-ChangeLog:
 | 
			
		||||
	$(AM_V_GEN)if test -d .git; then \
 | 
			
		||||
	  $(top_srcdir)/build-aux/gitlog-to-changelog \
 | 
			
		||||
	    --since=$(gen_start_date) > $(distdir)/cl-t; \
 | 
			
		||||
	  rm -f $(distdir)/ChangeLog; \
 | 
			
		||||
	  mv $(distdir)/cl-t $(distdir)/ChangeLog; \
 | 
			
		||||
	$(AM_V_GEN)if test -d .git; then			\
 | 
			
		||||
	  $(top_srcdir)/build-aux/gitlog-to-changelog		\
 | 
			
		||||
	    --since=$(gen_start_date) > $(distdir)/cl-t;	\
 | 
			
		||||
	  rm -f $(distdir)/ChangeLog;				\
 | 
			
		||||
	  mv $(distdir)/cl-t $(distdir)/ChangeLog;		\
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
.PHONY: gen-AUTHORS
 | 
			
		||||
 
 | 
			
		||||
@@ -15,9 +15,9 @@
 | 
			
		||||
## <http://www.gnu.org/licenses/>.
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Generated by running the following on Fedora 26:
 | 
			
		||||
# Generated by running the following on Fedora 9:
 | 
			
		||||
#
 | 
			
		||||
#  nm -D --defined-only /lib64/libc.so.6 \
 | 
			
		||||
#  nm -D --defined-only /lib/libc.so.6  \
 | 
			
		||||
#      | grep '_r$' \
 | 
			
		||||
#      | awk '{print $3}' \
 | 
			
		||||
#      | grep -v __ \
 | 
			
		||||
@@ -43,7 +43,6 @@ NON_REENTRANT += ether_ntoa
 | 
			
		||||
NON_REENTRANT += fcvt
 | 
			
		||||
NON_REENTRANT += fgetgrent
 | 
			
		||||
NON_REENTRANT += fgetpwent
 | 
			
		||||
NON_REENTRANT += fgetsgent
 | 
			
		||||
NON_REENTRANT += fgetspent
 | 
			
		||||
NON_REENTRANT += getaliasbyname
 | 
			
		||||
NON_REENTRANT += getaliasent
 | 
			
		||||
@@ -73,8 +72,6 @@ NON_REENTRANT += getrpcent
 | 
			
		||||
NON_REENTRANT += getservbyname
 | 
			
		||||
NON_REENTRANT += getservbyport
 | 
			
		||||
NON_REENTRANT += getservent
 | 
			
		||||
NON_REENTRANT += getsgent
 | 
			
		||||
NON_REENTRANT += getsgnam
 | 
			
		||||
NON_REENTRANT += getspent
 | 
			
		||||
NON_REENTRANT += getspnam
 | 
			
		||||
NON_REENTRANT += getutent
 | 
			
		||||
@@ -98,7 +95,6 @@ NON_REENTRANT += random
 | 
			
		||||
NON_REENTRANT += rand
 | 
			
		||||
NON_REENTRANT += seed48
 | 
			
		||||
NON_REENTRANT += setstate
 | 
			
		||||
NON_REENTRANT += sgetsgent
 | 
			
		||||
NON_REENTRANT += sgetspent
 | 
			
		||||
NON_REENTRANT += srand48
 | 
			
		||||
NON_REENTRANT += srandom
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										13
									
								
								README
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								README
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,13 @@
 | 
			
		||||
 | 
			
		||||
         LibVirt : simple API for virtualization
 | 
			
		||||
 | 
			
		||||
  Libvirt is a C toolkit to interact with the virtualization capabilities
 | 
			
		||||
of recent versions of Linux (and other OSes). It is free software
 | 
			
		||||
available under the GNU Lesser General Public License. Virtualization of
 | 
			
		||||
the Linux Operating System means the ability to run multiple instances of
 | 
			
		||||
Operating Systems concurrently on a single hardware system where the basic
 | 
			
		||||
resources are driven by a Linux instance. The library aim at providing
 | 
			
		||||
long term stable C API initially for the Xen paravirtualization but
 | 
			
		||||
should be able to integrate other virtualization mechanisms if needed.
 | 
			
		||||
 | 
			
		||||
Daniel Veillard <veillard@redhat.com>
 | 
			
		||||
@@ -2,8 +2,7 @@
 | 
			
		||||
 | 
			
		||||
These notes intend to help people working on the checked-out sources.
 | 
			
		||||
These requirements do not apply when building from a distribution tarball.
 | 
			
		||||
See also docs/hacking.html (after building libvirt using the information
 | 
			
		||||
included in this file) for more detailed contribution guidelines.
 | 
			
		||||
See also HACKING for more detailed libvirt contribution guidelines.
 | 
			
		||||
 | 
			
		||||
* Requirements
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										83
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										83
									
								
								README.md
									
									
									
									
									
								
							@@ -1,83 +0,0 @@
 | 
			
		||||
[](https://travis-ci.org/libvirt/libvirt)
 | 
			
		||||
 [](https://bestpractices.coreinfrastructure.org/projects/355)
 | 
			
		||||
 | 
			
		||||
Libvirt API for virtualization
 | 
			
		||||
==============================
 | 
			
		||||
 | 
			
		||||
Libvirt provides a portable, long term stable C API for managing the
 | 
			
		||||
virtualization technologies provided by many operating systems. It
 | 
			
		||||
includes support for QEMU, KVM, Xen, LXC, bhyve, Virtuozzo, VMware
 | 
			
		||||
vCenter and ESX, VMware Desktop, Hyper-V, VirtualBox and the POWER
 | 
			
		||||
Hypervisor.
 | 
			
		||||
 | 
			
		||||
For some of these hypervisors, it provides a stateful management
 | 
			
		||||
daemon which runs on the virtualization host allowing access to the
 | 
			
		||||
API both by non-privileged local users and remote users.
 | 
			
		||||
 | 
			
		||||
Layered packages provide bindings of the libvirt C API into other
 | 
			
		||||
languages including Python, Perl, PHP, Go, Java, OCaml, as well as
 | 
			
		||||
mappings into object systems such as GObject, CIM and SNMP.
 | 
			
		||||
 | 
			
		||||
Further information about the libvirt project can be found on the
 | 
			
		||||
website:
 | 
			
		||||
 | 
			
		||||
[https://libvirt.org](https://libvirt.org)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
License
 | 
			
		||||
-------
 | 
			
		||||
 | 
			
		||||
The libvirt C API is distributed under the terms of GNU Lesser General
 | 
			
		||||
Public License, version 2.1 (or later). Some parts of the code that are
 | 
			
		||||
not part of the C library may have the more restrictive GNU General
 | 
			
		||||
Public License, version 2.1 (or later). See the files `COPYING.LESSER`
 | 
			
		||||
and `COPYING` for full license terms & conditions.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Installation
 | 
			
		||||
------------
 | 
			
		||||
 | 
			
		||||
Libvirt uses the GNU Autotools build system, so in general can be built
 | 
			
		||||
and installed with the usual commands. For example, to build in a manner
 | 
			
		||||
that is suitable for installing as root, use:
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
$ ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var
 | 
			
		||||
$ make
 | 
			
		||||
$ sudo make install
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
While to build & install as an unprivileged user
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
$ ./configure --prefix=$HOME/usr
 | 
			
		||||
$ make
 | 
			
		||||
$ make install
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
The libvirt code relies on a large number of 3rd party libraries. These will
 | 
			
		||||
be detected during execution of the `configure` script and a summary printed
 | 
			
		||||
which lists any missing (optional) dependencies.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Contributing
 | 
			
		||||
------------
 | 
			
		||||
 | 
			
		||||
The libvirt project welcomes contributions in many ways. For most components
 | 
			
		||||
the best way to contribute is to send patches to the primary development
 | 
			
		||||
mailing list. Further guidance on this can be found on the website:
 | 
			
		||||
 | 
			
		||||
[https://libvirt.org/contribute.html](https://libvirt.org/contribute.html)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Contact
 | 
			
		||||
-------
 | 
			
		||||
 | 
			
		||||
The libvirt project has two primary mailing lists:
 | 
			
		||||
 | 
			
		||||
  * libvirt-users@redhat.com (**for user discussions**)
 | 
			
		||||
  * libvir-list@redhat.com (**for development only**)
 | 
			
		||||
 | 
			
		||||
Further details on contacting the project are available on the website:
 | 
			
		||||
 | 
			
		||||
[https://libvirt.org/contact.html](https://libvirt.org/contact.html)
 | 
			
		||||
							
								
								
									
										22
									
								
								TODO
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								TODO
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
			
		||||
         libvirt TODO list
 | 
			
		||||
         =================
 | 
			
		||||
 | 
			
		||||
The TODO list changes frequently, so is maintained online
 | 
			
		||||
in the libvirt bugzilla
 | 
			
		||||
 | 
			
		||||
  http://bugzilla.redhat.com/
 | 
			
		||||
 | 
			
		||||
Search against
 | 
			
		||||
 | 
			
		||||
    Product: Virtualization Tools
 | 
			
		||||
  Component: libvirt
 | 
			
		||||
    Subject: RFE
 | 
			
		||||
 | 
			
		||||
Or browse dependent bugs under
 | 
			
		||||
 | 
			
		||||
  https://bugzilla.redhat.com/show_bug.cgi?id=libvirtTodo
 | 
			
		||||
 | 
			
		||||
Summarized reports automatically generated from bugzilla
 | 
			
		||||
and provided online at
 | 
			
		||||
 | 
			
		||||
  http://libvirt.org/todo.html
 | 
			
		||||
							
								
								
									
										122
									
								
								autobuild.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										122
									
								
								autobuild.sh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,122 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
 | 
			
		||||
set -e
 | 
			
		||||
set -v
 | 
			
		||||
 | 
			
		||||
# Make things clean.
 | 
			
		||||
 | 
			
		||||
test -n "$1" && RESULTS=$1 || RESULTS=results.log
 | 
			
		||||
: ${AUTOBUILD_INSTALL_ROOT=$HOME/builder}
 | 
			
		||||
 | 
			
		||||
# If run under the autobuilder, we must use --nodeps with rpmbuild;
 | 
			
		||||
# but this can lead to odd error diagnosis for normal development.
 | 
			
		||||
nodeps=
 | 
			
		||||
if test "${AUTOBUILD_COUNTER+set}"; then
 | 
			
		||||
  nodeps=--nodeps
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
test -f Makefile && make -k distclean || :
 | 
			
		||||
rm -rf coverage
 | 
			
		||||
 | 
			
		||||
rm -rf build
 | 
			
		||||
mkdir build
 | 
			
		||||
cd build
 | 
			
		||||
 | 
			
		||||
# Run with options not normally exercised by the rpm build, for
 | 
			
		||||
# more complete code coverage.
 | 
			
		||||
../autogen.sh --prefix="$AUTOBUILD_INSTALL_ROOT" \
 | 
			
		||||
  --enable-expensive-tests \
 | 
			
		||||
  --enable-test-coverage \
 | 
			
		||||
  --disable-nls \
 | 
			
		||||
  --enable-werror \
 | 
			
		||||
  --enable-static
 | 
			
		||||
 | 
			
		||||
# If the MAKEFLAGS envvar does not yet include a -j option,
 | 
			
		||||
# add -jN where N depends on the number of processors.
 | 
			
		||||
case $MAKEFLAGS in
 | 
			
		||||
  *-j*) ;;
 | 
			
		||||
  *) n=$(getconf _NPROCESSORS_ONLN 2> /dev/null)
 | 
			
		||||
    test "$n" -gt 0 || n=1
 | 
			
		||||
    n=$(expr $n + 1)
 | 
			
		||||
    MAKEFLAGS="$MAKEFLAGS -j$n"
 | 
			
		||||
    export MAKEFLAGS
 | 
			
		||||
    ;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
make
 | 
			
		||||
make install
 | 
			
		||||
 | 
			
		||||
# set -o pipefail is a bashism; this use of exec is the POSIX alternative
 | 
			
		||||
exec 3>&1
 | 
			
		||||
st=$(
 | 
			
		||||
  exec 4>&1 >&3
 | 
			
		||||
  { make check syntax-check 2>&1 3>&- 4>&-; echo $? >&4; } | tee "$RESULTS"
 | 
			
		||||
)
 | 
			
		||||
exec 3>&-
 | 
			
		||||
test "$st" = 0
 | 
			
		||||
test -x /usr/bin/lcov && make cov
 | 
			
		||||
 | 
			
		||||
rm -f *.tar.xz
 | 
			
		||||
make dist
 | 
			
		||||
 | 
			
		||||
if test -n "$AUTOBUILD_COUNTER" ; then
 | 
			
		||||
  EXTRA_RELEASE=".auto$AUTOBUILD_COUNTER"
 | 
			
		||||
else
 | 
			
		||||
  NOW=`date +"%s"`
 | 
			
		||||
  EXTRA_RELEASE=".$USER$NOW"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if test -f /usr/bin/rpmbuild ; then
 | 
			
		||||
  rpmbuild $nodeps \
 | 
			
		||||
     --define "extra_release $EXTRA_RELEASE" \
 | 
			
		||||
     --define "_sourcedir `pwd`" \
 | 
			
		||||
     -ba --clean libvirt.spec
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# Test mingw32 cross-compile
 | 
			
		||||
if test -x /usr/bin/i686-w64-mingw32-gcc ; then
 | 
			
		||||
  make distclean
 | 
			
		||||
 | 
			
		||||
  PKG_CONFIG_LIBDIR="/usr/i686-w64-mingw32/sys-root/mingw/lib/pkgconfig:/usr/i686-w64-mingw32/sys-root/mingw/share/pkgconfig" \
 | 
			
		||||
  PKG_CONFIG_PATH="$AUTOBUILD_INSTALL_ROOT/i686-w64-mingw32/sys-root/mingw/lib/pkgconfig" \
 | 
			
		||||
  CC="i686-w64-mingw32-gcc" \
 | 
			
		||||
  ../configure \
 | 
			
		||||
    --build=$(uname -m)-w64-linux \
 | 
			
		||||
    --host=i686-w64-mingw32 \
 | 
			
		||||
    --prefix="$AUTOBUILD_INSTALL_ROOT/i686-w64-mingw32/sys-root/mingw" \
 | 
			
		||||
    --enable-expensive-tests \
 | 
			
		||||
    --enable-werror
 | 
			
		||||
 | 
			
		||||
  make
 | 
			
		||||
  make install
 | 
			
		||||
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# Test mingw64 cross-compile
 | 
			
		||||
if test -x /usr/bin/x86_64-w64-mingw32-gcc ; then
 | 
			
		||||
  make distclean
 | 
			
		||||
 | 
			
		||||
  PKG_CONFIG_LIBDIR="/usr/x86_64-w64-mingw32/sys-root/mingw/lib/pkgconfig:/usr/x86_64-w64-mingw32/sys-root/mingw/share/pkgconfig" \
 | 
			
		||||
  PKG_CONFIG_PATH="$AUTOBUILD_INSTALL_ROOT/x86_64-w64-mingw32/sys-root/mingw/lib/pkgconfig" \
 | 
			
		||||
  CC="x86_64-w64-mingw32-gcc" \
 | 
			
		||||
  ../configure \
 | 
			
		||||
    --build=$(uname -m)-w64-linux \
 | 
			
		||||
    --host=x86_64-w64-mingw32 \
 | 
			
		||||
    --prefix="$AUTOBUILD_INSTALL_ROOT/x86_64-w64-mingw32/sys-root/mingw" \
 | 
			
		||||
    --enable-expensive-tests \
 | 
			
		||||
    --enable-werror
 | 
			
		||||
 | 
			
		||||
  make
 | 
			
		||||
  make install
 | 
			
		||||
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
if test -x /usr/bin/i686-w64-mingw32-gcc && test -x /usr/bin/x86_64-w64-mingw32-gcc ; then
 | 
			
		||||
  if test -f /usr/bin/rpmbuild ; then
 | 
			
		||||
    rpmbuild $nodeps \
 | 
			
		||||
       --define "extra_release $EXTRA_RELEASE" \
 | 
			
		||||
       --define "_sourcedir `pwd`" \
 | 
			
		||||
       -ba --clean mingw-libvirt.spec
 | 
			
		||||
  fi
 | 
			
		||||
fi
 | 
			
		||||
							
								
								
									
										270
									
								
								autogen.sh
									
									
									
									
									
								
							
							
						
						
									
										270
									
								
								autogen.sh
									
									
									
									
									
								
							@@ -1,209 +1,117 @@
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
# Run this to generate all the initial makefiles, etc.
 | 
			
		||||
 | 
			
		||||
die()
 | 
			
		||||
{
 | 
			
		||||
    echo "error: $1" >&2
 | 
			
		||||
set -e
 | 
			
		||||
 | 
			
		||||
srcdir=`dirname "$0"`
 | 
			
		||||
test -z "$srcdir" && srcdir=.
 | 
			
		||||
 | 
			
		||||
THEDIR=`pwd`
 | 
			
		||||
cd "$srcdir"
 | 
			
		||||
 | 
			
		||||
test -f src/libvirt.c || {
 | 
			
		||||
    echo "You must run this script in the top-level libvirt directory"
 | 
			
		||||
    exit 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
starting_point=$(pwd)
 | 
			
		||||
 | 
			
		||||
srcdir=$(dirname "$0")
 | 
			
		||||
test "$srcdir" || srcdir=.
 | 
			
		||||
 | 
			
		||||
cd "$srcdir" || {
 | 
			
		||||
    die "Failed to cd into $srcdir"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
test -f src/libvirt.c || {
 | 
			
		||||
    die "$0 must live in the top-level libvirt directory"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
dry_run=
 | 
			
		||||
EXTRA_ARGS=
 | 
			
		||||
no_git=
 | 
			
		||||
gnulib_srcdir=
 | 
			
		||||
extra_args=
 | 
			
		||||
while test "$#" -gt 0; do
 | 
			
		||||
    case "$1" in
 | 
			
		||||
    --dry-run)
 | 
			
		||||
        # This variable will serve both as an indicator of the fact that
 | 
			
		||||
        # a dry run has been requested, and to store the result of the
 | 
			
		||||
        # dry run. It will be ultimately used as return code for the
 | 
			
		||||
        # script: 0 means no action is necessary, 2 means that autogen.sh
 | 
			
		||||
        # needs to be executed, and 1 is reserved for failures
 | 
			
		||||
        dry_run=0
 | 
			
		||||
        shift
 | 
			
		||||
        ;;
 | 
			
		||||
    --no-git)
 | 
			
		||||
        no_git=" $1"
 | 
			
		||||
        shift
 | 
			
		||||
        ;;
 | 
			
		||||
    --gnulib-srcdir=*)
 | 
			
		||||
        gnulib_srcdir=" $1"
 | 
			
		||||
        shift
 | 
			
		||||
        ;;
 | 
			
		||||
    --gnulib-srcdir)
 | 
			
		||||
        gnulib_srcdir=" $1=$2"
 | 
			
		||||
        shift
 | 
			
		||||
        shift
 | 
			
		||||
        ;;
 | 
			
		||||
    --system)
 | 
			
		||||
        prefix=/usr
 | 
			
		||||
        sysconfdir=/etc
 | 
			
		||||
        localstatedir=/var
 | 
			
		||||
        if test -d $prefix/lib64; then
 | 
			
		||||
            libdir=$prefix/lib64
 | 
			
		||||
        else
 | 
			
		||||
            libdir=$prefix/lib
 | 
			
		||||
        fi
 | 
			
		||||
        extra_args="--prefix=$prefix --localstatedir=$localstatedir"
 | 
			
		||||
        extra_args="$extra_args --sysconfdir=$sysconfdir --libdir=$libdir"
 | 
			
		||||
        shift
 | 
			
		||||
        ;;
 | 
			
		||||
    *)
 | 
			
		||||
        # All remaining arguments will be passed to configure verbatim
 | 
			
		||||
        break
 | 
			
		||||
        ;;
 | 
			
		||||
    esac
 | 
			
		||||
done
 | 
			
		||||
no_git="$no_git$gnulib_srcdir"
 | 
			
		||||
if test "x$1" = "x--no-git"; then
 | 
			
		||||
  no_git=" $1"
 | 
			
		||||
  shift
 | 
			
		||||
  case "$1 $2" in
 | 
			
		||||
    --gnulib-srcdir=*) no_git="$no_git $1"; shift ;;
 | 
			
		||||
    --gnulib-srcdir\ *) no_git="$no_git $1=$2"; shift; shift;;
 | 
			
		||||
  esac
 | 
			
		||||
fi
 | 
			
		||||
if test -z "$NOCONFIGURE" ; then
 | 
			
		||||
  if test "x$1" = "x--system"; then
 | 
			
		||||
    shift
 | 
			
		||||
    prefix=/usr
 | 
			
		||||
    libdir=$prefix/lib
 | 
			
		||||
    sysconfdir=/etc
 | 
			
		||||
    localstatedir=/var
 | 
			
		||||
    if [ -d /usr/lib64 ]; then
 | 
			
		||||
      libdir=$prefix/lib64
 | 
			
		||||
    fi
 | 
			
		||||
    EXTRA_ARGS="--prefix=$prefix --sysconfdir=$sysconfdir --localstatedir=$localstatedir --libdir=$libdir"
 | 
			
		||||
    echo "Running ./configure with $EXTRA_ARGS $@"
 | 
			
		||||
  else
 | 
			
		||||
    if test -z "$*" && test ! -f "$THEDIR/config.status"; then
 | 
			
		||||
        echo "I am going to run ./configure with no arguments - if you wish"
 | 
			
		||||
        echo "to pass any to it, please specify them on the $0 command line."
 | 
			
		||||
    fi
 | 
			
		||||
  fi
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
gnulib_hash()
 | 
			
		||||
# Compute the hash we'll use to determine whether rerunning bootstrap
 | 
			
		||||
# is required.  The first is just the SHA1 that selects a gnulib snapshot.
 | 
			
		||||
# The second ensures that whenever we change the set of gnulib modules used
 | 
			
		||||
# by this package, we rerun bootstrap to pull in the matching set of files.
 | 
			
		||||
# The third ensures that whenever we change the set of local gnulib diffs,
 | 
			
		||||
# we rerun bootstrap to pull in those diffs.
 | 
			
		||||
bootstrap_hash()
 | 
			
		||||
{
 | 
			
		||||
    local no_git=$1
 | 
			
		||||
 | 
			
		||||
    if test "$no_git"; then
 | 
			
		||||
        echo "no-git"
 | 
			
		||||
        echo no-git
 | 
			
		||||
        return
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    # Compute the hash we'll use to determine whether rerunning bootstrap
 | 
			
		||||
    # is required. The first is just the SHA1 that selects a gnulib snapshot.
 | 
			
		||||
    # The second ensures that whenever we change the set of gnulib modules used
 | 
			
		||||
    # by this package, we rerun bootstrap to pull in the matching set of files.
 | 
			
		||||
    # The third ensures that whenever we change the set of local gnulib diffs,
 | 
			
		||||
    # we rerun bootstrap to pull in those diffs.
 | 
			
		||||
    git submodule status .gnulib | awk '{ print $1 }'
 | 
			
		||||
    git submodule status | sed 's/^[ +-]//;s/ .*//'
 | 
			
		||||
    git hash-object bootstrap.conf
 | 
			
		||||
    git ls-tree -d HEAD gnulib/local | awk '{ print $3 }'
 | 
			
		||||
    git ls-tree -d HEAD gnulib/local | awk '{print $3}'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Only look into git submodules if we're in a git checkout
 | 
			
		||||
# Ensure that whenever we pull in a gnulib update or otherwise change to a
 | 
			
		||||
# different version (i.e., when switching branches), we also rerun ./bootstrap.
 | 
			
		||||
# Also, running 'make rpm' tends to litter the po/ directory, and some people
 | 
			
		||||
# like to run 'git clean -x -f po' to fix it; but only ./bootstrap regenerates
 | 
			
		||||
# the required file po/Makevars.
 | 
			
		||||
# Only run bootstrap from a git checkout, never from a tarball.
 | 
			
		||||
if test -d .git || test -f .git; then
 | 
			
		||||
 | 
			
		||||
    # Check for dirty submodules
 | 
			
		||||
    if test -z "$CLEAN_SUBMODULE"; then
 | 
			
		||||
        for path in $(git submodule status | awk '{ print $2 }'); do
 | 
			
		||||
            case "$(git diff "$path")" in
 | 
			
		||||
                *-dirty*)
 | 
			
		||||
                    echo "error: $path is dirty, please investigate" >&2
 | 
			
		||||
                    echo "set CLEAN_SUBMODULE to discard submodule changes" >&2
 | 
			
		||||
                    exit 1
 | 
			
		||||
                    ;;
 | 
			
		||||
            esac
 | 
			
		||||
        done
 | 
			
		||||
    curr_status=.git-module-status t=
 | 
			
		||||
    if test "$no_git"; then
 | 
			
		||||
        t=no-git
 | 
			
		||||
    elif test -d .gnulib; then
 | 
			
		||||
        t=$(bootstrap_hash; git diff .gnulib)
 | 
			
		||||
    fi
 | 
			
		||||
    if test "$CLEAN_SUBMODULE" && test -z "$no_git"; then
 | 
			
		||||
        if test -z "$dry_run"; then
 | 
			
		||||
            echo "Cleaning up submodules..."
 | 
			
		||||
            git submodule foreach 'git clean -dfqx && git reset --hard' || {
 | 
			
		||||
                die "Cleaning up submodules failed"
 | 
			
		||||
            }
 | 
			
		||||
        fi
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    # Update all submodules. If any of the submodules has not been
 | 
			
		||||
    # initialized yet, it will be initialized now; moreover, any submodule
 | 
			
		||||
    # with uncommitted changes will be returned to the expected state
 | 
			
		||||
    echo "Updating submodules..."
 | 
			
		||||
    git submodule update --init || {
 | 
			
		||||
        die "Updating submodules failed"
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    # The expected hash, eg. the one computed after the last
 | 
			
		||||
    # successful bootstrap run, is stored on disk
 | 
			
		||||
    state_file=.git-module-status
 | 
			
		||||
    expected_hash=$(cat "$state_file" 2>/dev/null)
 | 
			
		||||
    actual_hash=$(gnulib_hash "$no_git")
 | 
			
		||||
 | 
			
		||||
    if test "$actual_hash" = "$expected_hash" && \
 | 
			
		||||
       test -f po/Makevars && test -f AUTHORS; then
 | 
			
		||||
        # The gnulib hash matches our expectations, and all the files
 | 
			
		||||
        # that can only be generated through bootstrap are present:
 | 
			
		||||
        # we just need to run autoreconf. Unless we're performing a
 | 
			
		||||
        # dry run, of course...
 | 
			
		||||
        if test -z "$dry_run"; then
 | 
			
		||||
            echo "Running autoreconf..."
 | 
			
		||||
            autoreconf -if || {
 | 
			
		||||
                die "autoreconf failed"
 | 
			
		||||
            }
 | 
			
		||||
        fi
 | 
			
		||||
    case $t:${CLEAN_SUBMODULE+set} in
 | 
			
		||||
        *:set) ;;
 | 
			
		||||
        *-dirty*)
 | 
			
		||||
            echo "error: gnulib submodule is dirty, please investigate" 2>&1
 | 
			
		||||
            echo "set env-var CLEAN_SUBMODULE to discard gnulib changes" 2>&1
 | 
			
		||||
            exit 1 ;;
 | 
			
		||||
    esac
 | 
			
		||||
    # Keep this test in sync with cfg.mk:_update_required
 | 
			
		||||
    if test "$t" = "$(cat $curr_status 2>/dev/null)" \
 | 
			
		||||
        && test -f "po/Makevars" && test -f AUTHORS; then
 | 
			
		||||
        # good, it's up to date, all we need is autoreconf
 | 
			
		||||
        autoreconf -if
 | 
			
		||||
    else
 | 
			
		||||
        # Whenever the gnulib submodule or any of the related bits
 | 
			
		||||
        # has been changed in some way (see gnulib_hash) we need to
 | 
			
		||||
        # run bootstrap again. If we're performing a dry run, we
 | 
			
		||||
        # change the return code instead to signal our caller
 | 
			
		||||
        if test "$dry_run"; then
 | 
			
		||||
            dry_run=2
 | 
			
		||||
        else
 | 
			
		||||
            echo "Running bootstrap..."
 | 
			
		||||
            ./bootstrap$no_git --bootstrap-sync || {
 | 
			
		||||
                die "bootstrap failed"
 | 
			
		||||
            }
 | 
			
		||||
            gnulib_hash >"$state_file"
 | 
			
		||||
        if test -z "$no_git" && test ${CLEAN_SUBMODULE+set}; then
 | 
			
		||||
            echo cleaning up submodules...
 | 
			
		||||
            git submodule foreach 'git clean -dfqx && git reset --hard'
 | 
			
		||||
        fi
 | 
			
		||||
        echo running bootstrap$no_git...
 | 
			
		||||
        ./bootstrap$no_git --bootstrap-sync && bootstrap_hash > $curr_status \
 | 
			
		||||
            || { echo "Failed to bootstrap, please investigate."; exit 1; }
 | 
			
		||||
    fi
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# When performing a dry run, we can stop here
 | 
			
		||||
test "$dry_run" && exit "$dry_run"
 | 
			
		||||
test -n "$NOCONFIGURE" && exit 0
 | 
			
		||||
 | 
			
		||||
# If asked not to run configure, we can stop here
 | 
			
		||||
test "$NOCONFIGURE" && exit 0
 | 
			
		||||
cd "$THEDIR"
 | 
			
		||||
 | 
			
		||||
cd "$starting_point" || {
 | 
			
		||||
    die "Failed to cd into $starting_point"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
if test "$OBJ_DIR"; then
 | 
			
		||||
    mkdir -p "$OBJ_DIR" || {
 | 
			
		||||
        die "Failed to create $OBJ_DIR"
 | 
			
		||||
    }
 | 
			
		||||
    cd "$OBJ_DIR" || {
 | 
			
		||||
        die "Failed to cd into $OBJ_DIR"
 | 
			
		||||
    }
 | 
			
		||||
if test "x$OBJ_DIR" != x; then
 | 
			
		||||
    mkdir -p "$OBJ_DIR"
 | 
			
		||||
    cd "$OBJ_DIR"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# Make sure we can find GNU make and tell the user
 | 
			
		||||
# the right command to run
 | 
			
		||||
MAKE=
 | 
			
		||||
for cmd in make gmake; do
 | 
			
		||||
    if $cmd -v 2>&1 | grep -q "GNU Make"; then
 | 
			
		||||
        MAKE=$cmd
 | 
			
		||||
        break
 | 
			
		||||
    fi
 | 
			
		||||
done
 | 
			
		||||
test "$MAKE" || {
 | 
			
		||||
    die "GNU make is required to build libvirt"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
if test -z "$*" && test -z "$extra_args" && test -f config.status; then
 | 
			
		||||
    echo "Running config.status..."
 | 
			
		||||
    ./config.status --recheck || {
 | 
			
		||||
        die "config.status failed"
 | 
			
		||||
    }
 | 
			
		||||
if test -z "$*" && test -z "$EXTRA_ARGS" && test -f config.status; then
 | 
			
		||||
    ./config.status --recheck
 | 
			
		||||
else
 | 
			
		||||
    if test -z "$*" && test -z "$extra_args"; then
 | 
			
		||||
        echo "I am going to run configure with no arguments - if you wish"
 | 
			
		||||
        echo "to pass any to it, please specify them on the $0 command line."
 | 
			
		||||
    else
 | 
			
		||||
        echo "Running configure with $extra_args $@"
 | 
			
		||||
    fi
 | 
			
		||||
    "$srcdir/configure" $extra_args "$@" || {
 | 
			
		||||
        die "configure failed"
 | 
			
		||||
    }
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
echo
 | 
			
		||||
echo "Now type '$MAKE' to compile libvirt."
 | 
			
		||||
    $srcdir/configure $EXTRA_ARGS "$@"
 | 
			
		||||
fi && {
 | 
			
		||||
    echo
 | 
			
		||||
    echo "Now type 'make' to compile libvirt."
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										50
									
								
								bootstrap
									
									
									
									
									
								
							
							
						
						
									
										50
									
								
								bootstrap
									
									
									
									
									
								
							@@ -1,10 +1,10 @@
 | 
			
		||||
#! /bin/sh
 | 
			
		||||
# Print a version string.
 | 
			
		||||
scriptversion=2017-09-19.08; # UTC
 | 
			
		||||
scriptversion=2016-01-24.06; # UTC
 | 
			
		||||
 | 
			
		||||
# Bootstrap this package from checked-out sources.
 | 
			
		||||
 | 
			
		||||
# Copyright (C) 2003-2018 Free Software Foundation, Inc.
 | 
			
		||||
# Copyright (C) 2003-2016 Free Software Foundation, Inc.
 | 
			
		||||
 | 
			
		||||
# This program is free software: you can redistribute it and/or modify
 | 
			
		||||
# it under the terms of the GNU General Public License as published by
 | 
			
		||||
@@ -17,7 +17,7 @@ scriptversion=2017-09-19.08; # UTC
 | 
			
		||||
# GNU General Public License for more details.
 | 
			
		||||
 | 
			
		||||
# You should have received a copy of the GNU General Public License
 | 
			
		||||
# along with this program.  If not, see <https://www.gnu.org/licenses/>.
 | 
			
		||||
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 | 
			
		||||
# Originally written by Paul Eggert.  The canonical version of this
 | 
			
		||||
# script is maintained as build-aux/bootstrap in gnulib, however, to
 | 
			
		||||
@@ -141,7 +141,7 @@ po_download_command_format=\
 | 
			
		||||
# Fallback for downloading .po files (if rsync fails).
 | 
			
		||||
po_download_command_format2=\
 | 
			
		||||
"wget --mirror -nd -q -np -A.po -P '%s' \
 | 
			
		||||
 https://translationproject.org/latest/%s/"
 | 
			
		||||
 http://translationproject.org/latest/%s/"
 | 
			
		||||
 | 
			
		||||
# Prefer a non-empty tarname (4th argument of AC_INIT if given), else
 | 
			
		||||
# fall back to the package name (1st argument with munging)
 | 
			
		||||
@@ -418,30 +418,28 @@ sort_ver() { # sort -V is not generally available
 | 
			
		||||
  done
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
get_version_sed='
 | 
			
		||||
# Move version to start of line.
 | 
			
		||||
s/.*[v ]\([0-9]\)/\1/
 | 
			
		||||
 | 
			
		||||
# Skip lines that do not start with version.
 | 
			
		||||
/^[0-9]/!d
 | 
			
		||||
 | 
			
		||||
# Remove characters after the version.
 | 
			
		||||
s/[^.a-z0-9-].*//
 | 
			
		||||
 | 
			
		||||
# The first component must be digits only.
 | 
			
		||||
s/^\([0-9]*\)[a-z-].*/\1/
 | 
			
		||||
 | 
			
		||||
#the following essentially does s/5.005/5.5/
 | 
			
		||||
s/\.0*\([1-9]\)/.\1/g
 | 
			
		||||
p
 | 
			
		||||
q'
 | 
			
		||||
 | 
			
		||||
get_version() {
 | 
			
		||||
  app=$1
 | 
			
		||||
 | 
			
		||||
  $app --version >/dev/null 2>&1 || { $app --version; return 1; }
 | 
			
		||||
 | 
			
		||||
  $app --version 2>&1 | sed -n "$get_version_sed"
 | 
			
		||||
  $app --version 2>&1 |
 | 
			
		||||
  sed -n '# Move version to start of line.
 | 
			
		||||
          s/.*[v ]\([0-9]\)/\1/
 | 
			
		||||
 | 
			
		||||
          # Skip lines that do not start with version.
 | 
			
		||||
          /^[0-9]/!d
 | 
			
		||||
 | 
			
		||||
          # Remove characters after the version.
 | 
			
		||||
          s/[^.a-z0-9-].*//
 | 
			
		||||
 | 
			
		||||
          # The first component must be digits only.
 | 
			
		||||
          s/^\([0-9]*\)[a-z-].*/\1/
 | 
			
		||||
 | 
			
		||||
          #the following essentially does s/5.005/5.5/
 | 
			
		||||
          s/\.0*\([1-9]\)/.\1/g
 | 
			
		||||
          p
 | 
			
		||||
          q'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
check_versions() {
 | 
			
		||||
@@ -699,7 +697,7 @@ download_po_files() {
 | 
			
		||||
  echo "$me: getting translations into $subdir for $domain..."
 | 
			
		||||
  cmd=$(printf "$po_download_command_format" "$domain" "$subdir")
 | 
			
		||||
  eval "$cmd" && return
 | 
			
		||||
  # Fallback to HTTPS.
 | 
			
		||||
  # Fallback to HTTP.
 | 
			
		||||
  cmd=$(printf "$po_download_command_format2" "$subdir" "$domain")
 | 
			
		||||
  eval "$cmd"
 | 
			
		||||
}
 | 
			
		||||
@@ -790,9 +788,9 @@ symlink_to_dir()
 | 
			
		||||
      # Leave any existing symlink alone, if it already points to the source,
 | 
			
		||||
      # so that broken build tools that care about symlink times
 | 
			
		||||
      # aren't confused into doing unnecessary builds.  Conversely, if the
 | 
			
		||||
      # existing symlink's timestamp is older than the source, make it afresh,
 | 
			
		||||
      # existing symlink's time stamp is older than the source, make it afresh,
 | 
			
		||||
      # so that broken tools aren't confused into skipping needed builds.  See
 | 
			
		||||
      # <https://lists.gnu.org/r/bug-gnulib/2011-05/msg00326.html>.
 | 
			
		||||
      # <http://lists.gnu.org/archive/html/bug-gnulib/2011-05/msg00326.html>.
 | 
			
		||||
      test -h "$dst" &&
 | 
			
		||||
      src_ls=$(ls -diL "$src" 2>/dev/null) && set $src_ls && src_i=$1 &&
 | 
			
		||||
      dst_ls=$(ls -diL "$dst" 2>/dev/null) && set $dst_ls && dst_i=$1 &&
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
#!/usr/bin/env perl
 | 
			
		||||
#!/usr/bin/perl
 | 
			
		||||
#
 | 
			
		||||
# augeas-gentest.pl: Generate an augeas test file, from an
 | 
			
		||||
#                    example config file + test file template
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
#!/usr/bin/env perl
 | 
			
		||||
#!/usr/bin/perl
 | 
			
		||||
#
 | 
			
		||||
# check-spacing.pl: Report any usage of 'function (..args..)'
 | 
			
		||||
# Also check for other syntax issues, such as correct use of ';'
 | 
			
		||||
 
 | 
			
		||||
@@ -1,72 +0,0 @@
 | 
			
		||||
#!/usr/bin/env perl
 | 
			
		||||
 | 
			
		||||
my %noninlined;
 | 
			
		||||
my %mocked;
 | 
			
		||||
 | 
			
		||||
# Functions in public header don't get the noinline annotation
 | 
			
		||||
# so whitelist them here
 | 
			
		||||
$noninlined{"virEventAddTimeout"} = 1;
 | 
			
		||||
 | 
			
		||||
foreach my $arg (@ARGV) {
 | 
			
		||||
    if ($arg =~ /\.h$/) {
 | 
			
		||||
        #print "Scan header $arg\n";
 | 
			
		||||
        &scan_annotations($arg);
 | 
			
		||||
    } elsif ($arg =~ /mock\.c$/) {
 | 
			
		||||
        #print "Scan mock $arg\n";
 | 
			
		||||
        &scan_overrides($arg);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
my $warned = 0;
 | 
			
		||||
foreach my $func (keys %mocked) {
 | 
			
		||||
    next if exists $noninlined{$func};
 | 
			
		||||
 | 
			
		||||
    $warned++;
 | 
			
		||||
    print STDERR "$func is mocked at $mocked{$func} but missing noinline annotation\n";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
exit $warned ? 1 : 0;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
sub scan_annotations {
 | 
			
		||||
    my $file = shift;
 | 
			
		||||
 | 
			
		||||
    open FH, $file or die "cannot read $file: $!";
 | 
			
		||||
 | 
			
		||||
    my $func;
 | 
			
		||||
    while (<FH>) {
 | 
			
		||||
        if (/^\s*(\w+)\(/ || /^(?:\w+\*?\s+)+(?:\*\s*)?(\w+)\(/) {
 | 
			
		||||
            my $name = $1;
 | 
			
		||||
            if ($name !~ /ATTRIBUTE/) {
 | 
			
		||||
                $func = $name;
 | 
			
		||||
            }
 | 
			
		||||
        } elsif (/^\s*$/) {
 | 
			
		||||
            $func = undef;
 | 
			
		||||
        }
 | 
			
		||||
        if (/ATTRIBUTE_NOINLINE/) {
 | 
			
		||||
            if (defined $func) {
 | 
			
		||||
                $noninlined{$func} = 1;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    close FH
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub scan_overrides {
 | 
			
		||||
    my $file = shift;
 | 
			
		||||
 | 
			
		||||
    open FH, $file or die "cannot read $file: $!";
 | 
			
		||||
 | 
			
		||||
    my $func;
 | 
			
		||||
    while (<FH>) {
 | 
			
		||||
        if (/^(\w+)\(/ || /^\w+\s*(?:\*\s*)?(\w+)\(/) {
 | 
			
		||||
            my $name = $1;
 | 
			
		||||
            if ($name =~ /^vir/) {
 | 
			
		||||
                $mocked{$name} = "$file:$.";
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    close FH
 | 
			
		||||
}
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
#!/usr/bin/env perl
 | 
			
		||||
#!/usr/bin/perl
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -20,24 +20,22 @@
 | 
			
		||||
 * Since virt-login-shell will be setuid, we must do everything
 | 
			
		||||
 * we can to avoid linking to other libraries. Many of them do
 | 
			
		||||
 * unsafe things in functions marked __atttribute__((constructor)).
 | 
			
		||||
 * The only way to avoid such deps is to re-compile the
 | 
			
		||||
 * The only way avoid to avoid such deps is to re-compile the
 | 
			
		||||
 * functions with the code in question disabled, and for that we
 | 
			
		||||
 * must override the main config.h rules. Hence this file :-(
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifdef LIBVIRT_SETUID_RPC_CLIENT
 | 
			
		||||
# undef HAVE_LIBDEVMAPPER_H
 | 
			
		||||
# undef HAVE_LIBNL
 | 
			
		||||
# undef HAVE_LIBNL3
 | 
			
		||||
# undef HAVE_LIBSASL2
 | 
			
		||||
# undef HAVE_SYS_ACL_H
 | 
			
		||||
# undef WITH_CAPNG
 | 
			
		||||
# undef WITH_CURL
 | 
			
		||||
# undef WITH_DBUS
 | 
			
		||||
# undef WITH_DEVMAPPER
 | 
			
		||||
# undef WITH_DTRACE_PROBES
 | 
			
		||||
# undef WITH_GNUTLS
 | 
			
		||||
# undef WITH_GNUTLS_GCRYPT
 | 
			
		||||
# undef WITH_LIBSSH
 | 
			
		||||
# undef WITH_MACVTAP
 | 
			
		||||
# undef WITH_NUMACTL
 | 
			
		||||
# undef WITH_SASL
 | 
			
		||||
@@ -53,17 +51,15 @@
 | 
			
		||||
 * explanation above.
 | 
			
		||||
 */
 | 
			
		||||
#ifdef LIBVIRT_NSS
 | 
			
		||||
# undef HAVE_LIBDEVMAPPER_H
 | 
			
		||||
# undef HAVE_LIBNL
 | 
			
		||||
# undef HAVE_LIBNL3
 | 
			
		||||
# undef HAVE_LIBSASL2
 | 
			
		||||
# undef HAVE_SYS_ACL_H
 | 
			
		||||
# undef WITH_CAPNG
 | 
			
		||||
# undef WITH_CURL
 | 
			
		||||
# undef WITH_DEVMAPPER
 | 
			
		||||
# undef WITH_DTRACE_PROBES
 | 
			
		||||
# undef WITH_GNUTLS
 | 
			
		||||
# undef WITH_GNUTLS_GCRYPT
 | 
			
		||||
# undef WITH_LIBSSH
 | 
			
		||||
# undef WITH_MACVTAP
 | 
			
		||||
# undef WITH_NUMACTL
 | 
			
		||||
# undef WITH_SASL
 | 
			
		||||
@@ -74,22 +70,20 @@
 | 
			
		||||
# undef WITH_CAPNG
 | 
			
		||||
#endif /* LIBVIRT_NSS */
 | 
			
		||||
 | 
			
		||||
#ifndef __GNUC__
 | 
			
		||||
# error "Libvirt requires GCC >= 4.4, or CLang"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Define __GNUC_PREREQ to a sane default if it isn't yet defined.
 | 
			
		||||
 * Define __GNUC__ to a sane default if it isn't yet defined.
 | 
			
		||||
 * This is done here so that it's included as early as possible; gnulib relies
 | 
			
		||||
 * on this to be defined in features.h, which should be included from ctype.h.
 | 
			
		||||
 * This doesn't happen on many non-glibc systems.
 | 
			
		||||
 * When __GNUC_PREREQ is not defined, gnulib defines it to 0, which breaks things.
 | 
			
		||||
 * When __GNUC__ is not defined, gnulib defines it to 0, which breaks things.
 | 
			
		||||
 */
 | 
			
		||||
#ifndef __GNUC_PREREQ
 | 
			
		||||
# define __GNUC_PREREQ(maj, min) \
 | 
			
		||||
    ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !(__GNUC_PREREQ(4, 4) || defined(__clang__))
 | 
			
		||||
# error "Libvirt requires GCC >= 4.4, or CLang"
 | 
			
		||||
#ifdef __GNUC__
 | 
			
		||||
# ifndef __GNUC_PREREQ
 | 
			
		||||
#  if defined __GNUC__ && defined __GNUC_MINOR__
 | 
			
		||||
#   define __GNUC_PREREQ(maj, min)                                        \
 | 
			
		||||
   ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
 | 
			
		||||
#  else
 | 
			
		||||
#   define __GNUC_PREREQ(maj, min) 0
 | 
			
		||||
#  endif
 | 
			
		||||
# endif
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2568
									
								
								configure.ac
									
									
									
									
									
								
							
							
						
						
									
										2568
									
								
								configure.ac
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										546
									
								
								daemon/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										546
									
								
								daemon/Makefile.am
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,546 @@
 | 
			
		||||
## Process this file with automake to produce Makefile.in
 | 
			
		||||
 | 
			
		||||
## Copyright (C) 2005-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
 | 
			
		||||
## 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/>.
 | 
			
		||||
 | 
			
		||||
INCLUDES = \
 | 
			
		||||
	-I$(top_builddir)/gnulib/lib -I$(top_srcdir)/gnulib/lib \
 | 
			
		||||
	-I$(top_srcdir) \
 | 
			
		||||
	-I$(top_builddir)/include -I$(top_srcdir)/include \
 | 
			
		||||
	-I$(top_builddir)/src -I$(top_srcdir)/src \
 | 
			
		||||
	-I$(top_srcdir)/src/util \
 | 
			
		||||
	-I$(top_srcdir)/src/conf \
 | 
			
		||||
	-I$(top_srcdir)/src/rpc \
 | 
			
		||||
	-I$(top_srcdir)/src/remote \
 | 
			
		||||
	-I$(top_srcdir)/src/admin \
 | 
			
		||||
	-I$(top_srcdir)/src/access \
 | 
			
		||||
	$(GETTEXT_CPPFLAGS)
 | 
			
		||||
 | 
			
		||||
CLEANFILES =
 | 
			
		||||
 | 
			
		||||
DAEMON_GENERATED =			\
 | 
			
		||||
		remote_dispatch.h	\
 | 
			
		||||
		lxc_dispatch.h		\
 | 
			
		||||
		qemu_dispatch.h		\
 | 
			
		||||
		admin_dispatch.h	\
 | 
			
		||||
		$(NULL)
 | 
			
		||||
 | 
			
		||||
DAEMON_SOURCES =					\
 | 
			
		||||
		libvirtd.c libvirtd.h			\
 | 
			
		||||
		remote.c remote.h			\
 | 
			
		||||
		stream.c stream.h			\
 | 
			
		||||
		$(DAEMON_GENERATED)
 | 
			
		||||
 | 
			
		||||
LIBVIRTD_CONF_SOURCES = libvirtd-config.c libvirtd-config.h
 | 
			
		||||
 | 
			
		||||
PODFILES = \
 | 
			
		||||
	libvirtd.pod \
 | 
			
		||||
	$(NULL)
 | 
			
		||||
 | 
			
		||||
MANINFILES = \
 | 
			
		||||
	libvirtd.8.in \
 | 
			
		||||
	$(NULL)
 | 
			
		||||
 | 
			
		||||
DISTCLEANFILES =
 | 
			
		||||
EXTRA_DIST =						\
 | 
			
		||||
	remote_dispatch.h				\
 | 
			
		||||
	lxc_dispatch.h					\
 | 
			
		||||
	qemu_dispatch.h					\
 | 
			
		||||
	admin_dispatch.h				\
 | 
			
		||||
	libvirtd.conf					\
 | 
			
		||||
	libvirtd.init.in				\
 | 
			
		||||
	libvirtd.upstart				\
 | 
			
		||||
	libvirtd.policy.in				\
 | 
			
		||||
	libvirt.rules					\
 | 
			
		||||
	libvirtd.sasl					\
 | 
			
		||||
	libvirtd.service.in				\
 | 
			
		||||
	libvirtd.sysconf				\
 | 
			
		||||
	libvirtd.sysctl					\
 | 
			
		||||
	libvirtd.aug                                    \
 | 
			
		||||
	libvirtd.logrotate.in                           \
 | 
			
		||||
	libvirtd.qemu.logrotate.in                      \
 | 
			
		||||
	libvirtd.lxc.logrotate.in                       \
 | 
			
		||||
	libvirtd.libxl.logrotate.in                     \
 | 
			
		||||
	libvirtd.uml.logrotate.in                       \
 | 
			
		||||
	test_libvirtd.aug.in                             \
 | 
			
		||||
	THREADS.txt					\
 | 
			
		||||
	$(PODFILES)					\
 | 
			
		||||
	$(MANINFILES)					\
 | 
			
		||||
	$(DAEMON_SOURCES)				\
 | 
			
		||||
	$(LIBVIRTD_CONF_SOURCES)			\
 | 
			
		||||
	$(NULL)
 | 
			
		||||
 | 
			
		||||
BUILT_SOURCES =
 | 
			
		||||
 | 
			
		||||
REMOTE_PROTOCOL = $(top_srcdir)/src/remote/remote_protocol.x
 | 
			
		||||
LXC_PROTOCOL = $(top_srcdir)/src/remote/lxc_protocol.x
 | 
			
		||||
QEMU_PROTOCOL = $(top_srcdir)/src/remote/qemu_protocol.x
 | 
			
		||||
ADMIN_PROTOCOL = $(top_srcdir)/src/admin/admin_protocol.x
 | 
			
		||||
 | 
			
		||||
remote_dispatch.h: $(top_srcdir)/src/rpc/gendispatch.pl \
 | 
			
		||||
		$(REMOTE_PROTOCOL)
 | 
			
		||||
	$(AM_V_GEN)$(PERL) -w $(top_srcdir)/src/rpc/gendispatch.pl \
 | 
			
		||||
	  --mode=server remote REMOTE $(REMOTE_PROTOCOL) \
 | 
			
		||||
	  > $(srcdir)/remote_dispatch.h
 | 
			
		||||
 | 
			
		||||
lxc_dispatch.h: $(top_srcdir)/src/rpc/gendispatch.pl \
 | 
			
		||||
		$(LXC_PROTOCOL)
 | 
			
		||||
	$(AM_V_GEN)$(PERL) -w $(top_srcdir)/src/rpc/gendispatch.pl \
 | 
			
		||||
	  --mode=server lxc LXC $(LXC_PROTOCOL) \
 | 
			
		||||
	  > $(srcdir)/lxc_dispatch.h
 | 
			
		||||
 | 
			
		||||
qemu_dispatch.h: $(top_srcdir)/src/rpc/gendispatch.pl \
 | 
			
		||||
		$(QEMU_PROTOCOL)
 | 
			
		||||
	$(AM_V_GEN)$(PERL) -w $(top_srcdir)/src/rpc/gendispatch.pl \
 | 
			
		||||
	  --mode=server qemu QEMU $(QEMU_PROTOCOL) \
 | 
			
		||||
	  > $(srcdir)/qemu_dispatch.h
 | 
			
		||||
 | 
			
		||||
admin_dispatch.h: $(top_srcdir)/src/rpc/gendispatch.pl \
 | 
			
		||||
		$(ADMIN_PROTOCOL)
 | 
			
		||||
	$(AM_V_GEN)$(PERL) -w $(top_srcdir)/src/rpc/gendispatch.pl \
 | 
			
		||||
	  --mode=server admin ADMIN $(ADMIN_PROTOCOL) \
 | 
			
		||||
	  > $(srcdir)/admin_dispatch.h
 | 
			
		||||
 | 
			
		||||
if WITH_LIBVIRTD
 | 
			
		||||
 | 
			
		||||
# Build a convenience library, for reuse in tests/libvirtdconftest
 | 
			
		||||
noinst_LTLIBRARIES = libvirtd_conf.la
 | 
			
		||||
libvirtd_conf_la_SOURCES = $(LIBVIRTD_CONF_SOURCES)
 | 
			
		||||
libvirtd_conf_la_CFLAGS = \
 | 
			
		||||
	$(LIBXML_CFLAGS) \
 | 
			
		||||
	$(XDR_CFLAGS) \
 | 
			
		||||
	$(WARN_CFLAGS) $(PIE_CFLAGS) \
 | 
			
		||||
	$(COVERAGE_CFLAGS) \
 | 
			
		||||
	$(NULL)
 | 
			
		||||
libvirtd_conf_la_LDFLAGS =				\
 | 
			
		||||
	$(RELRO_LDFLAGS)				\
 | 
			
		||||
	$(PIE_LDFLAGS)					\
 | 
			
		||||
	$(COVERAGE_LDFLAGS)				\
 | 
			
		||||
	$(NO_INDIRECT_LDFLAGS)				\
 | 
			
		||||
	$(NULL)
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
libvirtd_admin_la_CFLAGS = \
 | 
			
		||||
		$(AM_CFLAGS)		\
 | 
			
		||||
		$(XDR_CFLAGS)		\
 | 
			
		||||
		$(PIE_CFLAGS)		\
 | 
			
		||||
		$(WARN_CFLAGS)		\
 | 
			
		||||
		$(LIBXML_CFLAGS)	\
 | 
			
		||||
		$(COVERAGE_CFLAGS)	\
 | 
			
		||||
		$(NULL)
 | 
			
		||||
libvirtd_admin_la_LDFLAGS = \
 | 
			
		||||
		$(PIE_LDFLAGS)		\
 | 
			
		||||
		$(RELRO_LDFLAGS)	\
 | 
			
		||||
		$(COVERAGE_LDFLAGS)	\
 | 
			
		||||
		$(NO_INDIRECT_LDFLAGS)  \
 | 
			
		||||
		$(NULL)
 | 
			
		||||
libvirtd_admin_la_LIBADD =	\
 | 
			
		||||
		../src/libvirt-admin.la
 | 
			
		||||
 | 
			
		||||
man8_MANS = libvirtd.8
 | 
			
		||||
 | 
			
		||||
sbin_PROGRAMS = libvirtd
 | 
			
		||||
 | 
			
		||||
confdir = $(sysconfdir)/libvirt/
 | 
			
		||||
conf_DATA = libvirtd.conf
 | 
			
		||||
 | 
			
		||||
augeasdir = $(datadir)/augeas/lenses
 | 
			
		||||
augeas_DATA = libvirtd.aug
 | 
			
		||||
 | 
			
		||||
augeastestsdir = $(datadir)/augeas/lenses/tests
 | 
			
		||||
augeastests_DATA = test_libvirtd.aug
 | 
			
		||||
 | 
			
		||||
CLEANFILES += test_libvirtd.aug
 | 
			
		||||
 | 
			
		||||
libvirtd_SOURCES = $(DAEMON_SOURCES)
 | 
			
		||||
 | 
			
		||||
#-D_XOPEN_SOURCE=600 -D_XOPEN_SOURCE_EXTENDED=1 -D_POSIX_C_SOURCE=199506L
 | 
			
		||||
libvirtd_CFLAGS = \
 | 
			
		||||
	$(LIBXML_CFLAGS) $(GNUTLS_CFLAGS) $(SASL_CFLAGS) \
 | 
			
		||||
	$(XDR_CFLAGS) $(DBUS_CFLAGS) $(LIBNL_CFLAGS) \
 | 
			
		||||
	$(WARN_CFLAGS) $(PIE_CFLAGS) \
 | 
			
		||||
	$(COVERAGE_CFLAGS) \
 | 
			
		||||
	-DQEMUD_PID_FILE="\"$(QEMUD_PID_FILE)\""
 | 
			
		||||
 | 
			
		||||
libvirtd_LDFLAGS =					\
 | 
			
		||||
	$(RELRO_LDFLAGS)				\
 | 
			
		||||
	$(PIE_LDFLAGS)					\
 | 
			
		||||
	$(COVERAGE_LDFLAGS)				\
 | 
			
		||||
	$(NO_INDIRECT_LDFLAGS)				\
 | 
			
		||||
	$(NULL)
 | 
			
		||||
 | 
			
		||||
libvirtd_LDADD =					\
 | 
			
		||||
	$(LIBXML_LIBS)					\
 | 
			
		||||
	$(GNUTLS_LIBS)					\
 | 
			
		||||
	$(SASL_LIBS)					\
 | 
			
		||||
	$(DBUS_LIBS)					\
 | 
			
		||||
	$(LIBNL_LIBS)
 | 
			
		||||
 | 
			
		||||
if WITH_DTRACE_PROBES
 | 
			
		||||
libvirtd_LDADD += ../src/libvirt_probes.lo
 | 
			
		||||
endif WITH_DTRACE_PROBES
 | 
			
		||||
 | 
			
		||||
libvirtd_LDADD += \
 | 
			
		||||
	libvirtd_conf.la \
 | 
			
		||||
	libvirtd_admin.la \
 | 
			
		||||
	../src/libvirt-lxc.la \
 | 
			
		||||
	../src/libvirt-qemu.la \
 | 
			
		||||
	../src/libvirt_driver_remote.la \
 | 
			
		||||
	$(NULL)
 | 
			
		||||
 | 
			
		||||
if ! WITH_DRIVER_MODULES
 | 
			
		||||
if WITH_QEMU
 | 
			
		||||
    libvirtd_LDADD += ../src/libvirt_driver_qemu.la
 | 
			
		||||
if WITH_DTRACE_PROBES
 | 
			
		||||
    libvirtd_LDADD += ../src/libvirt_qemu_probes.lo
 | 
			
		||||
endif WITH_DTRACE_PROBES
 | 
			
		||||
endif WITH_QEMU
 | 
			
		||||
 | 
			
		||||
if WITH_LXC
 | 
			
		||||
    libvirtd_LDADD += ../src/libvirt_driver_lxc.la
 | 
			
		||||
endif WITH_LXC
 | 
			
		||||
 | 
			
		||||
if WITH_XEN
 | 
			
		||||
    libvirtd_LDADD += ../src/libvirt_driver_xen.la
 | 
			
		||||
endif WITH_XEN
 | 
			
		||||
 | 
			
		||||
if WITH_LIBXL
 | 
			
		||||
    libvirtd_LDADD += ../src/libvirt_driver_libxl.la
 | 
			
		||||
endif WITH_LIBXL
 | 
			
		||||
 | 
			
		||||
if WITH_UML
 | 
			
		||||
    libvirtd_LDADD += ../src/libvirt_driver_uml.la
 | 
			
		||||
endif WITH_UML
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
if WITH_NETWORK
 | 
			
		||||
    libvirtd_LDADD += ../src/libvirt_driver_network.la
 | 
			
		||||
endif WITH_NETWORK
 | 
			
		||||
 | 
			
		||||
if WITH_INTERFACE
 | 
			
		||||
    libvirtd_LDADD += ../src/libvirt_driver_interface.la
 | 
			
		||||
endif WITH_INTERFACE
 | 
			
		||||
 | 
			
		||||
if WITH_NODE_DEVICES
 | 
			
		||||
    libvirtd_LDADD += ../src/libvirt_driver_nodedev.la
 | 
			
		||||
endif WITH_NODE_DEVICES
 | 
			
		||||
 | 
			
		||||
if WITH_SECRETS
 | 
			
		||||
    libvirtd_LDADD += ../src/libvirt_driver_secret.la
 | 
			
		||||
endif WITH_SECRETS
 | 
			
		||||
 | 
			
		||||
if WITH_NWFILTER
 | 
			
		||||
    libvirtd_LDADD += ../src/libvirt_driver_nwfilter.la
 | 
			
		||||
endif WITH_NWFILTER
 | 
			
		||||
endif ! WITH_DRIVER_MODULES
 | 
			
		||||
 | 
			
		||||
libvirtd_LDADD += ../src/libvirt.la
 | 
			
		||||
 | 
			
		||||
if WITH_POLKIT
 | 
			
		||||
if WITH_POLKIT0
 | 
			
		||||
policydir = $(datadir)/PolicyKit/policy
 | 
			
		||||
policyauth = auth_admin_keep_session
 | 
			
		||||
else ! WITH_POLKIT0
 | 
			
		||||
policydir = $(datadir)/polkit-1/actions
 | 
			
		||||
policyauth = auth_admin_keep
 | 
			
		||||
rulesdir = $(datadir)/polkit-1/rules.d
 | 
			
		||||
rulesfile = libvirt.rules
 | 
			
		||||
endif ! WITH_POLKIT0
 | 
			
		||||
endif WITH_POLKIT
 | 
			
		||||
 | 
			
		||||
libvirtd.policy: libvirtd.policy.in $(top_builddir)/config.status
 | 
			
		||||
	$(AM_V_GEN) sed \
 | 
			
		||||
	    -e 's|[@]authaction[@]|$(policyauth)|g' \
 | 
			
		||||
	    < $< > $@-t && \
 | 
			
		||||
	mv $@-t $@
 | 
			
		||||
BUILT_SOURCES += libvirtd.policy
 | 
			
		||||
 | 
			
		||||
install-data-local: install-init-redhat install-init-systemd \
 | 
			
		||||
		install-init-upstart \
 | 
			
		||||
		install-data-sasl install-data-polkit \
 | 
			
		||||
		install-logrotate install-sysctl
 | 
			
		||||
	$(MKDIR_P) $(DESTDIR)$(localstatedir)/log/libvirt \
 | 
			
		||||
		   $(DESTDIR)$(localstatedir)/run/libvirt \
 | 
			
		||||
		   $(DESTDIR)$(localstatedir)/lib/libvirt
 | 
			
		||||
 | 
			
		||||
uninstall-local:: uninstall-init-redhat uninstall-init-systemd \
 | 
			
		||||
		uninstall-init-upstart \
 | 
			
		||||
		uninstall-data-sasl uninstall-data-polkit \
 | 
			
		||||
		uninstall-logrotate uninstall-sysctl
 | 
			
		||||
	rmdir $(DESTDIR)$(localstatedir)/log/libvirt || :
 | 
			
		||||
	rmdir $(DESTDIR)$(localstatedir)/run/libvirt || :
 | 
			
		||||
	rmdir $(DESTDIR)$(localstatedir)/lib/libvirt || :
 | 
			
		||||
 | 
			
		||||
if WITH_POLKIT
 | 
			
		||||
install-data-polkit::
 | 
			
		||||
	$(MKDIR_P) $(DESTDIR)$(policydir)
 | 
			
		||||
	$(INSTALL_DATA) libvirtd.policy $(DESTDIR)$(policydir)/org.libvirt.unix.policy
 | 
			
		||||
if ! WITH_POLKIT0
 | 
			
		||||
	$(MKDIR_P) $(DESTDIR)$(rulesdir)
 | 
			
		||||
	$(INSTALL_DATA) $(srcdir)/$(rulesfile) $(DESTDIR)$(rulesdir)/50-libvirt.rules
 | 
			
		||||
endif ! WITH_POLKIT0
 | 
			
		||||
 | 
			
		||||
uninstall-data-polkit::
 | 
			
		||||
	rm -f $(DESTDIR)$(policydir)/org.libvirt.unix.policy
 | 
			
		||||
	rmdir $(DESTDIR)$(policydir) || :
 | 
			
		||||
if ! WITH_POLKIT0
 | 
			
		||||
	rm -f $(DESTDIR)$(rulesdir)/50-libvirt.rules
 | 
			
		||||
	rmdir $(DESTDIR)$(rulesdir) || :
 | 
			
		||||
endif ! WITH_POLKIT0
 | 
			
		||||
 | 
			
		||||
else ! WITH_POLKIT
 | 
			
		||||
install-data-polkit::
 | 
			
		||||
uninstall-data-polkit::
 | 
			
		||||
endif ! WITH_POLKIT
 | 
			
		||||
 | 
			
		||||
remote.c: $(DAEMON_GENERATED)
 | 
			
		||||
remote.h: $(DAEMON_GENERATED)
 | 
			
		||||
admin.c: $(DAEMON_GENERATED)
 | 
			
		||||
admin.h: $(DAEMON_GENERATED)
 | 
			
		||||
 | 
			
		||||
LOGROTATE_CONFS = libvirtd.qemu.logrotate libvirtd.lxc.logrotate \
 | 
			
		||||
		  libvirtd.libxl.logrotate libvirtd.uml.logrotate \
 | 
			
		||||
		  libvirtd.logrotate
 | 
			
		||||
 | 
			
		||||
BUILT_SOURCES += $(LOGROTATE_CONFS)
 | 
			
		||||
 | 
			
		||||
libvirtd.logrotate: libvirtd.logrotate.in
 | 
			
		||||
	$(AM_V_GEN)sed						\
 | 
			
		||||
	    -e 's|[@]localstatedir[@]|$(localstatedir)|g'	\
 | 
			
		||||
	    < $< > $@-t && \
 | 
			
		||||
	mv $@-t $@
 | 
			
		||||
 | 
			
		||||
libvirtd.qemu.logrotate: libvirtd.qemu.logrotate.in
 | 
			
		||||
	$(AM_V_GEN)sed						\
 | 
			
		||||
	    -e 's|[@]localstatedir[@]|$(localstatedir)|g'	\
 | 
			
		||||
	    < $< > $@-t && \
 | 
			
		||||
	mv $@-t $@
 | 
			
		||||
 | 
			
		||||
libvirtd.lxc.logrotate: libvirtd.lxc.logrotate.in
 | 
			
		||||
	$(AM_V_GEN)sed						\
 | 
			
		||||
	    -e 's|[@]localstatedir[@]|$(localstatedir)|g'	\
 | 
			
		||||
	    < $< > $@-t &&					\
 | 
			
		||||
	    mv $@-t $@
 | 
			
		||||
 | 
			
		||||
libvirtd.libxl.logrotate: libvirtd.libxl.logrotate.in
 | 
			
		||||
	$(AM_V_GEN)sed						\
 | 
			
		||||
	    -e 's|[@]localstatedir[@]|$(localstatedir)|g'	\
 | 
			
		||||
	    < $< > $@-t &&					\
 | 
			
		||||
	    mv $@-t $@
 | 
			
		||||
 | 
			
		||||
libvirtd.uml.logrotate: libvirtd.uml.logrotate.in
 | 
			
		||||
	$(AM_V_GEN)sed						\
 | 
			
		||||
	    -e 's|[@]localstatedir[@]|$(localstatedir)|g'	\
 | 
			
		||||
	    < $< > $@-t &&					\
 | 
			
		||||
	    mv $@-t $@
 | 
			
		||||
 | 
			
		||||
install-logrotate: $(LOGROTATE_CONFS)
 | 
			
		||||
	$(MKDIR_P) $(DESTDIR)$(localstatedir)/log/libvirt/qemu/ \
 | 
			
		||||
		   $(DESTDIR)$(localstatedir)/log/libvirt/lxc/ \
 | 
			
		||||
		   $(DESTDIR)$(localstatedir)/log/libvirt/uml/ \
 | 
			
		||||
		   $(DESTDIR)$(sysconfdir)/logrotate.d/
 | 
			
		||||
	$(INSTALL_DATA) libvirtd.logrotate \
 | 
			
		||||
		$(DESTDIR)$(sysconfdir)/logrotate.d/libvirtd
 | 
			
		||||
	$(INSTALL_DATA) libvirtd.qemu.logrotate \
 | 
			
		||||
		$(DESTDIR)$(sysconfdir)/logrotate.d/libvirtd.qemu
 | 
			
		||||
	$(INSTALL_DATA) libvirtd.lxc.logrotate \
 | 
			
		||||
		$(DESTDIR)$(sysconfdir)/logrotate.d/libvirtd.lxc
 | 
			
		||||
	$(INSTALL_DATA) libvirtd.libxl.logrotate \
 | 
			
		||||
		$(DESTDIR)$(sysconfdir)/logrotate.d/libvirtd.libxl
 | 
			
		||||
	$(INSTALL_DATA) libvirtd.uml.logrotate \
 | 
			
		||||
		$(DESTDIR)$(sysconfdir)/logrotate.d/libvirtd.uml
 | 
			
		||||
 | 
			
		||||
uninstall-logrotate:
 | 
			
		||||
	rm -f $(DESTDIR)$(sysconfdir)/logrotate.d/libvirtd \
 | 
			
		||||
	      $(DESTDIR)$(sysconfdir)/logrotate.d/libvirtd.qemu \
 | 
			
		||||
	      $(DESTDIR)$(sysconfdir)/logrotate.d/libvirtd.lxc \
 | 
			
		||||
	      $(DESTDIR)$(sysconfdir)/logrotate.d/libvirtd.libxl \
 | 
			
		||||
	      $(DESTDIR)$(sysconfdir)/logrotate.d/libvirtd.uml
 | 
			
		||||
	rmdir $(DESTDIR)$(localstatedir)/log/libvirt/qemu || :
 | 
			
		||||
	rmdir $(DESTDIR)$(localstatedir)/log/libvirt/lxc || :
 | 
			
		||||
	rmdir $(DESTDIR)$(localstatedir)/log/libvirt/uml || :
 | 
			
		||||
	rmdir $(DESTDIR)$(sysconfdir)/logrotate.d || :
 | 
			
		||||
 | 
			
		||||
install-sysconfig:
 | 
			
		||||
	$(MKDIR_P) $(DESTDIR)$(sysconfdir)/sysconfig
 | 
			
		||||
	$(INSTALL_DATA) $(srcdir)/libvirtd.sysconf \
 | 
			
		||||
	  $(DESTDIR)$(sysconfdir)/sysconfig/libvirtd
 | 
			
		||||
uninstall-sysconfig:
 | 
			
		||||
	rm -f $(DESTDIR)$(sysconfdir)/sysconfig/libvirtd
 | 
			
		||||
	rmdir $(DESTDIR)$(sysconfdir)/sysconfig || :
 | 
			
		||||
 | 
			
		||||
if WITH_SYSCTL
 | 
			
		||||
# Use $(prefix)/lib rather than $(libdir), since man sysctl.d insists on
 | 
			
		||||
# /usr/lib/sysctl.d/ even when libdir is /usr/lib64
 | 
			
		||||
install-sysctl:
 | 
			
		||||
	$(MKDIR_P) $(DESTDIR)$(prefix)/lib/sysctl.d
 | 
			
		||||
	$(INSTALL_DATA) $(srcdir)/libvirtd.sysctl \
 | 
			
		||||
	  $(DESTDIR)$(prefix)/lib/sysctl.d/60-libvirtd.conf
 | 
			
		||||
 | 
			
		||||
uninstall-sysctl:
 | 
			
		||||
	rm -f $(DESTDIR)$(prefix)/lib/sysctl.d/60-libvirtd.conf
 | 
			
		||||
	rmdir $(DESTDIR)$(prefix)/lib/sysctl.d || :
 | 
			
		||||
else ! WITH_SYSCTL
 | 
			
		||||
install-sysctl:
 | 
			
		||||
uninstall-sysctl:
 | 
			
		||||
endif ! WITH_SYSCTL
 | 
			
		||||
 | 
			
		||||
if LIBVIRT_INIT_SCRIPT_RED_HAT
 | 
			
		||||
 | 
			
		||||
BUILT_SOURCES += libvirtd.init
 | 
			
		||||
 | 
			
		||||
install-init-redhat: install-sysconfig libvirtd.init
 | 
			
		||||
	$(MKDIR_P) $(DESTDIR)$(sysconfdir)/rc.d/init.d
 | 
			
		||||
	$(INSTALL_SCRIPT) libvirtd.init \
 | 
			
		||||
	  $(DESTDIR)$(sysconfdir)/rc.d/init.d/libvirtd
 | 
			
		||||
 | 
			
		||||
uninstall-init-redhat: uninstall-sysconfig
 | 
			
		||||
	rm -f $(DESTDIR)$(sysconfdir)/rc.d/init.d/libvirtd
 | 
			
		||||
	rmdir $(DESTDIR)$(sysconfdir)/rc.d/init.d || :
 | 
			
		||||
else ! LIBVIRT_INIT_SCRIPT_RED_HAT
 | 
			
		||||
install-init-redhat:
 | 
			
		||||
uninstall-init-redhat:
 | 
			
		||||
endif ! LIBVIRT_INIT_SCRIPT_RED_HAT
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
if LIBVIRT_INIT_SCRIPT_UPSTART
 | 
			
		||||
 | 
			
		||||
install-init-upstart: install-sysconfig
 | 
			
		||||
	$(MKDIR_P) $(DESTDIR)$(sysconfdir)/event.d
 | 
			
		||||
	$(INSTALL_SCRIPT) libvirtd.upstart \
 | 
			
		||||
	  $(DESTDIR)$(sysconfdir)/event.d/libvirtd
 | 
			
		||||
 | 
			
		||||
uninstall-init-upstart: uninstall-sysconfig
 | 
			
		||||
	rm -f $(DESTDIR)$(sysconfdir)/event.d/libvirtd
 | 
			
		||||
	rmdir $(DESTDIR)$(sysconfdir)/event.d || :
 | 
			
		||||
else ! LIBVIRT_INIT_SCRIPT_UPSTART
 | 
			
		||||
install-init-upstart:
 | 
			
		||||
uninstall-init-upstart:
 | 
			
		||||
endif ! LIBVIRT_INIT_SCRIPT_UPSTART
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
if LIBVIRT_INIT_SCRIPT_SYSTEMD
 | 
			
		||||
 | 
			
		||||
SYSTEMD_UNIT_DIR = $(prefix)/lib/systemd/system
 | 
			
		||||
BUILT_SOURCES += libvirtd.service
 | 
			
		||||
 | 
			
		||||
install-init-systemd: install-sysconfig libvirtd.service
 | 
			
		||||
	$(MKDIR_P) $(DESTDIR)$(SYSTEMD_UNIT_DIR)
 | 
			
		||||
	$(INSTALL_DATA) libvirtd.service \
 | 
			
		||||
	  $(DESTDIR)$(SYSTEMD_UNIT_DIR)/libvirtd.service
 | 
			
		||||
 | 
			
		||||
uninstall-init-systemd: uninstall-sysconfig
 | 
			
		||||
	rm -f $(DESTDIR)$(SYSTEMD_UNIT_DIR)/libvirtd.service
 | 
			
		||||
	rmdir $(DESTDIR)$(SYSTEMD_UNIT_DIR) || :
 | 
			
		||||
else ! LIBVIRT_INIT_SCRIPT_SYSTEMD
 | 
			
		||||
install-init-systemd:
 | 
			
		||||
uninstall-init-systemd:
 | 
			
		||||
endif ! LIBVIRT_INIT_SCRIPT_SYSTEMD
 | 
			
		||||
 | 
			
		||||
libvirtd.init: libvirtd.init.in $(top_builddir)/config.status
 | 
			
		||||
	$(AM_V_GEN)sed						\
 | 
			
		||||
	    -e 's|[@]localstatedir[@]|$(localstatedir)|g'	\
 | 
			
		||||
	    -e 's|[@]sbindir[@]|$(sbindir)|g'			\
 | 
			
		||||
	    -e 's|[@]sysconfdir[@]|$(sysconfdir)|g'		\
 | 
			
		||||
	    < $< > $@-t &&					\
 | 
			
		||||
	    chmod a+x $@-t &&					\
 | 
			
		||||
	    mv $@-t $@
 | 
			
		||||
 | 
			
		||||
libvirtd.service: libvirtd.service.in $(top_builddir)/config.status
 | 
			
		||||
	$(AM_V_GEN)sed						\
 | 
			
		||||
	    -e 's|[@]localstatedir[@]|$(localstatedir)|g'	\
 | 
			
		||||
	    -e 's|[@]sbindir[@]|$(sbindir)|g'			\
 | 
			
		||||
	    -e 's|[@]sysconfdir[@]|$(sysconfdir)|g'		\
 | 
			
		||||
	    < $< > $@-t &&					\
 | 
			
		||||
	    mv $@-t $@
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
check-local: check-augeas
 | 
			
		||||
 | 
			
		||||
AUG_GENTEST = $(PERL) $(top_srcdir)/build-aux/augeas-gentest.pl
 | 
			
		||||
 | 
			
		||||
test_libvirtd.aug: test_libvirtd.aug.in $(srcdir)/libvirtd.conf
 | 
			
		||||
	$(AM_V_GEN)$(AUG_GENTEST) $(srcdir)/libvirtd.conf $< $@
 | 
			
		||||
 | 
			
		||||
check-augeas: test_libvirtd.aug
 | 
			
		||||
	$(AM_V_GEN)if test -x '$(AUGPARSE)'; then \
 | 
			
		||||
	  '$(AUGPARSE)' -I $(srcdir) test_libvirtd.aug; \
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# This must be added last, since functions it provides/replaces
 | 
			
		||||
# are used by nearly every other library.
 | 
			
		||||
libvirtd_LDADD += ../gnulib/lib/libgnu.la $(LIBSOCKET)
 | 
			
		||||
 | 
			
		||||
else ! WITH_LIBVIRTD
 | 
			
		||||
install-data-local: install-data-sasl
 | 
			
		||||
uninstall-local:: uninstall-data-sasl
 | 
			
		||||
endif ! WITH_LIBVIRTD
 | 
			
		||||
 | 
			
		||||
POD2MAN = pod2man -c "Virtualization Support" -r "$(PACKAGE)-$(VERSION)"
 | 
			
		||||
 | 
			
		||||
%.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 $@
 | 
			
		||||
 | 
			
		||||
# This is needed for clients too, so can't wrap in
 | 
			
		||||
# the WITH_LIBVIRTD conditional
 | 
			
		||||
if WITH_SASL
 | 
			
		||||
install-data-sasl:
 | 
			
		||||
	$(MKDIR_P) $(DESTDIR)$(sysconfdir)/sasl2/
 | 
			
		||||
	$(INSTALL_DATA) $(srcdir)/libvirtd.sasl \
 | 
			
		||||
		$(DESTDIR)$(sysconfdir)/sasl2/libvirt.conf
 | 
			
		||||
 | 
			
		||||
uninstall-data-sasl:
 | 
			
		||||
	rm -f $(DESTDIR)$(sysconfdir)/sasl2/libvirt.conf
 | 
			
		||||
	rmdir $(DESTDIR)$(sysconfdir)/sasl2/ || :
 | 
			
		||||
else ! WITH_SASL
 | 
			
		||||
install-data-sasl:
 | 
			
		||||
uninstall-data-sasl:
 | 
			
		||||
endif ! WITH_SASL
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
CLEANFILES += $(BUILT_SOURCES) $(man8_MANS)
 | 
			
		||||
CLEANFILES += *.cov *.gcov .libs/*.gcda .libs/*.gcno *.gcno *.gcda
 | 
			
		||||
MAINTAINERCLEANFILES = $(MANINFILES) $(DAEMON_GENERATED)
 | 
			
		||||
							
								
								
									
										52
									
								
								daemon/THREADS.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								daemon/THREADS.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,52 @@
 | 
			
		||||
 | 
			
		||||
     Threading in the libvirtd daemon
 | 
			
		||||
     ================================
 | 
			
		||||
 | 
			
		||||
To allow efficient processing of RPC requests, the libvirtd daemon
 | 
			
		||||
makes use of threads.
 | 
			
		||||
 | 
			
		||||
 - The process leader. This is the initial thread of control
 | 
			
		||||
   when the daemon starts running. It is responsible for
 | 
			
		||||
   initializing all the state, and starting the event loop.
 | 
			
		||||
   Once that's all done, this thread does nothing except
 | 
			
		||||
   wait for the event loop to quit, thus indicating an orderly
 | 
			
		||||
   shutdown is required.
 | 
			
		||||
 | 
			
		||||
 - The event loop. This thread runs the event loop, sitting
 | 
			
		||||
   in poll() on all monitored file handles, and calculating
 | 
			
		||||
   and dispatching any timers that may be registered. When
 | 
			
		||||
   this thread quits, the entire daemon will shutdown.
 | 
			
		||||
 | 
			
		||||
 - The workers. These 'n' threads all sit around waiting to
 | 
			
		||||
   process incoming RPC requests. Since RPC requests may take
 | 
			
		||||
   a long time to complete, with long idle periods, there will
 | 
			
		||||
   be quite a few workers running.
 | 
			
		||||
 | 
			
		||||
The use of threads obviously requires locking to ensure safety when
 | 
			
		||||
accessing/changing data structures.
 | 
			
		||||
 | 
			
		||||
 - the top level lock is on 'struct qemud_server'. This must be
 | 
			
		||||
   held before acquiring any other lock
 | 
			
		||||
 | 
			
		||||
 - Each 'struct qemud_client' object has a lock. The server lock
 | 
			
		||||
   must be held before acquiring it. Once the client lock is acquired
 | 
			
		||||
   the server lock can (optionally) be dropped.
 | 
			
		||||
 | 
			
		||||
 - The event loop has its own self-contained lock. You can ignore
 | 
			
		||||
   this as a caller of virEvent APIs.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
The server lock is used in conjunction with a condition variable
 | 
			
		||||
to pass jobs from the event loop thread to the workers. The main
 | 
			
		||||
event loop thread handles I/O from the client socket, and once a
 | 
			
		||||
complete RPC message has been read off the wire (and optionally
 | 
			
		||||
decrypted), it will be placed on the 'dx' job queue for the
 | 
			
		||||
associated client object. The job condition will be signalled and
 | 
			
		||||
a worker will wakup and process it.
 | 
			
		||||
 | 
			
		||||
The worker thread must quickly drop its locks on the server and
 | 
			
		||||
client to allow the main event loop thread to continue running
 | 
			
		||||
with its other work. Critically important, is that now libvirt
 | 
			
		||||
API call will ever be made with the server or client locks held.
 | 
			
		||||
 | 
			
		||||
-- End
 | 
			
		||||
							
								
								
									
										386
									
								
								daemon/admin.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										386
									
								
								daemon/admin.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,386 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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"
 | 
			
		||||
							
								
								
									
										36
									
								
								daemon/admin.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								daemon/admin.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,36 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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__ */
 | 
			
		||||
@@ -29,8 +29,8 @@
 | 
			
		||||
#include "virerror.h"
 | 
			
		||||
#include "viridentity.h"
 | 
			
		||||
#include "virlog.h"
 | 
			
		||||
#include "rpc/virnetdaemon.h"
 | 
			
		||||
#include "rpc/virnetserver.h"
 | 
			
		||||
#include "virnetdaemon.h"
 | 
			
		||||
#include "virnetserver.h"
 | 
			
		||||
#include "virstring.h"
 | 
			
		||||
#include "virthreadpool.h"
 | 
			
		||||
#include "virtypedparam.h"
 | 
			
		||||
@@ -382,8 +382,8 @@ adminServerSetClientLimits(virNetServerPtr srv,
 | 
			
		||||
                                   VIR_SERVER_CLIENTS_UNAUTH_MAX)))
 | 
			
		||||
        maxClientsUnauth = param->value.ui;
 | 
			
		||||
 | 
			
		||||
    if (virNetServerSetClientLimits(srv, maxClients,
 | 
			
		||||
                                    maxClientsUnauth) < 0)
 | 
			
		||||
    if (virNetServerSetClientProcessingControls(srv, maxClients,
 | 
			
		||||
                                                maxClientsUnauth) < 0)
 | 
			
		||||
        return -1;
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
@@ -21,8 +21,8 @@
 | 
			
		||||
 *          Martin Kletzander <mkletzan@redhat.com>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __ADMIN_SERVER_H__
 | 
			
		||||
# define __ADMIN_SERVER_H__
 | 
			
		||||
#ifndef __LIBVIRTD_ADMIN_SERVER_H__
 | 
			
		||||
# define __LIBVIRTD_ADMIN_SERVER_H__
 | 
			
		||||
 | 
			
		||||
# include "rpc/virnetdaemon.h"
 | 
			
		||||
# include "rpc/virnetserver.h"
 | 
			
		||||
@@ -72,4 +72,4 @@ int adminServerSetClientLimits(virNetServerPtr srv,
 | 
			
		||||
                               int nparams,
 | 
			
		||||
                               unsigned int flags);
 | 
			
		||||
 | 
			
		||||
#endif /* __ADMIN_SERVER_H__ */
 | 
			
		||||
#endif /* __LIBVIRTD_ADMIN_SERVER_H__ */
 | 
			
		||||
							
								
								
									
										437
									
								
								daemon/libvirtd-config.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										437
									
								
								daemon/libvirtd-config.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,437 @@
 | 
			
		||||
/*
 | 
			
		||||
 * libvirtd-config.c: daemon start of day, guest process & i/o management
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2006-2012, 2014, 2015 Red Hat, Inc.
 | 
			
		||||
 * Copyright (C) 2006 Daniel P. Berrange
 | 
			
		||||
 *
 | 
			
		||||
 * This library is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU Lesser General Public
 | 
			
		||||
 * License as published by the Free Software Foundation; either
 | 
			
		||||
 * version 2.1 of the License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This library is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
			
		||||
 * Lesser General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public
 | 
			
		||||
 * License along with this library.  If not, see
 | 
			
		||||
 * <http://www.gnu.org/licenses/>.
 | 
			
		||||
 *
 | 
			
		||||
 * Author: Daniel P. Berrange <berrange@redhat.com>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <config.h>
 | 
			
		||||
 | 
			
		||||
#include "libvirtd-config.h"
 | 
			
		||||
#include "virconf.h"
 | 
			
		||||
#include "viralloc.h"
 | 
			
		||||
#include "virerror.h"
 | 
			
		||||
#include "virlog.h"
 | 
			
		||||
#include "rpc/virnetserver.h"
 | 
			
		||||
#include "configmake.h"
 | 
			
		||||
#include "remote/remote_protocol.h"
 | 
			
		||||
#include "remote/remote_driver.h"
 | 
			
		||||
#include "virstring.h"
 | 
			
		||||
#include "virutil.h"
 | 
			
		||||
 | 
			
		||||
#define VIR_FROM_THIS VIR_FROM_CONF
 | 
			
		||||
 | 
			
		||||
VIR_LOG_INIT("daemon.libvirtd-config");
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static int
 | 
			
		||||
remoteConfigGetAuth(virConfPtr conf,
 | 
			
		||||
                    const char *filename,
 | 
			
		||||
                    const char *key,
 | 
			
		||||
                    int *auth)
 | 
			
		||||
{
 | 
			
		||||
    char *authstr = NULL;
 | 
			
		||||
 | 
			
		||||
    if (virConfGetValueString(conf, key, &authstr) < 0)
 | 
			
		||||
        return -1;
 | 
			
		||||
 | 
			
		||||
    if (!authstr)
 | 
			
		||||
        return 0;
 | 
			
		||||
 | 
			
		||||
    if (STREQ(authstr, "none")) {
 | 
			
		||||
        *auth = VIR_NET_SERVER_SERVICE_AUTH_NONE;
 | 
			
		||||
#if WITH_SASL
 | 
			
		||||
    } else if (STREQ(authstr, "sasl")) {
 | 
			
		||||
        *auth = VIR_NET_SERVER_SERVICE_AUTH_SASL;
 | 
			
		||||
#endif
 | 
			
		||||
    } else if (STREQ(authstr, "polkit")) {
 | 
			
		||||
        *auth = VIR_NET_SERVER_SERVICE_AUTH_POLKIT;
 | 
			
		||||
    } else {
 | 
			
		||||
        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
 | 
			
		||||
                       _("%s: %s: unsupported auth %s"),
 | 
			
		||||
                       filename, key, authstr);
 | 
			
		||||
        VIR_FREE(authstr);
 | 
			
		||||
        return -1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    VIR_FREE(authstr);
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
daemonConfigFilePath(bool privileged, char **configfile)
 | 
			
		||||
{
 | 
			
		||||
    if (privileged) {
 | 
			
		||||
        if (VIR_STRDUP(*configfile, SYSCONFDIR "/libvirt/libvirtd.conf") < 0)
 | 
			
		||||
            goto error;
 | 
			
		||||
    } else {
 | 
			
		||||
        char *configdir = NULL;
 | 
			
		||||
 | 
			
		||||
        if (!(configdir = virGetUserConfigDirectory()))
 | 
			
		||||
            goto error;
 | 
			
		||||
 | 
			
		||||
        if (virAsprintf(configfile, "%s/libvirtd.conf", configdir) < 0) {
 | 
			
		||||
            VIR_FREE(configdir);
 | 
			
		||||
            goto error;
 | 
			
		||||
        }
 | 
			
		||||
        VIR_FREE(configdir);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
 | 
			
		||||
 error:
 | 
			
		||||
    return -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct daemonConfig*
 | 
			
		||||
daemonConfigNew(bool privileged ATTRIBUTE_UNUSED)
 | 
			
		||||
{
 | 
			
		||||
    struct daemonConfig *data;
 | 
			
		||||
    char *localhost;
 | 
			
		||||
    int ret;
 | 
			
		||||
 | 
			
		||||
    if (VIR_ALLOC(data) < 0)
 | 
			
		||||
        return NULL;
 | 
			
		||||
 | 
			
		||||
    data->listen_tls = 1;
 | 
			
		||||
    data->listen_tcp = 0;
 | 
			
		||||
 | 
			
		||||
    if (VIR_STRDUP(data->tls_port, LIBVIRTD_TLS_PORT) < 0 ||
 | 
			
		||||
        VIR_STRDUP(data->tcp_port, LIBVIRTD_TCP_PORT) < 0)
 | 
			
		||||
        goto error;
 | 
			
		||||
 | 
			
		||||
    /* Only default to PolicyKit if running as root */
 | 
			
		||||
#if WITH_POLKIT
 | 
			
		||||
    if (privileged) {
 | 
			
		||||
        data->auth_unix_rw = REMOTE_AUTH_POLKIT;
 | 
			
		||||
        data->auth_unix_ro = REMOTE_AUTH_POLKIT;
 | 
			
		||||
    } else {
 | 
			
		||||
#endif
 | 
			
		||||
        data->auth_unix_rw = REMOTE_AUTH_NONE;
 | 
			
		||||
        data->auth_unix_ro = REMOTE_AUTH_NONE;
 | 
			
		||||
#if WITH_POLKIT
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
    if (VIR_STRDUP(data->unix_sock_rw_perms,
 | 
			
		||||
                   data->auth_unix_rw == REMOTE_AUTH_POLKIT ? "0777" : "0700") < 0 ||
 | 
			
		||||
        VIR_STRDUP(data->unix_sock_ro_perms, "0777") < 0 ||
 | 
			
		||||
        VIR_STRDUP(data->unix_sock_admin_perms, "0700") < 0)
 | 
			
		||||
        goto error;
 | 
			
		||||
 | 
			
		||||
#if WITH_SASL
 | 
			
		||||
    data->auth_tcp = REMOTE_AUTH_SASL;
 | 
			
		||||
#else
 | 
			
		||||
    data->auth_tcp = REMOTE_AUTH_NONE;
 | 
			
		||||
#endif
 | 
			
		||||
    data->auth_tls = REMOTE_AUTH_NONE;
 | 
			
		||||
 | 
			
		||||
    data->mdns_adv = 0;
 | 
			
		||||
 | 
			
		||||
    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;
 | 
			
		||||
 | 
			
		||||
    data->max_requests = 20;
 | 
			
		||||
    data->max_client_requests = 5;
 | 
			
		||||
 | 
			
		||||
    data->audit_level = 1;
 | 
			
		||||
    data->audit_logging = 0;
 | 
			
		||||
 | 
			
		||||
    data->keepalive_interval = 5;
 | 
			
		||||
    data->keepalive_count = 5;
 | 
			
		||||
 | 
			
		||||
    data->admin_min_workers = 5;
 | 
			
		||||
    data->admin_max_workers = 20;
 | 
			
		||||
    data->admin_max_clients = 5000;
 | 
			
		||||
    data->admin_max_queued_clients = 20;
 | 
			
		||||
    data->admin_max_client_requests = 5;
 | 
			
		||||
 | 
			
		||||
    data->admin_keepalive_interval = 5;
 | 
			
		||||
    data->admin_keepalive_count = 5;
 | 
			
		||||
 | 
			
		||||
    localhost = virGetHostname();
 | 
			
		||||
    if (localhost == NULL) {
 | 
			
		||||
        /* we couldn't resolve the hostname; assume that we are
 | 
			
		||||
         * running in disconnected operation, and report a less
 | 
			
		||||
         * useful Avahi string
 | 
			
		||||
         */
 | 
			
		||||
        ret = VIR_STRDUP(data->mdns_name, "Virtualization Host");
 | 
			
		||||
    } else {
 | 
			
		||||
        char *tmp;
 | 
			
		||||
        /* Extract the host part of the potentially FQDN */
 | 
			
		||||
        if ((tmp = strchr(localhost, '.')))
 | 
			
		||||
            *tmp = '\0';
 | 
			
		||||
        ret = virAsprintf(&data->mdns_name, "Virtualization Host %s",
 | 
			
		||||
                          localhost);
 | 
			
		||||
    }
 | 
			
		||||
    VIR_FREE(localhost);
 | 
			
		||||
    if (ret < 0)
 | 
			
		||||
        goto error;
 | 
			
		||||
 | 
			
		||||
    return data;
 | 
			
		||||
 | 
			
		||||
 error:
 | 
			
		||||
    daemonConfigFree(data);
 | 
			
		||||
    return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
daemonConfigFree(struct daemonConfig *data)
 | 
			
		||||
{
 | 
			
		||||
    char **tmp;
 | 
			
		||||
 | 
			
		||||
    if (!data)
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
    VIR_FREE(data->listen_addr);
 | 
			
		||||
    VIR_FREE(data->tls_port);
 | 
			
		||||
    VIR_FREE(data->tcp_port);
 | 
			
		||||
    tmp = data->access_drivers;
 | 
			
		||||
    while (tmp && *tmp) {
 | 
			
		||||
        VIR_FREE(*tmp);
 | 
			
		||||
        tmp++;
 | 
			
		||||
    }
 | 
			
		||||
    VIR_FREE(data->access_drivers);
 | 
			
		||||
 | 
			
		||||
    VIR_FREE(data->unix_sock_admin_perms);
 | 
			
		||||
    VIR_FREE(data->unix_sock_ro_perms);
 | 
			
		||||
    VIR_FREE(data->unix_sock_rw_perms);
 | 
			
		||||
    VIR_FREE(data->unix_sock_group);
 | 
			
		||||
    VIR_FREE(data->unix_sock_dir);
 | 
			
		||||
    VIR_FREE(data->mdns_name);
 | 
			
		||||
 | 
			
		||||
    tmp = data->tls_allowed_dn_list;
 | 
			
		||||
    while (tmp && *tmp) {
 | 
			
		||||
        VIR_FREE(*tmp);
 | 
			
		||||
        tmp++;
 | 
			
		||||
    }
 | 
			
		||||
    VIR_FREE(data->tls_allowed_dn_list);
 | 
			
		||||
 | 
			
		||||
    tmp = data->sasl_allowed_username_list;
 | 
			
		||||
    while (tmp && *tmp) {
 | 
			
		||||
        VIR_FREE(*tmp);
 | 
			
		||||
        tmp++;
 | 
			
		||||
    }
 | 
			
		||||
    VIR_FREE(data->sasl_allowed_username_list);
 | 
			
		||||
    VIR_FREE(data->tls_priority);
 | 
			
		||||
 | 
			
		||||
    VIR_FREE(data->key_file);
 | 
			
		||||
    VIR_FREE(data->ca_file);
 | 
			
		||||
    VIR_FREE(data->cert_file);
 | 
			
		||||
    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);
 | 
			
		||||
 | 
			
		||||
    VIR_FREE(data);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int
 | 
			
		||||
daemonConfigLoadOptions(struct daemonConfig *data,
 | 
			
		||||
                        const char *filename,
 | 
			
		||||
                        virConfPtr conf)
 | 
			
		||||
{
 | 
			
		||||
    if (virConfGetValueBool(conf, "listen_tcp", &data->listen_tcp) < 0)
 | 
			
		||||
        goto error;
 | 
			
		||||
    if (virConfGetValueBool(conf, "listen_tls", &data->listen_tls) < 0)
 | 
			
		||||
        goto error;
 | 
			
		||||
    if (virConfGetValueString(conf, "tls_port", &data->tls_port) < 0)
 | 
			
		||||
        goto error;
 | 
			
		||||
    if (virConfGetValueString(conf, "tcp_port", &data->tcp_port) < 0)
 | 
			
		||||
        goto error;
 | 
			
		||||
    if (virConfGetValueString(conf, "listen_addr", &data->listen_addr) < 0)
 | 
			
		||||
        goto error;
 | 
			
		||||
 | 
			
		||||
    if (remoteConfigGetAuth(conf, filename, "auth_unix_rw", &data->auth_unix_rw) < 0)
 | 
			
		||||
        goto error;
 | 
			
		||||
#if WITH_POLKIT
 | 
			
		||||
    /* Change default perms to be wide-open if PolicyKit is enabled.
 | 
			
		||||
     * Admin can always override in config file
 | 
			
		||||
     */
 | 
			
		||||
    if (data->auth_unix_rw == REMOTE_AUTH_POLKIT) {
 | 
			
		||||
        VIR_FREE(data->unix_sock_rw_perms);
 | 
			
		||||
        if (VIR_STRDUP(data->unix_sock_rw_perms, "0777") < 0)
 | 
			
		||||
            goto error;
 | 
			
		||||
    }
 | 
			
		||||
#endif
 | 
			
		||||
    if (remoteConfigGetAuth(conf, filename, "auth_unix_ro", &data->auth_unix_ro) < 0)
 | 
			
		||||
        goto error;
 | 
			
		||||
    if (remoteConfigGetAuth(conf, filename, "auth_tcp", &data->auth_tcp) < 0)
 | 
			
		||||
        goto error;
 | 
			
		||||
    if (remoteConfigGetAuth(conf, filename, "auth_tls", &data->auth_tls) < 0)
 | 
			
		||||
        goto error;
 | 
			
		||||
 | 
			
		||||
    if (virConfGetValueStringList(conf, "access_drivers", false,
 | 
			
		||||
                                  &data->access_drivers) < 0)
 | 
			
		||||
        goto error;
 | 
			
		||||
 | 
			
		||||
    if (virConfGetValueString(conf, "unix_sock_group", &data->unix_sock_group) < 0)
 | 
			
		||||
        goto error;
 | 
			
		||||
    if (virConfGetValueString(conf, "unix_sock_admin_perms", &data->unix_sock_admin_perms) < 0)
 | 
			
		||||
        goto error;
 | 
			
		||||
    if (virConfGetValueString(conf, "unix_sock_ro_perms", &data->unix_sock_ro_perms) < 0)
 | 
			
		||||
        goto error;
 | 
			
		||||
    if (virConfGetValueString(conf, "unix_sock_rw_perms", &data->unix_sock_rw_perms) < 0)
 | 
			
		||||
        goto error;
 | 
			
		||||
 | 
			
		||||
    if (virConfGetValueString(conf, "unix_sock_dir", &data->unix_sock_dir) < 0)
 | 
			
		||||
        goto error;
 | 
			
		||||
 | 
			
		||||
    if (virConfGetValueBool(conf, "mdns_adv", &data->mdns_adv) < 0)
 | 
			
		||||
        goto error;
 | 
			
		||||
    if (virConfGetValueString(conf, "mdns_name", &data->mdns_name) < 0)
 | 
			
		||||
        goto error;
 | 
			
		||||
 | 
			
		||||
    if (virConfGetValueBool(conf, "tls_no_sanity_certificate", &data->tls_no_sanity_certificate) < 0)
 | 
			
		||||
        goto error;
 | 
			
		||||
    if (virConfGetValueBool(conf, "tls_no_verify_certificate", &data->tls_no_verify_certificate) < 0)
 | 
			
		||||
        goto error;
 | 
			
		||||
 | 
			
		||||
    if (virConfGetValueString(conf, "key_file", &data->key_file) < 0)
 | 
			
		||||
        goto error;
 | 
			
		||||
    if (virConfGetValueString(conf, "cert_file", &data->cert_file) < 0)
 | 
			
		||||
        goto error;
 | 
			
		||||
    if (virConfGetValueString(conf, "ca_file", &data->ca_file) < 0)
 | 
			
		||||
        goto error;
 | 
			
		||||
    if (virConfGetValueString(conf, "crl_file", &data->crl_file) < 0)
 | 
			
		||||
        goto error;
 | 
			
		||||
 | 
			
		||||
    if (virConfGetValueStringList(conf, "tls_allowed_dn_list", false,
 | 
			
		||||
                                  &data->tls_allowed_dn_list) < 0)
 | 
			
		||||
        goto error;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    if (virConfGetValueStringList(conf, "sasl_allowed_username_list", false,
 | 
			
		||||
                                  &data->sasl_allowed_username_list) < 0)
 | 
			
		||||
        goto error;
 | 
			
		||||
 | 
			
		||||
    if (virConfGetValueString(conf, "tls_priority", &data->tls_priority) < 0)
 | 
			
		||||
        goto error;
 | 
			
		||||
 | 
			
		||||
    if (virConfGetValueUInt(conf, "min_workers", &data->min_workers) < 0)
 | 
			
		||||
        goto error;
 | 
			
		||||
    if (virConfGetValueUInt(conf, "max_workers", &data->max_workers) < 0)
 | 
			
		||||
        goto error;
 | 
			
		||||
    if (virConfGetValueUInt(conf, "max_clients", &data->max_clients) < 0)
 | 
			
		||||
        goto error;
 | 
			
		||||
    if (virConfGetValueUInt(conf, "max_queued_clients", &data->max_queued_clients) < 0)
 | 
			
		||||
        goto error;
 | 
			
		||||
    if (virConfGetValueUInt(conf, "max_anonymous_clients", &data->max_anonymous_clients) < 0)
 | 
			
		||||
        goto error;
 | 
			
		||||
 | 
			
		||||
    if (virConfGetValueUInt(conf, "prio_workers", &data->prio_workers) < 0)
 | 
			
		||||
        goto error;
 | 
			
		||||
 | 
			
		||||
    if (virConfGetValueUInt(conf, "max_requests", &data->max_requests) < 0)
 | 
			
		||||
        goto error;
 | 
			
		||||
    if (virConfGetValueUInt(conf, "max_client_requests", &data->max_client_requests) < 0)
 | 
			
		||||
        goto error;
 | 
			
		||||
 | 
			
		||||
    if (virConfGetValueUInt(conf, "admin_min_workers", &data->admin_min_workers) < 0)
 | 
			
		||||
        goto error;
 | 
			
		||||
    if (virConfGetValueUInt(conf, "admin_max_workers", &data->admin_max_workers) < 0)
 | 
			
		||||
        goto error;
 | 
			
		||||
    if (virConfGetValueUInt(conf, "admin_max_clients", &data->admin_max_clients) < 0)
 | 
			
		||||
        goto error;
 | 
			
		||||
    if (virConfGetValueUInt(conf, "admin_max_queued_clients", &data->admin_max_queued_clients) < 0)
 | 
			
		||||
        goto error;
 | 
			
		||||
    if (virConfGetValueUInt(conf, "admin_max_client_requests", &data->admin_max_client_requests) < 0)
 | 
			
		||||
        goto error;
 | 
			
		||||
 | 
			
		||||
    if (virConfGetValueUInt(conf, "audit_level", &data->audit_level) < 0)
 | 
			
		||||
        goto error;
 | 
			
		||||
    if (virConfGetValueBool(conf, "audit_logging", &data->audit_logging) < 0)
 | 
			
		||||
        goto error;
 | 
			
		||||
 | 
			
		||||
    if (virConfGetValueString(conf, "host_uuid", &data->host_uuid) < 0)
 | 
			
		||||
        goto error;
 | 
			
		||||
    if (virConfGetValueString(conf, "host_uuid_source", &data->host_uuid_source) < 0)
 | 
			
		||||
        goto error;
 | 
			
		||||
 | 
			
		||||
    if (virConfGetValueUInt(conf, "log_level", &data->log_level) < 0)
 | 
			
		||||
        goto error;
 | 
			
		||||
    if (virConfGetValueString(conf, "log_filters", &data->log_filters) < 0)
 | 
			
		||||
        goto error;
 | 
			
		||||
    if (virConfGetValueString(conf, "log_outputs", &data->log_outputs) < 0)
 | 
			
		||||
        goto error;
 | 
			
		||||
 | 
			
		||||
    if (virConfGetValueInt(conf, "keepalive_interval", &data->keepalive_interval) < 0)
 | 
			
		||||
        goto error;
 | 
			
		||||
    if (virConfGetValueUInt(conf, "keepalive_count", &data->keepalive_count) < 0)
 | 
			
		||||
        goto error;
 | 
			
		||||
 | 
			
		||||
    if (virConfGetValueInt(conf, "admin_keepalive_interval", &data->admin_keepalive_interval) < 0)
 | 
			
		||||
        goto error;
 | 
			
		||||
    if (virConfGetValueUInt(conf, "admin_keepalive_count", &data->admin_keepalive_count) < 0)
 | 
			
		||||
        goto error;
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
 | 
			
		||||
 error:
 | 
			
		||||
    return -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Read the config file if it exists.
 | 
			
		||||
 * Only used in the remote case, hence the name.
 | 
			
		||||
 */
 | 
			
		||||
int
 | 
			
		||||
daemonConfigLoadFile(struct daemonConfig *data,
 | 
			
		||||
                     const char *filename,
 | 
			
		||||
                     bool allow_missing)
 | 
			
		||||
{
 | 
			
		||||
    virConfPtr conf;
 | 
			
		||||
    int ret;
 | 
			
		||||
 | 
			
		||||
    if (allow_missing &&
 | 
			
		||||
        access(filename, R_OK) == -1 &&
 | 
			
		||||
        errno == ENOENT)
 | 
			
		||||
        return 0;
 | 
			
		||||
 | 
			
		||||
    conf = virConfReadFile(filename, 0);
 | 
			
		||||
    if (!conf)
 | 
			
		||||
        return -1;
 | 
			
		||||
 | 
			
		||||
    ret = daemonConfigLoadOptions(data, filename, conf);
 | 
			
		||||
    virConfFree(conf);
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int daemonConfigLoadData(struct daemonConfig *data,
 | 
			
		||||
                         const char *filename,
 | 
			
		||||
                         const char *filedata)
 | 
			
		||||
{
 | 
			
		||||
    virConfPtr conf;
 | 
			
		||||
    int ret;
 | 
			
		||||
 | 
			
		||||
    conf = virConfReadMem(filedata, strlen(filedata), 0);
 | 
			
		||||
    if (!conf)
 | 
			
		||||
        return -1;
 | 
			
		||||
 | 
			
		||||
    ret = daemonConfigLoadOptions(data, filename, conf);
 | 
			
		||||
    virConfFree(conf);
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										108
									
								
								daemon/libvirtd-config.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										108
									
								
								daemon/libvirtd-config.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,108 @@
 | 
			
		||||
/*
 | 
			
		||||
 * libvirtd-config.h: daemon start of day, guest process & i/o management
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2006-2012, 2015 Red Hat, Inc.
 | 
			
		||||
 * Copyright (C) 2006 Daniel P. Berrange
 | 
			
		||||
 *
 | 
			
		||||
 * This library is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU Lesser General Public
 | 
			
		||||
 * License as published by the Free Software Foundation; either
 | 
			
		||||
 * version 2.1 of the License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This library is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
			
		||||
 * Lesser General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public
 | 
			
		||||
 * License along with this library.  If not, see
 | 
			
		||||
 * <http://www.gnu.org/licenses/>.
 | 
			
		||||
 *
 | 
			
		||||
 * Author: Daniel P. Berrange <berrange@redhat.com>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __LIBVIRTD_CONFIG_H__
 | 
			
		||||
# define __LIBVIRTD_CONFIG_H__
 | 
			
		||||
 | 
			
		||||
# include "internal.h"
 | 
			
		||||
 | 
			
		||||
struct daemonConfig {
 | 
			
		||||
    char *host_uuid;
 | 
			
		||||
    char *host_uuid_source;
 | 
			
		||||
 | 
			
		||||
    bool listen_tls;
 | 
			
		||||
    bool listen_tcp;
 | 
			
		||||
    char *listen_addr;
 | 
			
		||||
    char *tls_port;
 | 
			
		||||
    char *tcp_port;
 | 
			
		||||
 | 
			
		||||
    char *unix_sock_admin_perms;
 | 
			
		||||
    char *unix_sock_ro_perms;
 | 
			
		||||
    char *unix_sock_rw_perms;
 | 
			
		||||
    char *unix_sock_group;
 | 
			
		||||
    char *unix_sock_dir;
 | 
			
		||||
 | 
			
		||||
    int auth_unix_rw;
 | 
			
		||||
    int auth_unix_ro;
 | 
			
		||||
    int auth_tcp;
 | 
			
		||||
    int auth_tls;
 | 
			
		||||
 | 
			
		||||
    char **access_drivers;
 | 
			
		||||
 | 
			
		||||
    bool mdns_adv;
 | 
			
		||||
    char *mdns_name;
 | 
			
		||||
 | 
			
		||||
    bool tls_no_verify_certificate;
 | 
			
		||||
    bool tls_no_sanity_certificate;
 | 
			
		||||
    char **tls_allowed_dn_list;
 | 
			
		||||
    char **sasl_allowed_username_list;
 | 
			
		||||
    char *tls_priority;
 | 
			
		||||
 | 
			
		||||
    char *key_file;
 | 
			
		||||
    char *cert_file;
 | 
			
		||||
    char *ca_file;
 | 
			
		||||
    char *crl_file;
 | 
			
		||||
 | 
			
		||||
    unsigned int min_workers;
 | 
			
		||||
    unsigned int max_workers;
 | 
			
		||||
    unsigned int max_clients;
 | 
			
		||||
    unsigned int max_queued_clients;
 | 
			
		||||
    unsigned int max_anonymous_clients;
 | 
			
		||||
 | 
			
		||||
    unsigned int prio_workers;
 | 
			
		||||
 | 
			
		||||
    unsigned int max_requests;
 | 
			
		||||
    unsigned int max_client_requests;
 | 
			
		||||
 | 
			
		||||
    unsigned int log_level;
 | 
			
		||||
    char *log_filters;
 | 
			
		||||
    char *log_outputs;
 | 
			
		||||
 | 
			
		||||
    unsigned int audit_level;
 | 
			
		||||
    bool audit_logging;
 | 
			
		||||
 | 
			
		||||
    int keepalive_interval;
 | 
			
		||||
    unsigned int keepalive_count;
 | 
			
		||||
 | 
			
		||||
    unsigned int admin_min_workers;
 | 
			
		||||
    unsigned int admin_max_workers;
 | 
			
		||||
    unsigned int admin_max_clients;
 | 
			
		||||
    unsigned int admin_max_queued_clients;
 | 
			
		||||
    unsigned int admin_max_client_requests;
 | 
			
		||||
 | 
			
		||||
    int admin_keepalive_interval;
 | 
			
		||||
    unsigned int admin_keepalive_count;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int daemonConfigFilePath(bool privileged, char **configfile);
 | 
			
		||||
struct daemonConfig* daemonConfigNew(bool privileged);
 | 
			
		||||
void daemonConfigFree(struct daemonConfig *data);
 | 
			
		||||
int daemonConfigLoadFile(struct daemonConfig *data,
 | 
			
		||||
                         const char *filename,
 | 
			
		||||
                         bool allow_missing);
 | 
			
		||||
int daemonConfigLoadData(struct daemonConfig *data,
 | 
			
		||||
                         const char *filename,
 | 
			
		||||
                         const char *filedata);
 | 
			
		||||
 | 
			
		||||
#endif /* __LIBVIRTD_CONFIG_H__ */
 | 
			
		||||
@@ -60,6 +60,7 @@ module Libvirtd =
 | 
			
		||||
                        | int_entry "max_clients"
 | 
			
		||||
                        | int_entry "max_queued_clients"
 | 
			
		||||
                        | int_entry "max_anonymous_clients"
 | 
			
		||||
                        | int_entry "max_requests"
 | 
			
		||||
                        | int_entry "max_client_requests"
 | 
			
		||||
                        | int_entry "prio_workers"
 | 
			
		||||
 | 
			
		||||
@@ -87,7 +88,6 @@ module Libvirtd =
 | 
			
		||||
 | 
			
		||||
   let misc_entry = str_entry "host_uuid"
 | 
			
		||||
                  | str_entry "host_uuid_source"
 | 
			
		||||
                  | int_entry "ovs_timeout"
 | 
			
		||||
 | 
			
		||||
   (* Each enty in the config is one of the following three ... *)
 | 
			
		||||
   let entry = network_entry
 | 
			
		||||
							
								
								
									
										1663
									
								
								daemon/libvirtd.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1663
									
								
								daemon/libvirtd.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -1,6 +1,6 @@
 | 
			
		||||
# Master libvirt daemon configuration file
 | 
			
		||||
#
 | 
			
		||||
# For further information consult https://libvirt.org/format.html
 | 
			
		||||
# For further information consult http://libvirt.org/format.html
 | 
			
		||||
#
 | 
			
		||||
# NOTE: the tests/daemon-conf regression test script requires
 | 
			
		||||
# that each "PARAMETER = VALUE" line in this file have the parameter
 | 
			
		||||
@@ -182,20 +182,6 @@
 | 
			
		||||
# TLS x509 certificate configuration
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
# Use of TLS requires that x509 certificates be issued. The default locations
 | 
			
		||||
# for the certificate files is as follows:
 | 
			
		||||
#
 | 
			
		||||
#   /etc/pki/CA/cacert.pem                 - The CA master certificate
 | 
			
		||||
#   /etc/pki/libvirt/servercert.pem        - The server certificate signed with
 | 
			
		||||
#                                            the cacert.pem
 | 
			
		||||
#   /etc/pki/libvirt/private/serverkey.pem - The server private key
 | 
			
		||||
#
 | 
			
		||||
# It is possible to override the default locations by altering the 'key_file',
 | 
			
		||||
# 'cert_file', and 'ca_file' values and uncommenting them below.
 | 
			
		||||
#
 | 
			
		||||
# NB, overriding the default of one location requires uncommenting and
 | 
			
		||||
# possibly additionally overriding the other settings.
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
# Override the default server key file path
 | 
			
		||||
#
 | 
			
		||||
@@ -315,10 +301,20 @@
 | 
			
		||||
# (notably domainDestroy) can be executed in this pool.
 | 
			
		||||
#prio_workers = 5
 | 
			
		||||
 | 
			
		||||
# Total global limit on concurrent RPC calls. Should be
 | 
			
		||||
# at least as large as max_workers. Beyond this, RPC requests
 | 
			
		||||
# will be read into memory and queued. This directly impacts
 | 
			
		||||
# memory usage, currently each request requires 256 KB of
 | 
			
		||||
# memory. So by default up to 5 MB of memory is used
 | 
			
		||||
#
 | 
			
		||||
# XXX this isn't actually enforced yet, only the per-client
 | 
			
		||||
# limit is used so far
 | 
			
		||||
#max_requests = 20
 | 
			
		||||
 | 
			
		||||
# Limit on concurrent requests from a single client
 | 
			
		||||
# connection. To avoid one client monopolizing the server
 | 
			
		||||
# this should be a small fraction of the global max_workers
 | 
			
		||||
# parameter.
 | 
			
		||||
# this should be a small fraction of the global max_requests
 | 
			
		||||
# and max_workers parameter
 | 
			
		||||
#max_client_requests = 5
 | 
			
		||||
 | 
			
		||||
# Same processing controls, but this time for the admin interface.
 | 
			
		||||
@@ -471,12 +467,3 @@
 | 
			
		||||
# Keepalive settings for the admin interface
 | 
			
		||||
#admin_keepalive_interval = 5
 | 
			
		||||
#admin_keepalive_count = 5
 | 
			
		||||
 | 
			
		||||
###################################################################
 | 
			
		||||
# Open vSwitch:
 | 
			
		||||
# This allows to specify a timeout for openvswitch calls made by
 | 
			
		||||
# libvirt. The ovs-vsctl utility is used for the configuration and
 | 
			
		||||
# its timeout option is set by default to 5 seconds to avoid
 | 
			
		||||
# potential infinite waits blocking libvirt.
 | 
			
		||||
#
 | 
			
		||||
#ovs_timeout = 5
 | 
			
		||||
							
								
								
									
										94
									
								
								daemon/libvirtd.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										94
									
								
								daemon/libvirtd.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,94 @@
 | 
			
		||||
/*
 | 
			
		||||
 * libvirtd.h: daemon data structure definitions
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2006-2015 Red Hat, Inc.
 | 
			
		||||
 * Copyright (C) 2006 Daniel P. Berrange
 | 
			
		||||
 *
 | 
			
		||||
 * This library is free software; you can redistribute it and/or
 | 
			
		||||
 * modify it under the terms of the GNU Lesser General Public
 | 
			
		||||
 * License as published by the Free Software Foundation; either
 | 
			
		||||
 * version 2.1 of the License, or (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This library is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
			
		||||
 * Lesser General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU Lesser General Public
 | 
			
		||||
 * License along with this library.  If not, see
 | 
			
		||||
 * <http://www.gnu.org/licenses/>.
 | 
			
		||||
 *
 | 
			
		||||
 * Author: Daniel P. Berrange <berrange@redhat.com>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifndef LIBVIRTD_H__
 | 
			
		||||
# define LIBVIRTD_H__
 | 
			
		||||
 | 
			
		||||
# define VIR_ENUM_SENTINELS
 | 
			
		||||
 | 
			
		||||
# include <rpc/types.h>
 | 
			
		||||
# include <rpc/xdr.h>
 | 
			
		||||
# include "remote_protocol.h"
 | 
			
		||||
# include "admin_protocol.h"
 | 
			
		||||
# include "lxc_protocol.h"
 | 
			
		||||
# include "qemu_protocol.h"
 | 
			
		||||
# include "virthread.h"
 | 
			
		||||
 | 
			
		||||
# if WITH_SASL
 | 
			
		||||
#  include "virnetsaslcontext.h"
 | 
			
		||||
# endif
 | 
			
		||||
# include "virnetserverprogram.h"
 | 
			
		||||
 | 
			
		||||
typedef struct daemonClientStream daemonClientStream;
 | 
			
		||||
typedef daemonClientStream *daemonClientStreamPtr;
 | 
			
		||||
typedef struct daemonClientPrivate daemonClientPrivate;
 | 
			
		||||
typedef daemonClientPrivate *daemonClientPrivatePtr;
 | 
			
		||||
typedef struct daemonAdmClientPrivate daemonAdmClientPrivate;
 | 
			
		||||
typedef daemonAdmClientPrivate *daemonAdmClientPrivatePtr;
 | 
			
		||||
typedef struct daemonClientEventCallback daemonClientEventCallback;
 | 
			
		||||
typedef daemonClientEventCallback *daemonClientEventCallbackPtr;
 | 
			
		||||
 | 
			
		||||
/* Stores the per-client connection state */
 | 
			
		||||
struct daemonClientPrivate {
 | 
			
		||||
    /* Hold while accessing any data except conn */
 | 
			
		||||
    virMutex lock;
 | 
			
		||||
 | 
			
		||||
    daemonClientEventCallbackPtr *domainEventCallbacks;
 | 
			
		||||
    size_t ndomainEventCallbacks;
 | 
			
		||||
    daemonClientEventCallbackPtr *networkEventCallbacks;
 | 
			
		||||
    size_t nnetworkEventCallbacks;
 | 
			
		||||
    daemonClientEventCallbackPtr *qemuEventCallbacks;
 | 
			
		||||
    size_t nqemuEventCallbacks;
 | 
			
		||||
    daemonClientEventCallbackPtr *storageEventCallbacks;
 | 
			
		||||
    size_t nstorageEventCallbacks;
 | 
			
		||||
    bool closeRegistered;
 | 
			
		||||
 | 
			
		||||
# if WITH_SASL
 | 
			
		||||
    virNetSASLSessionPtr sasl;
 | 
			
		||||
# endif
 | 
			
		||||
 | 
			
		||||
    /* This is only valid if a remote open call has been made on this
 | 
			
		||||
     * connection, otherwise it will be NULL.  Also if remote close is
 | 
			
		||||
     * called, it will be set back to NULL if that succeeds.
 | 
			
		||||
     */
 | 
			
		||||
    virConnectPtr conn;
 | 
			
		||||
 | 
			
		||||
    daemonClientStreamPtr streams;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/* Separate private data for admin connection */
 | 
			
		||||
struct daemonAdmClientPrivate {
 | 
			
		||||
    /* Just a placeholder, not that there is anything to be locked */
 | 
			
		||||
    virMutex lock;
 | 
			
		||||
 | 
			
		||||
    virNetDaemonPtr dmn;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
# if WITH_SASL
 | 
			
		||||
extern virNetSASLContextPtr saslCtxt;
 | 
			
		||||
# endif
 | 
			
		||||
extern virNetServerProgramPtr remoteProgram;
 | 
			
		||||
extern virNetServerProgramPtr qemuProgram;
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
@@ -14,7 +14,7 @@
 | 
			
		||||
# Short-Description: daemon for libvirt virtualization API
 | 
			
		||||
# Description: This is a daemon for managing guest instances
 | 
			
		||||
#              and libvirt virtual networks
 | 
			
		||||
#              See https://libvirt.org
 | 
			
		||||
#              See http://libvirt.org
 | 
			
		||||
### END INIT INFO
 | 
			
		||||
 | 
			
		||||
# the following is chkconfig init header
 | 
			
		||||
@@ -24,7 +24,7 @@
 | 
			
		||||
# chkconfig: 345 97 03
 | 
			
		||||
# description:  This is a daemon for managing guest instances \
 | 
			
		||||
#               and libvirt virtual networks \
 | 
			
		||||
#               See https://libvirt.org
 | 
			
		||||
#               See http://libvirt.org
 | 
			
		||||
#
 | 
			
		||||
# processname: libvirtd
 | 
			
		||||
# pidfile: @localstatedir@/run/libvirtd.pid
 | 
			
		||||
@@ -5,4 +5,5 @@
 | 
			
		||||
        compress
 | 
			
		||||
        delaycompress
 | 
			
		||||
        copytruncate
 | 
			
		||||
        minsize 100k
 | 
			
		||||
}
 | 
			
		||||
@@ -5,4 +5,5 @@
 | 
			
		||||
        compress
 | 
			
		||||
        delaycompress
 | 
			
		||||
        copytruncate
 | 
			
		||||
        minsize 100k
 | 
			
		||||
}
 | 
			
		||||
@@ -56,8 +56,10 @@ Use this name for the PID file, overriding the default value.
 | 
			
		||||
 | 
			
		||||
=item B<-t, --timeout> I<SECONDS>
 | 
			
		||||
 | 
			
		||||
Exit after timeout period (in seconds), provided there are neither any client
 | 
			
		||||
connections nor any running domains.
 | 
			
		||||
Exit after timeout period (in seconds) elapse with no client connections
 | 
			
		||||
or registered resources.  Be aware that resources such as autostart
 | 
			
		||||
networks will result in never reaching the timeout, even when there are
 | 
			
		||||
no client connections.
 | 
			
		||||
 | 
			
		||||
=item B<-v, --verbose>
 | 
			
		||||
 | 
			
		||||
@@ -79,7 +81,7 @@ On receipt of B<SIGHUP> libvirtd will reload its configuration.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<SYSCONFDIR/libvirt/libvirtd.conf>
 | 
			
		||||
=item F<SYSCONFDIR/libvirtd.conf>
 | 
			
		||||
 | 
			
		||||
The default configuration file used by libvirtd, unless overridden on the
 | 
			
		||||
command line using the B<-f>|B<--config> option.
 | 
			
		||||
@@ -112,7 +114,7 @@ The PID file to use, unless overridden by the B<-p>|B<--pid-file> option.
 | 
			
		||||
 | 
			
		||||
=over
 | 
			
		||||
 | 
			
		||||
=item F<$XDG_CONFIG_HOME/libvirt/libvirtd.conf>
 | 
			
		||||
=item F<$XDG_CONFIG_HOME/libvirtd.conf>
 | 
			
		||||
 | 
			
		||||
The default configuration file used by libvirtd, unless overridden on the
 | 
			
		||||
command line using the B<-f>|B<--config> option.
 | 
			
		||||
@@ -166,7 +168,7 @@ Please report all bugs you discover.  This should be done via either:
 | 
			
		||||
 | 
			
		||||
=item a) the mailing list
 | 
			
		||||
 | 
			
		||||
L<https://libvirt.org/contact.html>
 | 
			
		||||
L<http://libvirt.org/contact.html>
 | 
			
		||||
 | 
			
		||||
=item or,
 | 
			
		||||
 | 
			
		||||
@@ -174,7 +176,7 @@ B<>
 | 
			
		||||
 | 
			
		||||
=item b) the bug tracker
 | 
			
		||||
 | 
			
		||||
L<https://libvirt.org/bugs.html>
 | 
			
		||||
L<http://libvirt.org/bugs.html>
 | 
			
		||||
 | 
			
		||||
=item Alternatively, you may report bugs to your software distributor / vendor.
 | 
			
		||||
 | 
			
		||||
@@ -199,6 +201,6 @@ PURPOSE
 | 
			
		||||
=head1 SEE ALSO
 | 
			
		||||
 | 
			
		||||
L<virsh(1)>, L<virt-install(1)>, L<virt-xml-validate(1)>, L<virt-top(1)>,
 | 
			
		||||
L<virt-df(1)>, L<https://www.libvirt.org/>
 | 
			
		||||
L<virt-df(1)>, L<http://www.libvirt.org/>
 | 
			
		||||
 | 
			
		||||
=cut
 | 
			
		||||
@@ -5,4 +5,5 @@
 | 
			
		||||
        compress
 | 
			
		||||
        delaycompress
 | 
			
		||||
        copytruncate
 | 
			
		||||
        minsize 100k
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										31
									
								
								daemon/libvirtd.sasl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								daemon/libvirtd.sasl
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,31 @@
 | 
			
		||||
# If you want to use the non-TLS socket, then you *must* include
 | 
			
		||||
# the GSSAPI or DIGEST-MD5 mechanisms, because they are the only
 | 
			
		||||
# ones that can offer session encryption as well as authentication.
 | 
			
		||||
#
 | 
			
		||||
# If you're only using TLS, then you can turn on any mechanisms
 | 
			
		||||
# you like for authentication, because TLS provides the encryption
 | 
			
		||||
#
 | 
			
		||||
# Default to a simple username+password mechanism
 | 
			
		||||
mech_list: digest-md5
 | 
			
		||||
 | 
			
		||||
# Before you can use GSSAPI, you need a service principle on the
 | 
			
		||||
# KDC server for libvirt, and that to be exported to the keytab
 | 
			
		||||
# file listed below
 | 
			
		||||
#mech_list: gssapi
 | 
			
		||||
#
 | 
			
		||||
# You can also list many mechanisms at once, then the user can choose
 | 
			
		||||
# by adding  '?auth=sasl.gssapi' to their libvirt URI, eg
 | 
			
		||||
#   qemu+tcp://hostname/system?auth=sasl.gssapi
 | 
			
		||||
#mech_list: digest-md5 gssapi
 | 
			
		||||
 | 
			
		||||
# Some older builds of MIT kerberos on Linux ignore this option &
 | 
			
		||||
# instead need KRB5_KTNAME env var.
 | 
			
		||||
# For modern Linux, and other OS, this should be sufficient
 | 
			
		||||
#
 | 
			
		||||
# There is no default value here, uncomment if you need this
 | 
			
		||||
#keytab: /etc/libvirt/krb5.tab
 | 
			
		||||
 | 
			
		||||
# If using digest-md5 for username/passwds, then this is the file
 | 
			
		||||
# containing the passwds. Use 'saslpasswd2 -a libvirt [username]'
 | 
			
		||||
# to add entries, and 'sasldblistusers2 -f [sasldb_path]' to browse it
 | 
			
		||||
sasldb_path: /etc/libvirt/passwd.db
 | 
			
		||||
							
								
								
									
										31
									
								
								daemon/libvirtd.service.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								daemon/libvirtd.service.in
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,31 @@
 | 
			
		||||
# 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
 | 
			
		||||
After=network.target
 | 
			
		||||
After=dbus.service
 | 
			
		||||
After=iscsid.service
 | 
			
		||||
After=apparmor.service
 | 
			
		||||
After=local-fs.target
 | 
			
		||||
After=remote-fs.target
 | 
			
		||||
Documentation=man:libvirtd(8)
 | 
			
		||||
Documentation=http://libvirt.org
 | 
			
		||||
 | 
			
		||||
[Service]
 | 
			
		||||
Type=notify
 | 
			
		||||
EnvironmentFile=-/etc/sysconfig/libvirtd
 | 
			
		||||
ExecStart=@sbindir@/libvirtd $LIBVIRTD_ARGS
 | 
			
		||||
ExecReload=/bin/kill -HUP $MAINPID
 | 
			
		||||
KillMode=process
 | 
			
		||||
Restart=on-failure
 | 
			
		||||
# Override the maximum number of opened files
 | 
			
		||||
#LimitNOFILE=2048
 | 
			
		||||
 | 
			
		||||
[Install]
 | 
			
		||||
WantedBy=multi-user.target
 | 
			
		||||
Also=virtlockd.socket
 | 
			
		||||
Also=virtlogd.socket
 | 
			
		||||
@@ -5,4 +5,5 @@
 | 
			
		||||
        compress
 | 
			
		||||
        delaycompress
 | 
			
		||||
        copytruncate
 | 
			
		||||
        minsize 100k
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										6532
									
								
								daemon/remote.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6532
									
								
								daemon/remote.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										45
									
								
								daemon/remote.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								daemon/remote.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,45 @@
 | 
			
		||||
/*
 | 
			
		||||
 * remote.h: handlers for RPC method calls
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2007, 2008, 2009 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: Richard W.M. Jones <rjones@redhat.com>
 | 
			
		||||
 * Author: Daniel P. Berrange <berrange@redhat.com>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __LIBVIRTD_REMOTE_H__
 | 
			
		||||
# define __LIBVIRTD_REMOTE_H__
 | 
			
		||||
 | 
			
		||||
# include "remote_protocol.h"
 | 
			
		||||
# include "rpc/virnetserverprogram.h"
 | 
			
		||||
# include "rpc/virnetserverclient.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
extern virNetServerProgramProc remoteProcs[];
 | 
			
		||||
extern size_t remoteNProcs;
 | 
			
		||||
 | 
			
		||||
extern virNetServerProgramProc lxcProcs[];
 | 
			
		||||
extern size_t lxcNProcs;
 | 
			
		||||
 | 
			
		||||
extern virNetServerProgramProc qemuProcs[];
 | 
			
		||||
extern size_t qemuNProcs;
 | 
			
		||||
 | 
			
		||||
void remoteClientFreeFunc(void *data);
 | 
			
		||||
void *remoteClientInitHook(virNetServerClientPtr client,
 | 
			
		||||
                           void *opaque);
 | 
			
		||||
 | 
			
		||||
#endif /* __LIBVIRTD_REMOTE_H__ */
 | 
			
		||||
							
								
								
									
										796
									
								
								daemon/stream.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										796
									
								
								daemon/stream.c
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,796 @@
 | 
			
		||||
/*
 | 
			
		||||
 * stream.c: APIs for managing client streams
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2009-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
 | 
			
		||||
 * 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: Daniel P. Berrange <berrange@redhat.com>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include <config.h>
 | 
			
		||||
 | 
			
		||||
#include "stream.h"
 | 
			
		||||
#include "remote.h"
 | 
			
		||||
#include "viralloc.h"
 | 
			
		||||
#include "virlog.h"
 | 
			
		||||
#include "virnetserverclient.h"
 | 
			
		||||
#include "virerror.h"
 | 
			
		||||
 | 
			
		||||
#define VIR_FROM_THIS VIR_FROM_STREAMS
 | 
			
		||||
 | 
			
		||||
VIR_LOG_INIT("daemon.stream");
 | 
			
		||||
 | 
			
		||||
struct daemonClientStream {
 | 
			
		||||
    daemonClientPrivatePtr priv;
 | 
			
		||||
    int refs;
 | 
			
		||||
 | 
			
		||||
    virNetServerProgramPtr prog;
 | 
			
		||||
 | 
			
		||||
    virStreamPtr st;
 | 
			
		||||
    int procedure;
 | 
			
		||||
    unsigned int serial;
 | 
			
		||||
 | 
			
		||||
    bool recvEOF;
 | 
			
		||||
    bool closed;
 | 
			
		||||
 | 
			
		||||
    int filterID;
 | 
			
		||||
 | 
			
		||||
    virNetMessagePtr rx;
 | 
			
		||||
    bool tx;
 | 
			
		||||
 | 
			
		||||
    daemonClientStreamPtr next;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static int
 | 
			
		||||
daemonStreamHandleWrite(virNetServerClientPtr client,
 | 
			
		||||
                        daemonClientStream *stream);
 | 
			
		||||
static int
 | 
			
		||||
daemonStreamHandleRead(virNetServerClientPtr client,
 | 
			
		||||
                       daemonClientStream *stream);
 | 
			
		||||
static int
 | 
			
		||||
daemonStreamHandleFinish(virNetServerClientPtr client,
 | 
			
		||||
                         daemonClientStream *stream,
 | 
			
		||||
                         virNetMessagePtr msg);
 | 
			
		||||
static int
 | 
			
		||||
daemonStreamHandleAbort(virNetServerClientPtr client,
 | 
			
		||||
                        daemonClientStream *stream,
 | 
			
		||||
                        virNetMessagePtr msg);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
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)
 | 
			
		||||
        newEvents |= VIR_STREAM_EVENT_READABLE;
 | 
			
		||||
 | 
			
		||||
    virStreamEventUpdateCallback(stream->st, newEvents);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Invoked when an outgoing data packet message has been fully sent.
 | 
			
		||||
 * This simply re-enables TX of further data.
 | 
			
		||||
 *
 | 
			
		||||
 * The idea is to stop the daemon growing without bound due to
 | 
			
		||||
 * fast stream, but slow client
 | 
			
		||||
 */
 | 
			
		||||
static void
 | 
			
		||||
daemonStreamMessageFinished(virNetMessagePtr msg,
 | 
			
		||||
                            void *opaque)
 | 
			
		||||
{
 | 
			
		||||
    daemonClientStream *stream = opaque;
 | 
			
		||||
    VIR_DEBUG("stream=%p proc=%d serial=%u",
 | 
			
		||||
              stream, msg->header.proc, msg->header.serial);
 | 
			
		||||
 | 
			
		||||
    stream->tx = true;
 | 
			
		||||
    daemonStreamUpdateEvents(stream);
 | 
			
		||||
 | 
			
		||||
    daemonFreeClientStream(NULL, stream);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Callback that gets invoked when a stream becomes writable/readable
 | 
			
		||||
 */
 | 
			
		||||
static void
 | 
			
		||||
daemonStreamEvent(virStreamPtr st, int events, void *opaque)
 | 
			
		||||
{
 | 
			
		||||
    virNetServerClientPtr client = opaque;
 | 
			
		||||
    daemonClientStream *stream;
 | 
			
		||||
    daemonClientPrivatePtr priv = virNetServerClientGetPrivateData(client);
 | 
			
		||||
 | 
			
		||||
    virMutexLock(&priv->lock);
 | 
			
		||||
 | 
			
		||||
    stream = priv->streams;
 | 
			
		||||
    while (stream) {
 | 
			
		||||
        if (stream->st == st)
 | 
			
		||||
            break;
 | 
			
		||||
        stream = stream->next;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!stream) {
 | 
			
		||||
        VIR_WARN("event for client=%p stream st=%p, but missing stream state", client, st);
 | 
			
		||||
        virStreamEventRemoveCallback(st);
 | 
			
		||||
        goto cleanup;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    VIR_DEBUG("st=%p events=%d EOF=%d closed=%d", st, events, stream->recvEOF, stream->closed);
 | 
			
		||||
 | 
			
		||||
    if (!stream->closed &&
 | 
			
		||||
        (events & VIR_STREAM_EVENT_WRITABLE)) {
 | 
			
		||||
        if (daemonStreamHandleWrite(client, stream) < 0) {
 | 
			
		||||
            daemonRemoveClientStream(client, stream);
 | 
			
		||||
            virNetServerClientClose(client);
 | 
			
		||||
            goto cleanup;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!stream->closed && !stream->recvEOF &&
 | 
			
		||||
        (events & (VIR_STREAM_EVENT_READABLE))) {
 | 
			
		||||
        events = events & ~(VIR_STREAM_EVENT_READABLE);
 | 
			
		||||
        if (daemonStreamHandleRead(client, stream) < 0) {
 | 
			
		||||
            daemonRemoveClientStream(client, stream);
 | 
			
		||||
            virNetServerClientClose(client);
 | 
			
		||||
            goto cleanup;
 | 
			
		||||
        }
 | 
			
		||||
        /* If we detected EOF during read processing,
 | 
			
		||||
         * then clear hangup/error conditions, since
 | 
			
		||||
         * we want the client to see the EOF message
 | 
			
		||||
         * we just sent them
 | 
			
		||||
         */
 | 
			
		||||
        if (stream->recvEOF)
 | 
			
		||||
            events = events & ~(VIR_STREAM_EVENT_HANGUP |
 | 
			
		||||
                                VIR_STREAM_EVENT_ERROR);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* If we have a completion/abort message, always process it */
 | 
			
		||||
    if (stream->rx) {
 | 
			
		||||
        virNetMessagePtr msg = stream->rx;
 | 
			
		||||
        switch (msg->header.status) {
 | 
			
		||||
        case VIR_NET_CONTINUE:
 | 
			
		||||
            /* nada */
 | 
			
		||||
            break;
 | 
			
		||||
        case VIR_NET_OK:
 | 
			
		||||
            virNetMessageQueueServe(&stream->rx);
 | 
			
		||||
            if (daemonStreamHandleFinish(client, stream, msg) < 0) {
 | 
			
		||||
                virNetMessageFree(msg);
 | 
			
		||||
                daemonRemoveClientStream(client, stream);
 | 
			
		||||
                virNetServerClientClose(client);
 | 
			
		||||
                goto cleanup;
 | 
			
		||||
            }
 | 
			
		||||
            break;
 | 
			
		||||
        case VIR_NET_ERROR:
 | 
			
		||||
        default:
 | 
			
		||||
            virNetMessageQueueServe(&stream->rx);
 | 
			
		||||
            if (daemonStreamHandleAbort(client, stream, msg) < 0) {
 | 
			
		||||
                virNetMessageFree(msg);
 | 
			
		||||
                daemonRemoveClientStream(client, stream);
 | 
			
		||||
                virNetServerClientClose(client);
 | 
			
		||||
                goto cleanup;
 | 
			
		||||
            }
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    /* If we got HANGUP, we need to only send an empty
 | 
			
		||||
     * packet so the client sees an EOF and cleans up
 | 
			
		||||
     */
 | 
			
		||||
    if (!stream->closed && !stream->recvEOF &&
 | 
			
		||||
        (events & VIR_STREAM_EVENT_HANGUP)) {
 | 
			
		||||
        virNetMessagePtr msg;
 | 
			
		||||
        events &= ~(VIR_STREAM_EVENT_HANGUP);
 | 
			
		||||
        stream->tx = false;
 | 
			
		||||
        stream->recvEOF = true;
 | 
			
		||||
        if (!(msg = virNetMessageNew(false))) {
 | 
			
		||||
            daemonRemoveClientStream(client, stream);
 | 
			
		||||
            virNetServerClientClose(client);
 | 
			
		||||
            goto cleanup;
 | 
			
		||||
        }
 | 
			
		||||
        msg->cb = daemonStreamMessageFinished;
 | 
			
		||||
        msg->opaque = stream;
 | 
			
		||||
        stream->refs++;
 | 
			
		||||
        if (virNetServerProgramSendStreamData(remoteProgram,
 | 
			
		||||
                                              client,
 | 
			
		||||
                                              msg,
 | 
			
		||||
                                              stream->procedure,
 | 
			
		||||
                                              stream->serial,
 | 
			
		||||
                                              "", 0) < 0) {
 | 
			
		||||
            virNetMessageFree(msg);
 | 
			
		||||
            daemonRemoveClientStream(client, stream);
 | 
			
		||||
            virNetServerClientClose(client);
 | 
			
		||||
            goto cleanup;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!stream->closed &&
 | 
			
		||||
        (events & (VIR_STREAM_EVENT_ERROR | VIR_STREAM_EVENT_HANGUP))) {
 | 
			
		||||
        int ret;
 | 
			
		||||
        virNetMessagePtr msg;
 | 
			
		||||
        virNetMessageError rerr;
 | 
			
		||||
 | 
			
		||||
        memset(&rerr, 0, sizeof(rerr));
 | 
			
		||||
        stream->closed = true;
 | 
			
		||||
        virStreamEventRemoveCallback(stream->st);
 | 
			
		||||
        virStreamAbort(stream->st);
 | 
			
		||||
        if (events & VIR_STREAM_EVENT_HANGUP)
 | 
			
		||||
            virReportError(VIR_ERR_RPC,
 | 
			
		||||
                           "%s", _("stream had unexpected termination"));
 | 
			
		||||
        else
 | 
			
		||||
            virReportError(VIR_ERR_RPC,
 | 
			
		||||
                           "%s", _("stream had I/O failure"));
 | 
			
		||||
 | 
			
		||||
        msg = virNetMessageNew(false);
 | 
			
		||||
        if (!msg) {
 | 
			
		||||
            ret = -1;
 | 
			
		||||
        } else {
 | 
			
		||||
            ret = virNetServerProgramSendStreamError(remoteProgram,
 | 
			
		||||
                                                     client,
 | 
			
		||||
                                                     msg,
 | 
			
		||||
                                                     &rerr,
 | 
			
		||||
                                                     stream->procedure,
 | 
			
		||||
                                                     stream->serial);
 | 
			
		||||
        }
 | 
			
		||||
        daemonRemoveClientStream(client, stream);
 | 
			
		||||
        if (ret < 0)
 | 
			
		||||
            virNetServerClientClose(client);
 | 
			
		||||
        goto cleanup;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (stream->closed) {
 | 
			
		||||
        daemonRemoveClientStream(client, stream);
 | 
			
		||||
    } else {
 | 
			
		||||
        daemonStreamUpdateEvents(stream);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 cleanup:
 | 
			
		||||
    virMutexUnlock(&priv->lock);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * @client: a locked client object
 | 
			
		||||
 *
 | 
			
		||||
 * Invoked by the main loop when filtering incoming messages.
 | 
			
		||||
 *
 | 
			
		||||
 * Returns 1 if the message was processed, 0 if skipped,
 | 
			
		||||
 * -1 on fatal client error
 | 
			
		||||
 */
 | 
			
		||||
static int
 | 
			
		||||
daemonStreamFilter(virNetServerClientPtr client ATTRIBUTE_UNUSED,
 | 
			
		||||
                   virNetMessagePtr msg,
 | 
			
		||||
                   void *opaque)
 | 
			
		||||
{
 | 
			
		||||
    daemonClientStream *stream = opaque;
 | 
			
		||||
    int ret = 0;
 | 
			
		||||
 | 
			
		||||
    virMutexLock(&stream->priv->lock);
 | 
			
		||||
 | 
			
		||||
    if (msg->header.type != VIR_NET_STREAM)
 | 
			
		||||
        goto cleanup;
 | 
			
		||||
 | 
			
		||||
    if (!virNetServerProgramMatches(stream->prog, msg))
 | 
			
		||||
        goto cleanup;
 | 
			
		||||
 | 
			
		||||
    if (msg->header.proc != stream->procedure ||
 | 
			
		||||
        msg->header.serial != stream->serial)
 | 
			
		||||
        goto cleanup;
 | 
			
		||||
 | 
			
		||||
    VIR_DEBUG("Incoming client=%p, rx=%p, serial=%u, proc=%d, status=%d",
 | 
			
		||||
              client, stream->rx, msg->header.proc,
 | 
			
		||||
              msg->header.serial, msg->header.status);
 | 
			
		||||
 | 
			
		||||
    virNetMessageQueuePush(&stream->rx, msg);
 | 
			
		||||
    daemonStreamUpdateEvents(stream);
 | 
			
		||||
    ret = 1;
 | 
			
		||||
 | 
			
		||||
 cleanup:
 | 
			
		||||
    virMutexUnlock(&stream->priv->lock);
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * @conn: a connection object to associate the stream with
 | 
			
		||||
 * @header: the method call to associate with the stream
 | 
			
		||||
 *
 | 
			
		||||
 * Creates a new stream for this conn
 | 
			
		||||
 *
 | 
			
		||||
 * Returns a new stream object, or NULL upon OOM
 | 
			
		||||
 */
 | 
			
		||||
daemonClientStream *
 | 
			
		||||
daemonCreateClientStream(virNetServerClientPtr client,
 | 
			
		||||
                         virStreamPtr st,
 | 
			
		||||
                         virNetServerProgramPtr prog,
 | 
			
		||||
                         virNetMessageHeaderPtr header)
 | 
			
		||||
{
 | 
			
		||||
    daemonClientStream *stream;
 | 
			
		||||
    daemonClientPrivatePtr priv = virNetServerClientGetPrivateData(client);
 | 
			
		||||
 | 
			
		||||
    VIR_DEBUG("client=%p, proc=%d, serial=%u, st=%p",
 | 
			
		||||
              client, header->proc, header->serial, st);
 | 
			
		||||
 | 
			
		||||
    if (VIR_ALLOC(stream) < 0)
 | 
			
		||||
        return NULL;
 | 
			
		||||
 | 
			
		||||
    stream->refs = 1;
 | 
			
		||||
    stream->priv = priv;
 | 
			
		||||
    stream->prog = virObjectRef(prog);
 | 
			
		||||
    stream->procedure = header->proc;
 | 
			
		||||
    stream->serial = header->serial;
 | 
			
		||||
    stream->filterID = -1;
 | 
			
		||||
    stream->st = st;
 | 
			
		||||
 | 
			
		||||
    return stream;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * @stream: an unused client stream
 | 
			
		||||
 *
 | 
			
		||||
 * Frees the memory associated with this inactive client
 | 
			
		||||
 * stream
 | 
			
		||||
 */
 | 
			
		||||
int daemonFreeClientStream(virNetServerClientPtr client,
 | 
			
		||||
                           daemonClientStream *stream)
 | 
			
		||||
{
 | 
			
		||||
    virNetMessagePtr msg;
 | 
			
		||||
    int ret = 0;
 | 
			
		||||
 | 
			
		||||
    if (!stream)
 | 
			
		||||
        return 0;
 | 
			
		||||
 | 
			
		||||
    stream->refs--;
 | 
			
		||||
    if (stream->refs)
 | 
			
		||||
        return 0;
 | 
			
		||||
 | 
			
		||||
    VIR_DEBUG("client=%p, proc=%d, serial=%u",
 | 
			
		||||
              client, stream->procedure, stream->serial);
 | 
			
		||||
 | 
			
		||||
    virObjectUnref(stream->prog);
 | 
			
		||||
 | 
			
		||||
    msg = stream->rx;
 | 
			
		||||
    while (msg) {
 | 
			
		||||
        virNetMessagePtr tmp = msg->next;
 | 
			
		||||
        if (client) {
 | 
			
		||||
            /* Send a dummy reply to free up 'msg' & unblock client rx */
 | 
			
		||||
            virNetMessageClear(msg);
 | 
			
		||||
            msg->header.type = VIR_NET_REPLY;
 | 
			
		||||
            if (virNetServerClientSendMessage(client, msg) < 0) {
 | 
			
		||||
                virNetServerClientImmediateClose(client);
 | 
			
		||||
                virNetMessageFree(msg);
 | 
			
		||||
                ret = -1;
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            virNetMessageFree(msg);
 | 
			
		||||
        }
 | 
			
		||||
        msg = tmp;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    virObjectUnref(stream->st);
 | 
			
		||||
    VIR_FREE(stream);
 | 
			
		||||
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * @client: a locked client to add the stream to
 | 
			
		||||
 * @stream: a stream to add
 | 
			
		||||
 */
 | 
			
		||||
int daemonAddClientStream(virNetServerClientPtr client,
 | 
			
		||||
                          daemonClientStream *stream,
 | 
			
		||||
                          bool transmit)
 | 
			
		||||
{
 | 
			
		||||
    VIR_DEBUG("client=%p, proc=%d, serial=%u, st=%p, transmit=%d",
 | 
			
		||||
              client, stream->procedure, stream->serial, stream->st, transmit);
 | 
			
		||||
    daemonClientPrivatePtr priv = virNetServerClientGetPrivateData(client);
 | 
			
		||||
 | 
			
		||||
    if (stream->filterID != -1) {
 | 
			
		||||
        VIR_WARN("Filter already added to client %p", client);
 | 
			
		||||
        return -1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (virStreamEventAddCallback(stream->st, 0,
 | 
			
		||||
                                  daemonStreamEvent, client,
 | 
			
		||||
                                  virObjectFreeCallback) < 0)
 | 
			
		||||
        return -1;
 | 
			
		||||
 | 
			
		||||
    virObjectRef(client);
 | 
			
		||||
 | 
			
		||||
    if ((stream->filterID = virNetServerClientAddFilter(client,
 | 
			
		||||
                                                        daemonStreamFilter,
 | 
			
		||||
                                                        stream)) < 0) {
 | 
			
		||||
        virStreamEventRemoveCallback(stream->st);
 | 
			
		||||
        return -1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (transmit)
 | 
			
		||||
        stream->tx = true;
 | 
			
		||||
 | 
			
		||||
    virMutexLock(&priv->lock);
 | 
			
		||||
    stream->next = priv->streams;
 | 
			
		||||
    priv->streams = stream;
 | 
			
		||||
 | 
			
		||||
    daemonStreamUpdateEvents(stream);
 | 
			
		||||
 | 
			
		||||
    virMutexUnlock(&priv->lock);
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * @client: a locked client object
 | 
			
		||||
 * @stream: an inactive, closed stream object
 | 
			
		||||
 *
 | 
			
		||||
 * Removes a stream from the list of active streams for the client
 | 
			
		||||
 *
 | 
			
		||||
 * Returns 0 if the stream was removd, -1 if it doesn't exist
 | 
			
		||||
 */
 | 
			
		||||
int
 | 
			
		||||
daemonRemoveClientStream(virNetServerClientPtr client,
 | 
			
		||||
                         daemonClientStream *stream)
 | 
			
		||||
{
 | 
			
		||||
    VIR_DEBUG("client=%p, proc=%d, serial=%u, st=%p",
 | 
			
		||||
              client, stream->procedure, stream->serial, stream->st);
 | 
			
		||||
    daemonClientPrivatePtr priv = virNetServerClientGetPrivateData(client);
 | 
			
		||||
    daemonClientStream *curr = priv->streams;
 | 
			
		||||
    daemonClientStream *prev = NULL;
 | 
			
		||||
 | 
			
		||||
    if (stream->filterID != -1) {
 | 
			
		||||
        virNetServerClientRemoveFilter(client,
 | 
			
		||||
                                       stream->filterID);
 | 
			
		||||
        stream->filterID = -1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!stream->closed) {
 | 
			
		||||
        stream->closed = true;
 | 
			
		||||
        virStreamEventRemoveCallback(stream->st);
 | 
			
		||||
        virStreamAbort(stream->st);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    while (curr) {
 | 
			
		||||
        if (curr == stream) {
 | 
			
		||||
            if (prev)
 | 
			
		||||
                prev->next = curr->next;
 | 
			
		||||
            else
 | 
			
		||||
                priv->streams = curr->next;
 | 
			
		||||
            return daemonFreeClientStream(client, stream);
 | 
			
		||||
        }
 | 
			
		||||
        prev = curr;
 | 
			
		||||
        curr = curr->next;
 | 
			
		||||
    }
 | 
			
		||||
    return -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
daemonRemoveAllClientStreams(daemonClientStream *stream)
 | 
			
		||||
{
 | 
			
		||||
    daemonClientStream *tmp;
 | 
			
		||||
 | 
			
		||||
    VIR_DEBUG("stream=%p", stream);
 | 
			
		||||
 | 
			
		||||
    while (stream) {
 | 
			
		||||
        tmp = stream->next;
 | 
			
		||||
 | 
			
		||||
        if (!stream->closed) {
 | 
			
		||||
            stream->closed = true;
 | 
			
		||||
            virStreamEventRemoveCallback(stream->st);
 | 
			
		||||
            virStreamAbort(stream->st);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        daemonFreeClientStream(NULL, stream);
 | 
			
		||||
 | 
			
		||||
        VIR_DEBUG("next stream=%p", tmp);
 | 
			
		||||
        stream = tmp;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Returns:
 | 
			
		||||
 *   -1  if fatal error occurred
 | 
			
		||||
 *    0  if message was fully processed
 | 
			
		||||
 *    1  if message is still being processed
 | 
			
		||||
 */
 | 
			
		||||
static int
 | 
			
		||||
daemonStreamHandleWriteData(virNetServerClientPtr client,
 | 
			
		||||
                            daemonClientStream *stream,
 | 
			
		||||
                            virNetMessagePtr msg)
 | 
			
		||||
{
 | 
			
		||||
    int ret;
 | 
			
		||||
 | 
			
		||||
    VIR_DEBUG("client=%p, stream=%p, proc=%d, serial=%u, len=%zu, offset=%zu",
 | 
			
		||||
              client, stream, msg->header.proc, msg->header.serial,
 | 
			
		||||
              msg->bufferLength, msg->bufferOffset);
 | 
			
		||||
 | 
			
		||||
    ret = virStreamSend(stream->st,
 | 
			
		||||
                        msg->buffer + msg->bufferOffset,
 | 
			
		||||
                        msg->bufferLength - msg->bufferOffset);
 | 
			
		||||
 | 
			
		||||
    if (ret > 0) {
 | 
			
		||||
        msg->bufferOffset += ret;
 | 
			
		||||
 | 
			
		||||
        /* Partial write, so indicate we have more todo later */
 | 
			
		||||
        if (msg->bufferOffset < msg->bufferLength)
 | 
			
		||||
            return 1;
 | 
			
		||||
    } else if (ret == -2) {
 | 
			
		||||
        /* Blocking, so indicate we have more todo later */
 | 
			
		||||
        return 1;
 | 
			
		||||
    } else {
 | 
			
		||||
        virNetMessageError rerr;
 | 
			
		||||
 | 
			
		||||
        memset(&rerr, 0, sizeof(rerr));
 | 
			
		||||
 | 
			
		||||
        VIR_INFO("Stream send failed");
 | 
			
		||||
        stream->closed = true;
 | 
			
		||||
        virStreamEventRemoveCallback(stream->st);
 | 
			
		||||
        virStreamAbort(stream->st);
 | 
			
		||||
 | 
			
		||||
        return virNetServerProgramSendReplyError(stream->prog,
 | 
			
		||||
                                                 client,
 | 
			
		||||
                                                 msg,
 | 
			
		||||
                                                 &rerr,
 | 
			
		||||
                                                 &msg->header);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Process a finish handshake from the client.
 | 
			
		||||
 *
 | 
			
		||||
 * Returns a VIR_NET_OK confirmation if successful, or a VIR_NET_ERROR
 | 
			
		||||
 * if there was a stream error
 | 
			
		||||
 *
 | 
			
		||||
 * Returns 0 if successfully sent RPC reply, -1 upon fatal error
 | 
			
		||||
 */
 | 
			
		||||
static int
 | 
			
		||||
daemonStreamHandleFinish(virNetServerClientPtr client,
 | 
			
		||||
                         daemonClientStream *stream,
 | 
			
		||||
                         virNetMessagePtr msg)
 | 
			
		||||
{
 | 
			
		||||
    int ret;
 | 
			
		||||
 | 
			
		||||
    VIR_DEBUG("client=%p, stream=%p, proc=%d, serial=%u",
 | 
			
		||||
              client, stream, msg->header.proc, msg->header.serial);
 | 
			
		||||
 | 
			
		||||
    stream->closed = true;
 | 
			
		||||
    virStreamEventRemoveCallback(stream->st);
 | 
			
		||||
    ret = virStreamFinish(stream->st);
 | 
			
		||||
 | 
			
		||||
    if (ret < 0) {
 | 
			
		||||
        virNetMessageError rerr;
 | 
			
		||||
        memset(&rerr, 0, sizeof(rerr));
 | 
			
		||||
        return virNetServerProgramSendReplyError(stream->prog,
 | 
			
		||||
                                                 client,
 | 
			
		||||
                                                 msg,
 | 
			
		||||
                                                 &rerr,
 | 
			
		||||
                                                 &msg->header);
 | 
			
		||||
    } else {
 | 
			
		||||
        /* Send zero-length confirm */
 | 
			
		||||
        return virNetServerProgramSendStreamData(stream->prog,
 | 
			
		||||
                                                 client,
 | 
			
		||||
                                                 msg,
 | 
			
		||||
                                                 stream->procedure,
 | 
			
		||||
                                                 stream->serial,
 | 
			
		||||
                                                 NULL, 0);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Process an abort request from the client.
 | 
			
		||||
 *
 | 
			
		||||
 * Returns 0 if successfully aborted, -1 upon error
 | 
			
		||||
 */
 | 
			
		||||
static int
 | 
			
		||||
daemonStreamHandleAbort(virNetServerClientPtr client,
 | 
			
		||||
                        daemonClientStream *stream,
 | 
			
		||||
                        virNetMessagePtr msg)
 | 
			
		||||
{
 | 
			
		||||
    VIR_DEBUG("client=%p, stream=%p, proc=%d, serial=%u",
 | 
			
		||||
              client, stream, msg->header.proc, msg->header.serial);
 | 
			
		||||
    int ret;
 | 
			
		||||
    bool raise_error = false;
 | 
			
		||||
 | 
			
		||||
    stream->closed = true;
 | 
			
		||||
    virStreamEventRemoveCallback(stream->st);
 | 
			
		||||
    ret = virStreamAbort(stream->st);
 | 
			
		||||
 | 
			
		||||
    if (msg->header.status == VIR_NET_ERROR) {
 | 
			
		||||
        VIR_INFO("stream aborted at client request");
 | 
			
		||||
        raise_error = (ret < 0);
 | 
			
		||||
    } else {
 | 
			
		||||
        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);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Called when the stream is signalled has being able to accept
 | 
			
		||||
 * data writes. Will process all pending incoming messages
 | 
			
		||||
 * until they're all gone, or I/O blocks
 | 
			
		||||
 *
 | 
			
		||||
 * Returns 0 on success, or -1 upon fatal error
 | 
			
		||||
 */
 | 
			
		||||
static int
 | 
			
		||||
daemonStreamHandleWrite(virNetServerClientPtr client,
 | 
			
		||||
                        daemonClientStream *stream)
 | 
			
		||||
{
 | 
			
		||||
    VIR_DEBUG("client=%p, stream=%p", client, stream);
 | 
			
		||||
 | 
			
		||||
    while (stream->rx && !stream->closed) {
 | 
			
		||||
        virNetMessagePtr msg = stream->rx;
 | 
			
		||||
        int ret;
 | 
			
		||||
 | 
			
		||||
        switch (msg->header.status) {
 | 
			
		||||
        case VIR_NET_OK:
 | 
			
		||||
            ret = daemonStreamHandleFinish(client, stream, msg);
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
        case VIR_NET_CONTINUE:
 | 
			
		||||
            ret = daemonStreamHandleWriteData(client, stream, msg);
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
        case VIR_NET_ERROR:
 | 
			
		||||
        default:
 | 
			
		||||
            ret = daemonStreamHandleAbort(client, stream, msg);
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (ret > 0)
 | 
			
		||||
            break;  /* still processing data from msg */
 | 
			
		||||
 | 
			
		||||
        virNetMessageQueueServe(&stream->rx);
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
            virNetMessageFree(msg);
 | 
			
		||||
            virNetServerClientImmediateClose(client);
 | 
			
		||||
            return -1;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /* 'CONTINUE' messages don't send a reply (unless error
 | 
			
		||||
         * occurred), so to release the 'msg' object we need to
 | 
			
		||||
         * send a fake zero-length reply. Nothing actually gets
 | 
			
		||||
         * onto the wire, but this causes the client to reset
 | 
			
		||||
         * its active request count / throttling
 | 
			
		||||
         */
 | 
			
		||||
        if (msg->header.status == VIR_NET_CONTINUE) {
 | 
			
		||||
            virNetMessageClear(msg);
 | 
			
		||||
            msg->header.type = VIR_NET_REPLY;
 | 
			
		||||
            if (virNetServerClientSendMessage(client, msg) < 0) {
 | 
			
		||||
                virNetMessageFree(msg);
 | 
			
		||||
                virNetServerClientImmediateClose(client);
 | 
			
		||||
                return -1;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Invoked when a stream is signalled as having data
 | 
			
		||||
 * available to read. This reads up to one message
 | 
			
		||||
 * worth of data, and then queues that for transmission
 | 
			
		||||
 * to the client.
 | 
			
		||||
 *
 | 
			
		||||
 * Returns 0 if data was queued for TX, or a error RPC
 | 
			
		||||
 * was sent, or -1 on fatal error, indicating client should
 | 
			
		||||
 * be killed
 | 
			
		||||
 */
 | 
			
		||||
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;
 | 
			
		||||
 | 
			
		||||
    VIR_DEBUG("client=%p, stream=%p tx=%d closed=%d",
 | 
			
		||||
              client, stream, stream->tx, stream->closed);
 | 
			
		||||
 | 
			
		||||
    /* We might have had an event pending before we shut
 | 
			
		||||
     * down the stream, so if we're marked as closed,
 | 
			
		||||
     * then do nothing
 | 
			
		||||
     */
 | 
			
		||||
    if (stream->closed)
 | 
			
		||||
        return 0;
 | 
			
		||||
 | 
			
		||||
    /* Shouldn't ever be called unless we're marked able to
 | 
			
		||||
     * transmit, but doesn't hurt to check */
 | 
			
		||||
    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) {
 | 
			
		||||
        /* 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;
 | 
			
		||||
 | 
			
		||||
        msg->cb = daemonStreamMessageFinished;
 | 
			
		||||
        msg->opaque = stream;
 | 
			
		||||
        stream->refs++;
 | 
			
		||||
        if (virNetServerProgramSendStreamData(remoteProgram,
 | 
			
		||||
                                              client,
 | 
			
		||||
                                              msg,
 | 
			
		||||
                                              stream->procedure,
 | 
			
		||||
                                              stream->serial,
 | 
			
		||||
                                              buffer, rv) < 0)
 | 
			
		||||
            goto cleanup;
 | 
			
		||||
        msg = NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ret = 0;
 | 
			
		||||
 cleanup:
 | 
			
		||||
    VIR_FREE(buffer);
 | 
			
		||||
    virNetMessageFree(msg);
 | 
			
		||||
    return ret;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										49
									
								
								daemon/stream.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								daemon/stream.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,49 @@
 | 
			
		||||
/*
 | 
			
		||||
 * stream.h: APIs for managing client streams
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2009 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: Daniel P. Berrange <berrange@redhat.com>
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifndef __LIBVIRTD_STREAM_H__
 | 
			
		||||
# define __LIBVIRTD_STREAM_H__
 | 
			
		||||
 | 
			
		||||
# include "libvirtd.h"
 | 
			
		||||
 | 
			
		||||
daemonClientStream *
 | 
			
		||||
daemonCreateClientStream(virNetServerClientPtr client,
 | 
			
		||||
                         virStreamPtr st,
 | 
			
		||||
                         virNetServerProgramPtr prog,
 | 
			
		||||
                         virNetMessageHeaderPtr hdr);
 | 
			
		||||
 | 
			
		||||
int daemonFreeClientStream(virNetServerClientPtr client,
 | 
			
		||||
                           daemonClientStream *stream);
 | 
			
		||||
 | 
			
		||||
int daemonAddClientStream(virNetServerClientPtr client,
 | 
			
		||||
                          daemonClientStream *stream,
 | 
			
		||||
                          bool transmit);
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
daemonRemoveClientStream(virNetServerClientPtr client,
 | 
			
		||||
                         daemonClientStream *stream);
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
daemonRemoveAllClientStreams(daemonClientStream *stream);
 | 
			
		||||
 | 
			
		||||
#endif /* __LIBVIRTD_STREAM_H__ */
 | 
			
		||||
@@ -42,6 +42,7 @@ module Test_libvirtd =
 | 
			
		||||
        { "min_workers" = "5" }
 | 
			
		||||
        { "max_workers" = "20" }
 | 
			
		||||
        { "prio_workers" = "5" }
 | 
			
		||||
        { "max_requests" = "20" }
 | 
			
		||||
        { "max_client_requests" = "5" }
 | 
			
		||||
        { "admin_min_workers" = "1" }
 | 
			
		||||
        { "admin_max_workers" = "5" }
 | 
			
		||||
@@ -62,4 +63,3 @@ module Test_libvirtd =
 | 
			
		||||
        { "admin_keepalive_required" = "1" }
 | 
			
		||||
        { "admin_keepalive_interval" = "5" }
 | 
			
		||||
        { "admin_keepalive_count" = "5" }
 | 
			
		||||
        { "ovs_timeout" = "5" }
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<!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>404 page not found</h1>
 | 
			
		||||
@@ -9,11 +9,16 @@
 | 
			
		||||
      page you were looking for. You might want to try
 | 
			
		||||
    </p>
 | 
			
		||||
    <ul>
 | 
			
		||||
      <li>going back to the <a href="https://libvirt.org/">home page</a> to find
 | 
			
		||||
      <li>going back to the <a href="http://libvirt.org/">home page</a> to find
 | 
			
		||||
        a collection of links to interesting pages on this site</li>
 | 
			
		||||
      <li>using the search box at the top right corner of the screen to
 | 
			
		||||
        locate the content on this site or mailing list archives</li>
 | 
			
		||||
    </ul>
 | 
			
		||||
 | 
			
		||||
    <p class="image">
 | 
			
		||||
      <img src="/libvirtLogo404.png" alt="libvirt Logo"/>
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  </body>
 | 
			
		||||
</html>
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										265
									
								
								docs/Makefile.am
									
									
									
									
									
								
							
							
						
						
									
										265
									
								
								docs/Makefile.am
									
									
									
									
									
								
							@@ -16,93 +16,70 @@
 | 
			
		||||
## License along with this library.  If not, see
 | 
			
		||||
## <http://www.gnu.org/licenses/>.
 | 
			
		||||
 | 
			
		||||
PERL = perl
 | 
			
		||||
 | 
			
		||||
# The directory containing the source code (if it contains documentation).
 | 
			
		||||
DOC_SOURCE_DIR=../src
 | 
			
		||||
 | 
			
		||||
DEVHELP_DIR=$(datadir)/gtk-doc/html/libvirt
 | 
			
		||||
 | 
			
		||||
apihtml = \
 | 
			
		||||
  html/index.html \
 | 
			
		||||
apihtml =					\
 | 
			
		||||
  html/index.html				\
 | 
			
		||||
  $(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 \
 | 
			
		||||
  html/libvirt-libvirt-host.html \
 | 
			
		||||
  html/libvirt-libvirt-interface.html \
 | 
			
		||||
  html/libvirt-libvirt-network.html \
 | 
			
		||||
  html/libvirt-libvirt-nodedev.html \
 | 
			
		||||
  html/libvirt-libvirt-nwfilter.html \
 | 
			
		||||
  html/libvirt-libvirt-secret.html \
 | 
			
		||||
  html/libvirt-libvirt-storage.html \
 | 
			
		||||
  html/libvirt-libvirt-stream.html \
 | 
			
		||||
  html/libvirt-libvirt-common.html		\
 | 
			
		||||
  html/libvirt-libvirt-domain.html		\
 | 
			
		||||
  html/libvirt-libvirt-domain-snapshot.html	\
 | 
			
		||||
  html/libvirt-libvirt-event.html		\
 | 
			
		||||
  html/libvirt-libvirt-host.html		\
 | 
			
		||||
  html/libvirt-libvirt-interface.html		\
 | 
			
		||||
  html/libvirt-libvirt-network.html		\
 | 
			
		||||
  html/libvirt-libvirt-nodedev.html		\
 | 
			
		||||
  html/libvirt-libvirt-nwfilter.html		\
 | 
			
		||||
  html/libvirt-libvirt-secret.html		\
 | 
			
		||||
  html/libvirt-libvirt-storage.html		\
 | 
			
		||||
  html/libvirt-libvirt-stream.html		\
 | 
			
		||||
  html/libvirt-virterror.html
 | 
			
		||||
 | 
			
		||||
apipng = \
 | 
			
		||||
  html/left.png \
 | 
			
		||||
  html/up.png \
 | 
			
		||||
  html/home.png \
 | 
			
		||||
apipng =	\
 | 
			
		||||
  html/left.png	\
 | 
			
		||||
  html/up.png	\
 | 
			
		||||
  html/home.png	\
 | 
			
		||||
  html/right.png
 | 
			
		||||
 | 
			
		||||
devhelphtml = \
 | 
			
		||||
  devhelp/libvirt.devhelp \
 | 
			
		||||
  devhelp/index.html \
 | 
			
		||||
  devhelp/general.html \
 | 
			
		||||
devhelphtml =			\
 | 
			
		||||
  devhelp/libvirt.devhelp	\
 | 
			
		||||
  devhelp/index.html		\
 | 
			
		||||
  devhelp/general.html		\
 | 
			
		||||
  devhelp/libvirt-virterror.html
 | 
			
		||||
 | 
			
		||||
css = \
 | 
			
		||||
css =         \
 | 
			
		||||
  generic.css \
 | 
			
		||||
  libvirt.css \
 | 
			
		||||
  mobile.css \
 | 
			
		||||
  main.css
 | 
			
		||||
 | 
			
		||||
fonts = \
 | 
			
		||||
  fonts/LICENSE.md \
 | 
			
		||||
  fonts/stylesheet.css \
 | 
			
		||||
  fonts/overpass-bold-italic.woff \
 | 
			
		||||
  fonts/overpass-bold.woff \
 | 
			
		||||
  fonts/overpass-italic.woff \
 | 
			
		||||
  fonts/overpass-light-italic.woff \
 | 
			
		||||
  fonts/overpass-light.woff \
 | 
			
		||||
  fonts/overpass-mono-bold.woff \
 | 
			
		||||
  fonts/overpass-mono-light.woff \
 | 
			
		||||
  fonts/overpass-mono-regular.woff \
 | 
			
		||||
  fonts/overpass-mono-semibold.woff \
 | 
			
		||||
  fonts/overpass-regular.woff
 | 
			
		||||
 | 
			
		||||
devhelppng = \
 | 
			
		||||
  devhelp/home.png \
 | 
			
		||||
  devhelp/left.png \
 | 
			
		||||
  devhelp/right.png \
 | 
			
		||||
devhelppng =		\
 | 
			
		||||
  devhelp/home.png	\
 | 
			
		||||
  devhelp/left.png	\
 | 
			
		||||
  devhelp/right.png	\
 | 
			
		||||
  devhelp/up.png
 | 
			
		||||
 | 
			
		||||
devhelpcss = devhelp/style.css
 | 
			
		||||
 | 
			
		||||
devhelpxsl = devhelp/devhelp.xsl devhelp/html.xsl
 | 
			
		||||
 | 
			
		||||
logofiles = \
 | 
			
		||||
  logos/logo-base.svg \
 | 
			
		||||
  logos/logo-square.svg \
 | 
			
		||||
  logos/logo-square-powered.svg \
 | 
			
		||||
  logos/logo-banner-dark.svg \
 | 
			
		||||
  logos/logo-banner-light.svg \
 | 
			
		||||
  logos/logo-square-96.png \
 | 
			
		||||
  logos/logo-square-128.png \
 | 
			
		||||
  logos/logo-square-192.png \
 | 
			
		||||
  logos/logo-square-256.png \
 | 
			
		||||
  logos/logo-square-powered-96.png \
 | 
			
		||||
  logos/logo-square-powered-128.png \
 | 
			
		||||
  logos/logo-square-powered-192.png \
 | 
			
		||||
  logos/logo-square-powered-256.png \
 | 
			
		||||
  logos/logo-banner-dark-256.png \
 | 
			
		||||
  logos/logo-banner-dark-800.png \
 | 
			
		||||
  logos/logo-banner-light-256.png \
 | 
			
		||||
  logos/logo-banner-light-800.png
 | 
			
		||||
 | 
			
		||||
png = \
 | 
			
		||||
  32favicon.png \
 | 
			
		||||
  libvirt-header-bg.png \
 | 
			
		||||
  libvirt-header-logo.png \
 | 
			
		||||
  libvirtLogo.png \
 | 
			
		||||
  libvirt-net-logical.png \
 | 
			
		||||
  libvirt-net-physical.png \
 | 
			
		||||
  libvirt-daemon-arch.png \
 | 
			
		||||
  libvirt-driver-arch.png \
 | 
			
		||||
  libvirt-object-model.png \
 | 
			
		||||
  madeWith.png \
 | 
			
		||||
  migration-managed-direct.png \
 | 
			
		||||
  migration-managed-p2p.png \
 | 
			
		||||
  migration-native.png \
 | 
			
		||||
@@ -118,14 +95,15 @@ internals_html_in = \
 | 
			
		||||
  $(patsubst $(srcdir)/%,%,$(wildcard $(srcdir)/internals/*.html.in))
 | 
			
		||||
internals_html = $(internals_html_in:%.html.in=%.html)
 | 
			
		||||
 | 
			
		||||
# Since we ship pre-built html in the tarball, we must also
 | 
			
		||||
# ship the sources, even when those sources are themselves
 | 
			
		||||
# generated.
 | 
			
		||||
# Generate hvsupport.html and news.html first, since they take one extra step.
 | 
			
		||||
dot_html_in = \
 | 
			
		||||
  hvsupport.html.in \
 | 
			
		||||
  news.html.in \
 | 
			
		||||
  $(notdir $(wildcard $(srcdir)/*.html.in))
 | 
			
		||||
# todo.html is special - it is shipped in the tarball, but we
 | 
			
		||||
# have a dedicated 'todo' target to rebuild it from a proper
 | 
			
		||||
# config file, all other users are able to build it locally.
 | 
			
		||||
# For all other files, since we ship pre-built html in the
 | 
			
		||||
# tarball, we must also ship the sources, even when those
 | 
			
		||||
# sources are themselves generated.
 | 
			
		||||
dot_html_in = $(notdir $(wildcard $(srcdir)/*.html.in)) \
 | 
			
		||||
  todo.html.in \
 | 
			
		||||
  hvsupport.html.in
 | 
			
		||||
dot_html = $(dot_html_in:%.html.in=%.html)
 | 
			
		||||
 | 
			
		||||
dot_php_in = $(notdir $(wildcard $(srcdir)/*.php.in))
 | 
			
		||||
@@ -158,6 +136,8 @@ api_DATA = \
 | 
			
		||||
       libvirt-admin-api.xml
 | 
			
		||||
 | 
			
		||||
fig = \
 | 
			
		||||
  libvirt-net-logical.fig \
 | 
			
		||||
  libvirt-net-physical.fig \
 | 
			
		||||
  libvirt-daemon-arch.fig \
 | 
			
		||||
  libvirt-driver-arch.fig \
 | 
			
		||||
  libvirt-object-model.fig \
 | 
			
		||||
@@ -170,17 +150,17 @@ fig = \
 | 
			
		||||
schemadir = $(pkgdatadir)/schemas
 | 
			
		||||
schema_DATA = $(wildcard $(srcdir)/schemas/*.rng)
 | 
			
		||||
 | 
			
		||||
EXTRA_DIST= \
 | 
			
		||||
EXTRA_DIST=					\
 | 
			
		||||
  apibuild.py genaclperms.pl \
 | 
			
		||||
  site.xsl subsite.xsl newapi.xsl page.xsl \
 | 
			
		||||
  wrapstring.xsl \
 | 
			
		||||
  site.xsl newapi.xsl news.xsl page.xsl \
 | 
			
		||||
  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) \
 | 
			
		||||
  $(logofiles) $(patches) $(dot_php_in) $(dot_php_code_in) $(dot_php)\
 | 
			
		||||
  $(internals_html_in) $(internals_html) $(fonts) \
 | 
			
		||||
  aclperms.htmlinc \
 | 
			
		||||
  hvsupport.pl \
 | 
			
		||||
  $(patches) $(dot_php_in) $(dot_php_code_in) $(dot_php)\
 | 
			
		||||
  $(internals_html_in) $(internals_html) \
 | 
			
		||||
  sitemap.html.in aclperms.htmlinc \
 | 
			
		||||
  todo.pl hvsupport.pl todo.cfg-example \
 | 
			
		||||
  $(schema_DATA)
 | 
			
		||||
 | 
			
		||||
acl_generated = aclperms.htmlinc
 | 
			
		||||
@@ -197,13 +177,6 @@ MAINTAINERCLEANFILES = \
 | 
			
		||||
  $(addprefix $(srcdir)/,$(dot_php)) \
 | 
			
		||||
  $(srcdir)/hvsupport.html.in $(srcdir)/aclperms.htmlinc
 | 
			
		||||
 | 
			
		||||
timestamp="$(shell if test -n "$$SOURCE_DATE_EPOCH"; \
 | 
			
		||||
		   then \
 | 
			
		||||
		     date -u --date="@$$SOURCE_DATE_EPOCH"; \
 | 
			
		||||
		   else \
 | 
			
		||||
		     date -u; \
 | 
			
		||||
		   fi)"
 | 
			
		||||
 | 
			
		||||
all-am: web
 | 
			
		||||
 | 
			
		||||
api: $(srcdir)/libvirt-api.xml $(srcdir)/libvirt-refs.xml
 | 
			
		||||
@@ -214,6 +187,24 @@ admin_api: $(srcdir)/libvirt-admin-api.xml $(srcdir)/libvirt-admin-refs.xml
 | 
			
		||||
web: $(dot_html) $(internals_html) html/index.html devhelp/index.html \
 | 
			
		||||
  $(dot_php)
 | 
			
		||||
 | 
			
		||||
todo.html.in: todo.pl
 | 
			
		||||
	if [ -f  todo.cfg ]; then \
 | 
			
		||||
		echo "Generating $@"; \
 | 
			
		||||
		$(PERL) $< > $@ \
 | 
			
		||||
		|| { rm $@ && exit 1; }; \
 | 
			
		||||
	else \
 | 
			
		||||
		echo "Stubbing $@"; \
 | 
			
		||||
		printf "%s\n" \
 | 
			
		||||
		  "<html xmlns=\"http://www.w3.org/1999/xhtml\">" \
 | 
			
		||||
		  "<body>" \
 | 
			
		||||
		  "<h1>Todo list unavailable: no config file</h1>" \
 | 
			
		||||
		  "</body></html>" > $@ ; \
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
todo:
 | 
			
		||||
	rm -f todo.html.in
 | 
			
		||||
	$(MAKE) todo.html
 | 
			
		||||
 | 
			
		||||
hvsupport.html: $(srcdir)/hvsupport.html.in
 | 
			
		||||
 | 
			
		||||
$(srcdir)/hvsupport.html.in: $(srcdir)/hvsupport.pl $(api_DATA) \
 | 
			
		||||
@@ -223,33 +214,16 @@ $(srcdir)/hvsupport.html.in: $(srcdir)/hvsupport.pl $(api_DATA) \
 | 
			
		||||
	$(AM_V_GEN)$(PERL) $(srcdir)/hvsupport.pl $(top_srcdir)/src > $@ \
 | 
			
		||||
		|| { rm $@ && exit 1; }
 | 
			
		||||
 | 
			
		||||
# xsltproc seems to add the xmlns="" attribute to random output elements:
 | 
			
		||||
# use sed to strip it out, as leaving it there triggers XML errors during
 | 
			
		||||
# further transformation steps
 | 
			
		||||
news.html.in: \
 | 
			
		||||
	  $(srcdir)/news.xml \
 | 
			
		||||
	  $(srcdir)/news-html.xsl
 | 
			
		||||
	$(AM_V_GEN)$(XSLTPROC) --nonet \
 | 
			
		||||
	    $(srcdir)/news-html.xsl \
 | 
			
		||||
	    $(srcdir)/news.xml \
 | 
			
		||||
	  >$@-tmp \
 | 
			
		||||
	    || { rm -f $@-tmp; exit 1; }; \
 | 
			
		||||
	  sed 's/ xmlns=""//g' $@-tmp >$@ \
 | 
			
		||||
	    || { rm -f $@-tmp; exit 1; }; \
 | 
			
		||||
	  rm -f $@-tmp
 | 
			
		||||
EXTRA_DIST += \
 | 
			
		||||
	$(srcdir)/news.xml \
 | 
			
		||||
	$(srcdir)/news.rng \
 | 
			
		||||
	$(srcdir)/news-html.xsl
 | 
			
		||||
MAINTAINERCLEANFILES += \
 | 
			
		||||
	$(srcdir)/news.html.in
 | 
			
		||||
.PHONY: todo
 | 
			
		||||
 | 
			
		||||
%.png: %.fig
 | 
			
		||||
	convert -rotate 90 $< $@
 | 
			
		||||
 | 
			
		||||
%.html.tmp: %.html.in site.xsl subsite.xsl page.xsl \
 | 
			
		||||
		$(acl_generated)
 | 
			
		||||
	$(AM_V_GEN)name=`echo $@ | sed -e 's/.tmp//'`; \
 | 
			
		||||
		sitemap.html.in $(acl_generated)
 | 
			
		||||
	@if [ -x $(XSLTPROC) ] ; then \
 | 
			
		||||
	  echo "Generating $@"; \
 | 
			
		||||
	  name=`echo $@ | sed -e 's/.tmp//'`; \
 | 
			
		||||
	  dir=`dirname $@` ; \
 | 
			
		||||
	  if test "$$dir" = "."; \
 | 
			
		||||
	  then \
 | 
			
		||||
@@ -258,40 +232,52 @@ MAINTAINERCLEANFILES += \
 | 
			
		||||
	    $(MKDIR_P) $$dir; \
 | 
			
		||||
	    style=subsite.xsl; \
 | 
			
		||||
	  fi; \
 | 
			
		||||
	  $(XSLTPROC) --stringparam pagename $$name \
 | 
			
		||||
	    --stringparam timestamp $(timestamp) --nonet \
 | 
			
		||||
	  $(XSLTPROC) --stringparam pagename $$name --nonet \
 | 
			
		||||
	    $(top_srcdir)/docs/$$style $< > $@ \
 | 
			
		||||
	    || { rm $@ && exit 1; }
 | 
			
		||||
	    || { rm $@ && exit 1; }; fi
 | 
			
		||||
 | 
			
		||||
%.html: %.html.tmp
 | 
			
		||||
	$(AM_V_GEN)$(XMLLINT) --nonet --format $< > $(srcdir)/$@ \
 | 
			
		||||
	  || { rm $(srcdir)/$@ && exit 1; }
 | 
			
		||||
	@if test -x $(XMLLINT) && test -x $(XMLCATALOG) ; then \
 | 
			
		||||
	  if $(XMLCATALOG) '$(XML_CATALOG_FILE)' \
 | 
			
		||||
	    "-//W3C//DTD XHTML 1.0 Strict//EN" > /dev/null ; then \
 | 
			
		||||
	  echo "Validating $@" ; \
 | 
			
		||||
	  SGML_CATALOG_FILES='$(XML_CATALOG_FILE)' \
 | 
			
		||||
	  $(XMLLINT) --catalogs --nonet --format --valid $< > $(srcdir)/$@ \
 | 
			
		||||
	  || { rm $(srcdir)/$@ && exit 1; }; \
 | 
			
		||||
	  else echo "missing XHTML1 DTD"; cat $< > $(srcdir)/$@ ; fi ; fi
 | 
			
		||||
 | 
			
		||||
%.php.tmp: %.php.in site.xsl page.xsl
 | 
			
		||||
	$(AM_V_GEN)$(XSLTPROC) --stringparam pagename $(@:.tmp=) \
 | 
			
		||||
	    --stringparam timestamp $(timestamp) --nonet \
 | 
			
		||||
%.php.tmp: %.php.in site.xsl page.xsl sitemap.html.in
 | 
			
		||||
	@if [ -x $(XSLTPROC) ] ; then \
 | 
			
		||||
	  echo "Generating $@"; \
 | 
			
		||||
	  $(XSLTPROC) --stringparam pagename $(@:.tmp=) --nonet \
 | 
			
		||||
	    $(top_srcdir)/docs/site.xsl $< > $@ \
 | 
			
		||||
	    || { rm $@ && exit 1; }
 | 
			
		||||
	    || { rm $@ && exit 1; }; fi
 | 
			
		||||
 | 
			
		||||
%.php: %.php.tmp %.php.code.in
 | 
			
		||||
	$(AM_V_GEN)sed \
 | 
			
		||||
	    -e '/<span id="php_placeholder"><\/span>/r '"$(srcdir)/$@.code.in" \
 | 
			
		||||
	@if [ -x $(XSLTPROC) ] ; then \
 | 
			
		||||
	  echo "Scripting $@"; \
 | 
			
		||||
	    sed -e '/<span id="php_placeholder"><\/span>/r '"$(srcdir)/$@.code.in" \
 | 
			
		||||
	    -e /php_placeholder/d < $@.tmp > $(srcdir)/$@ \
 | 
			
		||||
	    || { rm $(srcdir)/$@ && exit 1; }
 | 
			
		||||
	    || { rm $(srcdir)/$@ && exit 1; }; fi
 | 
			
		||||
 | 
			
		||||
$(apihtml_generated): html/index.html
 | 
			
		||||
 | 
			
		||||
html/index.html: libvirt-api.xml newapi.xsl page.xsl $(APIBUILD_STAMP)
 | 
			
		||||
	$(AM_V_GEN)$(XSLTPROC) --nonet -o $(srcdir)/ \
 | 
			
		||||
html/index.html: libvirt-api.xml newapi.xsl page.xsl sitemap.html.in
 | 
			
		||||
	$(AM_V_GEN)if [ -x $(XSLTPROC) ] ; then \
 | 
			
		||||
	  $(XSLTPROC) --nonet -o $(srcdir)/ \
 | 
			
		||||
	  --stringparam builddir '$(abs_top_builddir)' \
 | 
			
		||||
	  --stringparam timestamp $(timestamp) \
 | 
			
		||||
	  $(srcdir)/newapi.xsl $(srcdir)/libvirt-api.xml && \
 | 
			
		||||
	  $(XMLLINT) --nonet --noout $(srcdir)/html/*.html
 | 
			
		||||
	  $(srcdir)/newapi.xsl $(srcdir)/libvirt-api.xml ; fi && \
 | 
			
		||||
	if test -x $(XMLLINT) && test -x $(XMLCATALOG) ; then \
 | 
			
		||||
	  if $(XMLCATALOG) '$(XML_CATALOG_FILE)' "-//W3C//DTD XHTML 1.0 Strict//EN" \
 | 
			
		||||
	    > /dev/null ; then \
 | 
			
		||||
	  SGML_CATALOG_FILES='$(XML_CATALOG_FILE)' \
 | 
			
		||||
	  $(XMLLINT) --catalogs --nonet --valid --noout $(srcdir)/html/*.html ; \
 | 
			
		||||
	  else echo "missing XHTML1 DTD"; cat $< > $(srcdir)/$@ ; fi ; fi
 | 
			
		||||
 | 
			
		||||
$(addprefix $(srcdir)/,$(devhelphtml)): $(srcdir)/libvirt-api.xml $(devhelpxsl)
 | 
			
		||||
	$(AM_V_GEN)$(XSLTPROC) --stringparam timestamp $(timestamp) \
 | 
			
		||||
	  --nonet -o $(srcdir)/devhelp/ \
 | 
			
		||||
	  $(top_srcdir)/docs/devhelp/devhelp.xsl $(srcdir)/libvirt-api.xml
 | 
			
		||||
	$(AM_V_GEN)if [ -x $(XSLTPROC) ] ; then \
 | 
			
		||||
	  $(XSLTPROC) --nonet -o $(srcdir)/devhelp/ \
 | 
			
		||||
	  $(top_srcdir)/docs/devhelp/devhelp.xsl $(srcdir)/libvirt-api.xml ; fi
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
python_generated_files = \
 | 
			
		||||
@@ -334,16 +320,6 @@ $(APIBUILD_STAMP): $(srcdir)/apibuild.py \
 | 
			
		||||
		$(top_srcdir)/include/libvirt/libvirt-admin.h \
 | 
			
		||||
		$(top_srcdir)/include/libvirt/virterror.h \
 | 
			
		||||
		$(top_srcdir)/src/libvirt.c \
 | 
			
		||||
		$(top_srcdir)/src/libvirt-domain-snapshot.c \
 | 
			
		||||
		$(top_srcdir)/src/libvirt-domain.c \
 | 
			
		||||
		$(top_srcdir)/src/libvirt-host.c \
 | 
			
		||||
		$(top_srcdir)/src/libvirt-interface.c \
 | 
			
		||||
		$(top_srcdir)/src/libvirt-network.c \
 | 
			
		||||
		$(top_srcdir)/src/libvirt-nodedev.c \
 | 
			
		||||
		$(top_srcdir)/src/libvirt-nwfilter.c \
 | 
			
		||||
		$(top_srcdir)/src/libvirt-secret.c \
 | 
			
		||||
		$(top_srcdir)/src/libvirt-storage.c \
 | 
			
		||||
		$(top_srcdir)/src/libvirt-stream.c \
 | 
			
		||||
		$(top_srcdir)/src/libvirt-lxc.c \
 | 
			
		||||
		$(top_srcdir)/src/libvirt-qemu.c \
 | 
			
		||||
		$(top_srcdir)/src/libvirt-admin.c \
 | 
			
		||||
@@ -358,10 +334,11 @@ check-local: all
 | 
			
		||||
dist-local: all
 | 
			
		||||
 | 
			
		||||
clean-local:
 | 
			
		||||
	rm -f *~ *.bak *.hierarchy *.signals *-unused.txt *.html html/*.html
 | 
			
		||||
	rm -f *~ *.bak *.hierarchy *.signals *-unused.txt *.html
 | 
			
		||||
 | 
			
		||||
maintainer-clean-local: clean-local
 | 
			
		||||
	rm -rf $(srcdir)/libvirt-api.xml $(srcdir)/libvirt-refs.xml
 | 
			
		||||
	rm -rf $(srcdir)/libvirt-api.xml $(srcdir)/libvirt-refs.xml \
 | 
			
		||||
		todo.html.in
 | 
			
		||||
	rm -rf $(srcdir)/libvirt-qemu-api.xml $(srcdir)/libvirt-qemu-refs.xml
 | 
			
		||||
	rm -rf $(srcdir)/libvirt-lxc-api.xml $(srcdir)/libvirt-lxc-refs.xml
 | 
			
		||||
	rm -rf $(srcdir)/libvirt-admin-api.xml $(srcdir)/libvirt-admin-refs.xml
 | 
			
		||||
@@ -373,9 +350,6 @@ install-data-local:
 | 
			
		||||
	$(mkinstalldirs) $(DESTDIR)$(HTML_DIR)
 | 
			
		||||
	for f in $(css) $(dot_html) $(gif) $(png); do \
 | 
			
		||||
	  $(INSTALL) -m 0644 $(srcdir)/$$f $(DESTDIR)$(HTML_DIR); done
 | 
			
		||||
	$(mkinstalldirs) $(DESTDIR)$(HTML_DIR)/logos
 | 
			
		||||
	for f in $(logofiles); do \
 | 
			
		||||
	  $(INSTALL) -m 0644 $(srcdir)/$$f $(DESTDIR)$(HTML_DIR)/logos; done
 | 
			
		||||
	$(mkinstalldirs) $(DESTDIR)$(HTML_DIR)/html
 | 
			
		||||
	for h in $(apihtml); do \
 | 
			
		||||
	  $(INSTALL) -m 0644 $(srcdir)/$$h $(DESTDIR)$(HTML_DIR)/html; done
 | 
			
		||||
@@ -388,16 +362,10 @@ install-data-local:
 | 
			
		||||
	for file in $(devhelphtml) $(devhelppng) $(devhelpcss); do \
 | 
			
		||||
	    $(INSTALL) -m 0644 $(srcdir)/$${file} $(DESTDIR)$(DEVHELP_DIR) ; \
 | 
			
		||||
	done
 | 
			
		||||
	$(mkinstalldirs) $(DESTDIR)$(HTML_DIR)/fonts
 | 
			
		||||
	for f in $(fonts); do \
 | 
			
		||||
	  $(INSTALL) -m 0644 $(srcdir)/$$f $(DESTDIR)$(HTML_DIR)/fonts; \
 | 
			
		||||
	done
 | 
			
		||||
	$(INSTALL_DATA) $(srcdir)/libvirtLogo.png $(DESTDIR)$(pkgdatadir)
 | 
			
		||||
 | 
			
		||||
uninstall-local:
 | 
			
		||||
	for f in $(css) $(dot_html) $(gif) $(png) $(fonts); do \
 | 
			
		||||
	  rm -f $(DESTDIR)$(HTML_DIR)/$$f; \
 | 
			
		||||
	done
 | 
			
		||||
	for f in $(logofiles); do \
 | 
			
		||||
	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
 | 
			
		||||
@@ -408,3 +376,4 @@ uninstall-local:
 | 
			
		||||
	for f in $(devhelphtml) $(devhelppng) $(devhelpcss); do \
 | 
			
		||||
	  rm -f $(DESTDIR)$(DEVHELP_DIR)/$$(basename $$f); \
 | 
			
		||||
	done
 | 
			
		||||
	rm -f $(DESTDIR)$(pkgdatadir)/libvirtLogo.png
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<!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>Client access control</h1>
 | 
			
		||||
@@ -12,7 +12,7 @@
 | 
			
		||||
 | 
			
		||||
    <ul id="toc"></ul>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="intro">Access control introduction</a></h2>
 | 
			
		||||
    <h2><a name="intro">Access control introduction</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      In a default configuration, the libvirtd daemon has three levels
 | 
			
		||||
@@ -42,7 +42,7 @@
 | 
			
		||||
      <code>getattr</code> permission.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="drivers">Access control drivers</a></h2>
 | 
			
		||||
    <h2><a name="drivers">Access control drivers</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      The access control framework is designed as a pluggable
 | 
			
		||||
@@ -83,7 +83,7 @@
 | 
			
		||||
      the libvirtd daemon be restarted.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="perms">Objects and permissions</a></h2>
 | 
			
		||||
    <h2><a name="perms">Objects and permissions</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      Libvirt applies access control to all the main object
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<!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>Polkit access control</h1>
 | 
			
		||||
@@ -14,7 +14,7 @@
 | 
			
		||||
 | 
			
		||||
    <ul id="toc"></ul>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="intro">Introduction</a></h2>
 | 
			
		||||
    <h2><a name="intro">Introduction</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      A default install of libvirt will typically use
 | 
			
		||||
@@ -27,7 +27,7 @@
 | 
			
		||||
      object.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="perms">Permission names</a></h2>
 | 
			
		||||
    <h2><a name="perms">Permission names</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      The libvirt <a href="acl.html#perms">object names and permission names</a>
 | 
			
		||||
@@ -53,7 +53,7 @@
 | 
			
		||||
      permissions default to deny access.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="attrs">Object identity attributes</a></h2>
 | 
			
		||||
    <h2><a name="attrs">Object identity attributes</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      To allow polkit authorization rules to be written to match
 | 
			
		||||
@@ -63,7 +63,7 @@
 | 
			
		||||
      of object being checked
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <h3><a id="object_connect">virConnectPtr</a></h3>
 | 
			
		||||
    <h3><a name="object_connect">virConnectPtr</a></h3>
 | 
			
		||||
    <table class="acl">
 | 
			
		||||
      <thead>
 | 
			
		||||
        <tr>
 | 
			
		||||
@@ -79,7 +79,7 @@
 | 
			
		||||
      </tbody>
 | 
			
		||||
    </table>
 | 
			
		||||
 | 
			
		||||
    <h3><a id="object_domain">virDomainPtr</a></h3>
 | 
			
		||||
    <h3><a name="object_domain">virDomainPtr</a></h3>
 | 
			
		||||
    <table class="acl">
 | 
			
		||||
      <thead>
 | 
			
		||||
        <tr>
 | 
			
		||||
@@ -103,7 +103,7 @@
 | 
			
		||||
      </tbody>
 | 
			
		||||
    </table>
 | 
			
		||||
 | 
			
		||||
    <h3><a id="object_interface">virInterfacePtr</a></h3>
 | 
			
		||||
    <h3><a name="object_interface">virInterfacePtr</a></h3>
 | 
			
		||||
    <table class="acl">
 | 
			
		||||
      <thead>
 | 
			
		||||
        <tr>
 | 
			
		||||
@@ -127,7 +127,7 @@
 | 
			
		||||
      </tbody>
 | 
			
		||||
    </table>
 | 
			
		||||
 | 
			
		||||
    <h3><a id="object_network">virNetworkPtr</a></h3>
 | 
			
		||||
    <h3><a name="object_network">virNetworkPtr</a></h3>
 | 
			
		||||
    <table class="acl">
 | 
			
		||||
      <thead>
 | 
			
		||||
        <tr>
 | 
			
		||||
@@ -151,7 +151,7 @@
 | 
			
		||||
      </tbody>
 | 
			
		||||
    </table>
 | 
			
		||||
 | 
			
		||||
    <h3><a id="object_node_device">virNodeDevicePtr</a></h3>
 | 
			
		||||
    <h3><a name="object_node_device">virNodeDevicePtr</a></h3>
 | 
			
		||||
    <table class="acl">
 | 
			
		||||
      <thead>
 | 
			
		||||
        <tr>
 | 
			
		||||
@@ -171,7 +171,7 @@
 | 
			
		||||
      </tbody>
 | 
			
		||||
    </table>
 | 
			
		||||
 | 
			
		||||
    <h3><a id="object_nwfilter">virNWFilterPtr</a></h3>
 | 
			
		||||
    <h3><a name="object_nwfilter">virNWFilterPtr</a></h3>
 | 
			
		||||
    <table class="acl">
 | 
			
		||||
      <thead>
 | 
			
		||||
        <tr>
 | 
			
		||||
@@ -195,7 +195,7 @@
 | 
			
		||||
      </tbody>
 | 
			
		||||
    </table>
 | 
			
		||||
 | 
			
		||||
    <h3><a id="object_secret">virSecretPtr</a></h3>
 | 
			
		||||
    <h3><a name="object_secret">virSecretPtr</a></h3>
 | 
			
		||||
    <table class="acl">
 | 
			
		||||
      <thead>
 | 
			
		||||
        <tr>
 | 
			
		||||
@@ -224,14 +224,10 @@
 | 
			
		||||
          <td>secret_usage_target</td>
 | 
			
		||||
          <td>Name of the associated iSCSI target, if any</td>
 | 
			
		||||
        </tr>
 | 
			
		||||
        <tr>
 | 
			
		||||
          <td>secret_usage_name</td>
 | 
			
		||||
          <td>Name of the associated TLS secret, if any</td>
 | 
			
		||||
        </tr>
 | 
			
		||||
      </tbody>
 | 
			
		||||
    </table>
 | 
			
		||||
 | 
			
		||||
    <h3><a id="object_storage_pool">virStoragePoolPtr</a></h3>
 | 
			
		||||
    <h3><a name="object_storage_pool">virStoragePoolPtr</a></h3>
 | 
			
		||||
    <table class="acl">
 | 
			
		||||
      <thead>
 | 
			
		||||
        <tr>
 | 
			
		||||
@@ -255,7 +251,7 @@
 | 
			
		||||
      </tbody>
 | 
			
		||||
    </table>
 | 
			
		||||
 | 
			
		||||
    <h3><a id="object_storage_vol">virStorageVolPtr</a></h3>
 | 
			
		||||
    <h3><a name="object_storage_vol">virStorageVolPtr</a></h3>
 | 
			
		||||
    <table class="acl">
 | 
			
		||||
      <thead>
 | 
			
		||||
        <tr>
 | 
			
		||||
@@ -288,7 +284,7 @@
 | 
			
		||||
    </table>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <h2><a id="user">User identity attributes</a></h2>
 | 
			
		||||
    <h2><a name="user">User identity attributes</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      At this point in time, the only attribute provided by
 | 
			
		||||
@@ -307,7 +303,7 @@
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <h2><a id="checks">Writing access control policies</a></h2>
 | 
			
		||||
    <h2><a name="checks">Writing access control policies</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      If using versions of polkit prior to 0.106 then it is only
 | 
			
		||||
@@ -334,9 +330,9 @@
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <pre>
 | 
			
		||||
polkit.addRule(function(action, subject) {
 | 
			
		||||
  ....logic to check 'action' and 'subject'...
 | 
			
		||||
});
 | 
			
		||||
      polkit.addRule(function(action, subject) {
 | 
			
		||||
        ....logic to check 'action' and 'subject'...
 | 
			
		||||
      });
 | 
			
		||||
    </pre>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
@@ -354,11 +350,11 @@ polkit.addRule(function(action, subject) {
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
    See
 | 
			
		||||
    <a href="https://libvirt.org/git/?p=libvirt.git;a=tree;f=examples/polkit;hb=HEAD">source code</a>
 | 
			
		||||
    <a href="http://libvirt.org/git/?p=libvirt.git;a=tree;f=examples/polkit;hb=HEAD">source code</a>
 | 
			
		||||
    for a more complex example.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <h3><a id="exconnect">Example: restricting ability to connect to drivers</a></h3>
 | 
			
		||||
    <h3><a name="exconnect">Example: restricting ability to connect to drivers</a></h3>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      Consider a local user <code>berrange</code>
 | 
			
		||||
@@ -386,7 +382,7 @@ polkit.addRule(function(action, subject) {
 | 
			
		||||
});
 | 
			
		||||
    </pre>
 | 
			
		||||
 | 
			
		||||
    <h3><a id="exdomain">Example: restricting access to a single domain</a></h3>
 | 
			
		||||
    <h3><a name="exdomain">Example: restricting access to a single domain</a></h3>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      Consider a local user <code>berrange</code>
 | 
			
		||||
 
 | 
			
		||||
										
											Binary file not shown.
										
									
								
							| 
		 Before Width: | Height: | Size: 13 KiB  | 
										
											Binary file not shown.
										
									
								
							| 
		 Before Width: | Height: | Size: 16 KiB  | 
@@ -1,5 +1,5 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<!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>The libvirt API concepts</h1>
 | 
			
		||||
@@ -9,7 +9,7 @@
 | 
			
		||||
 | 
			
		||||
    <ul id="toc"></ul>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="Objects">Objects Exposed</a></h2>
 | 
			
		||||
    <h2><a name="Objects">Objects Exposed</a></h2>
 | 
			
		||||
    <p> As defined in the <a href="goals.html">goals section</a>, the libvirt
 | 
			
		||||
    API is designed to expose all the resources needed to manage the
 | 
			
		||||
    virtualization support of recent operating systems. The first object
 | 
			
		||||
@@ -121,7 +121,7 @@
 | 
			
		||||
      set of nodes.</p></li>
 | 
			
		||||
    </ul>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="Functions">Functions and Naming Conventions</a></h2>
 | 
			
		||||
    <h2><a name="Functions">Functions and Naming Conventions</a></h2>
 | 
			
		||||
    <p> The naming of the functions present in the library is usually
 | 
			
		||||
      composed by a prefix describing the object associated to the function
 | 
			
		||||
      and a verb describing the action on that object.</p>
 | 
			
		||||
@@ -297,7 +297,7 @@
 | 
			
		||||
    <p> For more in-depth details of the storage related APIs see
 | 
			
		||||
      <a href="storage.html">the storage management page</a>.
 | 
			
		||||
    </p>
 | 
			
		||||
    <h2><a id="Drivers">The libvirt Drivers</a></h2>
 | 
			
		||||
    <h2><a name="Drivers">The libvirt Drivers</a></h2>
 | 
			
		||||
    <p>Drivers are the basic building block for libvirt functionality
 | 
			
		||||
    to support the capability to handle specific hypervisor driver calls.
 | 
			
		||||
    Drivers are discovered and registered during connection processing as
 | 
			
		||||
@@ -325,7 +325,7 @@
 | 
			
		||||
    the various functions and support found in each driver by the version
 | 
			
		||||
    support was added into libvirt.
 | 
			
		||||
    </p>
 | 
			
		||||
    <h2><a id="Remote">Daemon and Remote Access</a></h2>
 | 
			
		||||
    <h2><a name="Remote">Daemon and Remote Access</a></h2>
 | 
			
		||||
    <p>Access to libvirt drivers is primarily handled by the libvirtd
 | 
			
		||||
    daemon through the <a href="remote.html">remote</a> driver via an
 | 
			
		||||
    <a href="internals/rpc.html">RPC</a>. Some hypervisors do support
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<!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>Implementing a new API in Libvirt</h1>
 | 
			
		||||
@@ -44,7 +44,7 @@
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      <a href="https://libvirt.org/downloads.html">https://libvirt.org/downloads.html</a>
 | 
			
		||||
      <a href="http://libvirt.org/downloads.html">http://libvirt.org/downloads.html</a>
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
@@ -273,7 +273,7 @@
 | 
			
		||||
      <li>unlocks the remote driver.</li>
 | 
			
		||||
    </ol>
 | 
			
		||||
 | 
			
		||||
    <h3><a id="serverdispatch">Implement the server side dispatcher</a></h3>
 | 
			
		||||
    <h3><a name="serverdispatch">Implement the server side dispatcher</a></h3>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      Implementing the server side of the remote function call is simply a
 | 
			
		||||
@@ -300,7 +300,7 @@
 | 
			
		||||
 | 
			
		||||
    <p class="example">See <a href="api_extension/0005-implement-the-remote-protocol.patch">0005-implement-the-remote-protocol.patch</a></p>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="internaluseapi">Use the new API internally</a></h2>
 | 
			
		||||
    <h2><a name="internaluseapi">Use the new API internally</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      Sometimes, a new API serves as a superset of existing API, by
 | 
			
		||||
@@ -314,7 +314,7 @@
 | 
			
		||||
 | 
			
		||||
    <p class="example">See <a href="api_extension/0006-make-old-API-trivially-wrap-to-new-API.patch">0006-make-old-API-trivially-wrap-to-new-API.patch</a></p>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="virshuseapi">Expose the new API in virsh</a></h2>
 | 
			
		||||
    <h2><a name="virshuseapi">Expose the new API in virsh</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      All new API should be manageable from the virsh command line
 | 
			
		||||
@@ -345,7 +345,7 @@
 | 
			
		||||
 | 
			
		||||
    <p class="example">See <a href="api_extension/0007-add-virsh-support.patch">0007-add-virsh-support.patch</a></p>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="driverimpl">Implement the driver methods</a></h2>
 | 
			
		||||
    <h2><a name="driverimpl">Implement the driver methods</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      So, after all that, we get to the fun part.  All functionality in
 | 
			
		||||
@@ -356,7 +356,7 @@
 | 
			
		||||
      adding.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <h3><a id="commonimpl">Implement common handling</a></h3>
 | 
			
		||||
    <h3><a name="commonimpl">Implement common handling</a></h3>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      If the new API is applicable to more than one driver, it may
 | 
			
		||||
@@ -373,7 +373,7 @@
 | 
			
		||||
 | 
			
		||||
    <p class="example">See <a href="api_extension/0008-support-new-xml.patch">0008-support-new-xml.patch</a></p>
 | 
			
		||||
 | 
			
		||||
    <h3><a id="drivercode">Implement driver handling</a></h3>
 | 
			
		||||
    <h3><a name="drivercode">Implement driver handling</a></h3>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      The remaining patches should only touch one driver at a time.
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
#!/usr/bin/env python2
 | 
			
		||||
#!/usr/bin/python -u
 | 
			
		||||
#
 | 
			
		||||
# This is the API builder, it parses the C sources and build the
 | 
			
		||||
# API formal description in XML.
 | 
			
		||||
@@ -1365,9 +1365,9 @@ class CParser:
 | 
			
		||||
    def parseEnumBlock(self, token):
 | 
			
		||||
        self.enums = []
 | 
			
		||||
        name = None
 | 
			
		||||
        self.comment = None
 | 
			
		||||
        comment = ""
 | 
			
		||||
        value = "-1"
 | 
			
		||||
        commentsBeforeVal = self.comment is not None
 | 
			
		||||
        while token is not None:
 | 
			
		||||
            if token[0] == "sep" and token[1] == "{":
 | 
			
		||||
                token = self.token()
 | 
			
		||||
@@ -1408,10 +1408,6 @@ class CParser:
 | 
			
		||||
                        self.warning("Failed to compute value of enum %s" % (name))
 | 
			
		||||
                        value=""
 | 
			
		||||
                if token[0] == "sep" and token[1] == ",":
 | 
			
		||||
                    if commentsBeforeVal:
 | 
			
		||||
                        self.cleanupComment()
 | 
			
		||||
                        self.enums.append((name, value, self.comment))
 | 
			
		||||
                        name = comment = self.comment = None
 | 
			
		||||
                    token = self.token()
 | 
			
		||||
            else:
 | 
			
		||||
                token = self.token()
 | 
			
		||||
@@ -1656,8 +1652,6 @@ class CParser:
 | 
			
		||||
            self.enums = []
 | 
			
		||||
            token = self.token()
 | 
			
		||||
            if token is not None and token[0] == "sep" and token[1] == "{":
 | 
			
		||||
                # drop comments before the enum block
 | 
			
		||||
                self.comment = None
 | 
			
		||||
                token = self.token()
 | 
			
		||||
                token = self.parseEnumBlock(token)
 | 
			
		||||
            else:
 | 
			
		||||
@@ -2613,9 +2607,10 @@ class app:
 | 
			
		||||
            dirs = [srcdir + "/../src",
 | 
			
		||||
                    srcdir + "/../src/util",
 | 
			
		||||
                    srcdir + "/../include/libvirt"]
 | 
			
		||||
            if (builddir and
 | 
			
		||||
                not os.path.exists(srcdir + "/../include/libvirt/libvirt-common.h")):
 | 
			
		||||
            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:
 | 
			
		||||
 
 | 
			
		||||
										
											Binary file not shown.
										
									
								
							| 
		 Before Width: | Height: | Size: 10 KiB  | 
@@ -1,5 +1,5 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<!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>
 | 
			
		||||
@@ -11,7 +11,7 @@
 | 
			
		||||
 | 
			
		||||
    <ul id="toc"></ul>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="add">Add an application</a></h2>
 | 
			
		||||
    <h2><a name="add">Add an application</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      To add an application not listed on this page, send a message
 | 
			
		||||
@@ -19,18 +19,15 @@
 | 
			
		||||
      be added here, or simply send a patch against the documentation
 | 
			
		||||
      in the libvirt.git docs subdirectory.
 | 
			
		||||
      If your application uses libvirt as its API,
 | 
			
		||||
      the following graphics are available for your website to advertise
 | 
			
		||||
      the following graphic is available for your website to advertise
 | 
			
		||||
      support for libvirt:
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <p class="image">
 | 
			
		||||
      <img src="logos/logo-square-powered-96.png" alt="libvirt powered"/>
 | 
			
		||||
      <img src="logos/logo-square-powered-128.png" alt="libvirt powered"/>
 | 
			
		||||
      <img src="logos/logo-square-powered-192.png" alt="libvirt powered"/>
 | 
			
		||||
      <img src="logos/logo-square-powered-256.png" alt="libvirt powered"/>
 | 
			
		||||
      <img src="madeWith.png" alt="Made with libvirt"/>
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="clientserver">Client/Server applications</a></h2>
 | 
			
		||||
    <h2><a name="clientserver">Client/Server applications</a></h2>
 | 
			
		||||
 | 
			
		||||
    <dl>
 | 
			
		||||
      <dt><a href="http://archipelproject.org">Archipel</a></dt>
 | 
			
		||||
@@ -50,7 +47,7 @@
 | 
			
		||||
      </dd>
 | 
			
		||||
    </dl>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="command">Command line tools</a></h2>
 | 
			
		||||
    <h2><a name="command">Command line tools</a></h2>
 | 
			
		||||
 | 
			
		||||
    <dl>
 | 
			
		||||
      <dt><a href="http://libguestfs.org">guestfish</a></dt>
 | 
			
		||||
@@ -65,21 +62,21 @@
 | 
			
		||||
        management tasks on all libvirt managed domains, networks and
 | 
			
		||||
        storage. This is part of the libvirt core distribution.
 | 
			
		||||
      </dd>
 | 
			
		||||
      <dt><a href="https://virt-manager.org/">virt-clone</a></dt>
 | 
			
		||||
      <dt><a href="http://virt-manager.org/">virt-clone</a></dt>
 | 
			
		||||
      <dd>
 | 
			
		||||
        Allows the disk image(s) and configuration for an existing
 | 
			
		||||
        virtual machine to be cloned to form a new virtual machine.
 | 
			
		||||
        It automates copying of data across to new disk images, and
 | 
			
		||||
        updates the UUID, MAC address, and name in the configuration.
 | 
			
		||||
      </dd>
 | 
			
		||||
      <dt><a href="https://people.redhat.com/rjones/virt-df/">virt-df</a></dt>
 | 
			
		||||
      <dt><a href="http://et.redhat.com/~rjones/virt-df/">virt-df</a></dt>
 | 
			
		||||
      <dd>
 | 
			
		||||
        Examine the utilization of each filesystem in a virtual machine
 | 
			
		||||
        from the comfort of the host machine. This tool peeks into the
 | 
			
		||||
        guest disks and determines how much space is used. It can cope
 | 
			
		||||
        with common Linux filesystems and LVM volumes.
 | 
			
		||||
      </dd>
 | 
			
		||||
      <dt><a href="https://virt-manager.org/">virt-image</a></dt>
 | 
			
		||||
      <dt><a href="http://virt-manager.org/">virt-image</a></dt>
 | 
			
		||||
      <dd>
 | 
			
		||||
        Provides a way to deploy virtual appliances. It defines a
 | 
			
		||||
        simplified portable XML format describing the pre-requisites
 | 
			
		||||
@@ -87,26 +84,26 @@
 | 
			
		||||
        into the domain XML format for execution under any libvirt
 | 
			
		||||
        hypervisor meeting the pre-requisites.
 | 
			
		||||
      </dd>
 | 
			
		||||
      <dt><a href="https://virt-manager.org/">virt-install</a></dt>
 | 
			
		||||
      <dt><a href="http://virt-manager.org/">virt-install</a></dt>
 | 
			
		||||
      <dd>
 | 
			
		||||
        Provides a way to provision new virtual machines from a
 | 
			
		||||
        OS distribution install tree. It supports provisioning from
 | 
			
		||||
        local CD images, and the network over NFS, HTTP and FTP.
 | 
			
		||||
      </dd>
 | 
			
		||||
      <dt><a href="https://people.redhat.com/rjones/virt-top/">virt-top</a></dt>
 | 
			
		||||
      <dt><a href="http://et.redhat.com/~rjones/virt-top/">virt-top</a></dt>
 | 
			
		||||
      <dd>
 | 
			
		||||
        Watch the CPU, memory, network and disk utilization of all
 | 
			
		||||
        virtual machines running on a host.
 | 
			
		||||
      </dd>
 | 
			
		||||
      <dt>
 | 
			
		||||
        <a href="https://people.redhat.com/~rjones/virt-what/">virt-what</a>
 | 
			
		||||
        <a href="http://people.redhat.com/~rjones/virt-what/">virt-what</a>
 | 
			
		||||
      </dt>
 | 
			
		||||
      <dd>
 | 
			
		||||
        virt-what is a shell script for detecting if the program is running
 | 
			
		||||
        in a virtual machine.  It prints out a list of facts about the
 | 
			
		||||
        virtual machine, derived from heuristics.
 | 
			
		||||
      </dd>
 | 
			
		||||
      <dt><a href="https://sourceware.org/systemtap/">stap</a></dt>
 | 
			
		||||
      <dt><a href="http://sourceware.org/systemtap/">stap</a></dt>
 | 
			
		||||
      <dd>
 | 
			
		||||
        SystemTap is a tool used to gather rich information about a running
 | 
			
		||||
        system through the use of scripts. Starting from v2.4, the front-end
 | 
			
		||||
@@ -121,7 +118,7 @@
 | 
			
		||||
      </dd>
 | 
			
		||||
    </dl>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="configmgmt">Configuration Management</a></h2>
 | 
			
		||||
    <h2><a name="configmgmt">Configuration Management</a></h2>
 | 
			
		||||
 | 
			
		||||
    <dl>
 | 
			
		||||
      <dt><a href="https://wiki.lcfg.org/bin/view/LCFG/LcfgLibvirt">LCFG</a></dt>
 | 
			
		||||
@@ -139,10 +136,10 @@
 | 
			
		||||
      </dd>
 | 
			
		||||
    </dl>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="continuousintegration">Continuous Integration</a></h2>
 | 
			
		||||
    <h2><a name="continuousintegration">Continuous Integration</a></h2>
 | 
			
		||||
 | 
			
		||||
    <dl>
 | 
			
		||||
      <dt><a href="https://buildbot.net/buildbot/docs/current/Libvirt.html">BuildBot</a></dt>
 | 
			
		||||
      <dt><a href="http://buildbot.net/buildbot/docs/current/Libvirt.html">BuildBot</a></dt>
 | 
			
		||||
      <dd>
 | 
			
		||||
        BuildBot is a system to automate the compile/test cycle required
 | 
			
		||||
        by most software projects.  CVS commits trigger new builds, run on
 | 
			
		||||
@@ -152,7 +149,7 @@
 | 
			
		||||
    </dl>
 | 
			
		||||
 | 
			
		||||
    <dl>
 | 
			
		||||
      <dt><a href="https://wiki.jenkins-ci.org/display/JENKINS/Libvirt+Slaves+Plugin">Jenkins</a></dt>
 | 
			
		||||
      <dt><a href="http://wiki.jenkins-ci.org/display/JENKINS/Libvirt+Slaves+Plugin">Jenkins</a></dt>
 | 
			
		||||
      <dd>
 | 
			
		||||
        This plugin for Jenkins adds a way to control guest domains hosted
 | 
			
		||||
        on Xen or QEMU/KVM.  You configure a Jenkins Slave,
 | 
			
		||||
@@ -163,7 +160,7 @@
 | 
			
		||||
      </dd>
 | 
			
		||||
    </dl>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="conversion">Conversion</a></h2>
 | 
			
		||||
    <h2><a name="conversion">Conversion</a></h2>
 | 
			
		||||
 | 
			
		||||
    <dl>
 | 
			
		||||
      <dt><a href="http://libguestfs.org/virt-p2v.1.html">virt-p2v</a></dt>
 | 
			
		||||
@@ -194,37 +191,26 @@
 | 
			
		||||
      </dd>
 | 
			
		||||
    </dl>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="desktop">Desktop applications</a></h2>
 | 
			
		||||
    <h2><a name="desktop">Desktop applications</a></h2>
 | 
			
		||||
 | 
			
		||||
    <dl>
 | 
			
		||||
      <dt><a href="https://virt-manager.org/">virt-manager</a></dt>
 | 
			
		||||
      <dt><a href="http://virt-manager.org/">virt-manager</a></dt>
 | 
			
		||||
      <dd>
 | 
			
		||||
        A general purpose desktop management tool, able to manage
 | 
			
		||||
        virtual machines across both local and remotely accessed
 | 
			
		||||
        hypervisors. It is targeted at home and small office usage
 | 
			
		||||
        up to managing 10-20 hosts and their VMs.
 | 
			
		||||
      </dd>
 | 
			
		||||
      <dt><a href="https://virt-manager.org/">virt-viewer</a></dt>
 | 
			
		||||
      <dt><a href="http://virt-manager.org/">virt-viewer</a></dt>
 | 
			
		||||
      <dd>
 | 
			
		||||
        A lightweight tool for accessing the graphical console
 | 
			
		||||
        associated with a virtual machine. It can securely connect
 | 
			
		||||
        to remote consoles supporting the VNC protocol. Also provides
 | 
			
		||||
        an optional mozilla browser plugin.
 | 
			
		||||
      </dd>
 | 
			
		||||
      <dt><a href="https://f1ash.github.io/qt-virt-manager">qt-virt-manager</a></dt>
 | 
			
		||||
      <dd>
 | 
			
		||||
        The Qt GUI for create and control VMs and another virtual entities
 | 
			
		||||
        (aka networks, storages, interfaces, secrets, network filters).
 | 
			
		||||
        Contains integrated LXC/SPICE/VNC viewer for accessing the graphical or
 | 
			
		||||
        text console associated with a virtual machine or container.
 | 
			
		||||
      </dd>
 | 
			
		||||
      <dt><a href="https://f1ash.github.io/qt-virt-manager/#virtual-machines-viewer">qt-remote-viewer</a></dt>
 | 
			
		||||
      <dd>
 | 
			
		||||
        The Qt VNC/SPICE viewer for access to remote desktops or VMs.
 | 
			
		||||
      </dd>
 | 
			
		||||
    </dl>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="iaas">Infrastructure as a Service (IaaS)</a></h2>
 | 
			
		||||
    <h2><a name="iaas">Infrastructure as a Service (IaaS)</a></h2>
 | 
			
		||||
 | 
			
		||||
    <dl>
 | 
			
		||||
      <dt><a href="http://cc1.ifj.edu.pl">Cracow Cloud One</a></dt>
 | 
			
		||||
@@ -234,7 +220,17 @@
 | 
			
		||||
        it easy to benefit from private Cloud Computing technology.
 | 
			
		||||
      </dd>
 | 
			
		||||
 | 
			
		||||
      <dt><a href="https://github.com/eucalyptus/eucalyptus">Eucalyptus</a></dt>
 | 
			
		||||
      <dt><a href="http://www.emotivecloud.net">EMOTIVE Cloud</a></dt>
 | 
			
		||||
      <dd>The EMOTIVE (Elastic Management Of Tasks In Virtualized
 | 
			
		||||
        Environments) middleware allows executing tasks and providing
 | 
			
		||||
        virtualized environments to the users with Xen, KVM or
 | 
			
		||||
        VirtualBox hypervisor. EMOTIVE's main feature is VM management
 | 
			
		||||
        with different scheduling policies. It can be also used as a
 | 
			
		||||
        cloud provider and is very easy to extend thanks to its
 | 
			
		||||
        modular Web Services architecture.
 | 
			
		||||
      </dd>
 | 
			
		||||
 | 
			
		||||
      <dt><a href="http://www.eucalyptus.com">Eucalyptus</a></dt>
 | 
			
		||||
      <dd>
 | 
			
		||||
        Eucalyptus is an on-premise Infrastructure as a Service cloud
 | 
			
		||||
        software platform that is open source and
 | 
			
		||||
@@ -258,7 +254,7 @@
 | 
			
		||||
        management.
 | 
			
		||||
      </dd>
 | 
			
		||||
 | 
			
		||||
      <dt><a href="https://www.openstack.org">OpenStack</a></dt>
 | 
			
		||||
      <dt><a href="http://www.openstack.org">OpenStack</a></dt>
 | 
			
		||||
      <dd>
 | 
			
		||||
        OpenStack is a "cloud operating system" usable for both public
 | 
			
		||||
        and private clouds.  Its various parts take care of compute,
 | 
			
		||||
@@ -276,19 +272,9 @@
 | 
			
		||||
        perfect for setting up low-end servers in a cloud or a
 | 
			
		||||
        cloud where you want the most bang for the bucks.
 | 
			
		||||
      </dd>
 | 
			
		||||
 | 
			
		||||
      <dt><a href="http://en.zstack.io/">ZStack</a></dt>
 | 
			
		||||
      <dd>
 | 
			
		||||
        ZStack is an open source IaaS software that aims to automate the
 | 
			
		||||
        management of all resources (compute, storage, networking, etc.) in a
 | 
			
		||||
        datacenter by using APIs, thus conforming to the principles of a
 | 
			
		||||
        software-defined datacenter. The key strengths of ZStack in terms of
 | 
			
		||||
        management are scalability, performance, and a fast, user-friendly
 | 
			
		||||
        deployment.
 | 
			
		||||
      </dd>
 | 
			
		||||
    </dl>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="libraries">Libraries</a></h2>
 | 
			
		||||
    <h2><a name="libraries">Libraries</a></h2>
 | 
			
		||||
 | 
			
		||||
    <dl>
 | 
			
		||||
      <dt><a href="http://libguestfs.org">libguestfs</a></dt>
 | 
			
		||||
@@ -304,7 +290,7 @@
 | 
			
		||||
        Windows Registry in Windows guests.
 | 
			
		||||
      </dd>
 | 
			
		||||
 | 
			
		||||
      <dt><a href="https://sandbox.libvirt.org">libvirt-sandbox</a></dt>
 | 
			
		||||
      <dt><a href="http://sandbox.libvirt.org">libvirt-sandbox</a></dt>
 | 
			
		||||
      <dd>
 | 
			
		||||
        A library and command line tools for simplifying the creation of
 | 
			
		||||
        application sandboxes using virtualization technology. It currently
 | 
			
		||||
@@ -317,14 +303,14 @@
 | 
			
		||||
        Allows using simple ruby objects to manipulate
 | 
			
		||||
        hypervisors, guests, storage, network etc.  It is
 | 
			
		||||
        based on top of
 | 
			
		||||
        the <a href="https://libvirt.org/ruby">native ruby bindings</a>.
 | 
			
		||||
        the <a href="http://libvirt.org/ruby">native ruby bindings</a>.
 | 
			
		||||
      </dd>
 | 
			
		||||
    </dl>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="livecd">LiveCD / Appliances</a></h2>
 | 
			
		||||
    <h2><a name="livecd">LiveCD / Appliances</a></h2>
 | 
			
		||||
 | 
			
		||||
    <dl>
 | 
			
		||||
      <dt><a href="http://libguestfs.org/virt-v2v/">virt-p2v</a></dt>
 | 
			
		||||
      <dt><a href="http://et.redhat.com/~rjones/virt-p2v/">virt-p2v</a></dt>
 | 
			
		||||
      <dd>
 | 
			
		||||
        An older tool for converting a physical machine into a virtual
 | 
			
		||||
        machine.  It is a LiveCD which is booted on the machine to be
 | 
			
		||||
@@ -334,9 +320,9 @@
 | 
			
		||||
      </dd>
 | 
			
		||||
    </dl>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="monitoring">Monitoring</a></h2>
 | 
			
		||||
    <h2><a name="monitoring">Monitoring</a></h2>
 | 
			
		||||
    <dl>
 | 
			
		||||
      <dt><a href="https://collectd.org/plugins/libvirt.shtml">collectd</a></dt>
 | 
			
		||||
      <dt><a href="http://collectd.org/plugins/libvirt.shtml">collectd</a></dt>
 | 
			
		||||
      <dd>
 | 
			
		||||
        The libvirt-plugin is part of <a href="http://collectd.org/">collectd</a>
 | 
			
		||||
        and gathers statistics about virtualized guests on a system. This
 | 
			
		||||
@@ -345,19 +331,19 @@
 | 
			
		||||
        For a full description, please refer to the libvirt section in the
 | 
			
		||||
        collectd.conf(5) manual page.
 | 
			
		||||
      </dd>
 | 
			
		||||
      <dt><a href="http://www.sflow.net/">Host sFlow</a></dt>
 | 
			
		||||
      <dt><a href="http://host-sflow.sourceforge.net/">Host sFlow</a></dt>
 | 
			
		||||
      <dd>
 | 
			
		||||
        Host sFlow is a lightweight agent running on KVM hypervisors that
 | 
			
		||||
        links to libvirt library and exports standardized cpu, memory, network
 | 
			
		||||
        and disk metrics for all virtual machines.
 | 
			
		||||
      </dd>
 | 
			
		||||
      <dt><a href="https://honk.sigxcpu.org/projects/libvirt/#munin">Munin</a></dt>
 | 
			
		||||
      <dt><a href="http://honk.sigxcpu.org/projects/libvirt/#munin">Munin</a></dt>
 | 
			
		||||
      <dd>
 | 
			
		||||
        The plugins provided by Guido Günther allow to monitor various things
 | 
			
		||||
        The plugins provided by Guido Günther allow to monitor various things
 | 
			
		||||
        like network and block I/O with
 | 
			
		||||
        <a href="http://munin.projects.linpro.no/">Munin</a>.
 | 
			
		||||
      </dd>
 | 
			
		||||
      <dt><a href="http://people.redhat.com/rjones/nagios-virt/">Nagios-virt</a></dt>
 | 
			
		||||
      <dt><a href="http://et.redhat.com/~rjones/nagios-virt/">Nagios-virt</a></dt>
 | 
			
		||||
      <dd>
 | 
			
		||||
        Nagios-virt is a configuration tool to add monitoring of your
 | 
			
		||||
        virtualised domains to <a href="http://www.nagios.org/">Nagios</a>.
 | 
			
		||||
@@ -365,15 +351,7 @@
 | 
			
		||||
        your Xen or QEMU/KVM guests, or to integrate with your existing Nagios
 | 
			
		||||
        installation.
 | 
			
		||||
      </dd>
 | 
			
		||||
      <dt><a href="http://www.pcp.io/man/man1/pmdalibvirt.1.html">PCP</a></dt>
 | 
			
		||||
      <dd>
 | 
			
		||||
        The PCP libvirt PMDA (plugin) is part of the
 | 
			
		||||
        <a href="http://pcp.io/">PCP</a> toolkit and provides
 | 
			
		||||
        hypervisor and guest information and complete set of guest performance
 | 
			
		||||
        metrics. It supports pCPU, vCPU, memory, block device, network interface,
 | 
			
		||||
        and performance event metrics for each virtual guest.
 | 
			
		||||
      </dd>
 | 
			
		||||
      <dt><a href="https://community.zenoss.org/docs/DOC-4687">Zenoss</a></dt>
 | 
			
		||||
      <dt><a href="http://community.zenoss.org/docs/DOC-4687">Zenoss</a></dt>
 | 
			
		||||
      <dd>
 | 
			
		||||
        The Zenoss libvirt Zenpack adds support for monitoring virtualization
 | 
			
		||||
        servers.  It has been tested with KVM, QEMU, VMware ESX, and VMware
 | 
			
		||||
@@ -381,10 +359,10 @@
 | 
			
		||||
      </dd>
 | 
			
		||||
    </dl>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="provisioning">Provisioning</a></h2>
 | 
			
		||||
    <h2><a name="provisioning">Provisioning</a></h2>
 | 
			
		||||
 | 
			
		||||
    <dl>
 | 
			
		||||
      <dt><a href="https://www.ibm.com/developerworks/community/wikis/home?lang=en#!/wiki/Tivoli+Provisioning+Manager">Tivoli Provisioning Manager</a></dt>
 | 
			
		||||
      <dt><a href="http://www.ibm.com/software/tivoli/products/prov-mgr/">Tivoli Provisioning Manager</a></dt>
 | 
			
		||||
      <dd>
 | 
			
		||||
        Part of the IBM Tivoli family, Tivoli Provisioning Manager (TPM) is
 | 
			
		||||
        an IT lifecycle automation product.  It
 | 
			
		||||
@@ -394,7 +372,7 @@
 | 
			
		||||
    </dl>
 | 
			
		||||
 | 
			
		||||
    <dl>
 | 
			
		||||
      <dt><a href="https://theforeman.org">Foreman</a></dt>
 | 
			
		||||
      <dt><a href="http://theforeman.org">Foreman</a></dt>
 | 
			
		||||
      <dd>
 | 
			
		||||
      Foreman is an open source web based application aimed to be a
 | 
			
		||||
      Single Address For All Machines Life Cycle Management. Foreman:
 | 
			
		||||
@@ -415,10 +393,10 @@
 | 
			
		||||
    </dl>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <h2><a id="web">Web applications</a></h2>
 | 
			
		||||
    <h2><a name="web">Web applications</a></h2>
 | 
			
		||||
 | 
			
		||||
    <dl>
 | 
			
		||||
      <dt><a href="http://www.abiquo.com/">AbiCloud</a></dt>
 | 
			
		||||
      <dt><a href="http://community.abiquo.com/display/AbiCloud">AbiCloud</a></dt>
 | 
			
		||||
      <dd>
 | 
			
		||||
        AbiCloud is an open source cloud platform manager which allows to
 | 
			
		||||
        easily deploy a private cloud in your datacenter. One of the key
 | 
			
		||||
@@ -434,14 +412,14 @@
 | 
			
		||||
        Kimchi manages KVM guests through libvirt. The management interface is accessed
 | 
			
		||||
        over the web using a browser that supports HTML5.
 | 
			
		||||
      </dd>
 | 
			
		||||
      <dt><a href="https://ovirt.org/">oVirt</a></dt>
 | 
			
		||||
      <dt><a href="http://ovirt.org/">oVirt</a></dt>
 | 
			
		||||
      <dd>
 | 
			
		||||
        oVirt provides the ability to manage large numbers of virtual
 | 
			
		||||
        machines across an entire data center of hosts. It integrates
 | 
			
		||||
        with FreeIPA for Kerberos authentication, and in the future,
 | 
			
		||||
        certificate management.
 | 
			
		||||
      </dd>
 | 
			
		||||
      <dt><a href="https://ispsystem.com/en/software/vmmanager">VMmanager</a></dt>
 | 
			
		||||
      <dt><a href="http://ispsystem.com/en/software/vmmanager">VMmanager</a></dt>
 | 
			
		||||
      <dd>
 | 
			
		||||
        VMmanager is a software solution for virtualization management
 | 
			
		||||
        that can be used both for hosting virtual machines and
 | 
			
		||||
@@ -450,7 +428,7 @@
 | 
			
		||||
        functions, such as live migration that allows for load
 | 
			
		||||
        balancing between cluster nodes, monitoring CPU, memory.
 | 
			
		||||
      </dd>
 | 
			
		||||
      <dt><a href="https://mist.io/">mist.io</a></dt>
 | 
			
		||||
      <dt><a href="http://mist.io/">mist.io</a></dt>
 | 
			
		||||
      <dd>
 | 
			
		||||
        Mist.io is an open source project and a service that can assist you in
 | 
			
		||||
        managing your virtual machines on a unified way, providing a simple
 | 
			
		||||
@@ -458,17 +436,9 @@
 | 
			
		||||
        providers, OpenStack based public/private clouds, Docker servers, bare
 | 
			
		||||
        metal servers and now KVM hypervisors).
 | 
			
		||||
      </dd>
 | 
			
		||||
      <dt><a href="https://ravada.upc.edu/">Ravada</a></dt>
 | 
			
		||||
      <dd>
 | 
			
		||||
        Ravada is an open source tool for managing Virtual Desktop
 | 
			
		||||
        Infrastructure (VDI). It is very easy to install and use. Following
 | 
			
		||||
        the documentation, you'll be ready to deploy virtual machines in
 | 
			
		||||
        minutes. The only requirements for the users are a Web browser and
 | 
			
		||||
        a lightweight remote viewer.
 | 
			
		||||
      </dd>
 | 
			
		||||
    </dl>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="mobile">Mobile applications</a></h2>
 | 
			
		||||
    <h2><a name="mobile">Mobile applications</a></h2>
 | 
			
		||||
 | 
			
		||||
    <dl>
 | 
			
		||||
      <dt><a href="https://market.android.com/details?id=vm.manager">VM Manager</a></dt>
 | 
			
		||||
@@ -479,10 +449,10 @@
 | 
			
		||||
      </dd>
 | 
			
		||||
    </dl>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="other">Other</a></h2>
 | 
			
		||||
    <h2><a name="other">Other</a></h2>
 | 
			
		||||
 | 
			
		||||
    <dl>
 | 
			
		||||
      <dt><a href="https://cuckoosandbox.org/">Cuckoo Sandbox</a></dt>
 | 
			
		||||
      <dt><a href="http://cuckoosandbox.org/">Cuckoo Sandbox</a></dt>
 | 
			
		||||
      <dd>
 | 
			
		||||
        Cuckoo Sandbox is a malware analysis system.  You can throw
 | 
			
		||||
        any suspicious file at it and in a matter of seconds Cuckoo
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										7
									
								
								docs/archdomain.html.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								docs/archdomain.html.in
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,7 @@
 | 
			
		||||
<?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>Domain management architecture</h1>
 | 
			
		||||
  </body>
 | 
			
		||||
</html>
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<!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 architecture</h1>
 | 
			
		||||
@@ -13,7 +13,7 @@
 | 
			
		||||
 | 
			
		||||
    <ul id="toc"></ul>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="Xen">Xen support</a></h2>
 | 
			
		||||
    <h2><a name="Xen">Xen support</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>When running in a Xen environment, programs using libvirt have to execute
 | 
			
		||||
in "Domain 0", which is the primary Linux OS loaded on the machine. That OS
 | 
			
		||||
@@ -46,7 +46,7 @@ connect to initialize the library. It will then fork a libvirt_proxy
 | 
			
		||||
program running as root and providing read_only access to the API, this is
 | 
			
		||||
then only useful for reporting and monitoring.</p>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="QEmu">QEmu and KVM support</a></h2>
 | 
			
		||||
    <h2><a name="QEmu">QEmu and KVM support</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>The model for QEmu and KVM is completely similar, basically KVM is based
 | 
			
		||||
on QEmu for the process controlling a new domain, only small details differs
 | 
			
		||||
@@ -60,7 +60,7 @@ domain, by specifying the architecture and machine type targeted.</p>
 | 
			
		||||
    <p>The code controlling the QEmu process is available in the
 | 
			
		||||
<code>qemud/</code> directory.</p>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="drivers">Driver based architecture</a></h2>
 | 
			
		||||
    <h2><a name="drivers">Driver based architecture</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>As the previous section explains, libvirt can communicate using different
 | 
			
		||||
channels with the current hypervisor, and should also be able to use
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										54
									
								
								docs/archnetwork.html.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								docs/archnetwork.html.in
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,54 @@
 | 
			
		||||
<?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>Network management architecture</h1>
 | 
			
		||||
 | 
			
		||||
    <ul id="toc"></ul>
 | 
			
		||||
 | 
			
		||||
    <h2><a name="architecture">Architecture illustration</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      The diagrams below illustrate some of the network configurations
 | 
			
		||||
      enabled by the libvirt networking APIs
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <ul>
 | 
			
		||||
      <li><strong>VLAN 1</strong>. This virtual network has connectivity
 | 
			
		||||
        to <code>LAN 2</code> with traffic forwarded and NATed.
 | 
			
		||||
      </li>
 | 
			
		||||
      <li><strong>VLAN 2</strong>. This virtual network is completely
 | 
			
		||||
        isolated from any physical LAN.
 | 
			
		||||
      </li>
 | 
			
		||||
      <li><strong>Guest A</strong>. The first network interface is bridged
 | 
			
		||||
        to the physical <code>LAN 1</code>. The second interface is connected
 | 
			
		||||
        to a virtual network <code>VLAN 1</code>.
 | 
			
		||||
      </li>
 | 
			
		||||
      <li><strong>Guest B</strong>. The first network interface is connected
 | 
			
		||||
        to a virtual network <code>VLAN 1</code>, giving it limited NAT
 | 
			
		||||
        based connectivity to LAN2. It has a second network interface
 | 
			
		||||
        connected to <code>VLAN 2</code>. It acts a router allowing limited
 | 
			
		||||
        traffic between the two VLANs, thus giving <code>Guest C</code>
 | 
			
		||||
        connectivity to the physical <code>LAN 2</code>.
 | 
			
		||||
        </li>
 | 
			
		||||
      <li><strong>Guest C</strong>. The only network interface is connected
 | 
			
		||||
        to a virtual network <code>VLAN 2</code>. It has no direct connectivity
 | 
			
		||||
        to a physical LAN, relying on <code>Guest B</code> to route traffic
 | 
			
		||||
        on its behalf.
 | 
			
		||||
      </li>
 | 
			
		||||
    </ul>
 | 
			
		||||
 | 
			
		||||
    <h3><a name="logical">Logical diagram</a></h3>
 | 
			
		||||
 | 
			
		||||
    <p class="image">
 | 
			
		||||
      <img src="libvirt-net-logical.png" alt="Logical network architecture"/>
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <h3><a name="physical">Physical diagram</a></h3>
 | 
			
		||||
 | 
			
		||||
    <p class="image">
 | 
			
		||||
      <img src="libvirt-net-physical.png" alt="Physical network architecture"/>
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
  </body>
 | 
			
		||||
</html>
 | 
			
		||||
							
								
								
									
										7
									
								
								docs/archnode.html.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								docs/archnode.html.in
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,7 @@
 | 
			
		||||
<?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>Node device management architecture</h1>
 | 
			
		||||
  </body>
 | 
			
		||||
</html>
 | 
			
		||||
							
								
								
									
										32
									
								
								docs/archstorage.html.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								docs/archstorage.html.in
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,32 @@
 | 
			
		||||
<?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>Storage management architecture</h1>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      The storage management APIs are based around 2 core concepts
 | 
			
		||||
    </p>
 | 
			
		||||
    <ol>
 | 
			
		||||
      <li>
 | 
			
		||||
        <strong>Volume</strong> - a single storage volume which can
 | 
			
		||||
        be assigned to a guest, or used for creating further pools. A
 | 
			
		||||
        volume is either a block device, a raw file, or a special format
 | 
			
		||||
        file.
 | 
			
		||||
      </li>
 | 
			
		||||
      <li>
 | 
			
		||||
        <strong>Pool</strong> - provides a means for taking a chunk
 | 
			
		||||
        of storage and carving it up into volumes. A pool can be used to
 | 
			
		||||
        manage things such as a physical disk, a NFS server, a iSCSI target,
 | 
			
		||||
        a host adapter, an LVM group.
 | 
			
		||||
      </li>
 | 
			
		||||
    </ol>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      These two concepts are mapped through to two libvirt objects, a
 | 
			
		||||
      <code>virStorageVolPtr</code> and a <code>virStoragePoolPtr</code>,
 | 
			
		||||
      each with a collection of APIs for their management.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
  </body>
 | 
			
		||||
</html>
 | 
			
		||||
@@ -1,12 +1,12 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<!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>Audit log</h1>
 | 
			
		||||
 | 
			
		||||
    <ul id="toc"></ul>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="intro">Introduction</a></h2>
 | 
			
		||||
    <h2><a name="intro">Introduction</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      A number of the libvirt virtualization drivers (QEMU/KVM and LXC) include
 | 
			
		||||
@@ -17,7 +17,7 @@
 | 
			
		||||
      the logs will usually end up in <code>/var/log/audit/audit.log</code>
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="config">Configuration</a></h2>
 | 
			
		||||
    <h2><a name="config">Configuration</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      The libvirt audit integration is enabled by default on any host which has
 | 
			
		||||
@@ -48,7 +48,7 @@
 | 
			
		||||
      mentioned above.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="types">Message types</a></h2>
 | 
			
		||||
    <h2><a name="types">Message types</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      Libvirt defines three core audit message types each of which will
 | 
			
		||||
@@ -90,7 +90,7 @@
 | 
			
		||||
      <dd>Result of the action, either <code>success</code> or <code>failed</code></dd>
 | 
			
		||||
    </dl>
 | 
			
		||||
 | 
			
		||||
    <h3><a id="typecontrol">VIRT_CONTROL</a></h3>
 | 
			
		||||
    <h3><a name="typecontrol">VIRT_CONTROL</a></h3>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      Reports change in the lifecycle state of a virtual machine. The <code>msg</code>
 | 
			
		||||
@@ -110,7 +110,7 @@
 | 
			
		||||
      <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>
 | 
			
		||||
 | 
			
		||||
    <h3><a id="typemachine">VIRT_MACHINE_ID</a></h3>
 | 
			
		||||
    <h3><a name="typemachine">VIRT_MACHINE_ID</a></h3>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      Reports the association of a security context with a guest. The <code>msg</code>
 | 
			
		||||
@@ -126,7 +126,7 @@
 | 
			
		||||
      <dd>Security context for the guest disk images and other assigned host resources</dd>
 | 
			
		||||
    </dl>
 | 
			
		||||
 | 
			
		||||
    <h3><a id="typeresource">VIRT_RESOURCE</a></h3>
 | 
			
		||||
    <h3><a name="typeresource">VIRT_RESOURCE</a></h3>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      Reports the usage of a host resource by a guest. The fields include will
 | 
			
		||||
@@ -137,7 +137,7 @@
 | 
			
		||||
      be generated.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <h4><a id="typeresourcevcpu">Virtual CPU</a></h4>
 | 
			
		||||
    <h4><a name="typeresourcevcpu">Virtual CPU</a></h4>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      The <code>msg</code> field will include the following sub-fields
 | 
			
		||||
@@ -155,7 +155,7 @@
 | 
			
		||||
    </dl>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <h4><a id="typeresourcemem">Memory</a></h4>
 | 
			
		||||
    <h4><a name="typeresourcemem">Memory</a></h4>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      The <code>msg</code> field will include the following sub-fields
 | 
			
		||||
@@ -172,7 +172,7 @@
 | 
			
		||||
      <dd>Updated memory size in bytes</dd>
 | 
			
		||||
    </dl>
 | 
			
		||||
 | 
			
		||||
    <h4><a id="typeresourcedisk">Disk</a></h4>
 | 
			
		||||
    <h4><a name="typeresourcedisk">Disk</a></h4>
 | 
			
		||||
    <p>
 | 
			
		||||
      The <code>msg</code> field will include the following sub-fields
 | 
			
		||||
    </p>
 | 
			
		||||
@@ -188,7 +188,7 @@
 | 
			
		||||
      <dd>Updated host file or device path acting as the disk backing file</dd>
 | 
			
		||||
    </dl>
 | 
			
		||||
 | 
			
		||||
    <h4><a id="typeresourcenic">Network interface</a></h4>
 | 
			
		||||
    <h4><a name="typeresourcenic">Network interface</a></h4>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      The <code>msg</code> field will include the following sub-fields
 | 
			
		||||
@@ -221,7 +221,7 @@
 | 
			
		||||
      <dd>Name of the host network interface</dd>
 | 
			
		||||
    </dl>
 | 
			
		||||
 | 
			
		||||
    <h4><a id="typeresourcefs">Filesystem</a></h4>
 | 
			
		||||
    <h4><a name="typeresourcefs">Filesystem</a></h4>
 | 
			
		||||
    <p>
 | 
			
		||||
      The <code>msg</code> field will include the following sub-fields
 | 
			
		||||
    </p>
 | 
			
		||||
@@ -237,7 +237,7 @@
 | 
			
		||||
      <dd>Updated host directory, file or device path backing the filesystem</dd>
 | 
			
		||||
    </dl>
 | 
			
		||||
 | 
			
		||||
    <h4><a id="typeresourcehost">Host device</a></h4>
 | 
			
		||||
    <h4><a name="typeresourcehost">Host device</a></h4>
 | 
			
		||||
    <p>
 | 
			
		||||
      The <code>msg</code> field will include the following sub-fields
 | 
			
		||||
    </p>
 | 
			
		||||
@@ -255,7 +255,7 @@
 | 
			
		||||
      <dd>The path of the character device assigned to the guest, if <code>resrc=hostdev</code></dd>
 | 
			
		||||
    </dl>
 | 
			
		||||
 | 
			
		||||
    <h4><a id="typeresourcetpm">TPM</a></h4>
 | 
			
		||||
    <h4><a name="typeresourcetpm">TPM</a></h4>
 | 
			
		||||
    <p>
 | 
			
		||||
      The <code>msg</code> field will include the following sub-fields
 | 
			
		||||
    </p>
 | 
			
		||||
@@ -269,7 +269,7 @@
 | 
			
		||||
      <dd>The path of the host TPM device assigned to the guest</dd>
 | 
			
		||||
    </dl>
 | 
			
		||||
 | 
			
		||||
    <h4><a id="typeresourcerng">RNG</a></h4>
 | 
			
		||||
    <h4><a name="typeresourcerng">RNG</a></h4>
 | 
			
		||||
    <p>
 | 
			
		||||
      The <code>msg</code> field will include the following sub-fields
 | 
			
		||||
    </p>
 | 
			
		||||
@@ -285,7 +285,7 @@
 | 
			
		||||
      <dd>Updated path of the host entropy source for the RNG</dd>
 | 
			
		||||
    </dl>
 | 
			
		||||
 | 
			
		||||
    <h4><a id="typeresourcechardev">console/serial/parallel/channel</a></h4>
 | 
			
		||||
    <h4><a name="typeresourcechardev">console/serial/parallel/channel</a></h4>
 | 
			
		||||
    <p>
 | 
			
		||||
      The <code>msg</code> field will include the following sub-fields
 | 
			
		||||
    </p>
 | 
			
		||||
@@ -301,7 +301,7 @@
 | 
			
		||||
      <dd>Updated path of the backing character device for given emulated device</dd>
 | 
			
		||||
    </dl>
 | 
			
		||||
 | 
			
		||||
    <h4><a id="typeresourcesmartcard">smartcard</a></h4>
 | 
			
		||||
    <h4><a name="typeresourcesmartcard">smartcard</a></h4>
 | 
			
		||||
    <p>
 | 
			
		||||
      The <code>msg</code> field will include the following sub-fields
 | 
			
		||||
    </p>
 | 
			
		||||
@@ -321,7 +321,7 @@
 | 
			
		||||
      </dd>
 | 
			
		||||
    </dl>
 | 
			
		||||
 | 
			
		||||
    <h4><a id="typeresourceredir">Redirected device</a></h4>
 | 
			
		||||
    <h4><a name="typeresourceredir">Redirected device</a></h4>
 | 
			
		||||
    <p>
 | 
			
		||||
      The <code>msg</code> field will include the following sub-fields
 | 
			
		||||
    </p>
 | 
			
		||||
@@ -337,7 +337,7 @@
 | 
			
		||||
      <dd>The device type, only <code>USB redir</code> allowed</dd>
 | 
			
		||||
    </dl>
 | 
			
		||||
 | 
			
		||||
    <h4><a id="typeresourcecgroup">Control group</a></h4>
 | 
			
		||||
    <h4><a name="typeresourcecgroup">Control group</a></h4>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      The <code>msg</code> field will include the following sub-fields
 | 
			
		||||
@@ -352,24 +352,5 @@
 | 
			
		||||
      <dd>The name of the cgroup controller</dd>
 | 
			
		||||
    </dl>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <h4><a id="typeresourceshmem">Shared memory</a></h4>
 | 
			
		||||
    <p>
 | 
			
		||||
      The <code>msg</code> field will include the following sub-fields
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <dl>
 | 
			
		||||
      <dt><code>resrc</code></dt>
 | 
			
		||||
      <dd>The type of resource assigned. Set to <code>shmem</code></dd>
 | 
			
		||||
      <dt><code>reason</code></dt>
 | 
			
		||||
      <dd>The reason which caused the resource to be assigned to happen</dd>
 | 
			
		||||
      <dt><code>size</code></dt>
 | 
			
		||||
      <dd>The size of the shared memory region</dd>
 | 
			
		||||
      <dt><code>shmem</code></dt>
 | 
			
		||||
      <dd>Name of the shared memory region</dd>
 | 
			
		||||
      <dt><code>source</code></dt>
 | 
			
		||||
      <dd>Path of the backing character device for given emulated device</dd>
 | 
			
		||||
    </dl>
 | 
			
		||||
 | 
			
		||||
  </body>
 | 
			
		||||
</html>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<!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>Connection authentication</h1>
 | 
			
		||||
@@ -14,7 +14,7 @@
 | 
			
		||||
 | 
			
		||||
    <ul id="toc"></ul>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="Auth_client_config">Client configuration</a></h2>
 | 
			
		||||
    <h2><a name="Auth_client_config">Client configuration</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      When connecting to a remote hypervisor which requires authentication,
 | 
			
		||||
@@ -142,7 +142,7 @@ credentials=defgrp</pre>
 | 
			
		||||
      to storage VNC or SPICE login credentials
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="ACL_server_config">Server configuration</a></h2>
 | 
			
		||||
    <h2><a name="ACL_server_config">Server configuration</a></h2>
 | 
			
		||||
    <p>
 | 
			
		||||
The libvirt daemon allows the administrator to choose the authentication
 | 
			
		||||
mechanisms used for client connections on each network socket independently.
 | 
			
		||||
@@ -153,7 +153,7 @@ currently a choice of <code>none</code>, <code>polkit</code>, and <code>sasl</co
 | 
			
		||||
The SASL scheme can be further configured to choose between a large
 | 
			
		||||
number of different mechanisms.
 | 
			
		||||
</p>
 | 
			
		||||
    <h2><a id="ACL_server_unix_perms">UNIX socket permissions/group</a></h2>
 | 
			
		||||
    <h2><a name="ACL_server_unix_perms">UNIX socket permissions/group</a></h2>
 | 
			
		||||
    <p>
 | 
			
		||||
If libvirt does not contain support for PolicyKit, then access control for
 | 
			
		||||
the UNIX domain socket is done using traditional file user/group ownership
 | 
			
		||||
@@ -170,10 +170,10 @@ parameter. For example, setting the former to mode <code>0770</code> and the
 | 
			
		||||
latter <code>wheel</code> would let any user in the wheel group connect to
 | 
			
		||||
the libvirt daemon.
 | 
			
		||||
</p>
 | 
			
		||||
    <h2><a id="ACL_server_polkit">UNIX socket PolicyKit auth</a></h2>
 | 
			
		||||
    <h2><a name="ACL_server_polkit">UNIX socket PolicyKit auth</a></h2>
 | 
			
		||||
    <p>
 | 
			
		||||
If libvirt contains support for PolicyKit, then access control options are
 | 
			
		||||
more advanced. The <code>auth_unix_rw</code> parameter will default to
 | 
			
		||||
more advanced. The <code>unix_sock_auth</code> parameter will default to
 | 
			
		||||
<code>polkit</code>, and the file permissions will default to <code>0777</code>
 | 
			
		||||
even on the RW socket. Upon connecting to the socket, the client application
 | 
			
		||||
will be required to identify itself with PolicyKit. The default policy for the
 | 
			
		||||
@@ -204,72 +204,16 @@ ResultActive=yes</pre>
 | 
			
		||||
Further examples of PolicyKit setup can be found on the
 | 
			
		||||
<a href="http://wiki.libvirt.org/page/SSHPolicyKitSetup">wiki page</a>.
 | 
			
		||||
    </p>
 | 
			
		||||
    <h2><a id="ACL_server_sasl">SASL pluggable authentication</a></h2>
 | 
			
		||||
 | 
			
		||||
    <h2><a name="ACL_server_username">Username/password auth</a></h2>
 | 
			
		||||
    <p>
 | 
			
		||||
Libvirt integrates with the cyrus-sasl library to provide a pluggable authentication
 | 
			
		||||
system using the SASL protocol. SASL can be used in combination with libvirtd's TLS
 | 
			
		||||
or TCP socket listeners. When used with the TCP listener, the SASL mechanism is
 | 
			
		||||
rqeuired to provide session encryption in addition to authentication. Only a very
 | 
			
		||||
few SASL mechanisms are able to do this, and of those that can do it, only the
 | 
			
		||||
GSSAPI plugin is considered acceptably secure by modern standards:
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <dl>
 | 
			
		||||
      <dt>GSSAPI</dt>
 | 
			
		||||
      <dd><strong>This is the current default mechanism to use with libvirtd</strong>.
 | 
			
		||||
        It uses the Kerberos v5 authentication protocol underneath, and assuming
 | 
			
		||||
        the Kerberos client/server are configured with modern ciphers (AES),
 | 
			
		||||
        it provides strong session encryption capabilities.</dd>
 | 
			
		||||
 | 
			
		||||
      <dt>DIGEST-MD5</dt>
 | 
			
		||||
      <dd>This was previously set as the default mechanism to use with libvirtd.
 | 
			
		||||
        It provides a simple username/password based authentication mechanism
 | 
			
		||||
        that includes session encryption.
 | 
			
		||||
        <a href="https://tools.ietf.org/html/rfc6331">RFC 6331</a>, however,
 | 
			
		||||
        documents a number of serious security flaws with DIGEST-MD5 and as a
 | 
			
		||||
        result marks it as <code>OBSOLETE</code>. Specific concerns are that
 | 
			
		||||
        it is vulnerable to MITM attacks and the MD5 hash can be brute-forced
 | 
			
		||||
        to reveal the password. A replacement is provided via the SCRAM mechanism,
 | 
			
		||||
        however, note that this does not provide encryption, so the SCRAM
 | 
			
		||||
        mechanism can only be used on the libvirtd TLS listener.
 | 
			
		||||
      </dd>
 | 
			
		||||
 | 
			
		||||
      <dt>PASSDSS-3DES-1</dt>
 | 
			
		||||
      <dd>This provides a simple username/password based authentication
 | 
			
		||||
        mechanism that includes session encryption. The current cyrus-sasl
 | 
			
		||||
        implementation does not provide a way to validate the server's
 | 
			
		||||
        public key identity, thus it is susceptible to a MITM attacker
 | 
			
		||||
        impersonating the server. It is also not enabled in many OS
 | 
			
		||||
        distros when building SASL libraries.</dd>
 | 
			
		||||
 | 
			
		||||
      <dt>KERBEROS_V4</dt>
 | 
			
		||||
      <dd>This uses the obsolete Kerberos v4 protocol to provide both authentication
 | 
			
		||||
        and session encryption. Kerberos v4 protocol has been obsolete since the
 | 
			
		||||
        early 1990's and has known security vulnerabilities so this will never be
 | 
			
		||||
        used in practice.</dd>
 | 
			
		||||
    </dl>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      Other SASL mechanisms, not listed above, can only be used when the libvirtd
 | 
			
		||||
      TLS or UNIX socket listeners.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <h3><a id="ACL_server_username">Username/password auth</a></h3>
 | 
			
		||||
    <p>
 | 
			
		||||
As noted above, the DIGEST-MD5 mechanism is considered obsolete and should
 | 
			
		||||
not be used anymore. To provide a simple username/password auth scheme on
 | 
			
		||||
the libvirt UNIX socket or TLS listeners, however, it is possible to use
 | 
			
		||||
the SCRAM mechanism. The <code>auth_unix_ro</code>, <code>auth_unix_rw</code>,
 | 
			
		||||
<code>auth_tls</code> config params in <code>libvirt.conf</code> can be used
 | 
			
		||||
to turn on SASL auth in these listeners.
 | 
			
		||||
    </p>
 | 
			
		||||
    <p>
 | 
			
		||||
Since the libvirt SASL config file defaults to using GSSAPI (Kerberos), a
 | 
			
		||||
config change is rquired to enable plain password auth. This is done by
 | 
			
		||||
editting <code>/etc/sasl2/libvirt.conf</code> to set the <code>mech_list</code>
 | 
			
		||||
parameter to <code>scram-sha-1</code>.
 | 
			
		||||
    </p>
 | 
			
		||||
The plain TCP socket of the libvirt daemon defaults to using SASL for authentication.
 | 
			
		||||
The SASL mechanism configured by default is DIGEST-MD5, which provides a basic
 | 
			
		||||
username+password style authentication. It also provides for encryption of the data
 | 
			
		||||
stream, so the security of the plain TCP socket is on a par with that of the TLS
 | 
			
		||||
socket. If desired the UNIX socket and TLS socket can also have SASL enabled by
 | 
			
		||||
setting the <code>auth_unix_ro</code>, <code>auth_unix_rw</code>, <code>auth_tls</code>
 | 
			
		||||
config params in <code>libvirt.conf</code>.
 | 
			
		||||
</p>
 | 
			
		||||
    <p>
 | 
			
		||||
Out of the box, no user accounts are defined, so no clients will be able to authenticate
 | 
			
		||||
on the TCP socket. Adding users and setting their passwords is done with the <code>saslpasswd2</code>
 | 
			
		||||
@@ -297,13 +241,17 @@ again:
 | 
			
		||||
    <pre>
 | 
			
		||||
# saslpasswd2 -a libvirt -d fred
 | 
			
		||||
</pre>
 | 
			
		||||
    <h3><a id="ACL_server_kerberos">GSSAPI/Kerberos auth</a></h3>
 | 
			
		||||
    <h2><a name="ACL_server_kerberos">Kerberos auth</a></h2>
 | 
			
		||||
    <p>
 | 
			
		||||
The plain TCP listener of the libvirt daemon defaults to using SASL for authentication.
 | 
			
		||||
The libvirt SASL config also defaults to GSSAPI, so there is no need to edit the
 | 
			
		||||
SASL config when using GSSAPI. If the libvirtd TLS or UNIX listeners are used,
 | 
			
		||||
then the Kerberos session encryption will be disabled since it is not required
 | 
			
		||||
in these scenarios - only the plain TCP listener needs encryption
 | 
			
		||||
The plain TCP socket of the libvirt daemon defaults to using SASL for authentication.
 | 
			
		||||
The SASL mechanism configured by default is DIGEST-MD5, which provides a basic
 | 
			
		||||
username+password style authentication. To enable Kerberos single-sign-on instead,
 | 
			
		||||
the libvirt SASL configuration file must be changed. This is <code>/etc/sasl2/libvirt.conf</code>.
 | 
			
		||||
The <code>mech_list</code> parameter must first be changed to <code>gssapi</code>
 | 
			
		||||
instead of the default <code>digest-md5</code>, and keytab should be set to
 | 
			
		||||
<code>/etc/libvirt/krb5.tab</code> . If SASL is enabled on the UNIX
 | 
			
		||||
and/or TLS sockets, Kerberos will also be used for them. Like DIGEST-MD5, the Kerberos
 | 
			
		||||
mechanism provides data encryption of the session.
 | 
			
		||||
</p>
 | 
			
		||||
    <p>
 | 
			
		||||
Some operating systems do not install the SASL kerberos plugin by default. It
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<!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 >Bindings for other languages</h1>
 | 
			
		||||
@@ -14,17 +14,13 @@
 | 
			
		||||
        <strong>C#</strong>: Arnaud Champion develops
 | 
			
		||||
        <a href="csharp.html">C# bindings</a>.
 | 
			
		||||
      </li>
 | 
			
		||||
     <li>
 | 
			
		||||
        <strong>Go</strong>: Daniel Berrange develops
 | 
			
		||||
        <a href="https://godoc.org/github.com/libvirt/libvirt-go">Go bindings</a>.
 | 
			
		||||
      </li>
 | 
			
		||||
      <li>
 | 
			
		||||
        <strong>Java</strong>: Daniel Veillard develops
 | 
			
		||||
        <a href="java.html">Java bindings</a>.
 | 
			
		||||
      </li>
 | 
			
		||||
      <li>
 | 
			
		||||
        <strong>OCaml</strong>: Richard Jones develops
 | 
			
		||||
        <a href="https://libvirt.org/ocaml/">OCaml bindings</a>.
 | 
			
		||||
        <a href="http://libvirt.org/ocaml/">OCaml bindings</a>.
 | 
			
		||||
      </li>
 | 
			
		||||
      <li>
 | 
			
		||||
        <strong>Perl</strong>: Daniel Berrange develops
 | 
			
		||||
@@ -33,7 +29,7 @@
 | 
			
		||||
      <li>
 | 
			
		||||
        <p>
 | 
			
		||||
          <strong>PHP</strong>: Radek Hladik started developing
 | 
			
		||||
          <a href="https://libvirt.org/php">PHP bindings</a> in 2010.
 | 
			
		||||
          <a href="http://libvirt.org/php">PHP bindings</a> in 2010.
 | 
			
		||||
        </p>
 | 
			
		||||
        <p>
 | 
			
		||||
          In February 2011 the binding development has been moved to the libvirt.org website as
 | 
			
		||||
@@ -43,13 +39,13 @@
 | 
			
		||||
          The project is now maintained by Michal Novotny and it's heavily based
 | 
			
		||||
          on Radek's version. For more information, including
 | 
			
		||||
          information on posting patches to libvirt-php, please refer
 | 
			
		||||
          to the <a href="https://libvirt.org/php">PHP bindings</a> site.
 | 
			
		||||
          to the <a href="http://libvirt.org/php">PHP bindings</a> site.
 | 
			
		||||
        </p>
 | 
			
		||||
      </li>
 | 
			
		||||
      <li>
 | 
			
		||||
        <p>
 | 
			
		||||
          <strong>Python</strong>: Libvirt's python bindings are split to a
 | 
			
		||||
          separate <a href="https://libvirt.org/git/?p=libvirt-python.git">package</a>
 | 
			
		||||
          separate <a href="http://libvirt.org/git/?p=libvirt-python.git">package</a>
 | 
			
		||||
          since version 1.2.0, older versions came with direct support for the
 | 
			
		||||
          Python language.
 | 
			
		||||
        </p>
 | 
			
		||||
@@ -70,7 +66,7 @@
 | 
			
		||||
      </li>
 | 
			
		||||
      <li>
 | 
			
		||||
        <strong>Ruby</strong>: Chris Lalancette develops
 | 
			
		||||
        <a href="https://libvirt.org/ruby/">Ruby bindings</a>.
 | 
			
		||||
        <a href="http://libvirt.org/ruby/">Ruby bindings</a>.
 | 
			
		||||
      </li>
 | 
			
		||||
    </ul>
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<browserconfig>
 | 
			
		||||
    <msapplication>
 | 
			
		||||
        <tile>
 | 
			
		||||
            <square150x150logo src="/mstile-150x150.png"/>
 | 
			
		||||
            <TileColor>#b91d47</TileColor>
 | 
			
		||||
        </tile>
 | 
			
		||||
    </msapplication>
 | 
			
		||||
</browserconfig>
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<!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>
 | 
			
		||||
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
 | 
			
		||||
    <ul id="toc"></ul>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="security">Security Issues</a></h2>
 | 
			
		||||
    <h2><a name="security">Security Issues</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      If you think that an issue with libvirt may have security
 | 
			
		||||
@@ -19,7 +19,7 @@
 | 
			
		||||
      <a href="securityprocess.html">security process</a> instead.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="bugzilla">Bug Tracking</a></h2>
 | 
			
		||||
    <h2><a name="bugzilla">Bug Tracking</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      If you are using libvirt binaries from a Linux distribution
 | 
			
		||||
@@ -27,7 +27,7 @@
 | 
			
		||||
      first.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="general">General libvirt bug reports</a></h2>
 | 
			
		||||
    <h2><a name="general">General libvirt bug reports</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      The <a href="http://bugzilla.redhat.com">Red Hat Bugzilla Server</a>
 | 
			
		||||
@@ -69,7 +69,7 @@
 | 
			
		||||
      <li><a href="http://bugzilla.redhat.com/bugzilla/enter_bug.cgi?product=Virtualization%20Tools&component=libvirt">New libvirt ticket</a></li>
 | 
			
		||||
    </ul>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="distribution">Linux Distribution specific bug reports</a></h2>
 | 
			
		||||
    <h2><a name="distribution">Linux Distribution specific bug reports</a></h2>
 | 
			
		||||
    <ul>
 | 
			
		||||
      <li>
 | 
			
		||||
        If you are using binaries from <strong>Fedora</strong>, enter
 | 
			
		||||
@@ -107,7 +107,7 @@
 | 
			
		||||
    </ul>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <h2><a id="quality">How to file high quality bug reports</a></h2>
 | 
			
		||||
    <h2><a name="quality">How to file high quality bug reports</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      To increase the likelihood of your bug report being addressed it is
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<!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>Control Groups Resource Management</h1>
 | 
			
		||||
@@ -11,7 +11,7 @@
 | 
			
		||||
      for applying resource management to their virtual machines and containers.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="requiredControllers">Required controllers</a></h2>
 | 
			
		||||
    <h2><a name="requiredControllers">Required controllers</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      The control groups filesystem supports multiple "controllers". By default
 | 
			
		||||
@@ -42,7 +42,7 @@
 | 
			
		||||
      which use them will cease to operate.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="currentLayout">Current cgroups layout</a></h2>
 | 
			
		||||
    <h2><a name="currentLayout">Current cgroups layout</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      As of libvirt 1.0.5 or later, the cgroups layout created by libvirt has been
 | 
			
		||||
@@ -63,14 +63,14 @@
 | 
			
		||||
      in two, one describing systemd hosts and the other non-systemd hosts.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <h3><a id="currentLayoutSystemd">Systemd cgroups integration</a></h3>
 | 
			
		||||
    <h3><a name="currentLayoutSystemd">Systemd cgroups integration</a></h3>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      On hosts which use systemd, each consumer maps to a systemd scope unit,
 | 
			
		||||
      while partitions map to a system slice unit.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <h4><a id="systemdScope">Systemd scope naming</a></h4>
 | 
			
		||||
    <h4><a name="systemdScope">Systemd scope naming</a></h4>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      The systemd convention is for the scope name of virtual machines / containers
 | 
			
		||||
@@ -83,7 +83,7 @@
 | 
			
		||||
      The scope names map directly to the cgroup directory names.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <h4><a id="systemdSlice">Systemd slice naming</a></h4>
 | 
			
		||||
    <h4><a name="systemdSlice">Systemd slice naming</a></h4>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      The systemd convention for slice naming is that a slice should include the
 | 
			
		||||
@@ -96,7 +96,7 @@
 | 
			
		||||
      by libvirt will be associated with <code>machine.slice</code> by default.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <h4><a id="systemdLayout">Systemd cgroup layout</a></h4>
 | 
			
		||||
    <h4><a name="systemdLayout">Systemd cgroup layout</a></h4>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      Given this, a possible systemd cgroups layout involving 3 qemu guests,
 | 
			
		||||
@@ -145,7 +145,7 @@ $ROOT
 | 
			
		||||
          +- machine-lxc\x2dcontainer3.scope
 | 
			
		||||
    </pre>
 | 
			
		||||
 | 
			
		||||
    <h3><a id="currentLayoutGeneric">Non-systemd cgroups layout</a></h3>
 | 
			
		||||
    <h3><a name="currentLayoutGeneric">Non-systemd cgroups layout</a></h3>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      On hosts which do not use systemd, each consumer has a corresponding cgroup
 | 
			
		||||
@@ -206,7 +206,7 @@ $ROOT
 | 
			
		||||
          +- container3.libvirt-lxc
 | 
			
		||||
    </pre>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="customPartiton">Using custom partitions</a></h2>
 | 
			
		||||
    <h2><a name="customPartiton">Using custom partitions</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      If there is a need to apply resource constraints to groups of
 | 
			
		||||
@@ -221,11 +221,11 @@ $ROOT
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <pre>
 | 
			
		||||
...
 | 
			
		||||
<resource>
 | 
			
		||||
  <partition>/machine/production</partition>
 | 
			
		||||
</resource>
 | 
			
		||||
...
 | 
			
		||||
  ...
 | 
			
		||||
  <resource>
 | 
			
		||||
    <partition>/machine/production</partition>
 | 
			
		||||
  </resource>
 | 
			
		||||
  ...
 | 
			
		||||
    </pre>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
@@ -255,7 +255,7 @@ $ROOT
 | 
			
		||||
      later in this document did not support customization per guest.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <h3><a id="createSystemd">Creating custom partitions (systemd)</a></h3>
 | 
			
		||||
    <h3><a name="createSystemd">Creating custom partitions (systemd)</a></h3>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      Given the XML config above, the admin on a systemd based host would
 | 
			
		||||
@@ -272,7 +272,7 @@ EOF
 | 
			
		||||
# systemctl start machine-testing.slice
 | 
			
		||||
    </pre>
 | 
			
		||||
 | 
			
		||||
    <h3><a id="createNonSystemd">Creating custom partitions (non-systemd)</a></h3>
 | 
			
		||||
    <h3><a name="createNonSystemd">Creating custom partitions (non-systemd)</a></h3>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      Given the XML config above, the admin on a non-systemd based host
 | 
			
		||||
@@ -291,7 +291,7 @@ EOF
 | 
			
		||||
  done
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="resourceAPIs">Resource management APIs/commands</a></h2>
 | 
			
		||||
    <h2><a name="resourceAPIs">Resource management APIs/commands</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      Since libvirt aims to provide an API which is portable across
 | 
			
		||||
@@ -354,7 +354,7 @@ swap_hard_limit: unlimited
 | 
			
		||||
      network interfaces.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="legacyLayout">Legacy cgroups layout</a></h2>
 | 
			
		||||
    <h2><a name="legacyLayout">Legacy cgroups layout</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      Prior to libvirt 1.0.5, the cgroups layout created by libvirt was different
 | 
			
		||||
 
 | 
			
		||||
@@ -1,21 +1,21 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<!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><a id="installation">libvirt Installation</a></h1>
 | 
			
		||||
    <h1><a name="installation">libvirt Installation</a></h1>
 | 
			
		||||
 | 
			
		||||
    <ul id="toc"></ul>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="compiling">Compiling a release tarball</a></h2>
 | 
			
		||||
    <h2><a name="compiling">Compiling a release tarball</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      libvirt uses the standard configure/make/install steps:
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <pre>
 | 
			
		||||
$ xz -c libvirt-x.x.x.tar.xz | tar xvf -
 | 
			
		||||
$ cd libvirt-x.x.x
 | 
			
		||||
$ ./configure</pre>
 | 
			
		||||
      $ xz -c libvirt-x.x.x.tar.xz | tar xvf -
 | 
			
		||||
      $ cd libvirt-x.x.x
 | 
			
		||||
      $ ./configure</pre>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      The <i>configure</i> script can be given options to change its default
 | 
			
		||||
@@ -28,7 +28,7 @@ $ ./configure</pre>
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <pre>
 | 
			
		||||
$ ./configure <i>--help</i></pre>
 | 
			
		||||
      $ ./configure <i>--help</i></pre>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      When you have determined which options you want to use (if any),
 | 
			
		||||
@@ -49,16 +49,16 @@ $ ./configure <i>--help</i></pre>
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <pre>
 | 
			
		||||
$ ./configure <i>[possible options]</i>
 | 
			
		||||
$ make
 | 
			
		||||
$ <b>sudo</b> <i>make install</i></pre>
 | 
			
		||||
      $ ./configure <i>[possible options]</i>
 | 
			
		||||
      $ make
 | 
			
		||||
      $ <b>sudo</b> <i>make install</i></pre>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      At this point you <b>may</b> have to run ldconfig or a similar utility
 | 
			
		||||
      to update your list of installed shared libs.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="building">Building from a GIT checkout</a></h2>
 | 
			
		||||
    <h2><a name="building">Building from a GIT checkout</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      The libvirt build process uses GNU autotools, so after obtaining a
 | 
			
		||||
@@ -91,7 +91,7 @@ $ <b>sudo</b> <i>make install</i></pre>
 | 
			
		||||
      drive or manual download, and run this any time libvirt.git
 | 
			
		||||
      updates the commit stored in the .gnulib submodule:</p>
 | 
			
		||||
    <pre>
 | 
			
		||||
$ GNULIB_SRCDIR=/path/to/gnulib ./autogen.sh --no-git
 | 
			
		||||
      $ GNULIB_SRCDIR=/path/to/gnulib ./autogen.sh --no-git
 | 
			
		||||
    </pre>
 | 
			
		||||
 | 
			
		||||
    <p>To build & install libvirt to your home
 | 
			
		||||
@@ -99,9 +99,9 @@ $ GNULIB_SRCDIR=/path/to/gnulib ./autogen.sh --no-git
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <pre>
 | 
			
		||||
$ ./autogen.sh --prefix=$HOME/usr
 | 
			
		||||
$ make
 | 
			
		||||
$ <b>sudo</b> make install</pre>
 | 
			
		||||
      $ ./autogen.sh --prefix=$HOME/usr
 | 
			
		||||
      $ make
 | 
			
		||||
      $ <b>sudo</b> make install</pre>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      Be aware though, that binaries built with a custom prefix will not
 | 
			
		||||
@@ -111,8 +111,8 @@ $ <b>sudo</b> make install</pre>
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <pre>
 | 
			
		||||
$ ./autogen.sh --system
 | 
			
		||||
$ make
 | 
			
		||||
      $ ./autogen.sh --system
 | 
			
		||||
      $ make
 | 
			
		||||
    </pre>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
@@ -123,9 +123,9 @@ $ make
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <pre>
 | 
			
		||||
$ su -
 | 
			
		||||
# service libvirtd stop  (or systemctl stop libvirtd.service)
 | 
			
		||||
# /home/to/your/checkout/daemon/libvirtd
 | 
			
		||||
      $ su -
 | 
			
		||||
      # service libvirtd stop  (or systemctl stop libvirtd.service)
 | 
			
		||||
      # /home/to/your/checkout/daemon/libvirtd
 | 
			
		||||
    </pre>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
@@ -134,7 +134,7 @@ $ su -
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <pre>
 | 
			
		||||
$ ./run ./tools/virsh ....
 | 
			
		||||
      $ ./run ./tools/virsh ....
 | 
			
		||||
    </pre>
 | 
			
		||||
  </body>
 | 
			
		||||
</html>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,12 +1,12 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<!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>Contacting the project contributors</h1>
 | 
			
		||||
    <h1>Contacting the development team</h1>
 | 
			
		||||
 | 
			
		||||
    <ul id="toc"></ul>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="security">Security Issues</a></h2>
 | 
			
		||||
    <h2><a name="security">Security Issues</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      If you think that an issue with libvirt may have security
 | 
			
		||||
@@ -18,13 +18,13 @@
 | 
			
		||||
      <a href="securityprocess.html">security process</a> instead.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="email">Mailing lists</a></h2>
 | 
			
		||||
    <h2><a name="email">Mailing lists</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      There are three mailing-lists:
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <dl class="mail">
 | 
			
		||||
    <dl>
 | 
			
		||||
      <dt><a href="https://www.redhat.com/mailman/listinfo/libvir-list">libvir-list@redhat.com</a> (for development)</dt>
 | 
			
		||||
      <dd>
 | 
			
		||||
        Archives at <a href="https://www.redhat.com/archives/libvir-list">https://www.redhat.com/archives/libvir-list</a>
 | 
			
		||||
@@ -95,7 +95,7 @@
 | 
			
		||||
      page.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="irc">IRC discussion</a></h2>
 | 
			
		||||
    <h2><a name="irc">IRC discussion</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      Some of the libvirt developers may be found on IRC on the <a href="http://oftc.net">OFTC IRC</a>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,142 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html xmlns="http://www.w3.org/1999/xhtml">
 | 
			
		||||
  <body>
 | 
			
		||||
    <h1>Contributing to libvirt</h1>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      This page provides guidance on how to contribute to the
 | 
			
		||||
      libvirt project
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <ul id="toc"></ul>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="skills">Contributions required</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      The libvirt project is always looking for new contributors to
 | 
			
		||||
      participate in ongoing activities. While code development is a
 | 
			
		||||
      major part of the project, assistance is needed in many other
 | 
			
		||||
      areas including documentation writing, bug triage, testing,
 | 
			
		||||
      application integration, website / wiki content management,
 | 
			
		||||
      translation, branding, social media and more. The only
 | 
			
		||||
      requirement is an interest in virtualization and desire to
 | 
			
		||||
      help.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      The following is a non-exhaustive list of areas in which
 | 
			
		||||
      people can contribute to libvirt. If you have ideas for
 | 
			
		||||
      other contributions feel free to follow them.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <ul>
 | 
			
		||||
      <li><strong>Software development</strong>. The core library / daemon (and
 | 
			
		||||
        thus the bulk of coding) is written in C, but there are
 | 
			
		||||
        language bindings written in Python, Perl, Java, Ruby,
 | 
			
		||||
        Php, OCaml and Go. There are also higher level wrappers
 | 
			
		||||
        mapping libvirt into other object frameworks, such GLib,
 | 
			
		||||
        CIM and SNMP. For those interested in working on the core parts of
 | 
			
		||||
        libvirt, the <a href="hacking.html">contributor guidelines</a> are
 | 
			
		||||
        mandatory reading</li>
 | 
			
		||||
      <li><strong>Translation</strong>. All the libvirt modules aim to support
 | 
			
		||||
        translations where appropriate. All translation is
 | 
			
		||||
        handling outside of the normal libvirt review process,
 | 
			
		||||
        using the <a href="http://fedora.zanata.org">Fedora
 | 
			
		||||
        instance</a> of the Zanata tool. Thus people wishing
 | 
			
		||||
        to contribute to translation should join the Fedora
 | 
			
		||||
        translation team</li>
 | 
			
		||||
      <li><strong>Documentation</strong>. There are docbook guides on various
 | 
			
		||||
        aspects of libvirt, particularly application development
 | 
			
		||||
        guides for the C library and Python, and a virsh command
 | 
			
		||||
        reference. There is thus scope for work by people who are
 | 
			
		||||
        familiar with using or developing against libvirt, to
 | 
			
		||||
        write further content for these guides. There is also a
 | 
			
		||||
        need for people to review existing content for copy editing
 | 
			
		||||
        and identifying gaps in the docs</li>
 | 
			
		||||
      <li><strong>Website / wiki curation</strong>. The bulk of the website is
 | 
			
		||||
        maintained in the primary GIT repository, while the wiki
 | 
			
		||||
        site uses mediawiki. In both cases there is a need for
 | 
			
		||||
        people to both write new content and curate existing
 | 
			
		||||
        content to identify outdated information, improve its
 | 
			
		||||
        organization and target gaps.</li>
 | 
			
		||||
      <li><strong>Testing</strong>. There are a number of tests suites that can run
 | 
			
		||||
        automated tests against libvirt. The coverage of the tests
 | 
			
		||||
        is never complete, so there is a need for people to create
 | 
			
		||||
        new test suites and / or provide environments to actually
 | 
			
		||||
        run the tests in a variety of deployment scenarios.</li>
 | 
			
		||||
      <li><strong>Code analysis</strong>. The libvirt project has access to the coverity
 | 
			
		||||
        tool to run static analysis against the codebase, however,
 | 
			
		||||
        there are other types of code analysis that can be useful.
 | 
			
		||||
        In particular fuzzing of the inputs can be very effective
 | 
			
		||||
        at identifying problematic edge cases.</li>
 | 
			
		||||
      <li><strong>Security handling</strong>. Downstream (operating system) vendors
 | 
			
		||||
        who distribute libvirt may wish to propose a person to
 | 
			
		||||
        be part of the security handling team, to get early access
 | 
			
		||||
        to information about forthcoming vulnerability fixes.</li>
 | 
			
		||||
      <li><strong>Evangalism</strong>. Work done by the project is of no benefit
 | 
			
		||||
        unless the (potential) user community knows that it
 | 
			
		||||
        exists. Thus it is critically important to the health
 | 
			
		||||
        and future growth of the project, that there are a people
 | 
			
		||||
        who evangalise the work created by the project. This can
 | 
			
		||||
        take many forms, writing blog posts (about usage of features,
 | 
			
		||||
        personal user experiances, areas for future work, and more),
 | 
			
		||||
        syndicating docs and blogs via social media, giving user
 | 
			
		||||
        group and/or conference talks about libvirt.</li>
 | 
			
		||||
      <li><strong>User assistance</strong>. Since documentation
 | 
			
		||||
        is never perfect, there are inevitably cases where users
 | 
			
		||||
        will struggle to attain a deployment goal they have, or
 | 
			
		||||
        run into trouble with managing an existing deployment.
 | 
			
		||||
        While some users may be able to contact a software vendor
 | 
			
		||||
        to obtain support, it is common to rely on community help
 | 
			
		||||
        forums such as <a href="contact.html#email">libvirt users
 | 
			
		||||
          mailing list</a>, or sites such as
 | 
			
		||||
        <a href="http://stackoverflow.com/questions/tagged/libvirt">stackoverflow.</a>
 | 
			
		||||
        People who are familiar with libvirt and have ability &
 | 
			
		||||
        desire to help other users are encouraged to participate in
 | 
			
		||||
        these help forums.</li>
 | 
			
		||||
    </ul>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="comms">Communication</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      For full details on contacting other project contributors
 | 
			
		||||
      read the <a href="contact.html">contact</a> page. There
 | 
			
		||||
      are two main channels that libvirt uses for communication
 | 
			
		||||
      between contributors:
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <h3><a id="email">Mailing lists</a></h3>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      The project has a number of
 | 
			
		||||
      <a href="contact.html#email">mailing lists</a> for
 | 
			
		||||
      general communication between contributors.
 | 
			
		||||
      In general any design discussions and review
 | 
			
		||||
      of contributions will take place on the mailing
 | 
			
		||||
      lists, so it is important for all contributors
 | 
			
		||||
      to follow the traffic.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <h3><a id="irc">Instant messaging / chat</a></h3>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      Contributors to libvirt are encouraged to join the
 | 
			
		||||
      <a href="contact.html#irc">IRC channel</a> used by
 | 
			
		||||
      the project, where they can have live conversations
 | 
			
		||||
      with others members.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="outreach">Student / outreach coding programs</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      Since 2016, the libvirt project directly participates as an
 | 
			
		||||
      organization in the <a href="http://wiki.libvirt.org/page/Google_Summer_of_Code_Ideas">Google Summer of Code program</a>. Prior to
 | 
			
		||||
      this the project had a number of students in the program
 | 
			
		||||
      via a joint application with the QEMU project. People are
 | 
			
		||||
      encouraged to look at both the libvirt and QEMU programs
 | 
			
		||||
      to identify potentially interesting projects to work on.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
  </body>
 | 
			
		||||
</html>
 | 
			
		||||
@@ -1,12 +1,12 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<!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>C# API bindings</h1>
 | 
			
		||||
 | 
			
		||||
    <ul id="toc"></ul>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="description">Description</a></h2>
 | 
			
		||||
    <h2><a name="description">Description</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      The C# libvirt bindings are a class library.  They use a Microsoft
 | 
			
		||||
@@ -19,7 +19,9 @@
 | 
			
		||||
      to libvirt.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="requirements">Requirements</a></h2>
 | 
			
		||||
    <p> </p>
 | 
			
		||||
 | 
			
		||||
    <h2><a name="requirements">Requirements</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      These bindings depend upon the libvirt libraries being installed.
 | 
			
		||||
@@ -29,8 +31,10 @@
 | 
			
		||||
      compiling libvirt for windows.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <p> </p>
 | 
			
		||||
 | 
			
		||||
<!-- 2010-10-19 JC: Commented out until we have C# tarballs to download
 | 
			
		||||
    <h2><a id="getting">Getting them</a></h2>
 | 
			
		||||
    <h2><a name="getting">Getting them</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      The latest versions of the libvirt C# bindings can be downloaded from:
 | 
			
		||||
@@ -38,15 +42,15 @@
 | 
			
		||||
 | 
			
		||||
    <ul>
 | 
			
		||||
      <li><a href="ftp://libvirt.org/libvirt/csharp/">libvirt.org FTP server</a></li>
 | 
			
		||||
      <li><a href="https://libvirt.org/sources/csharp/">libvirt.org HTTP server</a></li>
 | 
			
		||||
      <li><a href="http://libvirt.org/sources/csharp/">libvirt.org HTTP server</a></li>
 | 
			
		||||
    </ul>
 | 
			
		||||
-->
 | 
			
		||||
 | 
			
		||||
    <h2><a id="git">GIT source repository</a></h2>
 | 
			
		||||
    <h2><a name="git">GIT source repository</a></h2>
 | 
			
		||||
    <p>
 | 
			
		||||
      The C# bindings source code is maintained in a <a
 | 
			
		||||
      href="http://git-scm.com/">git</a> repository available on
 | 
			
		||||
      <a href="https://libvirt.org/git/">libvirt.org</a>:
 | 
			
		||||
      <a href="http://libvirt.org/git/">libvirt.org</a>:
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
<pre>
 | 
			
		||||
@@ -58,10 +62,12 @@ git clone git://libvirt.org/libvirt-csharp.git
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
<pre>
 | 
			
		||||
<a href="https://libvirt.org/git/?p=libvirt-csharp.git;a=summary">https://libvirt.org/git/?p=libvirt-csharp.git;a=summary</a>
 | 
			
		||||
<a href="http://libvirt.org/git/?p=libvirt-csharp.git;a=summary">http://libvirt.org/git/?p=libvirt-csharp.git;a=summary</a>
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="usage">Usage</a></h2>
 | 
			
		||||
    <p> </p>
 | 
			
		||||
 | 
			
		||||
    <h2><a name="usage">Usage</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      The libvirt C# bindings class library exposes the <b>Libvirt</b>
 | 
			
		||||
@@ -110,15 +116,19 @@ git clone git://libvirt.org/libvirt-csharp.git
 | 
			
		||||
      </li>
 | 
			
		||||
    </ul>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="authors">Authors</a></h2>
 | 
			
		||||
    <p> </p>
 | 
			
		||||
 | 
			
		||||
    <h2><a name="authors">Authors</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      The C# bindings are the work of Arnaud Champion
 | 
			
		||||
      <<a href="mailto:arnaud.champion AT devatom.fr">arnaud.champion AT devatom.fr</a>>,
 | 
			
		||||
      based upon the previous work of Jaromír Červenka.
 | 
			
		||||
      based upon the previous work of Jaromír Červenka.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="notes">Test Configuration</a></h2>
 | 
			
		||||
    <p> </p>
 | 
			
		||||
 | 
			
		||||
    <h2><a name="notes">Test Configuration</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      Testing is performed using the following configurations:
 | 
			
		||||
@@ -129,85 +139,87 @@ git clone git://libvirt.org/libvirt-csharp.git
 | 
			
		||||
      <li>Ubuntu 10.10 amd64 / Mono 2.6.7 (compiled in 64 bits)</li>
 | 
			
		||||
    </ul>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="type">Type Coverage</a></h2>
 | 
			
		||||
    <p> </p>
 | 
			
		||||
 | 
			
		||||
    <h2><a name="type">Type Coverage</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      Coverage of the libvirt types is:
 | 
			
		||||
    </p>
 | 
			
		||||
    <table class="top_table">
 | 
			
		||||
      <tr><th>Type</th><th>Name</th><th>Binding?</th><th>Tested?</th><th>Sample Code?</th><th>Works?</th><th>Tested .Net/Windows Works?</th><th>Tested Mono (32-bit)/Windows Works?</th><th>Tested Mono (64-bit)/Linux Works?</th></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virCPUCompareResult</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>struct</td><td>virConnect</td><td>Yes, an IntPtr as the struct is not public</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virCPUCompareResult</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>struct</td><td>virConnect</td><td>Yes, an IntPtr as the struct is not public</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>struct</td><td>virConnectAuth</td><td>Yes</td><td>Yes</td><td>virConnectOpenAuth</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
 | 
			
		||||
      <tr><td>struct</td><td>virConnectCredential</td><td>Yes</td><td>Yes</td><td>virConnectOpenAuth</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virConnectCredentialType</td><td>Yes</td><td>Yes</td><td>virConnectOpenAuth</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virConnectFlags</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>struct</td><td>virDomain</td><td>Yes, an IntPtr as the struct is not public</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>struct</td><td>virDomainBlockInfo</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virConnectFlags</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>struct</td><td>virDomain</td><td>Yes, an IntPtr as the struct is not public</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>struct</td><td>virDomainBlockInfo</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>struct</td><td>virDomainBlockStatsInfo</td><td>Yes</td><td>Yes</td><td>virDomainStats</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virDomainCoreDumpFlags</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virDomainCreateFlags</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virDomainDeviceModifyFlags</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virDomainCoreDumpFlags</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virDomainCreateFlags</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virDomainDeviceModifyFlags</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virDomainEventDefinedDetailType</td><td>Yes</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
 | 
			
		||||
      <tr><td>struct</td><td>virDomainEventGraphicsAddress</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virDomainEventGraphicsAddressType</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virDomainEventGraphicsPhase</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>struct</td><td>virDomainEventGraphicsSubject</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>struct</td><td>virDomainEventGraphicsSubjectIdentity</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virDomainEventID</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virDomainEventIOErrorAction</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>struct</td><td>virDomainEventGraphicsAddress</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virDomainEventGraphicsAddressType</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virDomainEventGraphicsPhase</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>struct</td><td>virDomainEventGraphicsSubject</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>struct</td><td>virDomainEventGraphicsSubjectIdentity</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virDomainEventID</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virDomainEventIOErrorAction</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virDomainEventResumedDetailType</td><td>Yes</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virDomainEventStartedDetailType</td><td>Yes</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virDomainEventStoppedDetailType</td><td>Yes</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virDomainEventSuspendedDetailType</td><td>Yes</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virDomainEventType</td><td>Yes</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virDomainEventUndefinedDetailType</td><td>Yes</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virDomainEventWatchdogAction</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virDomainEventWatchdogAction</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>struct</td><td>virDomainInfo</td><td>Yes</td><td>Yes</td><td>virConnectSetErrorFunc, virDomainStats</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
 | 
			
		||||
      <tr><td>struct</td><td>virDomainInterfaceStatsStruct</td><td>Yes</td><td>Yes</td><td>virDomainStats</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
 | 
			
		||||
      <tr><td>struct</td><td>virDomainJobInfo</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virDomainJobType</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virDomainMemoryFlags</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>struct</td><td>virDomainMemoryStatStruct</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virDomainMemoryStatTags</td><td>Yes</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virDomainMigrateFlags</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>struct</td><td>virDomainSnapshot</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virDomainSnapshotDeleteFlags</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virDomainState</td><td>Yes</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virDomainXMLFlags</td><td>Yes</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>struct</td><td>virDomainJobInfo</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virDomainJobType</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virDomainMemoryFlags</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>struct</td><td>virDomainMemoryStatStruct</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virDomainMemoryStatTags</td><td>Yes</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virDomainMigrateFlags</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>struct</td><td>virDomainSnapshot</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virDomainSnapshotDeleteFlags</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virDomainState</td><td>Yes</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virDomainXMLFlags</td><td>Yes</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virEventHandleType</td><td>Yes</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
 | 
			
		||||
      <tr><td>struct</td><td>virInterface</td><td>Yes, an IntPtr as the struct is not public</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virInterfaceXMLFlags</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>struct</td><td>virNWFilter</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>struct</td><td>virNetwork</td><td>Yes, an IntPtr as the struct is not public</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>struct</td><td>virNodeDevice</td><td>Yes, an IntPtr as the struct is not public</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>struct</td><td>virNodeInfo</td><td>Yes</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>struct</td><td>virSchedParameter</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virSchedParameterType</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>struct</td><td>virSecret</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virSecretUsageType</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>struct</td><td>virSecurityLabel</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>struct</td><td>virSecurityModel</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virStoragePoolBuildFlags</td><td>Yes</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virStoragePoolDeleteFlags</td><td>Yes</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>struct</td><td>virStoragePoolInfo</td><td>Yes</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>struct</td><td>virStoragePool</td><td>Yes, an IntPtr as the struct is not public</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virStoragePoolState</td><td>Yes</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>struct</td><td>virStorageVol</td><td>Yes, an IntPtr as the struct is not public</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virStorageVolDeleteFlags</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>struct</td><td>virStorageVolInfo</td><td>Yes</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virStorageVolType</td><td>Yes</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>struct</td><td>virStream</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virStreamEventType</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virStreamFlags</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>struct</td><td>virVcpuInfo</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virVcpuState</td><td>No</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>struct</td><td>virInterface</td><td>Yes, an IntPtr as the struct is not public</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virInterfaceXMLFlags</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>struct</td><td>virNWFilter</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>struct</td><td>virNetwork</td><td>Yes, an IntPtr as the struct is not public</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>struct</td><td>virNodeDevice</td><td>Yes, an IntPtr as the struct is not public</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>struct</td><td>virNodeInfo</td><td>Yes</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>struct</td><td>virSchedParameter</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virSchedParameterType</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>struct</td><td>virSecret</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virSecretUsageType</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>struct</td><td>virSecurityLabel</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>struct</td><td>virSecurityModel</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virStoragePoolBuildFlags</td><td>Yes</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virStoragePoolDeleteFlags</td><td>Yes</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>struct</td><td>virStoragePoolInfo</td><td>Yes</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>struct</td><td>virStoragePool</td><td>Yes, an IntPtr as the struct is not public</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virStoragePoolState</td><td>Yes</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>struct</td><td>virStorageVol</td><td>Yes, an IntPtr as the struct is not public</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virStorageVolDeleteFlags</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>struct</td><td>virStorageVolInfo</td><td>Yes</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virStorageVolType</td><td>Yes</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>struct</td><td>virStream</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virStreamEventType</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virStreamFlags</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>struct</td><td>virVcpuInfo</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>enum</td><td>virVcpuState</td><td>No</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>struct</td><td>virError</td><td>Yes</td><td>Yes</td><td>virConnectSetErrorFunc, virDomainStats</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
 | 
			
		||||
    </table>
 | 
			
		||||
 | 
			
		||||
    <p></p>
 | 
			
		||||
    <p> </p>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="funccover">Function Coverage</a></h2>
 | 
			
		||||
    <h2><a name="funccover">Function Coverage</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      Coverage of the libvirt functions is:
 | 
			
		||||
@@ -215,274 +227,274 @@ git clone git://libvirt.org/libvirt-csharp.git
 | 
			
		||||
    <table class="top_table">
 | 
			
		||||
      <tr><th>Name</th><th>Binding?</th><th>Type?</th><th>Tested?</th><th>Sample Code?</th><th>Working?</th><th>Tested .Net/Windows Works?</th><th>Tested Mono (32-bit)/Windows Works?</th><th>Tested Mono (64-bit)/Linux Works?</th></tr>
 | 
			
		||||
      <tr><td>virConnectAuthCallback</td><td>Yes</td><td>delegate</td><td>Yes</td><td>virConnectOpenAuth</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
 | 
			
		||||
      <tr><td>virConnectBaselineCPU</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virConnectBaselineCPU</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virConnectClose</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectOpenAuth</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
 | 
			
		||||
      <tr><td>virConnectCompareCPU</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virConnectDomainEventCallback</td><td>Yes</td><td>delegate</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virConnectDomainEventDeregister</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virConnectDomainEventDeregisterAny</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virConnectDomainEventGenericCallback</td><td>No</td><td>delegate</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virConnectDomainEventGraphicsCallback</td><td>No</td><td>delegate</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virConnectDomainEventIOErrorCallback</td><td>No</td><td>delegate</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virConnectDomainEventIOErrorReasonCallback</td><td>No</td><td>delegate</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virConnectDomainEventRTCChangeCallback</td><td>No</td><td>delegate</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virConnectCompareCPU</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virConnectDomainEventCallback</td><td>Yes</td><td>delegate</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virConnectDomainEventDeregister</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virConnectDomainEventDeregisterAny</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virConnectDomainEventGenericCallback</td><td>No</td><td>delegate</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virConnectDomainEventGraphicsCallback</td><td>No</td><td>delegate</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virConnectDomainEventIOErrorCallback</td><td>No</td><td>delegate</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virConnectDomainEventIOErrorReasonCallback</td><td>No</td><td>delegate</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virConnectDomainEventRTCChangeCallback</td><td>No</td><td>delegate</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virConnectDomainEventRegister</td><td>Yes</td><td>function</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
 | 
			
		||||
      <tr><td>virConnectDomainEventRegisterAny</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virConnectDomainEventWatchdogCallback</td><td>No</td><td>delegate</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virConnectDomainXMLFromNative</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virConnectDomainXMLToNative</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virConnectFindStoragePoolSources</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virConnectGetCapabilities</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virConnectGetHostname</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virConnectGetLibVersion</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virConnectGetMaxVcpus</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virConnectGetType</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virConnectGetURI</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virConnectGetVersion</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virConnectIsEncrypted</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virConnectIsSecure</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virConnectDomainEventRegisterAny</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virConnectDomainEventWatchdogCallback</td><td>No</td><td>delegate</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virConnectDomainXMLFromNative</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virConnectDomainXMLToNative</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virConnectFindStoragePoolSources</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virConnectGetCapabilities</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virConnectGetHostname</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virConnectGetLibVersion</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virConnectGetMaxVcpus</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virConnectGetType</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virConnectGetURI</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virConnectGetVersion</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virConnectIsEncrypted</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virConnectIsSecure</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virConnectListDefinedDomains</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectOpenAuth</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
 | 
			
		||||
      <tr><td>virConnectListDefinedInterfaces </td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virConnectListDefinedNetworks</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virConnectListDefinedStoragePools</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virConnectListDefinedInterfaces </td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virConnectListDefinedNetworks</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virConnectListDefinedStoragePools</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virConnectListDomains</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectOpenAuth, virDomainInfos</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
 | 
			
		||||
      <tr><td>virConnectListInterfaces</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes, if the host handle the method</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virConnectListNWFilters </td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virConnectListNetworks</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virConnectListSecrets</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virConnectListInterfaces</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes, if the host handle the method</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virConnectListNWFilters </td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virConnectListNetworks</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virConnectListSecrets</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virConnectListStoragePools</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectOpen</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
 | 
			
		||||
      <tr><td>virConnectNumOfDefinedDomains</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectOpenAuth</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
 | 
			
		||||
      <tr><td>virConnectNumOfDefinedInterfaces</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virConnectNumOfDefinedNetworks</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virConnectNumOfDefinedStoragePools</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virConnectNumOfDefinedInterfaces</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virConnectNumOfDefinedNetworks</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virConnectNumOfDefinedStoragePools</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virConnectNumOfDomains</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectOpenAuth, virDomainInfos</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
 | 
			
		||||
      <tr><td>virConnectNumOfInterfaces</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virConnectNumOfNWFilters</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virConnectNumOfNetworks </td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virConnectNumOfSecrets</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virConnectNumOfInterfaces</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virConnectNumOfNWFilters</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virConnectNumOfNetworks </td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virConnectNumOfSecrets</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virConnectNumOfStoragePools</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectOpen</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
 | 
			
		||||
      <tr><td>virConnectOpen</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectOpen, virEventRegisterImpl, virDomainInfos</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
 | 
			
		||||
      <tr><td>virConnectOpenAuth</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectOpenAuth</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
 | 
			
		||||
      <tr><td>virConnectOpenReadOnly</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virConnectRef</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainAbortJob</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainAttachDevice</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainAttachDeviceFlags</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainBlockPeek</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virConnectOpenReadOnly</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virConnectRef</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainAbortJob</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainAttachDevice</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainAttachDeviceFlags</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainBlockPeek</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainBlockStats</td><td>Yes</td><td>function</td><td>Yes</td><td>virDomainInfos</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
 | 
			
		||||
      <tr><td>virDomainCoreDump</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainCreate</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainCreateLinux</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainCreateWithFlags</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainCreateXML</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainDefineXML</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainDestroy</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainDetachDevice</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainDetachDeviceFlags</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainFree</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainGetAutostart</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainGetBlockInfo</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainGetConnect</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainGetID</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainCoreDump</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainCreate</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainCreateLinux</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainCreateWithFlags</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainCreateXML</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainDefineXML</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainDestroy</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainDetachDevice</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainDetachDeviceFlags</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainFree</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainGetAutostart</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainGetBlockInfo</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainGetConnect</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainGetID</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainGetInfo</td><td>Yes</td><td>function</td><td>Yes</td><td>virDomainInfos</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
 | 
			
		||||
      <tr><td>virDomainGetJobInfo</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainGetMaxMemory</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainGetMaxVcpus</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainGetJobInfo</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainGetMaxMemory</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainGetMaxVcpus</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainGetName</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectOpenAuth, virDomainInfos</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
 | 
			
		||||
      <tr><td>virDomainGetOSType</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainGetSchedulerParameters</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainGetSchedulerType</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainGetSecurityLabel</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainGetUUID</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainGetUUIDString</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainGetVcpus</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainGetOSType</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainGetSchedulerParameters</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainGetSchedulerType</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainGetSecurityLabel</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainGetUUID</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainGetUUIDString</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainGetVcpus</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainGetXMLDesc</td><td>Yes</td><td>function</td><td>Yes</td><td>virDomainInfos</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
 | 
			
		||||
      <tr><td>virDomainHasCurrentSnapshot</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainHasManagedSaveImage</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainHasCurrentSnapshot</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainHasManagedSaveImage</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainInterfaceStats </td><td>No</td><td>function</td><td>Yes</td><td>virDomainInfos</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
 | 
			
		||||
      <tr><td>virDomainIsActive</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainIsPersistent</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainIsActive</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainIsPersistent</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainLookupByID</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectOpenAuth, virDomainInfos</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
 | 
			
		||||
      <tr><td>virDomainLookupByName</td><td>Yes</td><td>function</td><td>Yes</td><td>virDomainInfos</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
 | 
			
		||||
      <tr><td>virDomainLookupByUUID</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainLookupByUUIDString</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainManagedSave    </td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainManagedSaveRemove</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainMemoryPeek</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainMemoryStats</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainMigrate</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainMigrateSetMaxDowntime</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainMigrateToURI   </td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainPinVcpu</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainReboot</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainRef    </td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainRestore</td><td>Yes </td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainResume </td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainRevertToSnapshot</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainSave</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainSetAutostart</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainSetMaxMemory   </td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainSetMemory</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainSetSchedulerParameters</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainSetVcpus</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainShutdown</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainSnapshotCreateXML</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainSnapshotCurrent</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainSnapshotDelete</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainSnapshotFree</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainSnapshotGetXMLDesc</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainSnapshotListNames</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainSnapshotLookupByName</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainSnapshotNum</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainSuspend</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainUndefine</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainUpdateDeviceFlags</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virEventAddHandleFunc</td><td>Yes</td><td>delegate</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virEventAddTimeoutFunc</td><td>Yes</td><td>delegate</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virDomainLookupByUUID</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainLookupByUUIDString</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainManagedSave    </td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainManagedSaveRemove</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainMemoryPeek</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainMemoryStats</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainMigrate</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainMigrateSetMaxDowntime</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainMigrateToURI   </td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainPinVcpu</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainReboot</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainRef    </td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainRestore</td><td>Yes </td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainResume </td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainRevertToSnapshot</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainSave</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainSetAutostart</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainSetMaxMemory   </td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainSetMemory</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainSetSchedulerParameters</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainSetVcpus</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainShutdown</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainSnapshotCreateXML</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainSnapshotCurrent</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainSnapshotDelete</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainSnapshotFree</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainSnapshotGetXMLDesc</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainSnapshotListNames</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainSnapshotLookupByName</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainSnapshotNum</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainSuspend</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainUndefine</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virDomainUpdateDeviceFlags</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virEventAddHandleFunc</td><td>Yes</td><td>delegate</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virEventAddTimeoutFunc</td><td>Yes</td><td>delegate</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virEventHandleCallback</td><td>Yes</td><td>delegate</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
 | 
			
		||||
      <tr><td>virEventRegisterImpl</td><td>Yes</td><td>function</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
 | 
			
		||||
      <tr><td>virEventRemoveHandleFunc</td><td>Yes</td><td>delegate</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virEventRemoveTimeoutFunc</td><td>Yes</td><td>delegate</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virEventRemoveHandleFunc</td><td>Yes</td><td>delegate</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virEventRemoveTimeoutFunc</td><td>Yes</td><td>delegate</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virEventTimeoutCallback</td><td>Yes</td><td>delegate</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
 | 
			
		||||
      <tr><td>virEventUpdateHandleFunc</td><td>Yes</td><td>delegate</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virEventUpdateTimeoutFunc</td><td>Yes</td><td>delegate</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virEventUpdateHandleFunc</td><td>Yes</td><td>delegate</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virEventUpdateTimeoutFunc</td><td>Yes</td><td>delegate</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virFreeCallback</td><td>Yes</td><td>function</td><td>Yes</td><td>virEventRegisterImpl</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
 | 
			
		||||
      <tr><td>virGetVersion</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virInitialize</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virInterfaceCreate</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virInterfaceDefineXML</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virInterfaceDestroy</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virInterfaceFree</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virInterfaceGetConnect</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virInterfaceGetMACString</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virInterfaceGetName</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virInterfaceGetXMLDesc</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virInterfaceIsActive</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virInterfaceLookupByMACString</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virInterfaceLookupByName</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virInterfaceRef </td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virInterfaceUndefine</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virNWFilterDefineXML</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virNWFilterFree</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virNWFilterGetName</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virNWFilterGetUUID</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virNWFilterGetUUIDString</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virNWFilterGetXMLDesc</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virNWFilterLookupByName </td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virNWFilterLookupByUUID</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virNWFilterLookupByUUIDString</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virNWFilterRef  </td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virNWFilterUndefine</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virNetworkCreate</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virNetworkCreateXML</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virNetworkDefineXML</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virNetworkDestroy</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virNetworkFree</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virNetworkGetAutostart</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virNetworkGetBridgeName</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virNetworkGetConnect</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virNetworkGetName</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virNetworkGetUUID</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virNetworkGetUUIDString </td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virNetworkGetXMLDesc</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virNetworkIsActive</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virNetworkIsPersistent</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virNetworkLookupByName</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virNetworkLookupByUUID</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virNetworkLookupByUUIDString</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virNetworkRef</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virNetworkSetAutostart</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virNetworkUndefine</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virNodeDeviceCreateXML</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virNodeDeviceDestroy</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virNodeDeviceDettach</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virNodeDeviceFree</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virNodeDeviceGetName</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virNodeDeviceGetParent</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virNodeDeviceGetXMLDesc</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virNodeDeviceListCaps</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virNodeDeviceLookupByName</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virNodeDeviceNumOfCaps</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virNodeDeviceReAttach</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virNodeDeviceRef</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virNodeDeviceReset</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virNodeGetCellsFreeMemory</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virNodeGetFreeMemory</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virNodeGetInfo</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virNodeGetSecurityModel </td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virNodeListDevices</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virNodeNumOfDevices</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virSecretDefineXML</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virSecretFree   </td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virSecretGetConnect</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virSecretGetUUID</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virSecretGetUUIDString  </td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virSecretGetUsageID</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virSecretGetUsageType</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virSecretGetValue</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virSecretGetXMLDesc</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virSecretLookupByUUID</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virSecretLookupByUUIDString</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virSecretLookupByUsage</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virSecretRef</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virSecretSetValue</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virSecretUndefine</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virStoragePoolBuild</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virStoragePoolCreate</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virStoragePoolCreateXML </td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virStoragePoolDefineXML</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virStoragePoolDelete</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virStoragePoolDestroy</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virStoragePoolFree</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virStoragePoolGetAutostart</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virStoragePoolGetConnect</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virStoragePoolGetInfo</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virStoragePoolGetName</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virStoragePoolGetUUID</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virStoragePoolGetUUIDString</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virStoragePoolGetXMLDesc</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virStoragePoolIsActive</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virStoragePoolIsPersistent</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virStoragePoolListVolumes</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virStoragePoolLookupByName</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virStoragePoolLookupByUUID</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virStoragePoolLookupByUUIDString</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virStoragePoolLookupByVolume</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virStoragePoolNumOfVolumes</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virStoragePoolRef</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virStoragePoolRefresh</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virStoragePoolSetAutostart</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virStoragePoolUndefine</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virStorageVolCreateXML</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virStorageVolCreateXMLFrom</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virStorageVolDelete</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virStorageVolFree</td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virStorageVolGetConnect  </td><td>Yes</td><td>function</td><td>No</td><td></td><td>Maybe</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virStorageVolGetInfo</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virStorageVolGetKey</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virStorageVolGetName</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virStorageVolGetPath</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virStorageVolGetXMLDesc </td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virStorageVolLookupByKey</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virStorageVolLookupByName</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virStorageVolLookupByPath</td><td>Yes</td><td>function</td><td>Yes</td><td></td><td>Yes</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virStorageVolRef</td><td>Yes</td><td>function</td><td>No</td><td></td><td>No</td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virStorageVolWipe</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virStreamAbort  </td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virStreamEventAddCallback</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virStreamEventCallback</td><td>No</td><td>delegate</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virStreamEventRemoveCallback</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virStreamEventUpdateCallback</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virStreamFinish </td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virStreamFree   </td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virStreamNew</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virStreamRecv</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virStreamRecvAll</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virStreamRef</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virStreamSend</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virStreamSendAll</td><td>No</td><td>function</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virStreamSinkFunc</td><td>No</td><td>delegate</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virStreamSourceFunc</td><td>No</td><td>delegate</td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
 | 
			
		||||
      <tr><td>virGetVersion</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virInitialize</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virInterfaceCreate</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virInterfaceDefineXML</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virInterfaceDestroy</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virInterfaceFree</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virInterfaceGetConnect</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virInterfaceGetMACString</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virInterfaceGetName</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virInterfaceGetXMLDesc</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virInterfaceIsActive</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virInterfaceLookupByMACString</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virInterfaceLookupByName</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virInterfaceRef </td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virInterfaceUndefine</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virNWFilterDefineXML</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virNWFilterFree</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virNWFilterGetName</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virNWFilterGetUUID</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virNWFilterGetUUIDString</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virNWFilterGetXMLDesc</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virNWFilterLookupByName </td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virNWFilterLookupByUUID</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virNWFilterLookupByUUIDString</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virNWFilterRef  </td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virNWFilterUndefine</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virNetworkCreate</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virNetworkCreateXML</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virNetworkDefineXML</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virNetworkDestroy</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virNetworkFree</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virNetworkGetAutostart</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virNetworkGetBridgeName</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virNetworkGetConnect</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virNetworkGetName</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virNetworkGetUUID</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virNetworkGetUUIDString </td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virNetworkGetXMLDesc</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virNetworkIsActive</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virNetworkIsPersistent</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virNetworkLookupByName</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virNetworkLookupByUUID</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virNetworkLookupByUUIDString</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virNetworkRef</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virNetworkSetAutostart</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virNetworkUndefine</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virNodeDeviceCreateXML</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virNodeDeviceDestroy</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virNodeDeviceDettach</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virNodeDeviceFree</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virNodeDeviceGetName</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virNodeDeviceGetParent</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virNodeDeviceGetXMLDesc</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virNodeDeviceListCaps</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virNodeDeviceLookupByName</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virNodeDeviceNumOfCaps</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virNodeDeviceReAttach</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virNodeDeviceRef</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virNodeDeviceReset</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virNodeGetCellsFreeMemory</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virNodeGetFreeMemory</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virNodeGetInfo</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virNodeGetSecurityModel </td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virNodeListDevices</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virNodeNumOfDevices</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virSecretDefineXML</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virSecretFree   </td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virSecretGetConnect</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virSecretGetUUID</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virSecretGetUUIDString  </td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virSecretGetUsageID</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virSecretGetUsageType</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virSecretGetValue</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virSecretGetXMLDesc</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virSecretLookupByUUID</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virSecretLookupByUUIDString</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virSecretLookupByUsage</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virSecretRef</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virSecretSetValue</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virSecretUndefine</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virStoragePoolBuild</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virStoragePoolCreate</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virStoragePoolCreateXML </td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virStoragePoolDefineXML</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virStoragePoolDelete</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virStoragePoolDestroy</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virStoragePoolFree</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virStoragePoolGetAutostart</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virStoragePoolGetConnect</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virStoragePoolGetInfo</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virStoragePoolGetName</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virStoragePoolGetUUID</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virStoragePoolGetUUIDString</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virStoragePoolGetXMLDesc</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virStoragePoolIsActive</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virStoragePoolIsPersistent</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virStoragePoolListVolumes</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virStoragePoolLookupByName</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virStoragePoolLookupByUUID</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virStoragePoolLookupByUUIDString</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virStoragePoolLookupByVolume</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virStoragePoolNumOfVolumes</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virStoragePoolRef</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virStoragePoolRefresh</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virStoragePoolSetAutostart</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virStoragePoolUndefine</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virStorageVolCreateXML</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virStorageVolCreateXMLFrom</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virStorageVolDelete</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virStorageVolFree</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virStorageVolGetConnect  </td><td>Yes</td><td>function</td><td>No</td><td> </td><td>Maybe</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virStorageVolGetInfo</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virStorageVolGetKey</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virStorageVolGetName</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virStorageVolGetPath</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virStorageVolGetXMLDesc </td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virStorageVolLookupByKey</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virStorageVolLookupByName</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virStorageVolLookupByPath</td><td>Yes</td><td>function</td><td>Yes</td><td> </td><td>Yes</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virStorageVolRef</td><td>Yes</td><td>function</td><td>No</td><td> </td><td>No</td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virStorageVolWipe</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virStreamAbort  </td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virStreamEventAddCallback</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virStreamEventCallback</td><td>No</td><td>delegate</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virStreamEventRemoveCallback</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virStreamEventUpdateCallback</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virStreamFinish </td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virStreamFree   </td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virStreamNew</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virStreamRecv</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virStreamRecvAll</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virStreamRef</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virStreamSend</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virStreamSendAll</td><td>No</td><td>function</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virStreamSinkFunc</td><td>No</td><td>delegate</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virStreamSourceFunc</td><td>No</td><td>delegate</td><td> </td><td> </td><td> </td><td> </td><td> </td><td> </td></tr>
 | 
			
		||||
      <tr><td>virGetLastError</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectSetErrorFunc</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
 | 
			
		||||
      <tr><td>virConnSetErrorFunc</td><td>Yes</td><td>function</td><td>Yes</td><td>virConnectSetErrorFunc</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
 | 
			
		||||
      <tr><td>virErrorFunc</td><td>Yes</td><td>delegate</td><td>Yes</td><td>virConnectSetErrorFunc, virDomainInfos</td><td>Yes</td><td>Yes</td><td>Yes</td><td>Yes</td></tr>
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										50
									
								
								docs/deployment.html.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								docs/deployment.html.in
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,50 @@
 | 
			
		||||
<?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>Deployment</h1>
 | 
			
		||||
 | 
			
		||||
    <ul id="toc"></ul>
 | 
			
		||||
 | 
			
		||||
    <h2><a name="packages">Pre-packaged releases</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      The libvirt API is now available in all major Linux distributions,
 | 
			
		||||
      so the simplest deployment approach is to use your distributions'
 | 
			
		||||
      package management software to install the <code>libvirt</code>
 | 
			
		||||
      module.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <h2><a name="tarball">Self-built releases</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      libvirt uses GNU autotools for its build system, so deployment
 | 
			
		||||
      follows the usual process of <code>configure; make ; make install</code>
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <pre>
 | 
			
		||||
 | 
			
		||||
      # ./configure --prefix=$HOME/usr
 | 
			
		||||
      # make
 | 
			
		||||
      # make install
 | 
			
		||||
    </pre>
 | 
			
		||||
 | 
			
		||||
    <h2><a name="git">Built from GIT</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      When building from GIT it is necessary to generate the autotools
 | 
			
		||||
      support files. This requires having <code>autoconf</code>,
 | 
			
		||||
      <code>automake</code>, <code>libtool</code> and <code>intltool</code>
 | 
			
		||||
      installed. The process can be automated with the <code>autogen.sh</code>
 | 
			
		||||
      script.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <pre>
 | 
			
		||||
 | 
			
		||||
      # ./autogen.sh --prefix=$HOME/usr
 | 
			
		||||
      # make
 | 
			
		||||
      # make install
 | 
			
		||||
    </pre>
 | 
			
		||||
 | 
			
		||||
  </body>
 | 
			
		||||
</html>
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<!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 Application Development Guides</h1>
 | 
			
		||||
@@ -12,10 +12,10 @@
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <ul>
 | 
			
		||||
      <li><a href="https://libvirt.org/docs/libvirt-appdev-guide/en-US/html/">Application Development Guide (C language) HTML</a></li>
 | 
			
		||||
      <li><a href="https://libvirt.org/docs/libvirt-appdev-guide/en-US/pdf/">Application Development Guide (C language) PDF</a></li>
 | 
			
		||||
      <li><a href="https://libvirt.org/docs/libvirt-appdev-guide-python/en-US/html/">Application Development Guide (Python language) HTML</a></li>
 | 
			
		||||
      <li><a href="https://libvirt.org/docs/libvirt-appdev-guide-python/en-US/pdf/">Application Development Guide (Python language) PDF</a></li>
 | 
			
		||||
      <li><a href="http://libvirt.org/docs/libvirt-appdev-guide/en-US/html/">Application Development Guide (C language) HTML</a></li>
 | 
			
		||||
      <li><a href="http://libvirt.org/docs/libvirt-appdev-guide/en-US/pdf/">Application Development Guide (C language) PDF</a></li>
 | 
			
		||||
      <li><a href="http://libvirt.org/docs/libvirt-appdev-guide-python/en-US/html/">Application Development Guide (Python language) HTML</a></li>
 | 
			
		||||
      <li><a href="http://libvirt.org/docs/libvirt-appdev-guide-python/en-US/pdf/">Application Development Guide (Python language) PDF</a></li>
 | 
			
		||||
    </ul>
 | 
			
		||||
 | 
			
		||||
    <h2>Contributing content</h2>
 | 
			
		||||
@@ -28,14 +28,14 @@
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <pre>
 | 
			
		||||
# C language
 | 
			
		||||
$ git clone <a href="https://libvirt.org/git/?p=libvirt-appdev-guide.git">git://libvirt.org/libvirt-appdev-guide.git</a>
 | 
			
		||||
      # C language
 | 
			
		||||
      $ git clone <a href="http://libvirt.org/git/?p=libvirt-appdev-guide.git">git://libvirt.org/libvirt-appdev-guide.git</a>
 | 
			
		||||
 | 
			
		||||
# Python language
 | 
			
		||||
$ git clone <a href="https://libvirt.org/git/?p=libvirt-appdev-guide-python.git">git://libvirt.org/libvirt-appdev-guide-python.git</a>
 | 
			
		||||
      # Python language
 | 
			
		||||
      $ git clone <a href="http://libvirt.org/git/?p=libvirt-appdev-guide-python.git">git://libvirt.org/libvirt-appdev-guide-python.git</a>
 | 
			
		||||
 | 
			
		||||
# Publican Style/Theme
 | 
			
		||||
$ git clone <a href="https://libvirt.org/git/?p=libvirt-publican.git">git://libvirt.org/libvirt-publican.git</a>
 | 
			
		||||
      # Publican Style/Theme
 | 
			
		||||
      $ git clone <a href="http://libvirt.org/git/?p=libvirt-publican.git">git://libvirt.org/libvirt-publican.git</a>
 | 
			
		||||
    </pre>
 | 
			
		||||
 | 
			
		||||
  </body>
 | 
			
		||||
 
 | 
			
		||||
@@ -566,8 +566,8 @@ initially for the <a href="http://www.cl.cam.ac.uk/Research/SRG/netos/xen/index.
 | 
			
		||||
paravirtualization</a> but should be able to integrate other virtualization
 | 
			
		||||
mechanisms if needed.</p>
 | 
			
		||||
<p> If you get lost searching for some specific API use, try
 | 
			
		||||
<a href="https://libvirt.org/search.php">the online search
 | 
			
		||||
engine</a> hosted on <a href="https://libvirt.org/">libvirt.org</a>
 | 
			
		||||
<a href="http://libvirt.org/search.php">the online search
 | 
			
		||||
engine</a> hosted on <a href="http://libvirt.org/">libvirt.org</a>
 | 
			
		||||
it indexes the project page, the APIs as well as the mailing-list archives. </p>
 | 
			
		||||
	</body>
 | 
			
		||||
      </html>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,169 +1,7 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<!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 class="docs">
 | 
			
		||||
    <div class="panel">
 | 
			
		||||
      <h2>Deployment / operation</h2>
 | 
			
		||||
 | 
			
		||||
      <dl>
 | 
			
		||||
        <dt><a href="apps.html">Applications</a></dt>
 | 
			
		||||
        <dd>Applications known to use libvirt</dd>
 | 
			
		||||
 | 
			
		||||
        <dt><a href="windows.html">Windows</a></dt>
 | 
			
		||||
        <dd>Downloads for Windows</dd>
 | 
			
		||||
 | 
			
		||||
        <dt><a href="migration.html">Migration</a></dt>
 | 
			
		||||
        <dd>Migrating guests between machines</dd>
 | 
			
		||||
 | 
			
		||||
        <dt><a href="remote.html">Remote access</a></dt>
 | 
			
		||||
        <dd>Enable remote access over TCP</dd>
 | 
			
		||||
 | 
			
		||||
        <dt><a href="auth.html">Authentication</a></dt>
 | 
			
		||||
        <dd>Configure authentication for the libvirt daemon</dd>
 | 
			
		||||
 | 
			
		||||
        <dt><a href="acl.html">Access control</a></dt>
 | 
			
		||||
        <dd>Configure access control libvirt APIs with <a href="aclpolkit.html">polkit</a></dd>
 | 
			
		||||
 | 
			
		||||
        <dt><a href="logging.html">Logging</a></dt>
 | 
			
		||||
        <dd>The library and the daemon logging support</dd>
 | 
			
		||||
 | 
			
		||||
        <dt><a href="auditlog.html">Audit log</a></dt>
 | 
			
		||||
        <dd>Audit trail logs for host operations</dd>
 | 
			
		||||
 | 
			
		||||
        <dt><a href="firewall.html">Firewall</a></dt>
 | 
			
		||||
        <dd>Firewall and network filter configuration</dd>
 | 
			
		||||
 | 
			
		||||
        <dt><a href="hooks.html">Hooks</a></dt>
 | 
			
		||||
        <dd>Hooks for system specific management</dd>
 | 
			
		||||
 | 
			
		||||
        <dt><a href="nss.html">NSS module</a></dt>
 | 
			
		||||
        <dd>Enable domain host name translation to IP addresses</dd>
 | 
			
		||||
 | 
			
		||||
        <dt><a href="http://wiki.libvirt.org/page/FAQ">FAQ</a></dt>
 | 
			
		||||
        <dd>Frequently asked questions</dd>
 | 
			
		||||
      </dl>
 | 
			
		||||
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <div class="panel">
 | 
			
		||||
      <h2>Application development</h2>
 | 
			
		||||
      <dl>
 | 
			
		||||
        <dt><a href="devguide.html">Development Guide</a></dt>
 | 
			
		||||
        <dd>A guide and reference for developing with libvirt</dd>
 | 
			
		||||
 | 
			
		||||
        <dt><a href="virshcmdref.html">Virsh Commands</a></dt>
 | 
			
		||||
        <dd>Command reference for virsh</dd>
 | 
			
		||||
 | 
			
		||||
        <dt><a href="bindings.html">Language bindings</a></dt>
 | 
			
		||||
        <dd>Bindings of the libvirt API for
 | 
			
		||||
          <a href="csharp.html">c#</a>,
 | 
			
		||||
          <a href="https://godoc.org/github.com/libvirt/libvirt-go">go</a>,
 | 
			
		||||
          <a href="java.html">java</a>,
 | 
			
		||||
          <a href="https://libvirt.org/ocaml/">ocaml</a>.
 | 
			
		||||
          <a href="http://search.cpan.org/dist/Sys-Virt/">perl</a>,
 | 
			
		||||
          <a href="python.html">python</a>,
 | 
			
		||||
          <a href="php.html">php</a>,
 | 
			
		||||
          <a href="https://libvirt.org/ruby/">ruby</a></dd>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        <dt><a href="format.html">XML schemas</a></dt>
 | 
			
		||||
        <dd>Description of the XML schemas for
 | 
			
		||||
          <a href="formatdomain.html">domains</a>,
 | 
			
		||||
          <a href="formatnetwork.html">networks</a>,
 | 
			
		||||
          <a href="formatnwfilter.html">network filtering</a>,
 | 
			
		||||
          <a href="formatstorage.html">storage</a>,
 | 
			
		||||
          <a href="formatstorageencryption.html">storage encryption</a>,
 | 
			
		||||
          <a href="formatcaps.html">capabilities</a>,
 | 
			
		||||
          <a href="formatdomaincaps.html">domain capabilities</a>,
 | 
			
		||||
          <a href="formatnode.html">node devices</a>,
 | 
			
		||||
          <a href="formatsecret.html">secrets</a>,
 | 
			
		||||
          <a href="formatsnapshot.html">snapshots</a></dd>
 | 
			
		||||
 | 
			
		||||
        <dt><a href="uri.html">URI format</a></dt>
 | 
			
		||||
        <dd>The URI formats used for connecting to libvirt</dd>
 | 
			
		||||
 | 
			
		||||
        <dt><a href="locking.html">Disk locking</a></dt>
 | 
			
		||||
        <dd>Ensuring exclusive guest access to disks with
 | 
			
		||||
          <a href="locking-lockd.html">virtlockd</a> or
 | 
			
		||||
          <a href="locking-sanlock.html">Sanlock</a></dd>
 | 
			
		||||
 | 
			
		||||
        <dt><a href="cgroups.html">CGroups</a></dt>
 | 
			
		||||
        <dd>Control groups integration</dd>
 | 
			
		||||
 | 
			
		||||
        <dt><a href="html/index.html">API reference</a></dt>
 | 
			
		||||
        <dd>Reference manual for the C public API, split in
 | 
			
		||||
          <a href="html/libvirt-libvirt-common.html">common</a>,
 | 
			
		||||
          <a href="html/libvirt-libvirt-domain.html">domain</a>,
 | 
			
		||||
          <a href="html/libvirt-libvirt-domain-snapshot.html">domain snapshot</a>,
 | 
			
		||||
          <a href="html/libvirt-virterror.html">error</a>,
 | 
			
		||||
          <a href="html/libvirt-libvirt-event.html">event</a>,
 | 
			
		||||
          <a href="html/libvirt-libvirt-host.html">host</a>,
 | 
			
		||||
          <a href="html/libvirt-libvirt-interface.html">interface</a>,
 | 
			
		||||
          <a href="html/libvirt-libvirt-network.html">network</a>,
 | 
			
		||||
          <a href="html/libvirt-libvirt-nodedev.html">node device</a>,
 | 
			
		||||
          <a href="html/libvirt-libvirt-nwfilter.html">network filter</a>,
 | 
			
		||||
          <a href="html/libvirt-libvirt-secret.html">secret</a>,
 | 
			
		||||
          <a href="html/libvirt-libvirt-storage.html">storage</a>,
 | 
			
		||||
          <a href="html/libvirt-libvirt-stream.html">stream</a>
 | 
			
		||||
        </dd>
 | 
			
		||||
 | 
			
		||||
        <dt><a href="drivers.html">Drivers</a></dt>
 | 
			
		||||
        <dd>Hypervisor specific driver information</dd>
 | 
			
		||||
 | 
			
		||||
        <dt><a href="support.html">Support guarantees</a></dt>
 | 
			
		||||
        <dd>Details of support status for various interfaces</dd>
 | 
			
		||||
 | 
			
		||||
        <dt><a href="hvsupport.html">Driver support</a></dt>
 | 
			
		||||
        <dd>matrix of API support per hypervisor per release</dd>
 | 
			
		||||
 | 
			
		||||
        <dt><a href="secureusage.html">Secure usage</a></dt>
 | 
			
		||||
        <dd>Secure usage of the libvirt APIs</dd>
 | 
			
		||||
      </dl>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <div class="panel">
 | 
			
		||||
      <h2>Project development</h2>
 | 
			
		||||
      <dl>
 | 
			
		||||
        <dt><a href="hacking.html">Contributor guidelines</a></dt>
 | 
			
		||||
        <dd>General hacking guidelines for contributors</dd>
 | 
			
		||||
 | 
			
		||||
        <dt><a href="bugs.html">Bug reports</a></dt>
 | 
			
		||||
        <dd>How and where to report bugs and request features</dd>
 | 
			
		||||
 | 
			
		||||
        <dt><a href="compiling.html">Compiling</a></dt>
 | 
			
		||||
        <dd>How to compile libvirt</dd>
 | 
			
		||||
 | 
			
		||||
        <dt><a href="goals.html">Goals</a></dt>
 | 
			
		||||
        <dd>Terminology and goals of libvirt API</dd>
 | 
			
		||||
 | 
			
		||||
        <dt><a href="api.html">API concepts</a></dt>
 | 
			
		||||
        <dd>The libvirt API concepts</dd>
 | 
			
		||||
 | 
			
		||||
        <dt><a href="api_extension.html">API extensions</a></dt>
 | 
			
		||||
        <dd>Adding new public libvirt APIs</dd>
 | 
			
		||||
 | 
			
		||||
        <dt><a href="internals/eventloop.html">Event loop and worker pool</a></dt>
 | 
			
		||||
        <dd>Libvirt's event loop and worker pool mode</dd>
 | 
			
		||||
 | 
			
		||||
        <dt><a href="internals/command.html">Spawning commands</a></dt>
 | 
			
		||||
        <dd>Spawning commands from libvirt driver code</dd>
 | 
			
		||||
 | 
			
		||||
        <dt><a href="internals/rpc.html">RPC protocol & APIs</a></dt>
 | 
			
		||||
        <dd>RPC protocol information and API / dispatch guide</dd>
 | 
			
		||||
 | 
			
		||||
        <dt><a href="internals/locking.html">Lock managers</a></dt>
 | 
			
		||||
        <dd>Use lock managers to protect disk content</dd>
 | 
			
		||||
 | 
			
		||||
        <dt><a href="internals/oomtesting.html">Out of memory testing</a></dt>
 | 
			
		||||
        <dd>Simulating OOM conditions in the test suite</dd>
 | 
			
		||||
 | 
			
		||||
        <dt><a href="testsuites.html">Functional testing</a></dt>
 | 
			
		||||
        <dd>Testing libvirt with <a href="testtck.html">TCK test suite</a> and
 | 
			
		||||
         <a href="testapi.html">Libvirt-test-API</a></dd>
 | 
			
		||||
      </dl>
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <br class="clear"/>
 | 
			
		||||
 | 
			
		||||
  <body>
 | 
			
		||||
    <h1>Documentation</h1>
 | 
			
		||||
  </body>
 | 
			
		||||
</html>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,424 +1,23 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<!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>Downloads</h1>
 | 
			
		||||
 | 
			
		||||
    <ul id="toc"></ul>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="releases">Project modules</a></h2>
 | 
			
		||||
    <h2><a name="releases">Official Releases</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      The libvirt project maintains a number of inter-related modules beyond
 | 
			
		||||
      the core C library/daemon.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <table class="top_table downloads">
 | 
			
		||||
      <thead>
 | 
			
		||||
        <tr>
 | 
			
		||||
          <th>Module</th>
 | 
			
		||||
          <th>Releases</th>
 | 
			
		||||
          <th>GIT Repo</th>
 | 
			
		||||
          <th>GIT Mirrors</th>
 | 
			
		||||
          <th>Resources</th>
 | 
			
		||||
        </tr>
 | 
			
		||||
      </thead>
 | 
			
		||||
      <tbody>
 | 
			
		||||
        <tr>
 | 
			
		||||
          <td>libvirt</td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="ftp://libvirt.org/libvirt/">ftp</a>
 | 
			
		||||
            <a href="https://libvirt.org/sources/">https</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="https://libvirt.org/git/?p=libvirt.git;a=summary">libvirt</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="https://gitlab.com/libvirt/libvirt">gitlab</a>
 | 
			
		||||
            <a href="https://github.com/libvirt/libvirt">github</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="html/index.html">api ref</a>
 | 
			
		||||
            <a href="news.html">changes</a>
 | 
			
		||||
          </td>
 | 
			
		||||
        </tr>
 | 
			
		||||
        <tr>
 | 
			
		||||
          <th colspan="7">Language bindings</th>
 | 
			
		||||
        </tr>
 | 
			
		||||
        <tr>
 | 
			
		||||
          <td>C#</td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="ftp://libvirt.org/libvirt/csharp/">ftp</a>
 | 
			
		||||
            <a href="https://libvirt.org/sources/csharp/">https</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="https://libvirt.org/git/?p=libvirt-csharp.git;a=summary">libvirt</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="https://gitlab.com/libvirt/libvirt-csharp">gitlab</a>
 | 
			
		||||
            <a href="https://github.com/libvirt/libvirt-csharp">github</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td></td>
 | 
			
		||||
        </tr>
 | 
			
		||||
        <tr>
 | 
			
		||||
          <td>Go</td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="ftp://libvirt.org/libvirt/go/">ftp</a>
 | 
			
		||||
            <a href="https://libvirt.org/sources/go/">https</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="https://libvirt.org/git/?p=libvirt-go.git;a=summary">libvirt</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="https://gitlab.com/libvirt/libvirt-go">gitlab</a>
 | 
			
		||||
            <a href="https://github.com/libvirt/libvirt-go">github</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="https://godoc.org/github.com/libvirt/libvirt-go">api ref</a>
 | 
			
		||||
          </td>
 | 
			
		||||
        </tr>
 | 
			
		||||
        <tr>
 | 
			
		||||
          <td>Java</td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="ftp://libvirt.org/libvirt/java/">ftp</a>
 | 
			
		||||
            <a href="https://libvirt.org/sources/java/">https</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="https://libvirt.org/git/?p=libvirt-java.git;a=summary">libvirt</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="https://gitlab.com/libvirt/libvirt-java">gitlab</a>
 | 
			
		||||
            <a href="https://github.com/libvirt/libvirt-java">github</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td></td>
 | 
			
		||||
        </tr>
 | 
			
		||||
        <tr>
 | 
			
		||||
          <td>OCaml</td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="ftp://libvirt.org/libvirt/ocaml/">ftp</a>
 | 
			
		||||
            <a href="https://libvirt.org/sources/ocaml/">https</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="https://libvirt.org/git/?p=libvirt-ocaml.git;a=summary">libvirt</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="https://gitlab.com/libvirt/libvirt-ocaml">gitlab</a>
 | 
			
		||||
            <a href="https://github.com/libvirt/libvirt-ocaml">github</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td></td>
 | 
			
		||||
        </tr>
 | 
			
		||||
        <tr>
 | 
			
		||||
          <td>Perl (Sys::Virt)</td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="http://search.cpan.org/dist/Sys-Virt/">cpan</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="https://libvirt.org/git/?p=libvirt-perl.git;a=summary">libvirt</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="https://gitlab.com/libvirt/libvirt-perl">gitlab</a>
 | 
			
		||||
            <a href="https://github.com/libvirt/libvirt-perl">github</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="http://search.cpan.org/dist/Sys-Virt/">api ref</a>
 | 
			
		||||
            <a href="https://libvirt.org/git/?p=libvirt-perl.git;a=blob;f=Changes;hb=HEAD">changes</a>
 | 
			
		||||
          </td>
 | 
			
		||||
        </tr>
 | 
			
		||||
        <tr>
 | 
			
		||||
          <td>PHP</td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="ftp://libvirt.org/libvirt/php/">ftp</a>
 | 
			
		||||
            <a href="https://libvirt.org/sources/php/">https</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="https://libvirt.org/git/?p=libvirt-php.git;a=summary">libvirt</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="https://gitlab.com/libvirt/libvirt-php">gitlab</a>
 | 
			
		||||
            <a href="https://github.com/libvirt/libvirt-php">github</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td></td>
 | 
			
		||||
        </tr>
 | 
			
		||||
        <tr>
 | 
			
		||||
          <td>Python</td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="ftp://libvirt.org/libvirt/python/">ftp</a>
 | 
			
		||||
            <a href="https://libvirt.org/sources/python/">https</a>
 | 
			
		||||
            <a href="https://pypi.python.org/pypi/libvirt-python">pypi</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="https://libvirt.org/git/?p=libvirt-python.git;a=summary">libvirt</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="https://gitlab.com/libvirt/libvirt-python">gitlab</a>
 | 
			
		||||
            <a href="https://github.com/libvirt/libvirt-python">github</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td></td>
 | 
			
		||||
        </tr>
 | 
			
		||||
        <tr>
 | 
			
		||||
          <td>Ruby</td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="ftp://libvirt.org/libvirt/ruby/">ftp</a>
 | 
			
		||||
            <a href="https://libvirt.org/sources/ruby/">https</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="https://libvirt.org/git/?p=ruby-libvirt.git;a=summary">libvirt</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="https://gitlab.com/libvirt/ruby-libvirt">gitlab</a>
 | 
			
		||||
            <a href="https://github.com/libvirt/ruby-libvirt">github</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td></td>
 | 
			
		||||
        </tr>
 | 
			
		||||
        <tr>
 | 
			
		||||
          <td>Rust</td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="ftp://libvirt.org/libvirt/rust/">ftp</a>
 | 
			
		||||
            <a href="https://libvirt.org/sources/rust/">https</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="https://libvirt.org/git/?p=libvirt-rust.git;a=summary">libvirt</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="https://gitlab.com/libvirt/libvirt-rust">gitlab</a>
 | 
			
		||||
            <a href="https://github.com/libvirt/libvirt-rust">github</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td></td>
 | 
			
		||||
        </tr>
 | 
			
		||||
        <tr>
 | 
			
		||||
          <th colspan="7">Integration modules</th>
 | 
			
		||||
        </tr>
 | 
			
		||||
        <tr>
 | 
			
		||||
          <td>GLib / GConfig / GObject</td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="ftp://libvirt.org/libvirt/glib/">ftp</a>
 | 
			
		||||
            <a href="https://libvirt.org/sources/glib/">https</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="https://libvirt.org/git/?p=libvirt-glib.git;a=summary">libvirt</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="https://gitlab.com/libvirt/libvirt-glib">gitlab</a>
 | 
			
		||||
            <a href="https://github.com/libvirt/libvirt-glib">github</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td></td>
 | 
			
		||||
        </tr>
 | 
			
		||||
        <tr>
 | 
			
		||||
          <td>Go XML</td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="ftp://libvirt.org/libvirt/go/">ftp</a>
 | 
			
		||||
            <a href="https://libvirt.org/sources/go/">https</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="https://libvirt.org/git/?p=libvirt-go-xml.git;a=summary">libvirt</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="https://gitlab.com/libvirt/libvirt-go-xml">gitlab</a>
 | 
			
		||||
            <a href="https://github.com/libvirt/libvirt-go-xml">github</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="https://godoc.org/github.com/libvirt/libvirt-go-xml">api ref</a>
 | 
			
		||||
          </td>
 | 
			
		||||
        </tr>
 | 
			
		||||
        <tr>
 | 
			
		||||
          <td>Console Proxy</td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="ftp://libvirt.org/libvirt/consoleproxy/">ftp</a>
 | 
			
		||||
            <a href="https://libvirt.org/sources/consoleproxy/">https</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="https://libvirt.org/git/?p=libvirt-console-proxy.git;a=summary">libvirt</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="https://gitlab.com/libvirt/libvirt-console-proxy">gitlab</a>
 | 
			
		||||
            <a href="https://github.com/libvirt/libvirt-console-proxy">github</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td></td>
 | 
			
		||||
        </tr>
 | 
			
		||||
        <tr>
 | 
			
		||||
          <td>CIM provider</td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="ftp://libvirt.org/libvirt/CIM/">ftp</a>
 | 
			
		||||
            <a href="https://libvirt.org/sources/CIM/">https</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="https://libvirt.org/git/?p=libvirt-cim.git;a=summary">libvirt</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="https://gitlab.com/libvirt/libvirt-cim">gitlab</a>
 | 
			
		||||
            <a href="https://github.com/libvirt/libvirt-cim">github</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td></td>
 | 
			
		||||
        </tr>
 | 
			
		||||
        <tr>
 | 
			
		||||
          <td>CIM utils</td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="ftp://libvirt.org/libvirt/CIM/">ftp</a>
 | 
			
		||||
            <a href="https://libvirt.org/sources/CIM/">https</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="https://libvirt.org/git/?p=libcmpiutil.git;a=summary">libvirt</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="https://gitlab.com/libvirt/libcmpiutil">gitlab</a>
 | 
			
		||||
            <a href="https://github.com/libvirt/libcmpiutil">github</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td></td>
 | 
			
		||||
        </tr>
 | 
			
		||||
        <tr>
 | 
			
		||||
          <td>SNMP</td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="ftp://libvirt.org/libvirt/snmp/">ftp</a>
 | 
			
		||||
            <a href="https://libvirt.org/sources/snmp/">https</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="https://libvirt.org/git/?p=libvirt-snmp.git;a=summary">libvirt</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="https://gitlab.com/libvirt/libvirt-snmp">gitlab</a>
 | 
			
		||||
            <a href="https://github.com/libvirt/libvirt-snmp">github</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td></td>
 | 
			
		||||
        </tr>
 | 
			
		||||
        <tr>
 | 
			
		||||
          <td>Application Sandbox</td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="ftp://libvirt.org/libvirt/sandbox/">ftp</a>
 | 
			
		||||
            <a href="https://libvirt.org/sources/sandbox/">https</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="https://libvirt.org/git/?p=libvirt-sandbox.git;a=summary">libvirt</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="https://gitlab.com/libvirt/libvirt-sandbox">gitlab</a>
 | 
			
		||||
            <a href="https://github.com/libvirt/libvirt-sandbox">github</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td></td>
 | 
			
		||||
        </tr>
 | 
			
		||||
        <tr>
 | 
			
		||||
          <th colspan="7">Testing</th>
 | 
			
		||||
        </tr>
 | 
			
		||||
        <tr>
 | 
			
		||||
          <td>TCK</td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="ftp://libvirt.org/libvirt/tck/">ftp</a>
 | 
			
		||||
            <a href="https://libvirt.org/sources/tck/">https</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="https://libvirt.org/git/?p=libvirt-tck.git;a=summary">libvirt</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="https://gitlab.com/libvirt/libvirt-tck">gitlab</a>
 | 
			
		||||
            <a href="https://github.com/libvirt/libvirt-tck">github</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td></td>
 | 
			
		||||
        </tr>
 | 
			
		||||
        <tr>
 | 
			
		||||
          <td>Test API</td>
 | 
			
		||||
          <td></td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="https://libvirt.org/git/?p=libvirt-test-API.git;a=summary">libvirt</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="https://gitlab.com/libvirt/libvirt-test-API">gitlab</a>
 | 
			
		||||
            <a href="https://github.com/libvirt/libvirt-test-API">github</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td></td>
 | 
			
		||||
        </tr>
 | 
			
		||||
        <tr>
 | 
			
		||||
          <td>Jenkins Config</td>
 | 
			
		||||
          <td></td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="https://libvirt.org/git/?p=libvirt-jenkins-ci.git;a=summary">libvirt</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="https://gitlab.com/libvirt/libvirt-jenkins-ci">gitlab</a>
 | 
			
		||||
            <a href="https://github.com/libvirt/libvirt-jenkins-ci">github</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td></td>
 | 
			
		||||
        </tr>
 | 
			
		||||
        <tr>
 | 
			
		||||
          <td>CIM Test</td>
 | 
			
		||||
          <td></td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="https://libvirt.org/git/?p=cimtest.git;a=summary">libvirt</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="https://gitlab.com/libvirt/cimtest">gitlab</a>
 | 
			
		||||
            <a href="https://github.com/libvirt/cimtest">github</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td></td>
 | 
			
		||||
        </tr>
 | 
			
		||||
        <tr>
 | 
			
		||||
          <th colspan="7">Documentation</th>
 | 
			
		||||
        </tr>
 | 
			
		||||
        <tr>
 | 
			
		||||
          <td>Publican Brand</td>
 | 
			
		||||
          <td></td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="https://libvirt.org/git/?p=libvirt-publican.git;a=summary">libvirt</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="https://gitlab.com/libvirt/libvirt-publican">gitlab</a>
 | 
			
		||||
            <a href="https://github.com/libvirt/libvirt-publican">github</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td></td>
 | 
			
		||||
        </tr>
 | 
			
		||||
        <tr>
 | 
			
		||||
          <td>App Development Guide</td>
 | 
			
		||||
          <td></td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="https://libvirt.org/git/?p=libvirt-appdev-guide.git;a=summary">libvirt</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="https://gitlab.com/libvirt/libvirt-appdev-guide">gitlab</a>
 | 
			
		||||
            <a href="https://github.com/libvirt/libvirt-appdev-guide">github</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td></td>
 | 
			
		||||
        </tr>
 | 
			
		||||
        <tr>
 | 
			
		||||
          <td>App Development Guide Python</td>
 | 
			
		||||
          <td></td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="https://libvirt.org/git/?p=libvirt-appdev-guide-python.git;a=summary">libvirt</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="https://gitlab.com/libvirt/libvirt-appdev-guide-python">gitlab</a>
 | 
			
		||||
            <a href="https://github.com/libvirt/libvirt-appdev-guide-python">github</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td></td>
 | 
			
		||||
        </tr>
 | 
			
		||||
        <tr>
 | 
			
		||||
          <td>virsh Command Reference</td>
 | 
			
		||||
          <td></td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="https://libvirt.org/git/?p=libvirt-virshcmdref.git;a=summary">libvirt</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td>
 | 
			
		||||
            <a href="https://gitlab.com/libvirt/libvirt-virshcmdref">gitlab</a>
 | 
			
		||||
            <a href="https://github.com/libvirt/libvirt-virshcmdref">github</a>
 | 
			
		||||
          </td>
 | 
			
		||||
          <td></td>
 | 
			
		||||
        </tr>
 | 
			
		||||
      </tbody>
 | 
			
		||||
    </table>
 | 
			
		||||
 | 
			
		||||
    <h2>Primary download site</h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      Most modules have releases made available for download on the project
 | 
			
		||||
      site, via FTP, HTTP or HTTPS. Some modules are instead made available
 | 
			
		||||
      at alternative locations, for example, the Perl binding is made
 | 
			
		||||
      available only on CPAN.
 | 
			
		||||
      The latest versions of the libvirt C library can be downloaded from:
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <ul>
 | 
			
		||||
      <li><a href="ftp://libvirt.org/libvirt/">libvirt.org FTP server</a></li>
 | 
			
		||||
      <li><a href="https://libvirt.org/sources/">libvirt.org HTTP server</a></li>
 | 
			
		||||
      <li><a href="https://libvirt.org/sources/">libvirt.org HTTPS server</a></li>
 | 
			
		||||
      <li><a href="http://libvirt.org/sources/">libvirt.org HTTP server</a></li>
 | 
			
		||||
    </ul>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="hourly">Hourly development snapshots</a></h2>
 | 
			
		||||
    <h2><a name="hourly">Hourly development snapshots</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      Once an hour, an automated snapshot is made from the git server
 | 
			
		||||
@@ -430,31 +29,29 @@
 | 
			
		||||
 | 
			
		||||
    <ul>
 | 
			
		||||
      <li><a href="ftp://libvirt.org/libvirt/libvirt-git-snapshot.tar.xz">libvirt.org FTP server</a></li>
 | 
			
		||||
      <li><a href="https://libvirt.org/sources/libvirt-git-snapshot.tar.xz">libvirt.org HTTP server</a></li>
 | 
			
		||||
      <li><a href="http://libvirt.org/sources/libvirt-git-snapshot.tar.xz">libvirt.org HTTP server</a></li>
 | 
			
		||||
    </ul>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="schedule">Primary release schedule</a></h2>
 | 
			
		||||
    <h2><a name="schedule">Primary release schedule</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      The core libvirt module 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. The Python and Perl modules will aim to
 | 
			
		||||
      release at the same time as the core libvirt module. Other modules have
 | 
			
		||||
      independant ad-hoc releases with no fixed time schedle.
 | 
			
		||||
      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 id="numbering">Release numbering</a></h2>
 | 
			
		||||
    <h2><a name="numbering">Release numbering</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      Since libvirt 2.0.0, a time based version numbering rule
 | 
			
		||||
      is applied to the core library releases. 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:
 | 
			
		||||
      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>
 | 
			
		||||
@@ -462,8 +59,7 @@
 | 
			
		||||
      <dd>incremented by 1 for the first release of the year (the
 | 
			
		||||
        Jan 15th release)</dd>
 | 
			
		||||
      <dt><code>minor</code></dt>
 | 
			
		||||
      <dd>reset to 0 with every major increment, otherwise incremented by 1
 | 
			
		||||
        for each monthly release from git master</dd>
 | 
			
		||||
      <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>
 | 
			
		||||
@@ -472,18 +68,13 @@
 | 
			
		||||
    <p>
 | 
			
		||||
      Prior to 2.0.0, the major/minor numbers were incremented
 | 
			
		||||
      fairly arbitrarily, and maintenance releases appended a
 | 
			
		||||
      fourth digit. The language bindings will aim to use the
 | 
			
		||||
      same version number as the most recent core library API
 | 
			
		||||
      they support. The other modules have their own distinct
 | 
			
		||||
      release numbering sequence, though they generally aim
 | 
			
		||||
      to follow the above rules for incrementing major/minor/micro
 | 
			
		||||
      digits.
 | 
			
		||||
      fourth digit.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="maintenance">Maintenance releases</a></h2>
 | 
			
		||||
    <h2><a name="maintenance">Maintenance releases</a></h2>
 | 
			
		||||
    <p>
 | 
			
		||||
      In the git repository are several stable maintenance branches
 | 
			
		||||
      for the core library, matching the
 | 
			
		||||
      In the git repository are several stable maintenance branches,
 | 
			
		||||
      matching the
 | 
			
		||||
      pattern <code>v<i>major</i>.<i>minor</i>-maint</code>;
 | 
			
		||||
      these branches are forked off the corresponding
 | 
			
		||||
      <code>v<i>major</i>.<i>minor</i>.0</code> formal
 | 
			
		||||
@@ -497,9 +88,7 @@
 | 
			
		||||
      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. The language bindings
 | 
			
		||||
      and other modules generally do not provide stable branch
 | 
			
		||||
      releases.
 | 
			
		||||
      bugfixes to downstream consumers.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
@@ -508,19 +97,25 @@
 | 
			
		||||
      wiki page</a>.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="git">GIT source repository</a></h2>
 | 
			
		||||
    <h2><a name="git">GIT source repository</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      All modules maintained by the libvirt project have their primary
 | 
			
		||||
      source available in the <a href="https://libvirt.org/git/">project GIT server</a>.
 | 
			
		||||
      Each module can be cloned anonymously using:
 | 
			
		||||
      Libvirt code source is now maintained in a <a href="http://git-scm.com/">git</a>
 | 
			
		||||
      repository available on <a href="http://libvirt.org/git/">libvirt.org</a>:
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <pre>
 | 
			
		||||
git clone git://libvirt.org/[module name].git</pre>
 | 
			
		||||
      git clone git://libvirt.org/libvirt.git</pre>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      In addition to this primary repository, there are the following read-only git
 | 
			
		||||
      It can also be browsed at:
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <pre>
 | 
			
		||||
      <a href="http://libvirt.org/git/?p=libvirt.git;a=summary">http://libvirt.org/git/?p=libvirt.git;a=summary</a></pre>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      In addition to this repository, there are the following read-only git
 | 
			
		||||
      repositories which mirror the master one. Note that we currently do not
 | 
			
		||||
      use the full set of features on these mirrors (e.g. pull requests on
 | 
			
		||||
      GitHub, so please don't use them). All patch review and discussion only
 | 
			
		||||
@@ -529,8 +124,58 @@ git clone git://libvirt.org/[module name].git</pre>
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <pre>
 | 
			
		||||
<a href="https://github.com/libvirt/">https://github.com/libvirt/</a>
 | 
			
		||||
<a href="https://gitlab.com/libvirt/libvirt">https://gitlab.com/libvirt/</a></pre>
 | 
			
		||||
      <a href="https://github.com/libvirt/libvirt">https://github.com/libvirt/libvirt</a>
 | 
			
		||||
      <a href="http://repo.or.cz/w/libvirt.git">http://repo.or.cz/w/libvirt.git</a>
 | 
			
		||||
      <a href="https://gitlab.com/libvirt/libvirt">https://gitlab.com/libvirt/libvirt</a></pre>
 | 
			
		||||
 | 
			
		||||
    <br />
 | 
			
		||||
 | 
			
		||||
    <h1>libvirt Application Development Guide</h1>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      The guide is both a learning tool for developing with libvirt and an
 | 
			
		||||
      API reference document. It is a work in progress, composed by a
 | 
			
		||||
      professional author from contributions written by members of the
 | 
			
		||||
      libvirt team.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      Contributions to the guide are <b>VERY</b> welcome. If you'd like to get
 | 
			
		||||
      your name on this and demonstrate your virtualisation prowess, a solid
 | 
			
		||||
      contribution to the content here will do it. :)
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <h2><a name="appdevpdf">Application Development Guide PDF</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      PDF download is available here:
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <ul>
 | 
			
		||||
      <li><a href="http://libvirt.org/guide/pdf/Application_Development_Guide.pdf">libvirt App Dev Guide</a> (PDF)</li>
 | 
			
		||||
    </ul>
 | 
			
		||||
 | 
			
		||||
    <h2><a name="appdevgit">Application Development Guide source GIT repository</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      The source is also in a git repository:
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <pre>
 | 
			
		||||
      git clone git://libvirt.org/libvirt-appdev-guide.git</pre>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      Browsable at:
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <pre>
 | 
			
		||||
      <a href="http://libvirt.org/git/?p=libvirt-appdev-guide.git;a=summary">http://libvirt.org/git/?p=libvirt-appdev-guide.git;a=summary</a></pre>
 | 
			
		||||
 | 
			
		||||
    <br />
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      Once you've have obtained the libvirt source code, you can compile it
 | 
			
		||||
      using the <a href="compiling.html">instructions here</a>.
 | 
			
		||||
    </p>
 | 
			
		||||
  </body>
 | 
			
		||||
</html>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,14 +1,10 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<!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>Internal drivers</h1>
 | 
			
		||||
 | 
			
		||||
    <ul>
 | 
			
		||||
      <li><a href="#hypervisor">Hypervisor drivers</a></li>
 | 
			
		||||
      <li><a href="#storage">Storage drivers</a></li>
 | 
			
		||||
      <li><a href="drvnodedev.html">Node device driver</a></li>
 | 
			
		||||
    </ul>
 | 
			
		||||
    <ul id="toc"></ul>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      The libvirt public API delegates its implementation to one or
 | 
			
		||||
@@ -18,7 +14,7 @@
 | 
			
		||||
      network and storage driver active.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="hypervisor">Hypervisor drivers</a></h2>
 | 
			
		||||
    <h2><a name="hypervisor">Hypervisor drivers</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      The hypervisor drivers currently supported by libvirt are:
 | 
			
		||||
@@ -40,7 +36,7 @@
 | 
			
		||||
      <li><strong><a href="drvbhyve.html">Bhyve</a></strong> - The BSD Hypervisor</li>
 | 
			
		||||
    </ul>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="storage">Storage drivers</a></h2>
 | 
			
		||||
    <h2><a name="storage">Storage drivers</a></h2>
 | 
			
		||||
 | 
			
		||||
    <ul>
 | 
			
		||||
      <li><strong><a href="storage.html#StorageBackendDir">Directory backend</a></strong></li>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<!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>Bhyve driver</h1>
 | 
			
		||||
@@ -13,25 +13,14 @@ of bhyve are supported.
 | 
			
		||||
 | 
			
		||||
In order to enable bhyve on your FreeBSD host, you'll need to load the <code>vmm</code>
 | 
			
		||||
kernel module. Additionally, <code>if_tap</code> and <code>if_bridge</code> modules
 | 
			
		||||
should be loaded for networking support. Also, <span class="since">since 3.2.0</span> the
 | 
			
		||||
<code>virt-host-validate(1)</code> supports the bhyve host validation and could be
 | 
			
		||||
used like this:
 | 
			
		||||
should be loaded for networking support.
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
<pre>
 | 
			
		||||
$ virt-host-validate bhyve
 | 
			
		||||
 BHYVE: Checking for vmm module                                              : PASS
 | 
			
		||||
 BHYVE: Checking for if_tap module                                           : PASS
 | 
			
		||||
 BHYVE: Checking for if_bridge module                                        : PASS
 | 
			
		||||
 BHYVE: Checking for nmdm module                                             : PASS
 | 
			
		||||
$
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
Additional information on bhyve could be obtained on <a href="http://bhyve.org/">bhyve.org</a>.
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
<h2><a id="uri">Connections to the Bhyve driver</a></h2>
 | 
			
		||||
<h2><a name="uri">Connections to the Bhyve driver</a></h2>
 | 
			
		||||
<p>
 | 
			
		||||
The libvirt bhyve driver is a single-instance privileged driver. Some sample
 | 
			
		||||
connection URIs are:
 | 
			
		||||
@@ -43,7 +32,7 @@ bhyve+unix:///system                (local access)
 | 
			
		||||
bhyve+ssh://root@example.com/system (remote access, SSH tunnelled)
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
<h2><a id="exconfig">Example guest domain XML configurations</a></h2>
 | 
			
		||||
<h2><a name="exconfig">Example guest domain XML configurations</a></h2>
 | 
			
		||||
 | 
			
		||||
<h3>Example config</h3>
 | 
			
		||||
<p>
 | 
			
		||||
@@ -155,60 +144,9 @@ Note the addition of <bootloader>.
 | 
			
		||||
</domain>
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
<h3>Example config (Linux UEFI guest, VNC, tablet)</h3>
 | 
			
		||||
<h2><a name="usage">Guest usage / management</a></h2>
 | 
			
		||||
 | 
			
		||||
<p>This is an example to boot into Fedora 25 installation:</p>
 | 
			
		||||
 | 
			
		||||
<pre>
 | 
			
		||||
<domain type='bhyve'>
 | 
			
		||||
    <name>fedora_uefi_vnc_tablet</name>
 | 
			
		||||
    <memory unit='G'>4</memory>
 | 
			
		||||
    <vcpu>2</vcpu>
 | 
			
		||||
    <os>
 | 
			
		||||
       <type>hvm</type>
 | 
			
		||||
       <b><loader readonly="yes" type="pflash">/usr/local/share/uefi-firmware/BHYVE_UEFI.fd</loader></b>
 | 
			
		||||
    </os>
 | 
			
		||||
    <features>
 | 
			
		||||
      <apic/>
 | 
			
		||||
      <acpi/>
 | 
			
		||||
    </features>
 | 
			
		||||
    <clock offset='utc'/>
 | 
			
		||||
    <on_poweroff>destroy</on_poweroff>
 | 
			
		||||
    <on_reboot>restart</on_reboot>
 | 
			
		||||
    <on_crash>destroy</on_crash>
 | 
			
		||||
    <devices>
 | 
			
		||||
      <disk type='file' device='cdrom'>
 | 
			
		||||
        <driver name='file' type='raw'/>
 | 
			
		||||
          <source file='/path/to/Fedora-Workstation-Live-x86_64-25-1.3.iso'/>
 | 
			
		||||
        <target dev='hdc' bus='sata'/>
 | 
			
		||||
        <readonly/>
 | 
			
		||||
      </disk>
 | 
			
		||||
      <disk type='file' device='disk'>
 | 
			
		||||
        <driver name='file' type='raw'/>
 | 
			
		||||
        <source file='/path/to/linux_uefi.img'/>
 | 
			
		||||
        <target dev='hda' bus='sata'/>
 | 
			
		||||
        </disk>
 | 
			
		||||
      <interface type='bridge'>
 | 
			
		||||
        <model type='virtio'/>
 | 
			
		||||
        <source bridge="virbr0"/>
 | 
			
		||||
      </interface>
 | 
			
		||||
      <serial type="nmdm">
 | 
			
		||||
        <source master="/dev/nmdm0A" slave="/dev/nmdm0B"/>
 | 
			
		||||
      </serial>
 | 
			
		||||
      <b><graphics type='vnc' port='5904'>
 | 
			
		||||
        <listen type='address' address='127.0.0.1'/>
 | 
			
		||||
      </graphics>
 | 
			
		||||
      <controller type='usb' model='nec-xhci'/>
 | 
			
		||||
      <input type='tablet' bus='usb'/></b>
 | 
			
		||||
    </devices>
 | 
			
		||||
</domain>
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
<p>Please refer to the <a href="#uefi">UEFI</a> section for a more detailed explanation.</p>
 | 
			
		||||
 | 
			
		||||
<h2><a id="usage">Guest usage / management</a></h2>
 | 
			
		||||
 | 
			
		||||
<h3><a id="console">Connecting to a guest console</a></h3>
 | 
			
		||||
<h3><a name="console">Connecting to a guest console</a></h3>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
Guest console connection is supported through the <code>nmdm</code> device. It could be enabled by adding
 | 
			
		||||
@@ -216,13 +154,13 @@ the following to the domain XML (<span class="since">Since 1.2.4</span>):
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
<pre>
 | 
			
		||||
...
 | 
			
		||||
<devices>
 | 
			
		||||
  <serial type="nmdm">
 | 
			
		||||
    <source master="/dev/nmdm0A" slave="/dev/nmdm0B"/>
 | 
			
		||||
  </serial>
 | 
			
		||||
</devices>
 | 
			
		||||
...</pre>
 | 
			
		||||
  ...
 | 
			
		||||
  <devices>
 | 
			
		||||
    <serial type="nmdm">
 | 
			
		||||
      <source master="/dev/nmdm0A" slave="/dev/nmdm0B"/>
 | 
			
		||||
    </serial>
 | 
			
		||||
  </devices>
 | 
			
		||||
  ...</pre>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<p>Make sure to load the <code>nmdm</code> kernel module if you plan to use that.</p>
 | 
			
		||||
@@ -253,7 +191,7 @@ device) is:</p>
 | 
			
		||||
 | 
			
		||||
<pre>cu -l /dev/nmdm0B</pre>
 | 
			
		||||
 | 
			
		||||
<h3><a id="xmltonative">Converting from domain XML to Bhyve args</a></h3>
 | 
			
		||||
<h3><a name="xmltonative">Converting from domain XML to Bhyve args</a></h3>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
The <code>virsh domxml-to-native</code> command can preview the actual
 | 
			
		||||
@@ -275,23 +213,23 @@ tweak them.</p>
 | 
			
		||||
/usr/sbin/bhyve -c 2 -m 214 -A -I -H -P -s 0:0,hostbridge -s 3:0,virtio-net,tap0,mac=52:54:00:5d:74:e3 -s 2:0,virtio-blk,/home/user/vm1.img -s 1,lpc -l com1,/dev/nmdm0A vm1
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
<h3><a id="zfsvolume">Using ZFS volumes</a></h3>
 | 
			
		||||
<h3><a name="zfsvolume">Using ZFS volumes</a></h3>
 | 
			
		||||
 | 
			
		||||
<p>It's possible to use ZFS volumes as disk devices <span class="since">since 1.2.8</span>.
 | 
			
		||||
An example of domain XML device entry for that will look like:</p>
 | 
			
		||||
 | 
			
		||||
<pre>
 | 
			
		||||
...
 | 
			
		||||
<disk type='volume' device='disk'>
 | 
			
		||||
  <source pool='zfspool' volume='vol1'/>
 | 
			
		||||
  <target dev='vdb' bus='virtio'/>
 | 
			
		||||
</disk>
 | 
			
		||||
...</pre>
 | 
			
		||||
  ...
 | 
			
		||||
  <disk type='volume' device='disk'>
 | 
			
		||||
    <source pool='zfspool' volume='vol1'/>
 | 
			
		||||
    <target dev='vdb' bus='virtio'/>
 | 
			
		||||
  </disk>
 | 
			
		||||
  ...</pre>
 | 
			
		||||
 | 
			
		||||
<p>Please refer to the <a href="storage.html">Storage documentation</a> for more details on storage
 | 
			
		||||
management.</p>
 | 
			
		||||
 | 
			
		||||
<h3><a id="grubbhyve">Using grub2-bhyve or Alternative Bootloaders</a></h3>
 | 
			
		||||
<h3><a name="grubbhyve">Using grub2-bhyve or Alternative Bootloaders</a></h3>
 | 
			
		||||
 | 
			
		||||
<p>It's possible to boot non-FreeBSD guests by specifying an explicit
 | 
			
		||||
bootloader, e.g. <code>grub-bhyve(1)</code>. Arguments to the bootloader may be
 | 
			
		||||
@@ -303,93 +241,16 @@ the first disk in the domain (either <code>cdrom</code>- or
 | 
			
		||||
attempt to boot from the first partition in the disk image.</p>
 | 
			
		||||
 | 
			
		||||
<pre>
 | 
			
		||||
...
 | 
			
		||||
<bootloader>/usr/local/sbin/grub-bhyve</bootloader>
 | 
			
		||||
<bootloader_args>...</bootloader_args>
 | 
			
		||||
...
 | 
			
		||||
  ...
 | 
			
		||||
    <bootloader>/usr/local/sbin/grub-bhyve</bootloader>
 | 
			
		||||
    <bootloader_args>...</bootloader_args>
 | 
			
		||||
  ...
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
<p>Caveat: <code>bootloader_args</code> does not support any quoting.
 | 
			
		||||
Filenames, etc, must not have spaces or they will be tokenized incorrectly.</p>
 | 
			
		||||
 | 
			
		||||
<h3><a id="uefi">Using UEFI bootrom, VNC, and USB tablet</a></h3>
 | 
			
		||||
 | 
			
		||||
<p><span class="since">Since 3.2.0</span>, in addition to <a href="#grubbhyve">grub-bhyve</a>,
 | 
			
		||||
non-FreeBSD guests could be also booted using an UEFI boot ROM, provided both guest OS and
 | 
			
		||||
installed <code>bhyve(1)</code> version support UEFI. To use that, <code>loader</code>
 | 
			
		||||
should be specified in the <code>os</code> section:</p>
 | 
			
		||||
 | 
			
		||||
<pre>
 | 
			
		||||
<domain type='bhyve'>
 | 
			
		||||
    ...
 | 
			
		||||
    <os>
 | 
			
		||||
       <type>hvm</type>
 | 
			
		||||
       <loader readonly="yes" type="pflash">/usr/local/share/uefi-firmware/BHYVE_UEFI.fd</loader>
 | 
			
		||||
    </os>
 | 
			
		||||
    ...
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
<p>This uses the UEFI firmware provided by
 | 
			
		||||
the <a href="https://www.freshports.org/sysutils/bhyve-firmware/">sysutils/bhyve-firmware</a>
 | 
			
		||||
FreeBSD port.</p>
 | 
			
		||||
 | 
			
		||||
<p>VNC and the tablet input device could be configured this way:</p>
 | 
			
		||||
 | 
			
		||||
<pre>
 | 
			
		||||
<domain type='bhyve'>
 | 
			
		||||
    <devices>
 | 
			
		||||
      ...
 | 
			
		||||
      <graphics type='vnc' port='5904'>
 | 
			
		||||
        <listen type='address' address='127.0.0.1'/>
 | 
			
		||||
      </graphics>
 | 
			
		||||
      <controller type='usb' model='nec-xhci'/>
 | 
			
		||||
      <input type='tablet' bus='usb'/>
 | 
			
		||||
    </devices>
 | 
			
		||||
    ...
 | 
			
		||||
</domain>
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
<p>This way, VNC will be accessible on <code>127.0.0.1:5904</code>.</p>
 | 
			
		||||
 | 
			
		||||
<p>Please note that the tablet device requires to have a USB controller
 | 
			
		||||
of the <code>nec-xhci</code> model. Currently, only a single controller of this
 | 
			
		||||
type and a single tablet are supported per domain.</p>
 | 
			
		||||
 | 
			
		||||
<p><span class="since">Since 3.5.0</span>, it's possible to configure how the video device is exposed
 | 
			
		||||
to the guest using the <code>vgaconf</code> attribute:</p>
 | 
			
		||||
 | 
			
		||||
<pre>
 | 
			
		||||
<domain type='bhyve'>
 | 
			
		||||
    <devices>
 | 
			
		||||
    ...
 | 
			
		||||
      <graphics type='vnc' port='5904'>
 | 
			
		||||
        <listen type='address' address='127.0.0.1'/>
 | 
			
		||||
      </graphics>
 | 
			
		||||
      <video>
 | 
			
		||||
        <driver vgaconf='on'/>
 | 
			
		||||
        <model type='gop' heads='1' primary='yes'/>
 | 
			
		||||
      </video>
 | 
			
		||||
      ...
 | 
			
		||||
    </devices>
 | 
			
		||||
    ...
 | 
			
		||||
</domain>
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
<p>If not specified, bhyve's default mode for <code>vgaconf</code>
 | 
			
		||||
will be used. Please refer to the
 | 
			
		||||
<a href="https://www.freebsd.org/cgi/man.cgi?query=bhyve&sektion=8&manpath=FreeBSD+12-current">bhyve(8)</a>
 | 
			
		||||
manual page and the <a href="https://wiki.freebsd.org/bhyve">bhyve wiki</a> for more details on using
 | 
			
		||||
the <code>vgaconf</code> option.</p>
 | 
			
		||||
 | 
			
		||||
<p><span class="since">Since 3.7.0</span>, it's possible to use <code>autoport</code>
 | 
			
		||||
to let libvirt allocate VNC port automatically (instead of explicitly specifying
 | 
			
		||||
it with the <code>port</code> attribute):</p>
 | 
			
		||||
 | 
			
		||||
<pre>
 | 
			
		||||
    <graphics type='vnc' autoport='yes'>
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
<h3><a id="clockconfig">Clock configuration</a></h3>
 | 
			
		||||
<h3><a name="clockconfig">Clock configuration</a></h3>
 | 
			
		||||
 | 
			
		||||
<p>Originally bhyve supported only localtime for RTC. Support for UTC time was introduced in
 | 
			
		||||
<a href="http://svnweb.freebsd.org/changeset/base/284894">r284894</a> for <i>10-STABLE</i> and
 | 
			
		||||
@@ -415,21 +276,6 @@ you'll need to explicitly specify 'localtime' in this case:</p>
 | 
			
		||||
    <clock offset='localtime'/>
 | 
			
		||||
    ...
 | 
			
		||||
</domain>
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
<h3><a id="e1000">e1000 NIC</a></h3>
 | 
			
		||||
 | 
			
		||||
<p>As of <a href="https://svnweb.freebsd.org/changeset/base/302504">r302504</a> bhyve
 | 
			
		||||
supports Intel e1000 network adapter emulation. It's supported in libvirt
 | 
			
		||||
<span class="since">since 3.1.0</span> and could be used as follows:</p>
 | 
			
		||||
 | 
			
		||||
<pre>
 | 
			
		||||
...
 | 
			
		||||
    <interface type='bridge'>
 | 
			
		||||
      <source bridge='virbr0'/>
 | 
			
		||||
      <model type='<b>e1000</b>'/>
 | 
			
		||||
    </interface>
 | 
			
		||||
...
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
  </body>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<!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>VMware ESX hypervisor driver</h1>
 | 
			
		||||
@@ -11,7 +11,7 @@
 | 
			
		||||
        connect to a VMware vCenter 2.5/4.x/5.x (VPX).
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="project">Project Links</a></h2>
 | 
			
		||||
    <h2><a name="project">Project Links</a></h2>
 | 
			
		||||
 | 
			
		||||
    <ul>
 | 
			
		||||
      <li>
 | 
			
		||||
@@ -20,7 +20,7 @@
 | 
			
		||||
      </li>
 | 
			
		||||
    </ul>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="prereq">Deployment pre-requisites</a></h2>
 | 
			
		||||
    <h2><a name="prereq">Deployment pre-requisites</a></h2>
 | 
			
		||||
    <p>
 | 
			
		||||
        None. Any out-of-the-box installation of VPX/ESX(i)/GSX should work. No
 | 
			
		||||
        preparations are required on the server side, no libvirtd must be
 | 
			
		||||
@@ -34,7 +34,7 @@
 | 
			
		||||
        VMware vSphere API</a>.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="uri">Connections to the VMware ESX driver</a></h2>
 | 
			
		||||
    <h2><a name="uri">Connections to the VMware ESX driver</a></h2>
 | 
			
		||||
    <p>
 | 
			
		||||
        Some example remote connection URIs for the driver are:
 | 
			
		||||
    </p>
 | 
			
		||||
@@ -54,7 +54,7 @@ esx://example-esx.com/?no_verify=1     (ESX over HTTPS, but doesn't verify the s
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <h3><a id="uriformat">URI Format</a></h3>
 | 
			
		||||
    <h3><a name="uriformat">URI Format</a></h3>
 | 
			
		||||
    <p>
 | 
			
		||||
        URIs have this general form (<code>[...]</code> marks an optional part).
 | 
			
		||||
    </p>
 | 
			
		||||
@@ -93,7 +93,7 @@ vpx://example-vcenter.com/folder1/dc1/folder2/example-esx.com
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <h4><a id="extraparams">Extra parameters</a></h4>
 | 
			
		||||
    <h4><a name="extraparams">Extra parameters</a></h4>
 | 
			
		||||
    <p>
 | 
			
		||||
        Extra parameters can be added to a URI as part of the query string
 | 
			
		||||
        (the part following <code>?</code>). A single parameter is formed by a
 | 
			
		||||
@@ -188,7 +188,7 @@ vpx://example-vcenter.com/folder1/dc1/folder2/example-esx.com
 | 
			
		||||
    </table>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <h3><a id="auth">Authentication</a></h3>
 | 
			
		||||
    <h3><a name="auth">Authentication</a></h3>
 | 
			
		||||
    <p>
 | 
			
		||||
        In order to perform any useful operation the driver needs to log into
 | 
			
		||||
        the ESX server. Therefore, only <code>virConnectOpenAuth</code> can be
 | 
			
		||||
@@ -208,7 +208,7 @@ vpx://example-vcenter.com/folder1/dc1/folder2/example-esx.com
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <h3><a id="certificates">Certificates for HTTPS</a></h3>
 | 
			
		||||
    <h3><a name="certificates">Certificates for HTTPS</a></h3>
 | 
			
		||||
    <p>
 | 
			
		||||
        By default the ESX driver uses HTTPS to communicate with an ESX server.
 | 
			
		||||
        Proper HTTPS communication requires correctly configured SSL
 | 
			
		||||
@@ -244,7 +244,7 @@ error: internal error curl_easy_perform() returned an error: Peer certificate ca
 | 
			
		||||
    </ul>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <h3><a id="connproblems">Connection problems</a></h3>
 | 
			
		||||
    <h3><a name="connproblems">Connection problems</a></h3>
 | 
			
		||||
    <p>
 | 
			
		||||
        There are also other causes for connection problems than the
 | 
			
		||||
        <a href="#certificates">HTTPS certificate</a> related ones.
 | 
			
		||||
@@ -303,7 +303,7 @@ error: invalid argument in libvirt was built without the 'esx' driver
 | 
			
		||||
    </ul>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <h2><a id="questions">Questions blocking tasks</a></h2>
 | 
			
		||||
    <h2><a name="questions">Questions blocking tasks</a></h2>
 | 
			
		||||
    <p>
 | 
			
		||||
        Some methods of the VI API start tasks, for example
 | 
			
		||||
        <code>PowerOnVM_Task()</code>. Such tasks may be blocked by questions
 | 
			
		||||
@@ -322,12 +322,12 @@ error: invalid argument in libvirt was built without the 'esx' driver
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <h2><a id="xmlspecial">Specialties in the domain XML config</a></h2>
 | 
			
		||||
    <h2><a name="xmlspecial">Specialties in the domain XML config</a></h2>
 | 
			
		||||
    <p>
 | 
			
		||||
        There are several specialties in the domain XML config for ESX domains.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <h3><a id="restrictions">Restrictions</a></h3>
 | 
			
		||||
    <h3><a name="restrictions">Restrictions</a></h3>
 | 
			
		||||
    <p>
 | 
			
		||||
        There are some restrictions for some values of the domain XML config.
 | 
			
		||||
        The driver will complain if this restrictions are violated.
 | 
			
		||||
@@ -347,7 +347,7 @@ error: invalid argument in libvirt was built without the 'esx' driver
 | 
			
		||||
    </ul>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <h3><a id="datastore">Datastore references</a></h3>
 | 
			
		||||
    <h3><a name="datastore">Datastore references</a></h3>
 | 
			
		||||
    <p>
 | 
			
		||||
        Storage is managed in datastores. VMware uses a special path format to
 | 
			
		||||
        reference files in a datastore. Basically, the datastore name is put
 | 
			
		||||
@@ -366,7 +366,7 @@ error: invalid argument in libvirt was built without the 'esx' driver
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <h3><a id="macaddresses">MAC addresses</a></h3>
 | 
			
		||||
    <h3><a name="macaddresses">MAC addresses</a></h3>
 | 
			
		||||
    <p>
 | 
			
		||||
        VMware has registered two MAC address prefixes for domains:
 | 
			
		||||
        <code>00:0c:29</code> and <code>00:50:56</code>. These prefixes are
 | 
			
		||||
@@ -427,7 +427,7 @@ ethernet0.checkMACAddress = "false"
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <h3><a id="hardware">Available hardware</a></h3>
 | 
			
		||||
    <h3><a name="hardware">Available hardware</a></h3>
 | 
			
		||||
    <p>
 | 
			
		||||
        VMware ESX supports different models of SCSI controllers and network
 | 
			
		||||
        cards.
 | 
			
		||||
@@ -467,14 +467,14 @@ ethernet0.checkMACAddress = "false"
 | 
			
		||||
        Here a domain XML snippet:
 | 
			
		||||
    </p>
 | 
			
		||||
<pre>
 | 
			
		||||
...
 | 
			
		||||
<disk type='file' device='disk'>
 | 
			
		||||
  <source file='[local-storage] Fedora11/Fedora11.vmdk'/>
 | 
			
		||||
  <target dev='sda' bus='scsi'/>
 | 
			
		||||
  <address type='drive' controller='0' bus='0' unit='0'/>
 | 
			
		||||
</disk>
 | 
			
		||||
<controller type='scsi' index='0' model='<strong>lsilogic</strong>'/>
 | 
			
		||||
...
 | 
			
		||||
    ...
 | 
			
		||||
    <disk type='file' device='disk'>
 | 
			
		||||
      <source file='[local-storage] Fedora11/Fedora11.vmdk'/>
 | 
			
		||||
      <target dev='sda' bus='scsi'/>
 | 
			
		||||
      <address type='drive' controller='0' bus='0' unit='0'/>
 | 
			
		||||
    </disk>
 | 
			
		||||
    <controller type='scsi' index='0' model='<strong>lsilogic</strong>'/>
 | 
			
		||||
    ...
 | 
			
		||||
</pre>
 | 
			
		||||
    <p>
 | 
			
		||||
        The controller element is supported <span class="since">since 0.8.2</span>.
 | 
			
		||||
@@ -482,13 +482,13 @@ ethernet0.checkMACAddress = "false"
 | 
			
		||||
        specify the SCSI controller model. This attribute usage is deprecated now.
 | 
			
		||||
    </p>
 | 
			
		||||
<pre>
 | 
			
		||||
...
 | 
			
		||||
<disk type='file' device='disk'>
 | 
			
		||||
  <driver name='<strong>lsilogic</strong>'/>
 | 
			
		||||
  <source file='[local-storage] Fedora11/Fedora11.vmdk'/>
 | 
			
		||||
  <target dev='sda' bus='scsi'/>
 | 
			
		||||
</disk>
 | 
			
		||||
...
 | 
			
		||||
    ...
 | 
			
		||||
    <disk type='file' device='disk'>
 | 
			
		||||
      <driver name='<strong>lsilogic</strong>'/>
 | 
			
		||||
      <source file='[local-storage] Fedora11/Fedora11.vmdk'/>
 | 
			
		||||
      <target dev='sda' bus='scsi'/>
 | 
			
		||||
    </disk>
 | 
			
		||||
    ...
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -513,24 +513,24 @@ ethernet0.checkMACAddress = "false"
 | 
			
		||||
        Here a domain XML snippet:
 | 
			
		||||
    </p>
 | 
			
		||||
<pre>
 | 
			
		||||
...
 | 
			
		||||
<interface type='bridge'>
 | 
			
		||||
  <mac address='00:50:56:25:48:c7'/>
 | 
			
		||||
  <source bridge='VM Network'/>
 | 
			
		||||
  <model type='<strong>e1000</strong>'/>
 | 
			
		||||
</interface>
 | 
			
		||||
...
 | 
			
		||||
    ...
 | 
			
		||||
    <interface type='bridge'>
 | 
			
		||||
      <mac address='00:50:56:25:48:c7'/>
 | 
			
		||||
      <source bridge='VM Network'/>
 | 
			
		||||
      <model type='<strong>e1000</strong>'/>
 | 
			
		||||
    </interface>
 | 
			
		||||
    ...
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <h2><a id="importexport">Import and export of domain XML configs</a></h2>
 | 
			
		||||
    <h2><a name="importexport">Import and export of domain XML configs</a></h2>
 | 
			
		||||
    <p>
 | 
			
		||||
        The ESX driver currently supports a native config format known as
 | 
			
		||||
        <code>vmware-vmx</code> to handle VMware VMX configs.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <h3><a id="xmlimport">Converting from VMware VMX config to domain XML config</a></h3>
 | 
			
		||||
    <h3><a name="xmlimport">Converting from VMware VMX config to domain XML config</a></h3>
 | 
			
		||||
    <p>
 | 
			
		||||
        The <code>virsh domxml-from-native</code> provides a way to convert an
 | 
			
		||||
        existing VMware VMX config into a domain XML config that can then be
 | 
			
		||||
@@ -621,7 +621,7 @@ Enter root password for example.com:
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <h3><a id="xmlexport">Converting from domain XML config to VMware VMX config</a></h3>
 | 
			
		||||
    <h3><a name="xmlexport">Converting from domain XML config to VMware VMX config</a></h3>
 | 
			
		||||
    <p>
 | 
			
		||||
      The <code>virsh domxml-to-native</code> provides a way to convert a
 | 
			
		||||
      domain XML config into a VMware VMX config.
 | 
			
		||||
@@ -675,7 +675,7 @@ ethernet0.address = "00:50:56:25:48:C7"
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <h2><a id="xmlconfig">Example domain XML configs</a></h2>
 | 
			
		||||
    <h2><a name="xmlconfig">Example domain XML configs</a></h2>
 | 
			
		||||
 | 
			
		||||
    <h3>Fedora11 on x86_64</h3>
 | 
			
		||||
<pre>
 | 
			
		||||
@@ -704,7 +704,7 @@ ethernet0.address = "00:50:56:25:48:C7"
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <h2><a id="migration">Migration</a></h2>
 | 
			
		||||
    <h2><a name="migration">Migration</a></h2>
 | 
			
		||||
    <p>
 | 
			
		||||
        A migration cannot be initiated on an ESX server directly, a VMware
 | 
			
		||||
        vCenter is necessary for this. The <code>vcenter</code> query
 | 
			
		||||
@@ -749,7 +749,7 @@ Enter administrator password for example-vcenter.com:
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <h2><a id="scheduler">Scheduler configuration</a></h2>
 | 
			
		||||
    <h2><a name="scheduler">Scheduler configuration</a></h2>
 | 
			
		||||
    <p>
 | 
			
		||||
        The driver exposes the ESX CPU scheduler. The parameters listed below
 | 
			
		||||
        are available to control the scheduler.
 | 
			
		||||
@@ -780,7 +780,7 @@ Enter administrator password for example-vcenter.com:
 | 
			
		||||
    </dl>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <h2><a id="tools">VMware tools</a></h2>
 | 
			
		||||
    <h2><a name="tools">VMware tools</a></h2>
 | 
			
		||||
    <p>
 | 
			
		||||
        Some actions require installed VMware tools. If the VMware tools are
 | 
			
		||||
        not installed in the guest and one of the actions below is to be
 | 
			
		||||
@@ -796,7 +796,7 @@ Enter administrator password for example-vcenter.com:
 | 
			
		||||
    </ul>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <h2><a id="links">Links</a></h2>
 | 
			
		||||
    <h2><a name="links">Links</a></h2>
 | 
			
		||||
    <ul>
 | 
			
		||||
        <li>
 | 
			
		||||
            <a href="http://www.vmware.com/support/developer/vc-sdk/">
 | 
			
		||||
 
 | 
			
		||||
@@ -1,15 +1,15 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<!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>Microsoft Hyper-V hypervisor driver</h1>
 | 
			
		||||
    <ul id="toc"></ul>
 | 
			
		||||
    <p>
 | 
			
		||||
        The libvirt Microsoft Hyper-V driver can manage Hyper-V 2008 R2 and newer.
 | 
			
		||||
        The libvirt Microsoft Hyper-V driver can manage Hyper-V 2008 R2.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <h2><a id="project">Project Links</a></h2>
 | 
			
		||||
    <h2><a name="project">Project Links</a></h2>
 | 
			
		||||
    <ul>
 | 
			
		||||
      <li>
 | 
			
		||||
        The <a href="http://www.microsoft.com/hyper-v-server/">Microsoft Hyper-V</a>
 | 
			
		||||
@@ -18,7 +18,7 @@
 | 
			
		||||
    </ul>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <h2><a id="uri">Connections to the Microsoft Hyper-V driver</a></h2>
 | 
			
		||||
    <h2><a name="uri">Connections to the Microsoft Hyper-V driver</a></h2>
 | 
			
		||||
    <p>
 | 
			
		||||
        Some example remote connection URIs for the driver are:
 | 
			
		||||
    </p>
 | 
			
		||||
@@ -36,7 +36,7 @@ hyperv://example-hyperv.com/?transport=http  (over HTTP)
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <h3><a id="uriformat">URI Format</a></h3>
 | 
			
		||||
    <h3><a name="uriformat">URI Format</a></h3>
 | 
			
		||||
    <p>
 | 
			
		||||
        URIs have this general form (<code>[...]</code> marks an optional part).
 | 
			
		||||
    </p>
 | 
			
		||||
@@ -49,7 +49,7 @@ hyperv://[username@]hostname[:port]/[?extraparameters]
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <h4><a id="extraparams">Extra parameters</a></h4>
 | 
			
		||||
    <h4><a name="extraparams">Extra parameters</a></h4>
 | 
			
		||||
    <p>
 | 
			
		||||
        Extra parameters can be added to a URI as part of the query string
 | 
			
		||||
        (the part following <code>?</code>). A single parameter is formed by a
 | 
			
		||||
@@ -83,7 +83,7 @@ hyperv://[username@]hostname[:port]/[?extraparameters]
 | 
			
		||||
    </table>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <h3><a id="auth">Authentication</a></h3>
 | 
			
		||||
    <h3><a name="auth">Authentication</a></h3>
 | 
			
		||||
    <p>
 | 
			
		||||
        In order to perform any useful operation the driver needs to log into
 | 
			
		||||
        the Hyper-V server. Therefore, only <code>virConnectOpenAuth</code> can
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<!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>LXC container driver</h1>
 | 
			
		||||
@@ -18,7 +18,7 @@ particular sVirt for mandatory access control, auditing of operations,
 | 
			
		||||
integration with control groups and many other features.
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
<h2><a id="cgroups">Control groups Requirements</a></h2>
 | 
			
		||||
<h2><a name="cgroups">Control groups Requirements</a></h2>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
In order to control the resource usage of processes inside containers, the
 | 
			
		||||
@@ -32,7 +32,7 @@ init service will be required. For further information, consult the general
 | 
			
		||||
libvirt <a href="cgroups.html">cgroups documentation</a>.
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
<h2><a id="namespaces">Namespace requirements</a></h2>
 | 
			
		||||
<h2><a name="namespaces">Namespace requirements</a></h2>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
In order to separate processes inside a container from those in the
 | 
			
		||||
@@ -47,9 +47,9 @@ configured UID/GID mapping is a pre-requisite to making containers
 | 
			
		||||
secure, in the absence of sVirt confinement.</strong>
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
<h2><a id="init">Default container setup</a></h2>
 | 
			
		||||
<h2><a name="init">Default container setup</a></h2>
 | 
			
		||||
 | 
			
		||||
<h3><a id="cliargs">Command line arguments</a></h3>
 | 
			
		||||
<h3><a name="cliargs">Command line arguments</a></h3>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
When the container "init" process is started, it will typically
 | 
			
		||||
@@ -62,15 +62,15 @@ would use the following XML
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
<pre>
 | 
			
		||||
<os>
 | 
			
		||||
  <type arch='x86_64'>exe</type>
 | 
			
		||||
  <init>/bin/systemd</init>
 | 
			
		||||
  <initarg>--unit</initarg>
 | 
			
		||||
  <initarg>emergency.service</initarg>
 | 
			
		||||
</os>
 | 
			
		||||
  <os>
 | 
			
		||||
    <type arch='x86_64'>exe</type>
 | 
			
		||||
    <init>/bin/systemd</init>
 | 
			
		||||
    <initarg>--unit</initarg>
 | 
			
		||||
    <initarg>emergency.service</initarg>
 | 
			
		||||
  </os>
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
<h3><a id="envvars">Environment variables</a></h3>
 | 
			
		||||
<h3><a name="envvars">Environment variables</a></h3>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
When the container "init" process is started, it will be given several useful
 | 
			
		||||
@@ -108,7 +108,7 @@ Use of this is discouraged, in favour of passing arguments directly to the
 | 
			
		||||
container init process via the <code>initarg</code> config element.</dd>
 | 
			
		||||
</dl>
 | 
			
		||||
 | 
			
		||||
<h3><a id="fsmounts">Filesystem mounts</a></h3>
 | 
			
		||||
<h3><a name="fsmounts">Filesystem mounts</a></h3>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
In the absence of any explicit configuration, the container will
 | 
			
		||||
@@ -131,7 +131,7 @@ only expose the sub-tree associated with the container</li>
 | 
			
		||||
</ul>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<h3><a id="devnodes">Device nodes</a></h3>
 | 
			
		||||
<h3><a name="devnodes">Device nodes</a></h3>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
The container init process will be started with <code>CAP_MKNOD</code>
 | 
			
		||||
@@ -178,7 +178,7 @@ Further block or character devices will be made available to containers
 | 
			
		||||
depending on their configuration.
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
<h2><a id="security">Security considerations</a></h2>
 | 
			
		||||
<h2><a name="security">Security considerations</a></h2>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
The libvirt LXC driver is fairly flexible in how it can be configured,
 | 
			
		||||
@@ -190,7 +190,7 @@ isolation between a container and the host must ensure that they are
 | 
			
		||||
writing a suitable configuration.
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
<h3><a id="securenetworking">Network isolation</a></h3>
 | 
			
		||||
<h3><a name="securenetworking">Network isolation</a></h3>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
If the guest configuration does not list any network interfaces,
 | 
			
		||||
@@ -205,7 +205,7 @@ namespace is not wanted, then applications should set the
 | 
			
		||||
<code><features>....</features></code> element.
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
<h3><a id="securefs">Filesystem isolation</a></h3>
 | 
			
		||||
<h3><a name="securefs">Filesystem isolation</a></h3>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
If the guest configuration does not list any filesystems, then
 | 
			
		||||
@@ -250,7 +250,7 @@ a bind mount to hide them. This is particularly important for the
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<h3><a id="secureusers">User and group isolation</a></h3>
 | 
			
		||||
<h3><a name="secureusers">User and group isolation</a></h3>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
If the guest configuration does not list any ID mapping, then the
 | 
			
		||||
@@ -281,7 +281,7 @@ causes libvirt to activate the user namespace feature.
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<h2><a id="activation">Systemd Socket Activation Integration</a></h2>
 | 
			
		||||
<h2><a name="activation">Systemd Socket Activation Integration</a></h2>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
The libvirt LXC driver provides the ability to pass across pre-opened file
 | 
			
		||||
@@ -477,7 +477,7 @@ configured to block read/write/mknod from all devices except those
 | 
			
		||||
that a container is authorized to use.
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
<h2><a id="exconfig">Example configurations</a></h2>
 | 
			
		||||
<h2><a name="exconfig">Example configurations</a></h2>
 | 
			
		||||
 | 
			
		||||
<h3>Example config version 1</h3>
 | 
			
		||||
<p></p>
 | 
			
		||||
@@ -542,7 +542,7 @@ debootstrap, whatever) under /opt/vm-1-root:
 | 
			
		||||
</domain>
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
<h2><a id="capabilities">Altering the available capabilities</a></h2>
 | 
			
		||||
<h2><a name="capabilities">Altering the available capabilities</a></h2>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
By default the libvirt LXC driver drops some capabilities among which CAP_MKNOD.
 | 
			
		||||
@@ -590,7 +590,7 @@ Note that allowing capabilities that are normally dropped by default can serious
 | 
			
		||||
affect the security of the container and the host.
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
<h2><a id="share">Inherit namespaces</a></h2>
 | 
			
		||||
<h2><a name="share">Inherit namespaces</a></h2>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
Libvirt allows you to inherit the namespace from container/process just like lxc tools
 | 
			
		||||
@@ -611,11 +611,7 @@ ignored.
 | 
			
		||||
</domain>
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
The use of namespace passthrough requires libvirt >= 1.2.19
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
<h2><a id="usage">Container usage / management</a></h2>
 | 
			
		||||
<h2><a name="usage">Container usage / management</a></h2>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
As with any libvirt virtualization driver, LXC containers can be
 | 
			
		||||
@@ -629,7 +625,7 @@ and LXC. For further details about usage of virsh consult its
 | 
			
		||||
manual page.
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
<h3><a id="usageSave">Defining (saving) container configuration</a></h3>
 | 
			
		||||
<h3><a name="usageSave">Defining (saving) container configuration</a></h3>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
The <code>virsh define</code> command takes an XML configuration
 | 
			
		||||
@@ -640,7 +636,7 @@ document and loads it into libvirt, saving the configuration on disk
 | 
			
		||||
# virsh -c lxc:/// define myguest.xml
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
<h3><a id="usageView">Viewing container configuration</a></h3>
 | 
			
		||||
<h3><a name="usageView">Viewing container configuration</a></h3>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
The <code>virsh dumpxml</code> command can be used to view the
 | 
			
		||||
@@ -655,7 +651,7 @@ using the <code>--inactive</code> flag
 | 
			
		||||
# virsh -c lxc:/// dumpxml myguest
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
<h3><a id="usageStart">Starting containers</a></h3>
 | 
			
		||||
<h3><a name="usageStart">Starting containers</a></h3>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
The <code>virsh start</code> command can be used to start a
 | 
			
		||||
@@ -677,7 +673,7 @@ by libvirt, using the <code>virsh create</code> command.
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<h3><a id="usageStop">Stopping containers</a></h3>
 | 
			
		||||
<h3><a name="usageStop">Stopping containers</a></h3>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
The <code>virsh shutdown</code> command can be used
 | 
			
		||||
@@ -702,7 +698,7 @@ request, it can be forcibly stopped using the <code>virsh destroy</code>
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<h3><a id="usageReboot">Rebooting a container</a></h3>
 | 
			
		||||
<h3><a name="usageReboot">Rebooting a container</a></h3>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
The <code>virsh reboot</code> command can be used
 | 
			
		||||
@@ -717,7 +713,7 @@ to PID 1 inside the container.
 | 
			
		||||
# virsh -c lxc:/// reboot myguest
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
<h3><a id="usageDelete">Undefining (deleting) a container configuration</a></h3>
 | 
			
		||||
<h3><a name="usageDelete">Undefining (deleting) a container configuration</a></h3>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
The <code>virsh undefine</code> command can be used to delete the
 | 
			
		||||
@@ -729,7 +725,7 @@ running, this will turn it into a "transient" guest.
 | 
			
		||||
# virsh -c lxc:/// undefine myguest
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
<h3><a id="usageConnect">Connecting to a container console</a></h3>
 | 
			
		||||
<h3><a name="usageConnect">Connecting to a container console</a></h3>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
The <code>virsh console</code> command can be used to connect
 | 
			
		||||
@@ -752,7 +748,7 @@ as 'console0', 'console1', 'console2', etc.
 | 
			
		||||
# virsh -c lxc:/// console myguest --devname console1
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
<h3><a id="usageEnter">Running commands in a container</a></h3>
 | 
			
		||||
<h3><a name="usageEnter">Running commands in a container</a></h3>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
The <code>virsh lxc-enter-namespace</code> command can be used
 | 
			
		||||
@@ -764,7 +760,7 @@ and then execute an arbitrary command.
 | 
			
		||||
# virsh -c lxc:/// lxc-enter-namespace myguest -- /bin/ls -al /dev
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
<h3><a id="usageTop">Monitoring container utilization</a></h3>
 | 
			
		||||
<h3><a name="usageTop">Monitoring container utilization</a></h3>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
The <code>virt-top</code> command can be used to monitor the
 | 
			
		||||
@@ -776,7 +772,7 @@ host
 | 
			
		||||
# virt-top -c lxc:///
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
<h3><a id="usageConvert">Converting LXC container configuration</a></h3>
 | 
			
		||||
<h3><a name="usageConvert">Converting LXC container configuration</a></h3>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
The <code>virsh domxml-from-native</code> command can be used to convert
 | 
			
		||||
 
 | 
			
		||||
@@ -1,355 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<html xmlns="http://www.w3.org/1999/xhtml">
 | 
			
		||||
  <body>
 | 
			
		||||
    <h1>Host device management</h1>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      Libvirt provides management of both physical and virtual host devices
 | 
			
		||||
      (historically also referred to as node devices) like USB, PCI, SCSI, and
 | 
			
		||||
      network devices. This also includes various virtualization capabilities
 | 
			
		||||
      which the aforementioned devices provide for utilization, for example
 | 
			
		||||
      SR-IOV, NPIV, MDEV, DRM, etc.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      The node device driver provides means to list and show details about host
 | 
			
		||||
      devices (<code>virsh nodedev-list</code>,
 | 
			
		||||
      <code>virsh nodedev-dumpxml</code>), which are generic and can be used
 | 
			
		||||
      with all devices. It also provides means to create and destroy devices
 | 
			
		||||
      (<code>virsh nodedev-create</code>, <code>virsh nodedev-destroy</code>)
 | 
			
		||||
      which are meant to be used to create virtual devices, currently only
 | 
			
		||||
      supported by NPIV
 | 
			
		||||
      (<a href="http://wiki.libvirt.org/page/NPIV_in_libvirt">more info about NPIV)</a>).
 | 
			
		||||
      Devices on the host system are arranged in a tree-like hierarchy, with
 | 
			
		||||
      the root node being called <code>computer</code>. The node device driver
 | 
			
		||||
      supports two backends to manage the devices, HAL and udev, with the former
 | 
			
		||||
      being deprecated in favour of the latter.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      The generic format of a host device XML can be seen below.
 | 
			
		||||
      To identify a device both within the host and the device tree hierarchy,
 | 
			
		||||
      the following elements are used:
 | 
			
		||||
    </p>
 | 
			
		||||
      <dl>
 | 
			
		||||
        <dt><code>name</code></dt>
 | 
			
		||||
        <dd>
 | 
			
		||||
          The device's name will be generated by libvirt using the subsystem,
 | 
			
		||||
          like pci and the device's sysfs basename.
 | 
			
		||||
        </dd>
 | 
			
		||||
        <dt><code>path</code></dt>
 | 
			
		||||
        <dd>
 | 
			
		||||
          Fully qualified sysfs path to the device.
 | 
			
		||||
        </dd>
 | 
			
		||||
        <dt><code>parent</code></dt>
 | 
			
		||||
        <dd>
 | 
			
		||||
          This element identifies the parent node in the device hierarchy. The
 | 
			
		||||
          value of the element will correspond with the device parent's
 | 
			
		||||
          <code>name</code> element or <code>computer</code> if the device does
 | 
			
		||||
          not have any parent.
 | 
			
		||||
        </dd>
 | 
			
		||||
        <dt><code>driver</code></dt>
 | 
			
		||||
        <dd>
 | 
			
		||||
          This elements reports the driver in use for this device. The presence
 | 
			
		||||
          of this element in the output XML depends on whether the underlying
 | 
			
		||||
          device manager (most likely udev) exposes information about the
 | 
			
		||||
          driver.
 | 
			
		||||
        </dd>
 | 
			
		||||
        <dt><code>capability</code></dt>
 | 
			
		||||
        <dd>
 | 
			
		||||
          Describes the device in terms of feature support. The element has one
 | 
			
		||||
          mandatory attribute <code>type</code> the value of which determines
 | 
			
		||||
          the type of the device. Currently recognized values for the attribute
 | 
			
		||||
          are:
 | 
			
		||||
          <code>system</code>,
 | 
			
		||||
          <code>pci</code>,
 | 
			
		||||
          <code>usb</code>,
 | 
			
		||||
          <code>usb_device</code>,
 | 
			
		||||
          <code>net</code>,
 | 
			
		||||
          <code>scsi</code>,
 | 
			
		||||
          <code>scsi_host</code> (<span class="since">Since 0.4.7</span>),
 | 
			
		||||
          <code>fc_host</code>,
 | 
			
		||||
          <code>vports</code>,
 | 
			
		||||
          <code>scsi_target</code> (<span class="since">Since 0.7.3</span>),
 | 
			
		||||
          <code>storage</code> (<span class="since">Since 1.0.4</span>),
 | 
			
		||||
          <code>scsi_generic</code> (<span class="since">Since 1.0.7</span>),
 | 
			
		||||
          <code>drm</code> (<span class="since">Since 3.1.0</span>), and
 | 
			
		||||
          <code>mdev</code> (<span class="since">Since 3.4.0</span>).
 | 
			
		||||
          This element can be nested in which case it further specifies a
 | 
			
		||||
          device's capability. Refer to specific device types to see more values
 | 
			
		||||
          for the <code>type</code> attribute which are exclusive.
 | 
			
		||||
        </dd>
 | 
			
		||||
      </dl>
 | 
			
		||||
 | 
			
		||||
    <h2>Basic structure of a node device</h2>
 | 
			
		||||
    <pre>
 | 
			
		||||
<device>
 | 
			
		||||
  <name>pci_0000_00_17_0</name>
 | 
			
		||||
  <path>/sys/devices/pci0000:00/0000:00:17.0</path>
 | 
			
		||||
  <parent>computer</parent>
 | 
			
		||||
  <driver>
 | 
			
		||||
    <name>ahci</name>
 | 
			
		||||
  </driver>
 | 
			
		||||
  <capability type='pci'>
 | 
			
		||||
...
 | 
			
		||||
  </capability>
 | 
			
		||||
</device></pre>
 | 
			
		||||
 | 
			
		||||
    <ul id="toc"/>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="PCI">PCI host devices</a></h2>
 | 
			
		||||
    <dl>
 | 
			
		||||
      <dt><code>capability</code></dt>
 | 
			
		||||
      <dd>
 | 
			
		||||
        When used as top level element, the supported values for the
 | 
			
		||||
        <code>type</code> attribute are <code>pci</code> and
 | 
			
		||||
        <code>phys_function</code> (see <a href="#SRIOVCap">SR-IOV below</a>).
 | 
			
		||||
      </dd>
 | 
			
		||||
    </dl>
 | 
			
		||||
    <pre>
 | 
			
		||||
<device>
 | 
			
		||||
  <name>pci_0000_04_00_1</name>
 | 
			
		||||
  <path>/sys/devices/pci0000:00/0000:00:06.0/0000:04:00.1</path>
 | 
			
		||||
  <parent>pci_0000_00_06_0</parent>
 | 
			
		||||
  <driver>
 | 
			
		||||
    <name>igb</name>
 | 
			
		||||
  </driver>
 | 
			
		||||
  <capability type='pci'>
 | 
			
		||||
    <domain>0</domain>
 | 
			
		||||
    <bus>4</bus>
 | 
			
		||||
    <slot>0</slot>
 | 
			
		||||
    <function>1</function>
 | 
			
		||||
    <product id='0x10c9'>82576 Gigabit Network Connection</product>
 | 
			
		||||
    <vendor id='0x8086'>Intel Corporation</vendor>
 | 
			
		||||
    <iommuGroup number='15'>
 | 
			
		||||
      <address domain='0x0000' bus='0x04' slot='0x00' function='0x1'/>
 | 
			
		||||
    </iommuGroup>
 | 
			
		||||
    <numa node='0'/>
 | 
			
		||||
    <pci-express>
 | 
			
		||||
      <link validity='cap' port='1' speed='2.5' width='2'/>
 | 
			
		||||
      <link validity='sta' speed='2.5' width='2'/>
 | 
			
		||||
    </pci-express>
 | 
			
		||||
  </capability>
 | 
			
		||||
</device></pre>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      The XML format for a PCI device stays the same for any further
 | 
			
		||||
      capabilities it supports, a single nested <code><capability></code>
 | 
			
		||||
      element will be included for each capability the device supports.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <h3><a id="SRIOVCap">SR-IOV capability</a></h3>
 | 
			
		||||
    <p>
 | 
			
		||||
      Single root input/output virtualization (SR-IOV) allows sharing of the
 | 
			
		||||
      PCIe resources by multiple virtual environments. That is achieved by
 | 
			
		||||
      slicing up a single full-featured physical resource called physical
 | 
			
		||||
      function (PF) into multiple devices called virtual functions (VFs) sharing
 | 
			
		||||
      their configuration with the underlying PF. Despite the SR-IOV
 | 
			
		||||
      specification, the amount of VFs that can be created on a PF varies among
 | 
			
		||||
      manufacturers.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      Suppose the NIC <a href="#PCI">above</a> was also SR-IOV capable, it would
 | 
			
		||||
      also include a nested
 | 
			
		||||
      <code><capability></code> element enumerating all virtual
 | 
			
		||||
      functions available on the physical device (physical port) like in the
 | 
			
		||||
      example below.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <pre>
 | 
			
		||||
<capability type='pci'>
 | 
			
		||||
...
 | 
			
		||||
  <capability type='virt_functions' maxCount='7'>
 | 
			
		||||
    <address domain='0x0000' bus='0x04' slot='0x10' function='0x1'/>
 | 
			
		||||
    <address domain='0x0000' bus='0x04' slot='0x10' function='0x3'/>
 | 
			
		||||
    <address domain='0x0000' bus='0x04' slot='0x10' function='0x5'/>
 | 
			
		||||
    <address domain='0x0000' bus='0x04' slot='0x10' function='0x7'/>
 | 
			
		||||
    <address domain='0x0000' bus='0x04' slot='0x11' function='0x1'/>
 | 
			
		||||
    <address domain='0x0000' bus='0x04' slot='0x11' function='0x3'/>
 | 
			
		||||
    <address domain='0x0000' bus='0x04' slot='0x11' function='0x5'/>
 | 
			
		||||
  </capability>
 | 
			
		||||
...
 | 
			
		||||
</capability></pre>
 | 
			
		||||
    <p>
 | 
			
		||||
      A SR-IOV child device on the other hand, would then report its top level
 | 
			
		||||
      capability type as a <code>phys_function</code> instead:
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <pre>
 | 
			
		||||
<device>
 | 
			
		||||
...
 | 
			
		||||
  <capability type='phys_function'>
 | 
			
		||||
    <address domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
 | 
			
		||||
  </capability>
 | 
			
		||||
...
 | 
			
		||||
<device></pre>
 | 
			
		||||
 | 
			
		||||
    <h3><a id="MDEVCap">MDEV capability</a></h3>
 | 
			
		||||
    <p>
 | 
			
		||||
      A PCI device capable of creating mediated devices will include a nested
 | 
			
		||||
      capability <code>mdev_types</code> which enumerates all supported mdev
 | 
			
		||||
      types on the physical device, along with the type attributes available
 | 
			
		||||
      through sysfs:
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <dl>
 | 
			
		||||
      <dt><code>type</code></dt>
 | 
			
		||||
      <dd>
 | 
			
		||||
        This element describes a mediated device type which acts as an
 | 
			
		||||
        abstract template defining a resource allocation for instances of this
 | 
			
		||||
        device type. The element has one attribute <code>id</code> which holds
 | 
			
		||||
        an official vendor-supplied identifier for the type.
 | 
			
		||||
        <span class="since">Since 3.4.0</span>
 | 
			
		||||
      </dd>
 | 
			
		||||
 | 
			
		||||
      <dt><code>name</code></dt>
 | 
			
		||||
      <dd>
 | 
			
		||||
        The <code>name</code> element holds a vendor-supplied code name for
 | 
			
		||||
        the given mediated device type. This is an optional element.
 | 
			
		||||
        <span class="since">Since 3.4.0</span>
 | 
			
		||||
      </dd>
 | 
			
		||||
 | 
			
		||||
      <dt><code>deviceAPI</code></dt>
 | 
			
		||||
      <dd>
 | 
			
		||||
        The value of this element describes how an instance of the given type
 | 
			
		||||
        will be presented to the guest by the VFIO framework.
 | 
			
		||||
        <span class="since">Since 3.4.0</span>
 | 
			
		||||
      </dd>
 | 
			
		||||
 | 
			
		||||
      <dt><code>availableInstances</code></dt>
 | 
			
		||||
      <dd>
 | 
			
		||||
        This element reports the current state of resource allocation. In other
 | 
			
		||||
        words, how many instances of the given type can still be successfully
 | 
			
		||||
        created on the physical device.
 | 
			
		||||
        <span class="since">Since 3.4.0</span>
 | 
			
		||||
      </dd>
 | 
			
		||||
    </dl>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      For a more info about mediated devices, refer to the
 | 
			
		||||
      <a href="#MDEV">paragraph below</a>.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
<pre>
 | 
			
		||||
<device>
 | 
			
		||||
...
 | 
			
		||||
  <driver>
 | 
			
		||||
    <name>nvidia</name>
 | 
			
		||||
  </driver>
 | 
			
		||||
  <capability type='pci'>
 | 
			
		||||
...
 | 
			
		||||
    <capability type='mdev_types'>
 | 
			
		||||
      <type id='nvidia-11'>
 | 
			
		||||
        <name>GRID M60-0B</name>
 | 
			
		||||
        <deviceAPI>vfio-pci</deviceAPI>
 | 
			
		||||
        <availableInstances>16</availableInstances>
 | 
			
		||||
      </type>
 | 
			
		||||
      <!-- Here would come the rest of the available mdev types -->
 | 
			
		||||
    </capability>
 | 
			
		||||
...
 | 
			
		||||
  </capability>
 | 
			
		||||
</device></pre>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="MDEV">Mediated devices (MDEVs)</a></h2>
 | 
			
		||||
    <p>
 | 
			
		||||
      Mediated devices (<span class="since">Since 3.2.0</span>) are software
 | 
			
		||||
      devices defining resource allocation on the backing physical device which
 | 
			
		||||
      in turn allows the parent physical device's resources to be divided into
 | 
			
		||||
      several mediated devices, thus sharing the physical device's performance
 | 
			
		||||
      among multiple guests. Unlike SR-IOV however, where a PCIe device appears
 | 
			
		||||
      as multiple separate PCIe devices on the host's PCI bus, mediated devices
 | 
			
		||||
      only appear on the mdev virtual bus. Therefore, no detach/reattach
 | 
			
		||||
      procedure from/to the host driver procedure is involved even though
 | 
			
		||||
      mediated devices are used in a direct device assignment manner.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      The following sub-elements and attributes are exposed within the
 | 
			
		||||
      <code>capability</code> element:
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <dl>
 | 
			
		||||
      <dt><code>type</code></dt>
 | 
			
		||||
      <dd>
 | 
			
		||||
        This element describes a mediated device type which acts as an
 | 
			
		||||
        abstract template defining a resource allocation for instances of this
 | 
			
		||||
        device type. The element has one attribute <code>id</code> which holds
 | 
			
		||||
        an official vendor-supplied identifier for the type.
 | 
			
		||||
        <span class="since">Since 3.4.0</span>
 | 
			
		||||
      </dd>
 | 
			
		||||
 | 
			
		||||
      <dt><code>iommuGroup</code></dt>
 | 
			
		||||
      <dd>
 | 
			
		||||
        This element supports a single attribute <code>number</code> which holds
 | 
			
		||||
        the IOMMU group number the mediated device belongs to.
 | 
			
		||||
        <span class="since">Since 3.4.0</span>
 | 
			
		||||
      </dd>
 | 
			
		||||
    </dl>
 | 
			
		||||
 | 
			
		||||
    <h3>Example of a mediated device</h3>
 | 
			
		||||
    <pre>
 | 
			
		||||
<device>
 | 
			
		||||
  <name>mdev_4b20d080_1b54_4048_85b3_a6a62d165c01</name>
 | 
			
		||||
  <path>/sys/devices/pci0000:00/0000:00:02.0/4b20d080-1b54-4048-85b3-a6a62d165c01</path>
 | 
			
		||||
  <parent>pci_0000_06_00_0</parent>
 | 
			
		||||
  <driver>
 | 
			
		||||
    <name>vfio_mdev</name>
 | 
			
		||||
  </driver>
 | 
			
		||||
  <capability type='mdev'>
 | 
			
		||||
    <type id='nvidia-11'/>
 | 
			
		||||
    <iommuGroup number='12'/>
 | 
			
		||||
  <capability/>
 | 
			
		||||
<device/></pre>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      The support of mediated device's framework in libvirt's node device driver
 | 
			
		||||
      covers the following features:
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <ul>
 | 
			
		||||
      <li>
 | 
			
		||||
        list available mediated devices on the host
 | 
			
		||||
        (<span class="since">Since 3.4.0</span>)
 | 
			
		||||
      </li>
 | 
			
		||||
      <li>
 | 
			
		||||
        display device details
 | 
			
		||||
        (<span class="since">Since 3.4.0</span>)
 | 
			
		||||
      </li>
 | 
			
		||||
    </ul>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      Because mediated devices are instantiated from vendor specific templates,
 | 
			
		||||
      simply called 'types', information describing these types is contained
 | 
			
		||||
      within the parent device's capabilities
 | 
			
		||||
      (see the example in <a href="#PCI">PCI host devices</a>).
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      To see the supported mediated device types on a specific physical device
 | 
			
		||||
      use the following:
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <pre>
 | 
			
		||||
$ ls /sys/class/mdev_bus/<device>/mdev_supported_types</pre>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      To manually instantiate a mediated device, use one of the following as a
 | 
			
		||||
      reference:
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <pre>
 | 
			
		||||
$ uuidgen > /sys/class/mdev_bus/<device>/mdev_supported_types/<type>/create
 | 
			
		||||
...
 | 
			
		||||
$ echo <UUID> > /sys/class/mdev_bus/<device>/mdev_supported_types/<type>/create</pre>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      Manual removal of a mediated device is then performed as follows:
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <pre>
 | 
			
		||||
$ echo 1 > /sys/bus/mdev/devices/<uuid>/remove</pre>
 | 
			
		||||
 | 
			
		||||
  </body>
 | 
			
		||||
</html>
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<!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>OpenVZ container driver</h1>
 | 
			
		||||
@@ -15,7 +15,7 @@
 | 
			
		||||
    undue trouble.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="project">Project Links</a></h2>
 | 
			
		||||
    <h2><a name="project">Project Links</a></h2>
 | 
			
		||||
 | 
			
		||||
    <ul>
 | 
			
		||||
      <li>
 | 
			
		||||
@@ -24,7 +24,7 @@
 | 
			
		||||
      </li>
 | 
			
		||||
    </ul>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="connections">Connections to OpenVZ driver</a></h2>
 | 
			
		||||
    <h2><a name="connections">Connections to OpenVZ driver</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
    The libvirt OpenVZ driver is a single-instance privileged driver,
 | 
			
		||||
@@ -40,7 +40,7 @@ openvz+tcp://example.com/system      (remote access, SASl/Kerberos)
 | 
			
		||||
openvz+ssh://root@example.com/system (remote access, SSH tunnelled)
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="notes">Notes on bridged networking</a></h2>
 | 
			
		||||
    <h2><a name="notes">Notes on bridged networking</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
    Bridged networking enables a guest domain (ie container) to have its
 | 
			
		||||
@@ -49,7 +49,7 @@ openvz+ssh://root@example.com/system (remote access, SSH tunnelled)
 | 
			
		||||
    the host OS.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <h3><a id="host">Host network devices</a></h3>
 | 
			
		||||
    <h3><a name="host">Host network devices</a></h3>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
    One or more of the physical devices must be attached to a bridge. The
 | 
			
		||||
@@ -60,7 +60,7 @@ openvz+ssh://root@example.com/system (remote access, SSH tunnelled)
 | 
			
		||||
    physical device "eth0", or a bonding device "bond0".
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <h3><a id="tools">OpenVZ tools configuration</a></h3>
 | 
			
		||||
    <h3><a name="tools">OpenVZ tools configuration</a></h3>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
    OpenVZ releases later than 3.0.23 ship with a standard network device
 | 
			
		||||
@@ -85,7 +85,7 @@ EXTERNAL_SCRIPT="/usr/sbin/vznetaddbr"
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <h2><a id="example">Example guest domain XML configuration</a></h2>
 | 
			
		||||
    <h2><a name="example">Example guest domain XML configuration</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
    The current libvirt OpenVZ driver has a restriction that the
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<!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>IBM PowerVM hypervisor driver (phyp)</h1>
 | 
			
		||||
@@ -10,7 +10,7 @@
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <h2><a id="project">Project Links</a></h2>
 | 
			
		||||
    <h2><a name="project">Project Links</a></h2>
 | 
			
		||||
    <ul>
 | 
			
		||||
      <li>
 | 
			
		||||
        The <a href="http://www-03.ibm.com/systems/power/software/virtualization/index.html">IBM
 | 
			
		||||
@@ -19,7 +19,7 @@
 | 
			
		||||
    </ul>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <h2><a id="uri">Connections to the PowerVM driver</a></h2>
 | 
			
		||||
    <h2><a name="uri">Connections to the PowerVM driver</a></h2>
 | 
			
		||||
    <p>
 | 
			
		||||
        Some example remote connection URIs for the driver are:
 | 
			
		||||
    </p>
 | 
			
		||||
@@ -38,7 +38,7 @@ phyp://user@ivm/system (IVM connection)
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <h3><a id="uriformat">URI Format</a></h3>
 | 
			
		||||
    <h3><a name="uriformat">URI Format</a></h3>
 | 
			
		||||
    <p>
 | 
			
		||||
        URIs have this general form (<code>[...]</code> marks an
 | 
			
		||||
        optional part, <code>{...|...}</code> marks a mandatory choice).
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<!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>KVM/QEMU hypervisor driver</h1>
 | 
			
		||||
@@ -11,19 +11,19 @@
 | 
			
		||||
      version 0.12.0 or later.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="project">Project Links</a></h2>
 | 
			
		||||
    <h2><a name="project">Project Links</a></h2>
 | 
			
		||||
 | 
			
		||||
    <ul>
 | 
			
		||||
      <li>
 | 
			
		||||
        The <a href="https://www.linux-kvm.org/">KVM</a> Linux
 | 
			
		||||
        The <a href="http://www.linux-kvm.org/">KVM</a> Linux
 | 
			
		||||
        hypervisor
 | 
			
		||||
      </li>
 | 
			
		||||
      <li>
 | 
			
		||||
        The <a href="https://wiki.qemu.org/Index.html">QEMU</a> emulator
 | 
			
		||||
        The <a href="http://wiki.qemu.org/Index.html">QEMU</a> emulator
 | 
			
		||||
      </li>
 | 
			
		||||
    </ul>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="prereq">Deployment pre-requisites</a></h2>
 | 
			
		||||
    <h2><a name="prereq">Deployment pre-requisites</a></h2>
 | 
			
		||||
 | 
			
		||||
    <ul>
 | 
			
		||||
      <li>
 | 
			
		||||
@@ -43,7 +43,7 @@
 | 
			
		||||
      </li>
 | 
			
		||||
    </ul>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="uris">Connections to QEMU driver</a></h2>
 | 
			
		||||
    <h2><a name="uris">Connections to QEMU driver</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
    The libvirt QEMU driver is a multi-instance driver, providing a single
 | 
			
		||||
@@ -63,14 +63,14 @@ qemu+tcp://example.com/system        (remote access, SASl/Kerberos)
 | 
			
		||||
qemu+ssh://root@example.com/system   (remote access, SSH tunnelled)
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="security">Driver security architecture</a></h2>
 | 
			
		||||
    <h2><a name="security">Driver security architecture</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      There are multiple layers to security in the QEMU driver, allowing for
 | 
			
		||||
      flexibility in the use of QEMU based virtual machines.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <h3><a id="securitydriver">Driver instances</a></h3>
 | 
			
		||||
    <h3><a name="securitydriver">Driver instances</a></h3>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      As explained above there are two ways to access the QEMU driver
 | 
			
		||||
@@ -94,7 +94,7 @@ qemu+ssh://root@example.com/system   (remote access, SSH tunnelled)
 | 
			
		||||
      elevated privileges.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <h3><a id="securitydac">POSIX users/groups</a></h3>
 | 
			
		||||
    <h3><a name="securitydac">POSIX users/groups</a></h3>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      In the "session" instance, the POSIX users/groups model restricts QEMU
 | 
			
		||||
@@ -187,7 +187,7 @@ chmod o+x /path/to/directory
 | 
			
		||||
      </li>
 | 
			
		||||
    </ul>
 | 
			
		||||
 | 
			
		||||
    <h3><a id="securitycap">Linux process capabilities</a></h3>
 | 
			
		||||
    <h3><a name="securitycap">Linux process capabilities</a></h3>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      The libvirt QEMU driver has a build time option allowing it to use
 | 
			
		||||
@@ -224,7 +224,7 @@ chmod o+x /path/to/directory
 | 
			
		||||
      to changing the <code>/etc/libvirt/qemu.conf</code> settings.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <h3><a id="securityselinux">SELinux basic confinement</a></h3>
 | 
			
		||||
    <h3><a name="securityselinux">SELinux basic confinement</a></h3>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      The basic SELinux protection for QEMU virtual machines is intended to
 | 
			
		||||
@@ -255,7 +255,7 @@ chmod o+x /path/to/directory
 | 
			
		||||
      SELinux boolean.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <h3><a id="securitysvirt">SELinux sVirt confinement</a></h3>
 | 
			
		||||
    <h3><a name="securitysvirt">SELinux sVirt confinement</a></h3>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      The SELinux sVirt protection for QEMU virtual machines builds to the
 | 
			
		||||
@@ -305,7 +305,7 @@ chmod o+x /path/to/directory
 | 
			
		||||
      file can be used to change the setting to <code>security_driver="none"</code>
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <h3><a id="securitysvirtaa">AppArmor sVirt confinement</a></h3>
 | 
			
		||||
    <h3><a name="securitysvirtaa">AppArmor sVirt confinement</a></h3>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      When using basic AppArmor protection for the libvirtd daemon and
 | 
			
		||||
@@ -373,7 +373,7 @@ chmod o+x /path/to/directory
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <h3><a id="securityacl">Cgroups device ACLs</a></h3>
 | 
			
		||||
    <h3><a name="securityacl">Cgroups device ACLs</a></h3>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      Recent Linux kernels have a capability known as "cgroups" which is used
 | 
			
		||||
@@ -416,7 +416,7 @@ mount -t cgroup none /dev/cgroup -o devices
 | 
			
		||||
      <code>/dev/cgroup/libvirt/qemu/$VMNAME/</code>
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="imex">Import and export of libvirt domain XML configs</a></h2>
 | 
			
		||||
    <h2><a name="imex">Import and export of libvirt domain XML configs</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>The QEMU driver currently supports a single native
 | 
			
		||||
      config format known as <code>qemu-argv</code>. The data for this format
 | 
			
		||||
@@ -424,7 +424,7 @@ mount -t cgroup none /dev/cgroup -o devices
 | 
			
		||||
      then the QEMu binary name, finally followed by the QEMU command line
 | 
			
		||||
      arguments</p>
 | 
			
		||||
 | 
			
		||||
    <h3><a id="xmlimport">Converting from QEMU args to domain XML</a></h3>
 | 
			
		||||
    <h3><a name="xmlimport">Converting from QEMU args to domain XML</a></h3>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      The <code>virsh domxml-from-native</code> provides a way to
 | 
			
		||||
@@ -473,7 +473,7 @@ $ virsh domxml-from-native qemu-argv demo.args
 | 
			
		||||
 | 
			
		||||
    <p>NB, don't include the literal \ in the args, put everything on one line</p>
 | 
			
		||||
 | 
			
		||||
    <h3><a id="xmlexport">Converting from domain XML to QEMU args</a></h3>
 | 
			
		||||
    <h3><a name="xmlexport">Converting from domain XML to QEMU args</a></h3>
 | 
			
		||||
 | 
			
		||||
    <p>
 | 
			
		||||
      The <code>virsh domxml-to-native</code> provides a way to convert a
 | 
			
		||||
@@ -515,7 +515,7 @@ $ virsh domxml-to-native qemu-argv demo.xml
 | 
			
		||||
  -serial none -parallel none -usb
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="qemucommand">Pass-through of arbitrary qemu
 | 
			
		||||
    <h2><a name="qemucommand">Pass-through of arbitrary qemu
 | 
			
		||||
    commands</a></h2>
 | 
			
		||||
 | 
			
		||||
    <p>Libvirt provides an XML namespace and an optional
 | 
			
		||||
@@ -582,7 +582,7 @@ $ virsh domxml-to-native qemu-argv demo.xml
 | 
			
		||||
</domain>
 | 
			
		||||
</pre>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="xmlconfig">Example domain XML config</a></h2>
 | 
			
		||||
    <h2><a name="xmlconfig">Example domain XML config</a></h2>
 | 
			
		||||
 | 
			
		||||
    <h3>QEMU emulated guest on x86_64</h3>
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<!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>Remote management driver</h1>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<!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>Test "mock" driver</h1>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<!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>User Mode Linux driver</h1>
 | 
			
		||||
@@ -13,7 +13,7 @@
 | 
			
		||||
    has pre-created TAP devices.
 | 
			
		||||
    </p>
 | 
			
		||||
 | 
			
		||||
    <h2><a id="project">Project Links</a></h2>
 | 
			
		||||
    <h2><a name="project">Project Links</a></h2>
 | 
			
		||||
 | 
			
		||||
    <ul>
 | 
			
		||||
      <li>
 | 
			
		||||
 
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user