summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGuido Günther <agx@sigxcpu.org>2012-12-23 12:15:48 +0100
committerGuido Günther <agx@sigxcpu.org>2012-12-23 12:15:48 +0100
commite72245657ff92f2c6671fe33ee607cd1a93aba31 (patch)
tree342c89561206b8fb932269de94d7b6d68b613842 /src
parent751c235722d4e5b4a3dcbe485011ee1d13480d7b (diff)
New upstream version 1.0.1
Diffstat (limited to 'src')
-rw-r--r--src/Makefile.am267
-rw-r--r--src/Makefile.in646
-rwxr-xr-xsrc/check-symsorting.pl66
-rw-r--r--src/conf/domain_conf.c209
-rw-r--r--src/internal.h22
-rw-r--r--src/libvirt_esx.syms2
-rw-r--r--src/libvirt_openvz.syms2
-rw-r--r--src/libvirt_private.syms165
-rw-r--r--src/libxl/libxl_conf.c30
-rw-r--r--src/locking/libvirt_lockd.aug35
-rw-r--r--src/locking/lock_daemon.c1429
-rw-r--r--src/locking/lock_daemon.h56
-rw-r--r--src/locking/lock_daemon_config.c193
-rw-r--r--src/locking/lock_daemon_config.h50
-rw-r--r--src/locking/lock_daemon_dispatch.c431
-rw-r--r--src/locking/lock_daemon_dispatch.h31
-rw-r--r--src/locking/lock_daemon_dispatch_stubs.h255
-rw-r--r--src/locking/lock_driver_lockd.c839
-rw-r--r--src/locking/lock_driver_sanlock.c20
-rw-r--r--src/locking/lock_manager.c20
-rw-r--r--src/locking/lock_manager.h3
-rw-r--r--src/locking/lock_protocol.c160
-rw-r--r--src/locking/lock_protocol.h143
-rw-r--r--src/locking/lock_protocol.x95
-rw-r--r--src/locking/lockd.conf68
-rw-r--r--src/locking/test_libvirt_lockd.aug.in9
-rw-r--r--src/locking/virtlockd.init.in93
-rw-r--r--src/locking/virtlockd.service.in13
-rw-r--r--src/locking/virtlockd.socket.in8
-rw-r--r--src/locking/virtlockd.sysconf3
-rw-r--r--src/network/bridge_driver.c11
-rw-r--r--src/qemu/qemu_capabilities.c3
-rw-r--r--src/qemu/qemu_conf.c13
-rw-r--r--src/qemu/qemu_conf.h3
-rw-r--r--src/qemu/qemu_driver.c129
-rw-r--r--src/qemu/qemu_hotplug.c10
-rw-r--r--src/qemu/qemu_monitor.c8
-rw-r--r--src/qemu/qemu_process.c12
-rw-r--r--src/rpc/virnetsocket.c30
-rw-r--r--src/security/security_selinux.c3
-rw-r--r--src/util/cgroup.c7
-rw-r--r--src/util/storage_file.c108
-rw-r--r--src/util/storage_file.h6
-rw-r--r--src/util/util.c50
-rw-r--r--src/util/virinitctl.c56
45 files changed, 5287 insertions, 525 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index 6d2816dc5..53ec9dad9 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -28,6 +28,7 @@ BUILT_SOURCES =
CLEANFILES =
DISTCLEANFILES =
MAINTAINERCLEANFILES =
+nodist_conf_DATA =
THREAD_LIBS = $(LIB_PTHREAD) $(LTLIBMULTITHREAD)
@@ -148,6 +149,45 @@ LOCK_DRIVER_SANLOCK_SOURCES = \
LOCK_DRIVER_SANLOCK_HELPER_SOURCES = \
locking/sanlock_helper.c
+LOCK_PROTOCOL_GENERATED = \
+ $(srcdir)/locking/lock_protocol.h \
+ $(srcdir)/locking/lock_protocol.c \
+ $(NULL)
+
+LOCK_PROTOCOL = $(srcdir)/locking/lock_protocol.x
+EXTRA_DIST += $(LOCK_PROTOCOL) \
+ $(LOCK_PROTOCOL_GENERATED)
+BUILT_SOURCES += $(LOCK_PROTOCOL_GENERATED)
+MAINTAINERCLEANFILES += $(LOCK_PROTOCOL_GENERATED)
+
+LOCK_DAEMON_GENERATED = \
+ $(srcdir)/locking/lock_daemon_dispatch_stubs.h
+ $(NULL)
+
+BUILT_SOURCES += $(LOCK_DAEMON_GENERATED)
+EXTRA_DIST += $(LOCK_DAEMON_GENERATED)
+MAINTAINERCLEANFILES += $(LOCK_DAEMON_GENERATED)
+
+LOCK_DRIVER_LOCKD_SOURCES = \
+ locking/lock_driver_lockd.c \
+ $(NULL)
+
+LOCK_DAEMON_SOURCES = \
+ locking/lock_daemon.h \
+ locking/lock_daemon.c \
+ locking/lock_daemon_config.h \
+ locking/lock_daemon_config.c \
+ locking/lock_daemon_dispatch.c \
+ locking/lock_daemon_dispatch.h \
+ $(NULL)
+
+$(srcdir)/locking/lock_daemon_dispatch_stubs.h: $(LOCK_PROTOCOL) \
+ $(srcdir)/rpc/gendispatch.pl Makefile.am
+ $(AM_V_GEN)perl -w $(srcdir)/rpc/gendispatch.pl \
+ -b virLockSpaceProtocol VIR_LOCK_SPACE_PROTOCOL \
+ $(LOCK_PROTOCOL) > $@
+
+
NETDEV_CONF_SOURCES = \
conf/netdev_bandwidth_conf.h conf/netdev_bandwidth_conf.c \
conf/netdev_vport_profile_conf.h conf/netdev_vport_profile_conf.c \
@@ -326,6 +366,9 @@ check-symfile: libvirt.syms libvirt.la
else
check-symfile:
endif
+check-symsorting:
+ $(AM_V_GEN)$(PERL) $(srcdir)/check-symsorting.pl $(USED_SYM_FILES)
+EXTRA_DIST += check-symfile.pl check-symsorting.pl
PROTOCOL_STRUCTS = \
$(srcdir)/remote_protocol-structs \
@@ -348,8 +391,8 @@ else !WITH_REMOTE
# re-generated when configured --without-remote.
check-protocol:
endif
-EXTRA_DIST += $(PROTOCOL_STRUCTS) check-symfile.pl
-check-local: check-protocol check-symfile
+EXTRA_DIST += $(PROTOCOL_STRUCTS)
+check-local: check-protocol check-symfile check-symsorting
.PHONY: check-protocol $(PROTOCOL_STRUCTS:structs=struct)
# Mock driver, covering domains, storage, networks, etc
@@ -737,7 +780,7 @@ libvirt_driver_la_CFLAGS = $(NUMACTL_CFLAGS) $(GNUTLS_CFLAGS) \
-I$(top_srcdir)/src/conf $(AM_CFLAGS)
libvirt_driver_la_LIBADD = $(NUMACTL_LIBS) $(GNUTLS_LIBS) $(DLOPEN_LIBS)
-USED_SYM_FILES = libvirt_private.syms
+USED_SYM_FILES = $(srcdir)/libvirt_private.syms
if WITH_TEST
noinst_LTLIBRARIES += libvirt_driver_test.la
@@ -1269,9 +1312,14 @@ EXTRA_DIST += \
check-local: check-augeas
-.PHONY: check-augeas check-augeas-qemu check-augeas-lxc check-augeas-sanlock
+.PHONY: check-augeas \
+ check-augeas-qemu \
+ check-augeas-lxc \
+ check-augeas-sanlock \
+ check-augeas-lockd \
+ $(NULL)
-check-augeas: check-augeas-qemu check-augeas-lxc check-augeas-sanlock
+check-augeas: check-augeas-qemu check-augeas-lxc check-augeas-sanlock check-augeas-lockd
AUG_GENTEST = $(PERL) $(top_srcdir)/build-aux/augeas-gentest.pl
EXTRA_DIST += $(top_srcdir)/build-aux/augeas-gentest.pl
@@ -1315,6 +1363,15 @@ else
check-augeas-sanlock:
endif
+test_libvirt_lockd.aug: locking/test_libvirt_lockd.aug.in \
+ locking/qemu-lockd.conf $(AUG_GENTEST)
+ $(AM_V_GEN)$(AUG_GENTEST) locking/qemu-lockd.conf $< $@
+
+check-augeas-lockd: test_libvirt_lockd.aug
+ $(AM_V_GEN)if test -x '$(AUGPARSE)'; then \
+ '$(AUGPARSE)' -I $(srcdir)/locking test_libvirt_lockd.aug; \
+ fi
+
#
# Build our version script. This is composed of three parts:
#
@@ -1335,43 +1392,43 @@ endif
#
if WITH_DRIVER_MODULES
-USED_SYM_FILES += libvirt_driver_modules.syms
+USED_SYM_FILES += $(srcdir)/libvirt_driver_modules.syms
endif
if WITH_LINUX
-USED_SYM_FILES += libvirt_linux.syms
+USED_SYM_FILES += $(srcdir)/libvirt_linux.syms
endif
if WITH_ESX
-USED_SYM_FILES += libvirt_esx.syms
+USED_SYM_FILES += $(srcdir)/libvirt_esx.syms
endif
if WITH_LIBVIRTD
-USED_SYM_FILES += libvirt_daemon.syms
+USED_SYM_FILES += $(srcdir)/libvirt_daemon.syms
endif
if WITH_OPENVZ
-USED_SYM_FILES += libvirt_openvz.syms
+USED_SYM_FILES += $(srcdir)/libvirt_openvz.syms
endif
if WITH_VMX
-USED_SYM_FILES += libvirt_vmx.syms
+USED_SYM_FILES += $(srcdir)/libvirt_vmx.syms
endif
if WITH_XENXS
-USED_SYM_FILES += libvirt_xenxs.syms
+USED_SYM_FILES += $(srcdir)/libvirt_xenxs.syms
endif
if HAVE_SASL
-USED_SYM_FILES += libvirt_sasl.syms
+USED_SYM_FILES += $(srcdir)/libvirt_sasl.syms
endif
if HAVE_LIBSSH2
-USED_SYM_FILES += libvirt_libssh2.syms
+USED_SYM_FILES += $(srcdir)/libvirt_libssh2.syms
endif
if WITH_ATOMIC_OPS_PTHREAD
-USED_SYM_FILES += libvirt_atomic.syms
+USED_SYM_FILES += $(srcdir)/libvirt_atomic.syms
endif
EXTRA_DIST += \
@@ -1401,9 +1458,7 @@ libvirt.syms: libvirt_public.syms $(USED_SYM_FILES) \
printf '\n\n# Private symbols\n\n' >>$@-tmp && \
printf 'LIBVIRT_PRIVATE_$(VERSION) {\n\n' >>$@-tmp && \
printf 'global:\n\n' >>$@-tmp && \
- for file in $(USED_SYM_FILES); do \
- cat $(srcdir)/$$file >>$@-tmp; \
- done && \
+ cat $(USED_SYM_FILES) >>$@-tmp && \
printf '\n\nlocal:\n*;\n\n};' >>$@-tmp && \
chmod a-w $@-tmp && \
mv $@-tmp libvirt.syms
@@ -1508,10 +1563,166 @@ libvirt_qemu_la_CFLAGS = $(AM_CFLAGS)
libvirt_qemu_la_LIBADD = libvirt.la $(CYGWIN_EXTRA_LIBADD)
EXTRA_DIST += $(LIBVIRT_QEMU_SYMBOL_FILE)
-if HAVE_SANLOCK
lockdriverdir = $(libdir)/libvirt/lock-driver
-lockdriver_LTLIBRARIES = sanlock.la
+lockdriver_LTLIBRARIES =
+
+if WITH_LIBVIRTD
+lockdriver_LTLIBRARIES += lockd.la
+lockd_la_SOURCES = \
+ $(LOCK_DRIVER_LOCKD_SOURCES) \
+ $(LOCK_PROTOCOL_GENERATED) \
+ $(NULL)
+lockd_la_CFLAGS = -I$(top_srcdir)/src/conf $(AM_CFLAGS)
+lockd_la_LDFLAGS = -module -avoid-version
+lockd_la_LIBADD = ../gnulib/lib/libgnu.la libvirt-net-rpc.la libvirt-net-rpc-client.la
+augeas_DATA += locking/libvirt_lockd.aug
+augeastest_DATA += test_libvirt_lockd.aug
+CLEANFILES += test_libvirt_lockd.aug
+if WITH_DTRACE_PROBES
+lockd_la_LIBADD += libvirt_probes.lo
+endif
+if WITH_QEMU
+nodist_conf_DATA += locking/qemu-lockd.conf
+BUILT_SOURCES += locking/qemu-lockd.conf
+DISTCLEANFILES += locking/qemu-lockd.conf
+endif
+
+locking/%-lockd.conf: $(srcdir)/locking/lockd.conf
+ $(AM_V_GEN)$(MKDIR_P) locking ; \
+ cp $< $@
+
+
+sbin_PROGRAMS = virtlockd
+
+virtlockd_SOURCES = \
+ $(LOCK_DAEMON_SOURCES) \
+ $(LOCK_PROTOCOL_GENERATED) \
+ $(LOCK_DAEMON_GENERATED) \
+ $(NULL)
+virtlockd_CFLAGS = \
+ $(AM_CFLAGS) \
+ $(NULL)
+virtlockd_LDFLAGS = \
+ $(AM_LDFLAGS) \
+ $(CYGWIN_EXTRA_LDFLAGS) \
+ $(MINGW_EXTRA_LDFLAGS) \
+ $(NULL)
+virtlockd_LDADD = \
+ libvirt-net-rpc-server.la \
+ libvirt-net-rpc.la \
+ libvirt_util.la \
+ ../gnulib/lib/libgnu.la \
+ $(CYGWIN_EXTRA_LIBADD) \
+ $(NULL)
+if WITH_DTRACE_PROBES
+virtlockd_LDADD += libvirt_probes.lo
+endif
+
+else
+EXTRA_DIST += $(LOCK_DAEMON_SOURCES) \
+ $(LOCK_DRIVER_LOCKD_SOURCES)
+endif
+
+EXTRA_DIST += locking/virtlockd.sysconf \
+ locking/lockd.conf \
+ locking/libvirt_lockd.aug \
+ locking/test_libvirt_lockd.aug.in
+
+install-sysconfig:
+ $(MKDIR_P) $(DESTDIR)$(sysconfdir)/sysconfig
+ $(INSTALL_DATA) $(srcdir)/locking/virtlockd.sysconf \
+ $(DESTDIR)$(sysconfdir)/sysconfig/virtlockd
+
+uninstall-sysconfig:
+ rm -f $(DESTDIR)$(sysconfdir)/sysconfig/virtlockd
+ rmdir $(DESTDIR)$(sysconfdir)/sysconfig || :
+EXTRA_DIST += locking/virtlockd.init.in
+
+if WITH_LIBVIRTD
+if LIBVIRT_INIT_SCRIPT_RED_HAT
+install-init:: virtlockd.init install-sysconfig
+ $(MKDIR_P) $(DESTDIR)$(sysconfdir)/rc.d/init.d
+ $(INSTALL_SCRIPT) virtlockd.init \
+ $(DESTDIR)$(sysconfdir)/rc.d/init.d/virtlockd
+
+uninstall-init:: uninstall-sysconfig
+ rm -f $(DESTDIR)$(sysconfdir)/rc.d/init.d/virtlockd
+ rmdir $(DESTDIR)$(sysconfdir)/rc.d/init.d || :
+
+BUILT_SOURCES += virtlockd.init
+DISTCLEANFILES += virtlockd.init
+else
+install-init::
+uninstall-init::
+endif
+else
+install-init::
+uninstall-init::
+endif
+
+virtlockd.init: locking/virtlockd.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 $@
+
+
+
+EXTRA_DIST += locking/virtlockd.service.in locking/virtlockd.socket.in
+
+if WITH_LIBVIRTD
+if LIBVIRT_INIT_SCRIPT_SYSTEMD
+
+SYSTEMD_UNIT_DIR = /lib/systemd/system
+
+BUILT_SOURCES += virtlockd.service virtlockd.socket
+DISTCLEANFILES += virtlockd.service virtlockd.socket
+
+install-systemd: virtlockd.service virtlockd.socket install-sysconfig
+ $(MKDIR_P) $(DESTDIR)$(SYSTEMD_UNIT_DIR)
+ $(INSTALL_SCRIPT) virtlockd.service \
+ $(DESTDIR)$(SYSTEMD_UNIT_DIR)/
+ $(INSTALL_SCRIPT) virtlockd.socket \
+ $(DESTDIR)$(SYSTEMD_UNIT_DIR)/
+
+uninstall-systemd: uninstall-sysconfig
+ rm -f $(DESTDIR)$(SYSTEMD_UNIT_DIR)/virtlockd.service \
+ $(DESTDIR)$(SYSTEMD_UNIT_DIR)/virtlockd.socket
+ rmdir $(DESTDIR)$(SYSTEMD_UNIT_DIR) || :
+else
+install-systemd:
+uninstall-systemd:
+endif
+else
+install-systemd:
+uninstall-systemd:
+endif
+
+virtlockd.service: locking/virtlockd.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 && \
+ chmod a+x $@-t && \
+ mv $@-t $@
+
+virtlockd.socket: locking/virtlockd.socket.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 $@
+
+
+if HAVE_SANLOCK
+lockdriver_LTLIBRARIES += sanlock.la
sanlock_la_SOURCES = $(LOCK_DRIVER_SANLOCK_SOURCES)
sanlock_la_CFLAGS = -I$(top_srcdir)/src/conf $(AM_CFLAGS)
sanlock_la_LDFLAGS = -module -avoid-version
@@ -1527,7 +1738,7 @@ locking/%-sanlock.conf: $(srcdir)/locking/sanlock.conf
cp $< $@
if WITH_QEMU
-nodist_conf_DATA = locking/qemu-sanlock.conf
+nodist_conf_DATA += locking/qemu-sanlock.conf
BUILT_SOURCES += locking/qemu-sanlock.conf
DISTCLEANFILES += locking/qemu-sanlock.conf
endif
@@ -1745,7 +1956,12 @@ endif
endif
EXTRA_DIST += $(SECURITY_DRIVER_APPARMOR_HELPER_SOURCES)
-install-data-local:
+install-data-local: install-init install-systemd
+if WITH_LIBVIRTD
+ $(MKDIR_P) "$(DESTDIR)$(localstatedir)/lib/libvirt/lockd"
+ $(MKDIR_P) "$(DESTDIR)$(localstatedir)/lib/libvirt/lockd/files"
+ $(MKDIR_P) "$(DESTDIR)$(localstatedir)/run/libvirt/lockd"
+endif
$(MKDIR_P) "$(DESTDIR)$(localstatedir)/cache/libvirt"
$(MKDIR_P) "$(DESTDIR)$(localstatedir)/lib/libvirt/images"
$(MKDIR_P) "$(DESTDIR)$(localstatedir)/lib/libvirt/filesystems"
@@ -1794,7 +2010,12 @@ if WITH_NETWORK
$(DESTDIR)$(sysconfdir)/libvirt/qemu/networks/autostart/default.xml
endif
-uninstall-local::
+uninstall-local:: uninstall-init uninstall-systemd
+if WITH_LIBVIRTD
+ rmdir "$(DESTDIR)$(localstatedir)/lib/libvirt/lockd/files" ||:
+ rmdir "$(DESTDIR)$(localstatedir)/lib/libvirt/lockd" ||:
+ rmdir "$(DESTDIR)$(localstatedir)/run/libvirt/lockd" ||:
+endif
rmdir "$(DESTDIR)$(localstatedir)/cache/libvirt" ||:
rmdir "$(DESTDIR)$(localstatedir)/lib/libvirt/images" ||:
rmdir "$(DESTDIR)$(localstatedir)/lib/libvirt/filesystems" ||:
diff --git a/src/Makefile.in b/src/Makefile.in
index 7c1f97ece..66857da2b 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -197,16 +197,16 @@ host_triplet = @host@
# except that build options (such as --enable-debug) can mean these
# symbols aren't present at all.
#
-@WITH_DRIVER_MODULES_TRUE@am__append_115 = libvirt_driver_modules.syms
-@WITH_LINUX_TRUE@am__append_116 = libvirt_linux.syms
-@WITH_ESX_TRUE@am__append_117 = libvirt_esx.syms
-@WITH_LIBVIRTD_TRUE@am__append_118 = libvirt_daemon.syms
-@WITH_OPENVZ_TRUE@am__append_119 = libvirt_openvz.syms
-@WITH_VMX_TRUE@am__append_120 = libvirt_vmx.syms
-@WITH_XENXS_TRUE@am__append_121 = libvirt_xenxs.syms
-@HAVE_SASL_TRUE@am__append_122 = libvirt_sasl.syms
-@HAVE_LIBSSH2_TRUE@am__append_123 = libvirt_libssh2.syms
-@WITH_ATOMIC_OPS_PTHREAD_TRUE@am__append_124 = libvirt_atomic.syms
+@WITH_DRIVER_MODULES_TRUE@am__append_115 = $(srcdir)/libvirt_driver_modules.syms
+@WITH_LINUX_TRUE@am__append_116 = $(srcdir)/libvirt_linux.syms
+@WITH_ESX_TRUE@am__append_117 = $(srcdir)/libvirt_esx.syms
+@WITH_LIBVIRTD_TRUE@am__append_118 = $(srcdir)/libvirt_daemon.syms
+@WITH_OPENVZ_TRUE@am__append_119 = $(srcdir)/libvirt_openvz.syms
+@WITH_VMX_TRUE@am__append_120 = $(srcdir)/libvirt_vmx.syms
+@WITH_XENXS_TRUE@am__append_121 = $(srcdir)/libvirt_xenxs.syms
+@HAVE_SASL_TRUE@am__append_122 = $(srcdir)/libvirt_sasl.syms
+@HAVE_LIBSSH2_TRUE@am__append_123 = $(srcdir)/libvirt_libssh2.syms
+@WITH_ATOMIC_OPS_PTHREAD_TRUE@am__append_124 = $(srcdir)/libvirt_atomic.syms
@WITH_DTRACE_PROBES_TRUE@am__append_125 = libvirt_probes.lo
@WITH_DTRACE_PROBES_TRUE@am__append_126 = libvirt_probes.lo libvirt_probes.o
@WITH_DTRACE_PROBES_TRUE@am__append_127 = libvirt_probes.h libvirt_probes.stp libvirt_functions.stp
@@ -218,41 +218,60 @@ host_triplet = @host@
@WITH_DTRACE_PROBES_TRUE@ libvirt_functions.stp libvirt_probes.stp \
@WITH_DTRACE_PROBES_TRUE@ libvirt_qemu_probes.stp
-@HAVE_SANLOCK_TRUE@am__append_131 = locking/libvirt_sanlock.aug
-@HAVE_SANLOCK_TRUE@am__append_132 = test_libvirt_sanlock.aug
-@HAVE_SANLOCK_TRUE@am__append_133 = test_libvirt_sanlock.aug
-@HAVE_SANLOCK_TRUE@@WITH_QEMU_TRUE@am__append_134 = locking/qemu-sanlock.conf
-@HAVE_SANLOCK_TRUE@@WITH_QEMU_TRUE@am__append_135 = locking/qemu-sanlock.conf
-@HAVE_SANLOCK_FALSE@am__append_136 = $(LOCK_DRIVER_SANLOCK_SOURCES)
-@HAVE_LIBSSH2_TRUE@am__append_137 = \
+@WITH_LIBVIRTD_TRUE@am__append_131 = lockd.la
+@WITH_LIBVIRTD_TRUE@am__append_132 = locking/libvirt_lockd.aug
+@WITH_LIBVIRTD_TRUE@am__append_133 = test_libvirt_lockd.aug
+@WITH_LIBVIRTD_TRUE@am__append_134 = test_libvirt_lockd.aug
+@WITH_DTRACE_PROBES_TRUE@@WITH_LIBVIRTD_TRUE@am__append_135 = libvirt_probes.lo
+@WITH_LIBVIRTD_TRUE@@WITH_QEMU_TRUE@am__append_136 = locking/qemu-lockd.conf
+@WITH_LIBVIRTD_TRUE@@WITH_QEMU_TRUE@am__append_137 = locking/qemu-lockd.conf
+@WITH_LIBVIRTD_TRUE@@WITH_QEMU_TRUE@am__append_138 = locking/qemu-lockd.conf
+@WITH_LIBVIRTD_TRUE@sbin_PROGRAMS = virtlockd$(EXEEXT)
+@WITH_DTRACE_PROBES_TRUE@@WITH_LIBVIRTD_TRUE@am__append_139 = libvirt_probes.lo
+@WITH_LIBVIRTD_FALSE@am__append_140 = $(LOCK_DAEMON_SOURCES) \
+@WITH_LIBVIRTD_FALSE@ $(LOCK_DRIVER_LOCKD_SOURCES)
+
+@LIBVIRT_INIT_SCRIPT_RED_HAT_TRUE@@WITH_LIBVIRTD_TRUE@am__append_141 = virtlockd.init
+@LIBVIRT_INIT_SCRIPT_RED_HAT_TRUE@@WITH_LIBVIRTD_TRUE@am__append_142 = virtlockd.init
+@LIBVIRT_INIT_SCRIPT_SYSTEMD_TRUE@@WITH_LIBVIRTD_TRUE@am__append_143 = virtlockd.service virtlockd.socket
+@LIBVIRT_INIT_SCRIPT_SYSTEMD_TRUE@@WITH_LIBVIRTD_TRUE@am__append_144 = virtlockd.service virtlockd.socket
+@HAVE_SANLOCK_TRUE@am__append_145 = sanlock.la
+@HAVE_SANLOCK_TRUE@am__append_146 = locking/libvirt_sanlock.aug
+@HAVE_SANLOCK_TRUE@am__append_147 = test_libvirt_sanlock.aug
+@HAVE_SANLOCK_TRUE@am__append_148 = test_libvirt_sanlock.aug
+@HAVE_SANLOCK_TRUE@@WITH_QEMU_TRUE@am__append_149 = locking/qemu-sanlock.conf
+@HAVE_SANLOCK_TRUE@@WITH_QEMU_TRUE@am__append_150 = locking/qemu-sanlock.conf
+@HAVE_SANLOCK_TRUE@@WITH_QEMU_TRUE@am__append_151 = locking/qemu-sanlock.conf
+@HAVE_SANLOCK_FALSE@am__append_152 = $(LOCK_DRIVER_SANLOCK_SOURCES)
+@HAVE_LIBSSH2_TRUE@am__append_153 = \
@HAVE_LIBSSH2_TRUE@ rpc/virnetsshsession.h rpc/virnetsshsession.c
-@HAVE_LIBSSH2_FALSE@am__append_138 = \
+@HAVE_LIBSSH2_FALSE@am__append_154 = \
@HAVE_LIBSSH2_FALSE@ rpc/virnetsshsession.h rpc/virnetsshsession.c
-@HAVE_SASL_TRUE@am__append_139 = \
+@HAVE_SASL_TRUE@am__append_155 = \
@HAVE_SASL_TRUE@ rpc/virnetsaslcontext.h rpc/virnetsaslcontext.c
-@HAVE_SASL_FALSE@am__append_140 = \
+@HAVE_SASL_FALSE@am__append_156 = \
@HAVE_SASL_FALSE@ rpc/virnetsaslcontext.h rpc/virnetsaslcontext.c
libexec_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3) \
$(am__EXEEXT_4) $(am__EXEEXT_5)
-@WITH_LIBVIRTD_TRUE@am__append_141 = libvirt_iohelper
-@WITH_DTRACE_PROBES_TRUE@@WITH_LIBVIRTD_TRUE@am__append_142 = libvirt_probes.lo
-@WITH_LIBVIRTD_TRUE@@WITH_STORAGE_DISK_TRUE@am__append_143 = libvirt_parthelper
-@WITH_DTRACE_PROBES_TRUE@@WITH_LIBVIRTD_TRUE@@WITH_STORAGE_DISK_TRUE@am__append_144 = libvirt_probes.lo
-@HAVE_SANLOCK_TRUE@am__append_145 = libvirt_sanlock_helper
-@WITH_LIBVIRTD_TRUE@@WITH_LXC_TRUE@am__append_146 = libvirt_lxc
-@WITH_DTRACE_PROBES_TRUE@@WITH_LIBVIRTD_TRUE@@WITH_LXC_TRUE@am__append_147 = libvirt_probes.lo
-@WITH_LIBVIRTD_TRUE@@WITH_LXC_TRUE@@WITH_SECDRIVER_SELINUX_TRUE@am__append_148 = $(SELINUX_LIBS)
-@WITH_LIBVIRTD_TRUE@@WITH_LXC_TRUE@@WITH_SECDRIVER_APPARMOR_TRUE@am__append_149 = $(APPARMOR_LIBS)
-@HAVE_LIBBLKID_TRUE@@WITH_LIBVIRTD_TRUE@@WITH_LXC_TRUE@am__append_150 = $(BLKID_CFLAGS)
-@HAVE_LIBBLKID_TRUE@@WITH_LIBVIRTD_TRUE@@WITH_LXC_TRUE@am__append_151 = $(BLKID_LIBS)
-@WITH_LIBVIRTD_TRUE@@WITH_LXC_TRUE@@WITH_SECDRIVER_SELINUX_TRUE@am__append_152 = $(SELINUX_CFLAGS)
-@WITH_LIBVIRTD_TRUE@@WITH_LXC_TRUE@@WITH_SECDRIVER_APPARMOR_TRUE@am__append_153 = $(APPARMOR_CFLAGS)
-@WITH_LIBVIRTD_TRUE@@WITH_SECDRIVER_APPARMOR_TRUE@am__append_154 = virt-aa-helper
-@WITH_DTRACE_PROBES_TRUE@@WITH_LIBVIRTD_TRUE@@WITH_SECDRIVER_APPARMOR_TRUE@am__append_155 = libvirt_probes.lo
+@WITH_LIBVIRTD_TRUE@am__append_157 = libvirt_iohelper
+@WITH_DTRACE_PROBES_TRUE@@WITH_LIBVIRTD_TRUE@am__append_158 = libvirt_probes.lo
+@WITH_LIBVIRTD_TRUE@@WITH_STORAGE_DISK_TRUE@am__append_159 = libvirt_parthelper
+@WITH_DTRACE_PROBES_TRUE@@WITH_LIBVIRTD_TRUE@@WITH_STORAGE_DISK_TRUE@am__append_160 = libvirt_probes.lo
+@HAVE_SANLOCK_TRUE@am__append_161 = libvirt_sanlock_helper
+@WITH_LIBVIRTD_TRUE@@WITH_LXC_TRUE@am__append_162 = libvirt_lxc
+@WITH_DTRACE_PROBES_TRUE@@WITH_LIBVIRTD_TRUE@@WITH_LXC_TRUE@am__append_163 = libvirt_probes.lo
+@WITH_LIBVIRTD_TRUE@@WITH_LXC_TRUE@@WITH_SECDRIVER_SELINUX_TRUE@am__append_164 = $(SELINUX_LIBS)
+@WITH_LIBVIRTD_TRUE@@WITH_LXC_TRUE@@WITH_SECDRIVER_APPARMOR_TRUE@am__append_165 = $(APPARMOR_LIBS)
+@HAVE_LIBBLKID_TRUE@@WITH_LIBVIRTD_TRUE@@WITH_LXC_TRUE@am__append_166 = $(BLKID_CFLAGS)
+@HAVE_LIBBLKID_TRUE@@WITH_LIBVIRTD_TRUE@@WITH_LXC_TRUE@am__append_167 = $(BLKID_LIBS)
+@WITH_LIBVIRTD_TRUE@@WITH_LXC_TRUE@@WITH_SECDRIVER_SELINUX_TRUE@am__append_168 = $(SELINUX_CFLAGS)
+@WITH_LIBVIRTD_TRUE@@WITH_LXC_TRUE@@WITH_SECDRIVER_APPARMOR_TRUE@am__append_169 = $(APPARMOR_CFLAGS)
+@WITH_LIBVIRTD_TRUE@@WITH_SECDRIVER_APPARMOR_TRUE@am__append_170 = virt-aa-helper
+@WITH_DTRACE_PROBES_TRUE@@WITH_LIBVIRTD_TRUE@@WITH_SECDRIVER_APPARMOR_TRUE@am__append_171 = libvirt_probes.lo
subdir = src
DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
@@ -404,6 +423,7 @@ am__aclocal_m4_deps = $(top_srcdir)/gnulib/m4/00gnulib.m4 \
$(top_srcdir)/gnulib/m4/servent.m4 \
$(top_srcdir)/gnulib/m4/setenv.m4 \
$(top_srcdir)/gnulib/m4/setlocale.m4 \
+ $(top_srcdir)/gnulib/m4/sha256.m4 \
$(top_srcdir)/gnulib/m4/sig_atomic_t.m4 \
$(top_srcdir)/gnulib/m4/sigaction.m4 \
$(top_srcdir)/gnulib/m4/signal_h.m4 \
@@ -527,9 +547,10 @@ am__uninstall_files_from_dir = { \
}
am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(lockdriverdir)" \
"$(DESTDIR)$(moddir)" "$(DESTDIR)$(libexecdir)" \
- "$(DESTDIR)$(augeasdir)" "$(DESTDIR)$(augeastestdir)" \
- "$(DESTDIR)$(confdir)" "$(DESTDIR)$(confdir)" \
- "$(DESTDIR)$(pkgdatadir)" "$(DESTDIR)$(tapsetdir)"
+ "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(augeasdir)" \
+ "$(DESTDIR)$(augeastestdir)" "$(DESTDIR)$(confdir)" \
+ "$(DESTDIR)$(confdir)" "$(DESTDIR)$(pkgdatadir)" \
+ "$(DESTDIR)$(tapsetdir)"
LTLIBRARIES = $(lib_LTLIBRARIES) $(lockdriver_LTLIBRARIES) \
$(mod_LTLIBRARIES) $(noinst_LTLIBRARIES)
am__DEPENDENCIES_1 =
@@ -1357,10 +1378,26 @@ libvirt_xenxs_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
$(libvirt_xenxs_la_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
-o $@
@WITH_XENXS_TRUE@am_libvirt_xenxs_la_rpath =
+@WITH_LIBVIRTD_TRUE@lockd_la_DEPENDENCIES = ../gnulib/lib/libgnu.la \
+@WITH_LIBVIRTD_TRUE@ libvirt-net-rpc.la \
+@WITH_LIBVIRTD_TRUE@ libvirt-net-rpc-client.la \
+@WITH_LIBVIRTD_TRUE@ $(am__append_135)
+am__lockd_la_SOURCES_DIST = locking/lock_driver_lockd.c \
+ $(srcdir)/locking/lock_protocol.h \
+ $(srcdir)/locking/lock_protocol.c
+am__objects_78 = lockd_la-lock_driver_lockd.lo
+am__objects_79 = lockd_la-lock_protocol.lo
+@WITH_LIBVIRTD_TRUE@am_lockd_la_OBJECTS = $(am__objects_78) \
+@WITH_LIBVIRTD_TRUE@ $(am__objects_79)
+lockd_la_OBJECTS = $(am_lockd_la_OBJECTS)
+lockd_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(lockd_la_CFLAGS) \
+ $(CFLAGS) $(lockd_la_LDFLAGS) $(LDFLAGS) -o $@
+@WITH_LIBVIRTD_TRUE@am_lockd_la_rpath = -rpath $(lockdriverdir)
@HAVE_SANLOCK_TRUE@sanlock_la_DEPENDENCIES = ../gnulib/lib/libgnu.la
am__sanlock_la_SOURCES_DIST = locking/lock_driver_sanlock.c
-am__objects_78 = sanlock_la-lock_driver_sanlock.lo
-@HAVE_SANLOCK_TRUE@am_sanlock_la_OBJECTS = $(am__objects_78)
+am__objects_80 = sanlock_la-lock_driver_sanlock.lo
+@HAVE_SANLOCK_TRUE@am_sanlock_la_OBJECTS = $(am__objects_80)
sanlock_la_OBJECTS = $(am_sanlock_la_OBJECTS)
sanlock_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(sanlock_la_CFLAGS) \
@@ -1372,13 +1409,13 @@ sanlock_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
@WITH_LIBVIRTD_TRUE@@WITH_LXC_TRUE@am__EXEEXT_4 = \
@WITH_LIBVIRTD_TRUE@@WITH_LXC_TRUE@ libvirt_lxc$(EXEEXT)
@WITH_LIBVIRTD_TRUE@@WITH_SECDRIVER_APPARMOR_TRUE@am__EXEEXT_5 = virt-aa-helper$(EXEEXT)
-PROGRAMS = $(libexec_PROGRAMS)
+PROGRAMS = $(libexec_PROGRAMS) $(sbin_PROGRAMS)
am__libvirt_iohelper_SOURCES_DIST = util/iohelper.c
-am__objects_79 = libvirt_iohelper-iohelper.$(OBJEXT)
-@WITH_LIBVIRTD_TRUE@am_libvirt_iohelper_OBJECTS = $(am__objects_79)
+am__objects_81 = libvirt_iohelper-iohelper.$(OBJEXT)
+@WITH_LIBVIRTD_TRUE@am_libvirt_iohelper_OBJECTS = $(am__objects_81)
libvirt_iohelper_OBJECTS = $(am_libvirt_iohelper_OBJECTS)
@WITH_LIBVIRTD_TRUE@libvirt_iohelper_DEPENDENCIES = libvirt_util.la \
-@WITH_LIBVIRTD_TRUE@ ../gnulib/lib/libgnu.la $(am__append_142)
+@WITH_LIBVIRTD_TRUE@ ../gnulib/lib/libgnu.la $(am__append_158)
libvirt_iohelper_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
$(libvirt_iohelper_CFLAGS) $(CFLAGS) \
@@ -1390,19 +1427,19 @@ am__libvirt_lxc_SOURCES_DIST = $(srcdir)/lxc/lxc_protocol.h \
lxc/lxc_cgroup.c lxc/lxc_cgroup.h lxc/lxc_fuse.c \
lxc/lxc_fuse.h lxc/lxc_controller.c nodeinfo.h nodeinfo.c \
datatypes.h datatypes.c
-am__objects_80 = libvirt_lxc-lxc_protocol.$(OBJEXT)
-am__objects_81 = $(am__objects_80) $(am__objects_30) \
+am__objects_82 = libvirt_lxc-lxc_protocol.$(OBJEXT)
+am__objects_83 = $(am__objects_82) $(am__objects_30) \
libvirt_lxc-lxc_conf.$(OBJEXT) \
libvirt_lxc-lxc_container.$(OBJEXT) \
libvirt_lxc-lxc_cgroup.$(OBJEXT) \
libvirt_lxc-lxc_fuse.$(OBJEXT) \
libvirt_lxc-lxc_controller.$(OBJEXT)
-am__objects_82 = libvirt_lxc-nodeinfo.$(OBJEXT)
-am__objects_83 = libvirt_lxc-datatypes.$(OBJEXT)
+am__objects_84 = libvirt_lxc-nodeinfo.$(OBJEXT)
+am__objects_85 = libvirt_lxc-datatypes.$(OBJEXT)
@WITH_LIBVIRTD_TRUE@@WITH_LXC_TRUE@am_libvirt_lxc_OBJECTS = \
-@WITH_LIBVIRTD_TRUE@@WITH_LXC_TRUE@ $(am__objects_81) \
-@WITH_LIBVIRTD_TRUE@@WITH_LXC_TRUE@ $(am__objects_82) \
-@WITH_LIBVIRTD_TRUE@@WITH_LXC_TRUE@ $(am__objects_83)
+@WITH_LIBVIRTD_TRUE@@WITH_LXC_TRUE@ $(am__objects_83) \
+@WITH_LIBVIRTD_TRUE@@WITH_LXC_TRUE@ $(am__objects_84) \
+@WITH_LIBVIRTD_TRUE@@WITH_LXC_TRUE@ $(am__objects_85)
libvirt_lxc_OBJECTS = $(am_libvirt_lxc_OBJECTS)
@WITH_LIBVIRTD_TRUE@@WITH_LXC_TRUE@@WITH_SECDRIVER_SELINUX_TRUE@am__DEPENDENCIES_16 = $(am__DEPENDENCIES_1)
@WITH_LIBVIRTD_TRUE@@WITH_LXC_TRUE@@WITH_SECDRIVER_APPARMOR_TRUE@am__DEPENDENCIES_17 = $(am__DEPENDENCIES_1)
@@ -1416,7 +1453,7 @@ libvirt_lxc_OBJECTS = $(am_libvirt_lxc_OBJECTS)
@WITH_LIBVIRTD_TRUE@@WITH_LXC_TRUE@ libvirt_conf.la \
@WITH_LIBVIRTD_TRUE@@WITH_LXC_TRUE@ libvirt_util.la \
@WITH_LIBVIRTD_TRUE@@WITH_LXC_TRUE@ ../gnulib/lib/libgnu.la \
-@WITH_LIBVIRTD_TRUE@@WITH_LXC_TRUE@ $(am__append_147) \
+@WITH_LIBVIRTD_TRUE@@WITH_LXC_TRUE@ $(am__append_163) \
@WITH_LIBVIRTD_TRUE@@WITH_LXC_TRUE@ $(am__DEPENDENCIES_16) \
@WITH_LIBVIRTD_TRUE@@WITH_LXC_TRUE@ $(am__DEPENDENCIES_17) \
@WITH_LIBVIRTD_TRUE@@WITH_LXC_TRUE@ $(am__DEPENDENCIES_18)
@@ -1424,22 +1461,22 @@ libvirt_lxc_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(libvirt_lxc_CFLAGS) \
$(CFLAGS) $(libvirt_lxc_LDFLAGS) $(LDFLAGS) -o $@
am__libvirt_parthelper_SOURCES_DIST = storage/parthelper.c
-am__objects_84 = libvirt_parthelper-parthelper.$(OBJEXT)
+am__objects_86 = libvirt_parthelper-parthelper.$(OBJEXT)
@WITH_LIBVIRTD_TRUE@@WITH_STORAGE_DISK_TRUE@am_libvirt_parthelper_OBJECTS = \
-@WITH_LIBVIRTD_TRUE@@WITH_STORAGE_DISK_TRUE@ $(am__objects_84)
+@WITH_LIBVIRTD_TRUE@@WITH_STORAGE_DISK_TRUE@ $(am__objects_86)
libvirt_parthelper_OBJECTS = $(am_libvirt_parthelper_OBJECTS)
@WITH_LIBVIRTD_TRUE@@WITH_STORAGE_DISK_TRUE@libvirt_parthelper_DEPENDENCIES = $(am__DEPENDENCIES_1) \
@WITH_LIBVIRTD_TRUE@@WITH_STORAGE_DISK_TRUE@ libvirt_util.la \
@WITH_LIBVIRTD_TRUE@@WITH_STORAGE_DISK_TRUE@ ../gnulib/lib/libgnu.la \
-@WITH_LIBVIRTD_TRUE@@WITH_STORAGE_DISK_TRUE@ $(am__append_144)
+@WITH_LIBVIRTD_TRUE@@WITH_STORAGE_DISK_TRUE@ $(am__append_160)
libvirt_parthelper_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
$(libvirt_parthelper_CFLAGS) $(CFLAGS) \
$(libvirt_parthelper_LDFLAGS) $(LDFLAGS) -o $@
am__libvirt_sanlock_helper_SOURCES_DIST = locking/sanlock_helper.c
-am__objects_85 = libvirt_sanlock_helper-sanlock_helper.$(OBJEXT)
+am__objects_87 = libvirt_sanlock_helper-sanlock_helper.$(OBJEXT)
@HAVE_SANLOCK_TRUE@am_libvirt_sanlock_helper_OBJECTS = \
-@HAVE_SANLOCK_TRUE@ $(am__objects_85)
+@HAVE_SANLOCK_TRUE@ $(am__objects_87)
libvirt_sanlock_helper_OBJECTS = $(am_libvirt_sanlock_helper_OBJECTS)
@HAVE_SANLOCK_TRUE@libvirt_sanlock_helper_DEPENDENCIES = libvirt.la
libvirt_sanlock_helper_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
@@ -1448,19 +1485,41 @@ libvirt_sanlock_helper_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
$(libvirt_sanlock_helper_LDFLAGS) $(LDFLAGS) -o $@
am__virt_aa_helper_SOURCES_DIST = datatypes.h datatypes.c \
security/virt-aa-helper.c
-am__objects_86 = virt_aa_helper-datatypes.$(OBJEXT)
-am__objects_87 = $(am__objects_86) \
+am__objects_88 = virt_aa_helper-datatypes.$(OBJEXT)
+am__objects_89 = $(am__objects_88) \
virt_aa_helper-virt-aa-helper.$(OBJEXT)
-@WITH_LIBVIRTD_TRUE@@WITH_SECDRIVER_APPARMOR_TRUE@am_virt_aa_helper_OBJECTS = $(am__objects_87)
+@WITH_LIBVIRTD_TRUE@@WITH_SECDRIVER_APPARMOR_TRUE@am_virt_aa_helper_OBJECTS = $(am__objects_89)
virt_aa_helper_OBJECTS = $(am_virt_aa_helper_OBJECTS)
@WITH_LIBVIRTD_TRUE@@WITH_SECDRIVER_APPARMOR_TRUE@virt_aa_helper_DEPENDENCIES = libvirt_conf.la \
@WITH_LIBVIRTD_TRUE@@WITH_SECDRIVER_APPARMOR_TRUE@ libvirt_util.la \
@WITH_LIBVIRTD_TRUE@@WITH_SECDRIVER_APPARMOR_TRUE@ ../gnulib/lib/libgnu.la \
-@WITH_LIBVIRTD_TRUE@@WITH_SECDRIVER_APPARMOR_TRUE@ $(am__append_155)
+@WITH_LIBVIRTD_TRUE@@WITH_SECDRIVER_APPARMOR_TRUE@ $(am__append_171)
virt_aa_helper_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
$(virt_aa_helper_CFLAGS) $(CFLAGS) $(virt_aa_helper_LDFLAGS) \
$(LDFLAGS) -o $@
+am__virtlockd_SOURCES_DIST = locking/lock_daemon.h \
+ locking/lock_daemon.c locking/lock_daemon_config.h \
+ locking/lock_daemon_config.c locking/lock_daemon_dispatch.c \
+ locking/lock_daemon_dispatch.h \
+ $(srcdir)/locking/lock_protocol.h \
+ $(srcdir)/locking/lock_protocol.c \
+ $(srcdir)/locking/lock_daemon_dispatch_stubs.h
+am__objects_90 = virtlockd-lock_daemon.$(OBJEXT) \
+ virtlockd-lock_daemon_config.$(OBJEXT) \
+ virtlockd-lock_daemon_dispatch.$(OBJEXT)
+am__objects_91 = virtlockd-lock_protocol.$(OBJEXT)
+@WITH_LIBVIRTD_TRUE@am_virtlockd_OBJECTS = $(am__objects_90) \
+@WITH_LIBVIRTD_TRUE@ $(am__objects_91) $(am__objects_30)
+virtlockd_OBJECTS = $(am_virtlockd_OBJECTS)
+@WITH_LIBVIRTD_TRUE@virtlockd_DEPENDENCIES = \
+@WITH_LIBVIRTD_TRUE@ libvirt-net-rpc-server.la \
+@WITH_LIBVIRTD_TRUE@ libvirt-net-rpc.la libvirt_util.la \
+@WITH_LIBVIRTD_TRUE@ ../gnulib/lib/libgnu.la \
+@WITH_LIBVIRTD_TRUE@ $(am__DEPENDENCIES_1) $(am__append_139)
+virtlockd_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(virtlockd_CFLAGS) \
+ $(CFLAGS) $(virtlockd_LDFLAGS) $(LDFLAGS) -o $@
DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp
am__depfiles_maybe = depfiles
@@ -1524,10 +1583,11 @@ SOURCES = $(libvirt_net_rpc_client_la_SOURCES) \
$(libvirt_driver_xenapi_la_SOURCES) \
$(libvirt_security_manager_la_SOURCES) \
$(libvirt_util_la_SOURCES) $(libvirt_vmx_la_SOURCES) \
- $(libvirt_xenxs_la_SOURCES) $(sanlock_la_SOURCES) \
- $(libvirt_iohelper_SOURCES) $(libvirt_lxc_SOURCES) \
- $(libvirt_parthelper_SOURCES) \
- $(libvirt_sanlock_helper_SOURCES) $(virt_aa_helper_SOURCES)
+ $(libvirt_xenxs_la_SOURCES) $(lockd_la_SOURCES) \
+ $(sanlock_la_SOURCES) $(libvirt_iohelper_SOURCES) \
+ $(libvirt_lxc_SOURCES) $(libvirt_parthelper_SOURCES) \
+ $(libvirt_sanlock_helper_SOURCES) $(virt_aa_helper_SOURCES) \
+ $(virtlockd_SOURCES)
DIST_SOURCES = $(libvirt_net_rpc_client_la_SOURCES) \
$(libvirt_net_rpc_server_la_SOURCES) \
$(am__libvirt_net_rpc_la_SOURCES_DIST) \
@@ -1565,12 +1625,13 @@ DIST_SOURCES = $(libvirt_net_rpc_client_la_SOURCES) \
$(am__libvirt_security_manager_la_SOURCES_DIST) \
$(libvirt_util_la_SOURCES) $(am__libvirt_vmx_la_SOURCES_DIST) \
$(am__libvirt_xenxs_la_SOURCES_DIST) \
- $(am__sanlock_la_SOURCES_DIST) \
+ $(am__lockd_la_SOURCES_DIST) $(am__sanlock_la_SOURCES_DIST) \
$(am__libvirt_iohelper_SOURCES_DIST) \
$(am__libvirt_lxc_SOURCES_DIST) \
$(am__libvirt_parthelper_SOURCES_DIST) \
$(am__libvirt_sanlock_helper_SOURCES_DIST) \
- $(am__virt_aa_helper_SOURCES_DIST)
+ $(am__virt_aa_helper_SOURCES_DIST) \
+ $(am__virtlockd_SOURCES_DIST)
am__can_run_installinfo = \
case $$AM_UPDATE_INFO_DIR in \
n|no|NO) false;; \
@@ -3020,27 +3081,29 @@ AM_LDFLAGS = $(COVERAGE_LDFLAGS)
# Add all conditional sources just in case...
EXTRA_DIST = $(conf_DATA) util/keymaps.csv $(srcdir)/util/virkeymaps.h \
$(srcdir)/util/keymaps.csv $(srcdir)/util/virkeycode-mapgen.py \
- util/threads-pthread.c util/threads-win32.c \
+ util/threads-pthread.c util/threads-win32.c $(LOCK_PROTOCOL) \
+ $(LOCK_PROTOCOL_GENERATED) $(LOCK_DAEMON_GENERATED) \
$(REMOTE_DRIVER_PROTOCOL) $(REMOTE_DRIVER_GENERATED) \
- $(PROTOCOL_STRUCTS) check-symfile.pl $(LXC_PROTOCOL) \
- $(LXC_GENERATED) $(NULL) $(pkgdata_DATA) qemu/qemu.conf \
- qemu/libvirtd_qemu.aug qemu/test_libvirtd_qemu.aug.in \
- qemu/THREADS.txt lxc/lxc.conf lxc/libvirtd_lxc.aug \
- lxc/test_libvirtd_lxc.aug.in $(ESX_GENERATED_STAMP) \
- $(HYPERV_GENERATED_STAMP) network/default.xml \
- $(TEST_DRIVER_SOURCES) $(REMOTE_DRIVER_SOURCES) \
- $(XEN_DRIVER_SOURCES) $(QEMU_DRIVER_SOURCES) \
- $(LXC_DRIVER_SOURCES) $(UML_DRIVER_SOURCES) \
- $(OPENVZ_DRIVER_SOURCES) $(PHYP_DRIVER_SOURCES) \
- $(VBOX_DRIVER_SOURCES) $(XENAPI_DRIVER_SOURCES) \
- $(LIBXL_DRIVER_SOURCES) $(ESX_DRIVER_SOURCES) \
- $(ESX_DRIVER_EXTRA_DIST) $(HYPERV_DRIVER_SOURCES) \
- $(HYPERV_DRIVER_EXTRA_DIST) $(PARALLELS_DRIVER_SOURCES) \
- $(NETWORK_DRIVER_SOURCES) $(INTERFACE_DRIVER_SOURCES) \
- $(STORAGE_DRIVER_SOURCES) $(STORAGE_DRIVER_FS_SOURCES) \
- $(STORAGE_DRIVER_LVM_SOURCES) $(STORAGE_DRIVER_ISCSI_SOURCES) \
- $(STORAGE_DRIVER_SCSI_SOURCES) $(STORAGE_DRIVER_MPATH_SOURCES) \
- $(STORAGE_DRIVER_DISK_SOURCES) $(STORAGE_DRIVER_RBD_SOURCES) \
+ check-symfile.pl check-symsorting.pl $(PROTOCOL_STRUCTS) \
+ $(LXC_PROTOCOL) $(LXC_GENERATED) $(NULL) $(pkgdata_DATA) \
+ qemu/qemu.conf qemu/libvirtd_qemu.aug \
+ qemu/test_libvirtd_qemu.aug.in qemu/THREADS.txt lxc/lxc.conf \
+ lxc/libvirtd_lxc.aug lxc/test_libvirtd_lxc.aug.in \
+ $(ESX_GENERATED_STAMP) $(HYPERV_GENERATED_STAMP) \
+ network/default.xml $(TEST_DRIVER_SOURCES) \
+ $(REMOTE_DRIVER_SOURCES) $(XEN_DRIVER_SOURCES) \
+ $(QEMU_DRIVER_SOURCES) $(LXC_DRIVER_SOURCES) \
+ $(UML_DRIVER_SOURCES) $(OPENVZ_DRIVER_SOURCES) \
+ $(PHYP_DRIVER_SOURCES) $(VBOX_DRIVER_SOURCES) \
+ $(XENAPI_DRIVER_SOURCES) $(LIBXL_DRIVER_SOURCES) \
+ $(ESX_DRIVER_SOURCES) $(ESX_DRIVER_EXTRA_DIST) \
+ $(HYPERV_DRIVER_SOURCES) $(HYPERV_DRIVER_EXTRA_DIST) \
+ $(PARALLELS_DRIVER_SOURCES) $(NETWORK_DRIVER_SOURCES) \
+ $(INTERFACE_DRIVER_SOURCES) $(STORAGE_DRIVER_SOURCES) \
+ $(STORAGE_DRIVER_FS_SOURCES) $(STORAGE_DRIVER_LVM_SOURCES) \
+ $(STORAGE_DRIVER_ISCSI_SOURCES) $(STORAGE_DRIVER_SCSI_SOURCES) \
+ $(STORAGE_DRIVER_MPATH_SOURCES) $(STORAGE_DRIVER_DISK_SOURCES) \
+ $(STORAGE_DRIVER_RBD_SOURCES) \
$(STORAGE_DRIVER_SHEEPDOG_SOURCES) \
$(NODE_DEVICE_DRIVER_SOURCES) \
$(NODE_DEVICE_DRIVER_HAL_SOURCES) \
@@ -3055,26 +3118,34 @@ EXTRA_DIST = $(conf_DATA) util/keymaps.csv $(srcdir)/util/virkeymaps.h \
libvirt_qemu.syms libvirt_sasl.syms libvirt_vmx.syms \
libvirt_xenxs.syms libvirt_libssh2.syms libvirt_probes.d \
libvirt_qemu_probes.d $(LIBVIRT_QEMU_SYMBOL_FILE) \
- $(am__append_136) locking/sanlock.conf \
- locking/libvirt_sanlock.aug \
+ $(am__append_140) locking/virtlockd.sysconf locking/lockd.conf \
+ locking/libvirt_lockd.aug locking/test_libvirt_lockd.aug.in \
+ locking/virtlockd.init.in locking/virtlockd.service.in \
+ locking/virtlockd.socket.in $(am__append_152) \
+ locking/sanlock.conf locking/libvirt_sanlock.aug \
locking/test_libvirt_sanlock.aug.in dtrace2systemtap.pl \
rpc/gendispatch.pl rpc/genprotocol.pl rpc/gensystemtap.pl \
rpc/virnetprotocol.x rpc/virkeepaliveprotocol.x \
- $(am__append_138) $(am__append_140) \
+ $(am__append_154) $(am__append_156) \
$(STORAGE_HELPER_DISK_SOURCES) $(LXC_CONTROLLER_SOURCES) \
$(SECURITY_DRIVER_APPARMOR_HELPER_SOURCES)
-BUILT_SOURCES = $(srcdir)/util/virkeymaps.h $(LXC_GENERATED) \
- $(am__append_13) $(ESX_DRIVER_GENERATED) \
- $(HYPERV_DRIVER_GENERATED) $(GENERATED_SYM_FILES) \
- $(am__append_127) $(am__append_129) $(am__append_134) \
- $(VIR_NET_RPC_GENERATED)
+BUILT_SOURCES = $(srcdir)/util/virkeymaps.h $(LOCK_PROTOCOL_GENERATED) \
+ $(LOCK_DAEMON_GENERATED) $(LXC_GENERATED) $(am__append_13) \
+ $(ESX_DRIVER_GENERATED) $(HYPERV_DRIVER_GENERATED) \
+ $(GENERATED_SYM_FILES) $(am__append_127) $(am__append_129) \
+ $(am__append_137) $(am__append_141) $(am__append_143) \
+ $(am__append_150) $(VIR_NET_RPC_GENERATED)
CLEANFILES = $(am__append_39) $(am__append_51) $(am__append_130) \
- $(am__append_133) *.gcov .libs/*.gcda .libs/*.gcno *.gcno \
- *.gcda *.i *.s
-DISTCLEANFILES = $(am__append_135) $(GENERATED_SYM_FILES)
-MAINTAINERCLEANFILES = $(ESX_DRIVER_GENERATED) $(ESX_GENERATED_STAMP) \
- $(HYPERV_DRIVER_GENERATED) $(HYPERV_GENERATED_STAMP) \
- $(REMOTE_DRIVER_GENERATED) $(VIR_NET_RPC_GENERATED)
+ $(am__append_134) $(am__append_148) *.gcov .libs/*.gcda \
+ .libs/*.gcno *.gcno *.gcda *.i *.s
+DISTCLEANFILES = $(am__append_138) $(am__append_142) $(am__append_144) \
+ $(am__append_151) $(GENERATED_SYM_FILES)
+MAINTAINERCLEANFILES = $(LOCK_PROTOCOL_GENERATED) \
+ $(LOCK_DAEMON_GENERATED) $(ESX_DRIVER_GENERATED) \
+ $(ESX_GENERATED_STAMP) $(HYPERV_DRIVER_GENERATED) \
+ $(HYPERV_GENERATED_STAMP) $(REMOTE_DRIVER_GENERATED) \
+ $(VIR_NET_RPC_GENERATED)
+nodist_conf_DATA = $(am__append_136) $(am__append_149)
THREAD_LIBS = $(LIB_PTHREAD) $(LTLIBMULTITHREAD)
@WITH_NETWORK_TRUE@UUID = $(shell uuidgen 2>/dev/null)
lib_LTLIBRARIES = libvirt.la libvirt-qemu.la
@@ -3086,9 +3157,11 @@ mod_LTLIBRARIES = $(am__append_15) $(am__append_29) $(am__append_33) \
confdir = $(sysconfdir)/libvirt
conf_DATA = libvirt.conf $(am__append_36) $(am__append_48)
augeasdir = $(datadir)/augeas/lenses
-augeas_DATA = $(am__append_37) $(am__append_49) $(am__append_131)
+augeas_DATA = $(am__append_37) $(am__append_49) $(am__append_132) \
+ $(am__append_146)
augeastestdir = $(datadir)/augeas/lenses/tests
-augeastest_DATA = $(am__append_38) $(am__append_50) $(am__append_132)
+augeastest_DATA = $(am__append_38) $(am__append_50) $(am__append_133) \
+ $(am__append_147)
# These files are not related to driver APIs. Simply generic
# helper APIs for various purposes
@@ -3179,6 +3252,28 @@ LOCK_DRIVER_SANLOCK_SOURCES = \
LOCK_DRIVER_SANLOCK_HELPER_SOURCES = \
locking/sanlock_helper.c
+LOCK_PROTOCOL_GENERATED = \
+ $(srcdir)/locking/lock_protocol.h \
+ $(srcdir)/locking/lock_protocol.c \
+ $(NULL)
+
+LOCK_PROTOCOL = $(srcdir)/locking/lock_protocol.x
+LOCK_DAEMON_GENERATED = \
+ $(srcdir)/locking/lock_daemon_dispatch_stubs.h
+
+LOCK_DRIVER_LOCKD_SOURCES = \
+ locking/lock_driver_lockd.c \
+ $(NULL)
+
+LOCK_DAEMON_SOURCES = \
+ locking/lock_daemon.h \
+ locking/lock_daemon.c \
+ locking/lock_daemon_config.h \
+ locking/lock_daemon_config.c \
+ locking/lock_daemon_dispatch.c \
+ locking/lock_daemon_dispatch.h \
+ $(NULL)
+
NETDEV_CONF_SOURCES = \
conf/netdev_bandwidth_conf.h conf/netdev_bandwidth_conf.c \
conf/netdev_vport_profile_conf.h conf/netdev_vport_profile_conf.c \
@@ -3700,7 +3795,7 @@ libvirt_driver_la_CFLAGS = $(NUMACTL_CFLAGS) $(GNUTLS_CFLAGS) \
-I$(top_srcdir)/src/conf $(AM_CFLAGS)
libvirt_driver_la_LIBADD = $(NUMACTL_LIBS) $(GNUTLS_LIBS) $(DLOPEN_LIBS)
-USED_SYM_FILES = libvirt_private.syms $(am__append_115) \
+USED_SYM_FILES = $(srcdir)/libvirt_private.syms $(am__append_115) \
$(am__append_116) $(am__append_117) $(am__append_118) \
$(am__append_119) $(am__append_120) $(am__append_121) \
$(am__append_122) $(am__append_123) $(am__append_124)
@@ -3954,15 +4049,47 @@ libvirt_qemu_la_LDFLAGS = $(VERSION_SCRIPT_FLAGS)$(LIBVIRT_QEMU_SYMBOL_FILE) \
libvirt_qemu_la_CFLAGS = $(AM_CFLAGS)
libvirt_qemu_la_LIBADD = libvirt.la $(CYGWIN_EXTRA_LIBADD)
-@HAVE_SANLOCK_TRUE@lockdriverdir = $(libdir)/libvirt/lock-driver
-@HAVE_SANLOCK_TRUE@lockdriver_LTLIBRARIES = sanlock.la
+lockdriverdir = $(libdir)/libvirt/lock-driver
+lockdriver_LTLIBRARIES = $(am__append_131) $(am__append_145)
+@WITH_LIBVIRTD_TRUE@lockd_la_SOURCES = \
+@WITH_LIBVIRTD_TRUE@ $(LOCK_DRIVER_LOCKD_SOURCES) \
+@WITH_LIBVIRTD_TRUE@ $(LOCK_PROTOCOL_GENERATED) \
+@WITH_LIBVIRTD_TRUE@ $(NULL)
+
+@WITH_LIBVIRTD_TRUE@lockd_la_CFLAGS = -I$(top_srcdir)/src/conf $(AM_CFLAGS)
+@WITH_LIBVIRTD_TRUE@lockd_la_LDFLAGS = -module -avoid-version
+@WITH_LIBVIRTD_TRUE@lockd_la_LIBADD = ../gnulib/lib/libgnu.la \
+@WITH_LIBVIRTD_TRUE@ libvirt-net-rpc.la \
+@WITH_LIBVIRTD_TRUE@ libvirt-net-rpc-client.la \
+@WITH_LIBVIRTD_TRUE@ $(am__append_135)
+@WITH_LIBVIRTD_TRUE@virtlockd_SOURCES = \
+@WITH_LIBVIRTD_TRUE@ $(LOCK_DAEMON_SOURCES) \
+@WITH_LIBVIRTD_TRUE@ $(LOCK_PROTOCOL_GENERATED) \
+@WITH_LIBVIRTD_TRUE@ $(LOCK_DAEMON_GENERATED) \
+@WITH_LIBVIRTD_TRUE@ $(NULL)
+
+@WITH_LIBVIRTD_TRUE@virtlockd_CFLAGS = \
+@WITH_LIBVIRTD_TRUE@ $(AM_CFLAGS) \
+@WITH_LIBVIRTD_TRUE@ $(NULL)
+
+@WITH_LIBVIRTD_TRUE@virtlockd_LDFLAGS = \
+@WITH_LIBVIRTD_TRUE@ $(AM_LDFLAGS) \
+@WITH_LIBVIRTD_TRUE@ $(CYGWIN_EXTRA_LDFLAGS) \
+@WITH_LIBVIRTD_TRUE@ $(MINGW_EXTRA_LDFLAGS) \
+@WITH_LIBVIRTD_TRUE@ $(NULL)
+
+@WITH_LIBVIRTD_TRUE@virtlockd_LDADD = libvirt-net-rpc-server.la \
+@WITH_LIBVIRTD_TRUE@ libvirt-net-rpc.la libvirt_util.la \
+@WITH_LIBVIRTD_TRUE@ ../gnulib/lib/libgnu.la \
+@WITH_LIBVIRTD_TRUE@ $(CYGWIN_EXTRA_LIBADD) $(NULL) \
+@WITH_LIBVIRTD_TRUE@ $(am__append_139)
+@LIBVIRT_INIT_SCRIPT_SYSTEMD_TRUE@@WITH_LIBVIRTD_TRUE@SYSTEMD_UNIT_DIR = /lib/systemd/system
@HAVE_SANLOCK_TRUE@sanlock_la_SOURCES = $(LOCK_DRIVER_SANLOCK_SOURCES)
@HAVE_SANLOCK_TRUE@sanlock_la_CFLAGS = -I$(top_srcdir)/src/conf $(AM_CFLAGS)
@HAVE_SANLOCK_TRUE@sanlock_la_LDFLAGS = -module -avoid-version
@HAVE_SANLOCK_TRUE@sanlock_la_LIBADD = -lsanlock_client \
@HAVE_SANLOCK_TRUE@ ../gnulib/lib/libgnu.la
-@HAVE_SANLOCK_TRUE@@WITH_QEMU_TRUE@nodist_conf_DATA = locking/qemu-sanlock.conf
VIR_NET_RPC_GENERATED = \
$(srcdir)/rpc/virnetprotocol.h \
$(srcdir)/rpc/virnetprotocol.c \
@@ -3974,7 +4101,7 @@ libvirt_net_rpc_la_SOURCES = rpc/virnetmessage.h rpc/virnetmessage.c \
rpc/virnetsocket.c rpc/virnettlscontext.h \
rpc/virnettlscontext.c rpc/virkeepaliveprotocol.h \
rpc/virkeepaliveprotocol.c rpc/virkeepalive.h \
- rpc/virkeepalive.c $(am__append_137) $(am__append_139)
+ rpc/virkeepalive.c $(am__append_153) $(am__append_155)
libvirt_net_rpc_la_CFLAGS = \
$(GNUTLS_CFLAGS) \
$(SASL_CFLAGS) \
@@ -4038,7 +4165,7 @@ libvirt_net_rpc_client_la_LIBADD = \
@WITH_LIBVIRTD_TRUE@libvirt_iohelper_SOURCES = $(UTIL_IO_HELPER_SOURCES)
@WITH_LIBVIRTD_TRUE@libvirt_iohelper_LDFLAGS = $(WARN_LDFLAGS) $(AM_LDFLAGS)
@WITH_LIBVIRTD_TRUE@libvirt_iohelper_LDADD = libvirt_util.la \
-@WITH_LIBVIRTD_TRUE@ ../gnulib/lib/libgnu.la $(am__append_142)
+@WITH_LIBVIRTD_TRUE@ ../gnulib/lib/libgnu.la $(am__append_158)
@WITH_LIBVIRTD_TRUE@libvirt_iohelper_CFLAGS = $(AM_CFLAGS)
@WITH_LIBVIRTD_TRUE@@WITH_STORAGE_DISK_TRUE@libvirt_parthelper_SOURCES = $(STORAGE_HELPER_DISK_SOURCES)
@WITH_LIBVIRTD_TRUE@@WITH_STORAGE_DISK_TRUE@libvirt_parthelper_LDFLAGS = $(WARN_LDFLAGS) $(AM_LDFLAGS)
@@ -4046,7 +4173,7 @@ libvirt_net_rpc_client_la_LIBADD = \
@WITH_LIBVIRTD_TRUE@@WITH_STORAGE_DISK_TRUE@ $(LIBPARTED_LIBS) \
@WITH_LIBVIRTD_TRUE@@WITH_STORAGE_DISK_TRUE@ libvirt_util.la \
@WITH_LIBVIRTD_TRUE@@WITH_STORAGE_DISK_TRUE@ ../gnulib/lib/libgnu.la \
-@WITH_LIBVIRTD_TRUE@@WITH_STORAGE_DISK_TRUE@ $(am__append_144)
+@WITH_LIBVIRTD_TRUE@@WITH_STORAGE_DISK_TRUE@ $(am__append_160)
@WITH_LIBVIRTD_TRUE@@WITH_STORAGE_DISK_TRUE@libvirt_parthelper_CFLAGS = $(LIBPARTED_CFLAGS) $(AM_CFLAGS)
@HAVE_SANLOCK_TRUE@libvirt_sanlock_helper_SOURCES = $(LOCK_DRIVER_SANLOCK_HELPER_SOURCES)
@HAVE_SANLOCK_TRUE@libvirt_sanlock_helper_CFLAGS = -I$(top_srcdir)/src/conf $(AM_CFLAGS)
@@ -4067,24 +4194,24 @@ libvirt_net_rpc_client_la_LIBADD = \
@WITH_LIBVIRTD_TRUE@@WITH_LXC_TRUE@ libvirt_conf.la \
@WITH_LIBVIRTD_TRUE@@WITH_LXC_TRUE@ libvirt_util.la \
@WITH_LIBVIRTD_TRUE@@WITH_LXC_TRUE@ ../gnulib/lib/libgnu.la \
-@WITH_LIBVIRTD_TRUE@@WITH_LXC_TRUE@ $(am__append_147) \
-@WITH_LIBVIRTD_TRUE@@WITH_LXC_TRUE@ $(am__append_148) \
-@WITH_LIBVIRTD_TRUE@@WITH_LXC_TRUE@ $(am__append_149) \
-@WITH_LIBVIRTD_TRUE@@WITH_LXC_TRUE@ $(am__append_151)
+@WITH_LIBVIRTD_TRUE@@WITH_LXC_TRUE@ $(am__append_163) \
+@WITH_LIBVIRTD_TRUE@@WITH_LXC_TRUE@ $(am__append_164) \
+@WITH_LIBVIRTD_TRUE@@WITH_LXC_TRUE@ $(am__append_165) \
+@WITH_LIBVIRTD_TRUE@@WITH_LXC_TRUE@ $(am__append_167)
@WITH_LIBVIRTD_TRUE@@WITH_LXC_TRUE@libvirt_lxc_CFLAGS = \
@WITH_LIBVIRTD_TRUE@@WITH_LXC_TRUE@ -I$(top_srcdir)/src/conf \
@WITH_LIBVIRTD_TRUE@@WITH_LXC_TRUE@ $(AM_CFLAGS) \
@WITH_LIBVIRTD_TRUE@@WITH_LXC_TRUE@ $(LIBNL_CFLAGS) \
@WITH_LIBVIRTD_TRUE@@WITH_LXC_TRUE@ $(FUSE_CFLAGS) \
-@WITH_LIBVIRTD_TRUE@@WITH_LXC_TRUE@ $(am__append_150) \
-@WITH_LIBVIRTD_TRUE@@WITH_LXC_TRUE@ $(am__append_152) \
-@WITH_LIBVIRTD_TRUE@@WITH_LXC_TRUE@ $(am__append_153)
+@WITH_LIBVIRTD_TRUE@@WITH_LXC_TRUE@ $(am__append_166) \
+@WITH_LIBVIRTD_TRUE@@WITH_LXC_TRUE@ $(am__append_168) \
+@WITH_LIBVIRTD_TRUE@@WITH_LXC_TRUE@ $(am__append_169)
@WITH_LIBVIRTD_TRUE@@WITH_SECDRIVER_APPARMOR_TRUE@virt_aa_helper_SOURCES = $(SECURITY_DRIVER_APPARMOR_HELPER_SOURCES)
@WITH_LIBVIRTD_TRUE@@WITH_SECDRIVER_APPARMOR_TRUE@virt_aa_helper_LDFLAGS = $(WARN_LDFLAGS) $(AM_LDFLAGS)
@WITH_LIBVIRTD_TRUE@@WITH_SECDRIVER_APPARMOR_TRUE@virt_aa_helper_LDADD = libvirt_conf.la \
@WITH_LIBVIRTD_TRUE@@WITH_SECDRIVER_APPARMOR_TRUE@ libvirt_util.la \
@WITH_LIBVIRTD_TRUE@@WITH_SECDRIVER_APPARMOR_TRUE@ ../gnulib/lib/libgnu.la \
-@WITH_LIBVIRTD_TRUE@@WITH_SECDRIVER_APPARMOR_TRUE@ $(am__append_155)
+@WITH_LIBVIRTD_TRUE@@WITH_SECDRIVER_APPARMOR_TRUE@ $(am__append_171)
@WITH_LIBVIRTD_TRUE@@WITH_SECDRIVER_APPARMOR_TRUE@virt_aa_helper_CFLAGS = \
@WITH_LIBVIRTD_TRUE@@WITH_SECDRIVER_APPARMOR_TRUE@ -I$(top_srcdir)/src/conf \
@WITH_LIBVIRTD_TRUE@@WITH_SECDRIVER_APPARMOR_TRUE@ -I$(top_srcdir)/src/security \
@@ -4310,6 +4437,8 @@ libvirt_vmx.la: $(libvirt_vmx_la_OBJECTS) $(libvirt_vmx_la_DEPENDENCIES) $(EXTRA
$(AM_V_CCLD)$(libvirt_vmx_la_LINK) $(am_libvirt_vmx_la_rpath) $(libvirt_vmx_la_OBJECTS) $(libvirt_vmx_la_LIBADD) $(LIBS)
libvirt_xenxs.la: $(libvirt_xenxs_la_OBJECTS) $(libvirt_xenxs_la_DEPENDENCIES) $(EXTRA_libvirt_xenxs_la_DEPENDENCIES)
$(AM_V_CCLD)$(libvirt_xenxs_la_LINK) $(am_libvirt_xenxs_la_rpath) $(libvirt_xenxs_la_OBJECTS) $(libvirt_xenxs_la_LIBADD) $(LIBS)
+lockd.la: $(lockd_la_OBJECTS) $(lockd_la_DEPENDENCIES) $(EXTRA_lockd_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(lockd_la_LINK) $(am_lockd_la_rpath) $(lockd_la_OBJECTS) $(lockd_la_LIBADD) $(LIBS)
sanlock.la: $(sanlock_la_OBJECTS) $(sanlock_la_DEPENDENCIES) $(EXTRA_sanlock_la_DEPENDENCIES)
$(AM_V_CCLD)$(sanlock_la_LINK) $(am_sanlock_la_rpath) $(sanlock_la_OBJECTS) $(sanlock_la_LIBADD) $(LIBS)
install-libexecPROGRAMS: $(libexec_PROGRAMS)
@@ -4358,6 +4487,52 @@ clean-libexecPROGRAMS:
list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
echo " rm -f" $$list; \
rm -f $$list
+install-sbinPROGRAMS: $(sbin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ @list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(sbindir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(sbindir)" || exit 1; \
+ fi; \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed 's/$(EXEEXT)$$//' | \
+ while read p p1; do if test -f $$p || test -f $$p1; \
+ then echo "$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \
+ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+ sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) files[d] = files[d] " " $$1; \
+ else { print "f", $$3 "/" $$4, $$1; } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(sbindir)$$dir'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(sbindir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-sbinPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+ -e 's/$$/$(EXEEXT)/' `; \
+ test -n "$$list" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(sbindir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(sbindir)" && rm -f $$files
+
+clean-sbinPROGRAMS:
+ @list='$(sbin_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
libvirt_iohelper$(EXEEXT): $(libvirt_iohelper_OBJECTS) $(libvirt_iohelper_DEPENDENCIES) $(EXTRA_libvirt_iohelper_DEPENDENCIES)
@rm -f libvirt_iohelper$(EXEEXT)
$(AM_V_CCLD)$(libvirt_iohelper_LINK) $(libvirt_iohelper_OBJECTS) $(libvirt_iohelper_LDADD) $(LIBS)
@@ -4373,6 +4548,9 @@ libvirt_sanlock_helper$(EXEEXT): $(libvirt_sanlock_helper_OBJECTS) $(libvirt_san
virt-aa-helper$(EXEEXT): $(virt_aa_helper_OBJECTS) $(virt_aa_helper_DEPENDENCIES) $(EXTRA_virt_aa_helper_DEPENDENCIES)
@rm -f virt-aa-helper$(EXEEXT)
$(AM_V_CCLD)$(virt_aa_helper_LINK) $(virt_aa_helper_OBJECTS) $(virt_aa_helper_LDADD) $(LIBS)
+virtlockd$(EXEEXT): $(virtlockd_OBJECTS) $(virtlockd_DEPENDENCIES) $(EXTRA_virtlockd_DEPENDENCIES)
+ @rm -f virtlockd$(EXEEXT)
+ $(AM_V_CCLD)$(virtlockd_LINK) $(virtlockd_OBJECTS) $(virtlockd_LDADD) $(LIBS)
mostlyclean-compile:
-rm -f *.$(OBJEXT)
@@ -4620,9 +4798,15 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libvirt_vmx_la-vmx.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libvirt_xenxs_la-xen_sxpr.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libvirt_xenxs_la-xen_xm.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lockd_la-lock_driver_lockd.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lockd_la-lock_protocol.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sanlock_la-lock_driver_sanlock.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/virt_aa_helper-datatypes.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/virt_aa_helper-virt-aa-helper.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/virtlockd-lock_daemon.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/virtlockd-lock_daemon_config.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/virtlockd-lock_daemon_dispatch.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/virtlockd-lock_protocol.Po@am__quote@
.c.o:
@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
@@ -6248,6 +6432,20 @@ libvirt_xenxs_la-xen_xm.lo: xenxs/xen_xm.c
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libvirt_xenxs_la_CFLAGS) $(CFLAGS) -c -o libvirt_xenxs_la-xen_xm.lo `test -f 'xenxs/xen_xm.c' || echo '$(srcdir)/'`xenxs/xen_xm.c
+lockd_la-lock_driver_lockd.lo: locking/lock_driver_lockd.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lockd_la_CFLAGS) $(CFLAGS) -MT lockd_la-lock_driver_lockd.lo -MD -MP -MF $(DEPDIR)/lockd_la-lock_driver_lockd.Tpo -c -o lockd_la-lock_driver_lockd.lo `test -f 'locking/lock_driver_lockd.c' || echo '$(srcdir)/'`locking/lock_driver_lockd.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lockd_la-lock_driver_lockd.Tpo $(DEPDIR)/lockd_la-lock_driver_lockd.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='locking/lock_driver_lockd.c' object='lockd_la-lock_driver_lockd.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lockd_la_CFLAGS) $(CFLAGS) -c -o lockd_la-lock_driver_lockd.lo `test -f 'locking/lock_driver_lockd.c' || echo '$(srcdir)/'`locking/lock_driver_lockd.c
+
+lockd_la-lock_protocol.lo: $(srcdir)/locking/lock_protocol.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lockd_la_CFLAGS) $(CFLAGS) -MT lockd_la-lock_protocol.lo -MD -MP -MF $(DEPDIR)/lockd_la-lock_protocol.Tpo -c -o lockd_la-lock_protocol.lo `test -f '$(srcdir)/locking/lock_protocol.c' || echo '$(srcdir)/'`$(srcdir)/locking/lock_protocol.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/lockd_la-lock_protocol.Tpo $(DEPDIR)/lockd_la-lock_protocol.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$(srcdir)/locking/lock_protocol.c' object='lockd_la-lock_protocol.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lockd_la_CFLAGS) $(CFLAGS) -c -o lockd_la-lock_protocol.lo `test -f '$(srcdir)/locking/lock_protocol.c' || echo '$(srcdir)/'`$(srcdir)/locking/lock_protocol.c
+
sanlock_la-lock_driver_sanlock.lo: locking/lock_driver_sanlock.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(sanlock_la_CFLAGS) $(CFLAGS) -MT sanlock_la-lock_driver_sanlock.lo -MD -MP -MF $(DEPDIR)/sanlock_la-lock_driver_sanlock.Tpo -c -o sanlock_la-lock_driver_sanlock.lo `test -f 'locking/lock_driver_sanlock.c' || echo '$(srcdir)/'`locking/lock_driver_sanlock.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/sanlock_la-lock_driver_sanlock.Tpo $(DEPDIR)/sanlock_la-lock_driver_sanlock.Plo
@@ -6437,6 +6635,62 @@ virt_aa_helper-virt-aa-helper.obj: security/virt-aa-helper.c
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(virt_aa_helper_CFLAGS) $(CFLAGS) -c -o virt_aa_helper-virt-aa-helper.obj `if test -f 'security/virt-aa-helper.c'; then $(CYGPATH_W) 'security/virt-aa-helper.c'; else $(CYGPATH_W) '$(srcdir)/security/virt-aa-helper.c'; fi`
+virtlockd-lock_daemon.o: locking/lock_daemon.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(virtlockd_CFLAGS) $(CFLAGS) -MT virtlockd-lock_daemon.o -MD -MP -MF $(DEPDIR)/virtlockd-lock_daemon.Tpo -c -o virtlockd-lock_daemon.o `test -f 'locking/lock_daemon.c' || echo '$(srcdir)/'`locking/lock_daemon.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/virtlockd-lock_daemon.Tpo $(DEPDIR)/virtlockd-lock_daemon.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='locking/lock_daemon.c' object='virtlockd-lock_daemon.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(virtlockd_CFLAGS) $(CFLAGS) -c -o virtlockd-lock_daemon.o `test -f 'locking/lock_daemon.c' || echo '$(srcdir)/'`locking/lock_daemon.c
+
+virtlockd-lock_daemon.obj: locking/lock_daemon.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(virtlockd_CFLAGS) $(CFLAGS) -MT virtlockd-lock_daemon.obj -MD -MP -MF $(DEPDIR)/virtlockd-lock_daemon.Tpo -c -o virtlockd-lock_daemon.obj `if test -f 'locking/lock_daemon.c'; then $(CYGPATH_W) 'locking/lock_daemon.c'; else $(CYGPATH_W) '$(srcdir)/locking/lock_daemon.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/virtlockd-lock_daemon.Tpo $(DEPDIR)/virtlockd-lock_daemon.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='locking/lock_daemon.c' object='virtlockd-lock_daemon.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(virtlockd_CFLAGS) $(CFLAGS) -c -o virtlockd-lock_daemon.obj `if test -f 'locking/lock_daemon.c'; then $(CYGPATH_W) 'locking/lock_daemon.c'; else $(CYGPATH_W) '$(srcdir)/locking/lock_daemon.c'; fi`
+
+virtlockd-lock_daemon_config.o: locking/lock_daemon_config.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(virtlockd_CFLAGS) $(CFLAGS) -MT virtlockd-lock_daemon_config.o -MD -MP -MF $(DEPDIR)/virtlockd-lock_daemon_config.Tpo -c -o virtlockd-lock_daemon_config.o `test -f 'locking/lock_daemon_config.c' || echo '$(srcdir)/'`locking/lock_daemon_config.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/virtlockd-lock_daemon_config.Tpo $(DEPDIR)/virtlockd-lock_daemon_config.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='locking/lock_daemon_config.c' object='virtlockd-lock_daemon_config.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(virtlockd_CFLAGS) $(CFLAGS) -c -o virtlockd-lock_daemon_config.o `test -f 'locking/lock_daemon_config.c' || echo '$(srcdir)/'`locking/lock_daemon_config.c
+
+virtlockd-lock_daemon_config.obj: locking/lock_daemon_config.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(virtlockd_CFLAGS) $(CFLAGS) -MT virtlockd-lock_daemon_config.obj -MD -MP -MF $(DEPDIR)/virtlockd-lock_daemon_config.Tpo -c -o virtlockd-lock_daemon_config.obj `if test -f 'locking/lock_daemon_config.c'; then $(CYGPATH_W) 'locking/lock_daemon_config.c'; else $(CYGPATH_W) '$(srcdir)/locking/lock_daemon_config.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/virtlockd-lock_daemon_config.Tpo $(DEPDIR)/virtlockd-lock_daemon_config.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='locking/lock_daemon_config.c' object='virtlockd-lock_daemon_config.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(virtlockd_CFLAGS) $(CFLAGS) -c -o virtlockd-lock_daemon_config.obj `if test -f 'locking/lock_daemon_config.c'; then $(CYGPATH_W) 'locking/lock_daemon_config.c'; else $(CYGPATH_W) '$(srcdir)/locking/lock_daemon_config.c'; fi`
+
+virtlockd-lock_daemon_dispatch.o: locking/lock_daemon_dispatch.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(virtlockd_CFLAGS) $(CFLAGS) -MT virtlockd-lock_daemon_dispatch.o -MD -MP -MF $(DEPDIR)/virtlockd-lock_daemon_dispatch.Tpo -c -o virtlockd-lock_daemon_dispatch.o `test -f 'locking/lock_daemon_dispatch.c' || echo '$(srcdir)/'`locking/lock_daemon_dispatch.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/virtlockd-lock_daemon_dispatch.Tpo $(DEPDIR)/virtlockd-lock_daemon_dispatch.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='locking/lock_daemon_dispatch.c' object='virtlockd-lock_daemon_dispatch.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(virtlockd_CFLAGS) $(CFLAGS) -c -o virtlockd-lock_daemon_dispatch.o `test -f 'locking/lock_daemon_dispatch.c' || echo '$(srcdir)/'`locking/lock_daemon_dispatch.c
+
+virtlockd-lock_daemon_dispatch.obj: locking/lock_daemon_dispatch.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(virtlockd_CFLAGS) $(CFLAGS) -MT virtlockd-lock_daemon_dispatch.obj -MD -MP -MF $(DEPDIR)/virtlockd-lock_daemon_dispatch.Tpo -c -o virtlockd-lock_daemon_dispatch.obj `if test -f 'locking/lock_daemon_dispatch.c'; then $(CYGPATH_W) 'locking/lock_daemon_dispatch.c'; else $(CYGPATH_W) '$(srcdir)/locking/lock_daemon_dispatch.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/virtlockd-lock_daemon_dispatch.Tpo $(DEPDIR)/virtlockd-lock_daemon_dispatch.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='locking/lock_daemon_dispatch.c' object='virtlockd-lock_daemon_dispatch.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(virtlockd_CFLAGS) $(CFLAGS) -c -o virtlockd-lock_daemon_dispatch.obj `if test -f 'locking/lock_daemon_dispatch.c'; then $(CYGPATH_W) 'locking/lock_daemon_dispatch.c'; else $(CYGPATH_W) '$(srcdir)/locking/lock_daemon_dispatch.c'; fi`
+
+virtlockd-lock_protocol.o: $(srcdir)/locking/lock_protocol.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(virtlockd_CFLAGS) $(CFLAGS) -MT virtlockd-lock_protocol.o -MD -MP -MF $(DEPDIR)/virtlockd-lock_protocol.Tpo -c -o virtlockd-lock_protocol.o `test -f '$(srcdir)/locking/lock_protocol.c' || echo '$(srcdir)/'`$(srcdir)/locking/lock_protocol.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/virtlockd-lock_protocol.Tpo $(DEPDIR)/virtlockd-lock_protocol.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$(srcdir)/locking/lock_protocol.c' object='virtlockd-lock_protocol.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(virtlockd_CFLAGS) $(CFLAGS) -c -o virtlockd-lock_protocol.o `test -f '$(srcdir)/locking/lock_protocol.c' || echo '$(srcdir)/'`$(srcdir)/locking/lock_protocol.c
+
+virtlockd-lock_protocol.obj: $(srcdir)/locking/lock_protocol.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(virtlockd_CFLAGS) $(CFLAGS) -MT virtlockd-lock_protocol.obj -MD -MP -MF $(DEPDIR)/virtlockd-lock_protocol.Tpo -c -o virtlockd-lock_protocol.obj `if test -f '$(srcdir)/locking/lock_protocol.c'; then $(CYGPATH_W) '$(srcdir)/locking/lock_protocol.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/locking/lock_protocol.c'; fi`
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/virtlockd-lock_protocol.Tpo $(DEPDIR)/virtlockd-lock_protocol.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$(srcdir)/locking/lock_protocol.c' object='virtlockd-lock_protocol.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(virtlockd_CFLAGS) $(CFLAGS) -c -o virtlockd-lock_protocol.obj `if test -f '$(srcdir)/locking/lock_protocol.c'; then $(CYGPATH_W) '$(srcdir)/locking/lock_protocol.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/locking/lock_protocol.c'; fi`
+
mostlyclean-libtool:
-rm -f *.lo
@@ -6657,7 +6911,7 @@ check: $(BUILT_SOURCES)
$(MAKE) $(AM_MAKEFLAGS) check-am
all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(DATA)
installdirs:
- for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(lockdriverdir)" "$(DESTDIR)$(moddir)" "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(augeasdir)" "$(DESTDIR)$(augeastestdir)" "$(DESTDIR)$(confdir)" "$(DESTDIR)$(confdir)" "$(DESTDIR)$(pkgdatadir)" "$(DESTDIR)$(tapsetdir)"; do \
+ for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(lockdriverdir)" "$(DESTDIR)$(moddir)" "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(augeasdir)" "$(DESTDIR)$(augeastestdir)" "$(DESTDIR)$(confdir)" "$(DESTDIR)$(confdir)" "$(DESTDIR)$(pkgdatadir)" "$(DESTDIR)$(tapsetdir)"; do \
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
done
install: $(BUILT_SOURCES)
@@ -6699,7 +6953,7 @@ clean: clean-am
clean-am: clean-generic clean-libLTLIBRARIES clean-libexecPROGRAMS \
clean-libtool clean-lockdriverLTLIBRARIES clean-modLTLIBRARIES \
- clean-noinstLTLIBRARIES mostlyclean-am
+ clean-noinstLTLIBRARIES clean-sbinPROGRAMS mostlyclean-am
distclean: distclean-am
-rm -rf ./$(DEPDIR)
@@ -6728,7 +6982,8 @@ install-dvi: install-dvi-am
install-dvi-am:
-install-exec-am: install-libLTLIBRARIES install-libexecPROGRAMS
+install-exec-am: install-libLTLIBRARIES install-libexecPROGRAMS \
+ install-sbinPROGRAMS
install-html: install-html-am
@@ -6773,39 +7028,47 @@ uninstall-am: uninstall-augeasDATA uninstall-augeastestDATA \
uninstall-libexecPROGRAMS uninstall-local \
uninstall-lockdriverLTLIBRARIES uninstall-modLTLIBRARIES \
uninstall-nodist_confDATA uninstall-pkgdataDATA \
- uninstall-tapsetDATA
+ uninstall-sbinPROGRAMS uninstall-tapsetDATA
.MAKE: all check check-am install install-am install-strip
.PHONY: CTAGS GTAGS all all-am check check-am check-local clean \
clean-generic clean-libLTLIBRARIES clean-libexecPROGRAMS \
clean-libtool clean-lockdriverLTLIBRARIES clean-modLTLIBRARIES \
- clean-noinstLTLIBRARIES ctags distclean distclean-compile \
- distclean-generic distclean-libtool distclean-tags distdir dvi \
- dvi-am html html-am info info-am install install-am \
- install-augeasDATA install-augeastestDATA install-confDATA \
- install-data install-data-am install-data-local install-dvi \
- install-dvi-am install-exec install-exec-am install-html \
- install-html-am install-info install-info-am \
- install-libLTLIBRARIES install-libexecPROGRAMS \
+ clean-noinstLTLIBRARIES clean-sbinPROGRAMS ctags distclean \
+ distclean-compile distclean-generic distclean-libtool \
+ distclean-tags distdir dvi dvi-am html html-am info info-am \
+ install install-am install-augeasDATA install-augeastestDATA \
+ install-confDATA install-data install-data-am \
+ install-data-local install-dvi install-dvi-am install-exec \
+ install-exec-am install-html install-html-am install-info \
+ install-info-am install-libLTLIBRARIES install-libexecPROGRAMS \
install-lockdriverLTLIBRARIES install-man \
install-modLTLIBRARIES install-nodist_confDATA install-pdf \
install-pdf-am install-pkgdataDATA install-ps install-ps-am \
- install-strip install-tapsetDATA installcheck installcheck-am \
- installdirs maintainer-clean maintainer-clean-generic \
- mostlyclean mostlyclean-compile mostlyclean-generic \
- mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \
- uninstall-am uninstall-augeasDATA uninstall-augeastestDATA \
- uninstall-confDATA uninstall-libLTLIBRARIES \
- uninstall-libexecPROGRAMS uninstall-local \
- uninstall-lockdriverLTLIBRARIES uninstall-modLTLIBRARIES \
- uninstall-nodist_confDATA uninstall-pkgdataDATA \
+ install-sbinPROGRAMS install-strip install-tapsetDATA \
+ installcheck installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-augeasDATA \
+ uninstall-augeastestDATA uninstall-confDATA \
+ uninstall-libLTLIBRARIES uninstall-libexecPROGRAMS \
+ uninstall-local uninstall-lockdriverLTLIBRARIES \
+ uninstall-modLTLIBRARIES uninstall-nodist_confDATA \
+ uninstall-pkgdataDATA uninstall-sbinPROGRAMS \
uninstall-tapsetDATA
$(srcdir)/util/virkeymaps.h: $(srcdir)/util/keymaps.csv \
$(srcdir)/util/virkeycode-mapgen.py
$(AM_V_GEN)$(PYTHON) $(srcdir)/util/virkeycode-mapgen.py <$(srcdir)/util/keymaps.csv >$@
+ $(NULL)
+
+$(srcdir)/locking/lock_daemon_dispatch_stubs.h: $(LOCK_PROTOCOL) \
+ $(srcdir)/rpc/gendispatch.pl Makefile.am
+ $(AM_V_GEN)perl -w $(srcdir)/rpc/gendispatch.pl \
+ -b virLockSpaceProtocol VIR_LOCK_SPACE_PROTOCOL \
+ $(LOCK_PROTOCOL) > $@
$(srcdir)/remote/remote_client_bodies.h: $(srcdir)/rpc/gendispatch.pl \
$(REMOTE_PROTOCOL)
@@ -6823,6 +7086,8 @@ $(srcdir)/remote/qemu_client_bodies.h: $(srcdir)/rpc/gendispatch.pl \
@WITH_LINUX_TRUE@ $(AM_V_GEN)$(PERL) $(srcdir)/check-symfile.pl libvirt.syms \
@WITH_LINUX_TRUE@ .libs/libvirt.so
@WITH_LINUX_FALSE@check-symfile:
+check-symsorting:
+ $(AM_V_GEN)$(PERL) $(srcdir)/check-symsorting.pl $(USED_SYM_FILES)
@WITH_REMOTE_TRUE@check-protocol: $(PROTOCOL_STRUCTS) $(PROTOCOL_STRUCTS:structs=struct)
# The .o file that pdwtags parses is created as a side effect of running
@@ -6836,7 +7101,7 @@ $(srcdir)/remote/qemu_client_bodies.h: $(srcdir)/rpc/gendispatch.pl \
# The $(PROTOCOL_STRUCTS) files must live in git, because they cannot be
# re-generated when configured --without-remote.
@WITH_REMOTE_FALSE@check-protocol:
-check-local: check-protocol check-symfile
+check-local: check-protocol check-symfile check-symsorting
.PHONY: check-protocol $(PROTOCOL_STRUCTS:structs=struct)
$(srcdir)/lxc/lxc_monitor_dispatch.h: $(srcdir)/rpc/gendispatch.pl \
@@ -6873,9 +7138,14 @@ $(HYPERV_GENERATED_STAMP): $(srcdir)/hyperv/hyperv_wmi_generator.input \
check-local: check-augeas
-.PHONY: check-augeas check-augeas-qemu check-augeas-lxc check-augeas-sanlock
+.PHONY: check-augeas \
+ check-augeas-qemu \
+ check-augeas-lxc \
+ check-augeas-sanlock \
+ check-augeas-lockd \
+ $(NULL)
-check-augeas: check-augeas-qemu check-augeas-lxc check-augeas-sanlock
+check-augeas: check-augeas-qemu check-augeas-lxc check-augeas-sanlock check-augeas-lockd
@WITH_QEMU_TRUE@test_libvirtd_qemu.aug: qemu/test_libvirtd_qemu.aug.in \
@WITH_QEMU_TRUE@ $(srcdir)/qemu/qemu.conf $(AUG_GENTEST)
@@ -6907,6 +7177,15 @@ check-augeas: check-augeas-qemu check-augeas-lxc check-augeas-sanlock
@HAVE_SANLOCK_TRUE@ fi
@HAVE_SANLOCK_FALSE@check-augeas-sanlock:
+test_libvirt_lockd.aug: locking/test_libvirt_lockd.aug.in \
+ locking/qemu-lockd.conf $(AUG_GENTEST)
+ $(AM_V_GEN)$(AUG_GENTEST) locking/qemu-lockd.conf $< $@
+
+check-augeas-lockd: test_libvirt_lockd.aug
+ $(AM_V_GEN)if test -x '$(AUGPARSE)'; then \
+ '$(AUGPARSE)' -I $(srcdir)/locking test_libvirt_lockd.aug; \
+ fi
+
libvirt.syms: libvirt_public.syms $(USED_SYM_FILES) \
$(top_builddir)/config.status
$(AM_V_GEN)rm -f $@-tmp $@ ; \
@@ -6915,9 +7194,7 @@ libvirt.syms: libvirt_public.syms $(USED_SYM_FILES) \
printf '\n\n# Private symbols\n\n' >>$@-tmp && \
printf 'LIBVIRT_PRIVATE_$(VERSION) {\n\n' >>$@-tmp && \
printf 'global:\n\n' >>$@-tmp && \
- for file in $(USED_SYM_FILES); do \
- cat $(srcdir)/$$file >>$@-tmp; \
- done && \
+ cat $(USED_SYM_FILES) >>$@-tmp && \
printf '\n\nlocal:\n*;\n\n};' >>$@-tmp && \
chmod a-w $@-tmp && \
mv $@-tmp libvirt.syms
@@ -6959,11 +7236,83 @@ libvirt_qemu.def: $(srcdir)/libvirt_qemu.syms
@WITH_DTRACE_PROBES_TRUE@ $(AM_V_GEN)$(PERL) -w $(srcdir)/dtrace2systemtap.pl \
@WITH_DTRACE_PROBES_TRUE@ $(DTRACE2SYSTEMTAP_FLAGS) $(bindir) $(sbindir) $(libdir) $< > $@
+@WITH_LIBVIRTD_TRUE@locking/%-lockd.conf: $(srcdir)/locking/lockd.conf
+@WITH_LIBVIRTD_TRUE@ $(AM_V_GEN)$(MKDIR_P) locking ; \
+@WITH_LIBVIRTD_TRUE@ cp $< $@
+
+install-sysconfig:
+ $(MKDIR_P) $(DESTDIR)$(sysconfdir)/sysconfig
+ $(INSTALL_DATA) $(srcdir)/locking/virtlockd.sysconf \
+ $(DESTDIR)$(sysconfdir)/sysconfig/virtlockd
+
+uninstall-sysconfig:
+ rm -f $(DESTDIR)$(sysconfdir)/sysconfig/virtlockd
+ rmdir $(DESTDIR)$(sysconfdir)/sysconfig || :
+
+@LIBVIRT_INIT_SCRIPT_RED_HAT_TRUE@@WITH_LIBVIRTD_TRUE@install-init:: virtlockd.init install-sysconfig
+@LIBVIRT_INIT_SCRIPT_RED_HAT_TRUE@@WITH_LIBVIRTD_TRUE@ $(MKDIR_P) $(DESTDIR)$(sysconfdir)/rc.d/init.d
+@LIBVIRT_INIT_SCRIPT_RED_HAT_TRUE@@WITH_LIBVIRTD_TRUE@ $(INSTALL_SCRIPT) virtlockd.init \
+@LIBVIRT_INIT_SCRIPT_RED_HAT_TRUE@@WITH_LIBVIRTD_TRUE@ $(DESTDIR)$(sysconfdir)/rc.d/init.d/virtlockd
+
+@LIBVIRT_INIT_SCRIPT_RED_HAT_TRUE@@WITH_LIBVIRTD_TRUE@uninstall-init:: uninstall-sysconfig
+@LIBVIRT_INIT_SCRIPT_RED_HAT_TRUE@@WITH_LIBVIRTD_TRUE@ rm -f $(DESTDIR)$(sysconfdir)/rc.d/init.d/virtlockd
+@LIBVIRT_INIT_SCRIPT_RED_HAT_TRUE@@WITH_LIBVIRTD_TRUE@ rmdir $(DESTDIR)$(sysconfdir)/rc.d/init.d || :
+@LIBVIRT_INIT_SCRIPT_RED_HAT_FALSE@@WITH_LIBVIRTD_TRUE@install-init::
+@LIBVIRT_INIT_SCRIPT_RED_HAT_FALSE@@WITH_LIBVIRTD_TRUE@uninstall-init::
+@WITH_LIBVIRTD_FALSE@install-init::
+@WITH_LIBVIRTD_FALSE@uninstall-init::
+
+virtlockd.init: locking/virtlockd.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 $@
+
+@LIBVIRT_INIT_SCRIPT_SYSTEMD_TRUE@@WITH_LIBVIRTD_TRUE@install-systemd: virtlockd.service virtlockd.socket install-sysconfig
+@LIBVIRT_INIT_SCRIPT_SYSTEMD_TRUE@@WITH_LIBVIRTD_TRUE@ $(MKDIR_P) $(DESTDIR)$(SYSTEMD_UNIT_DIR)
+@LIBVIRT_INIT_SCRIPT_SYSTEMD_TRUE@@WITH_LIBVIRTD_TRUE@ $(INSTALL_SCRIPT) virtlockd.service \
+@LIBVIRT_INIT_SCRIPT_SYSTEMD_TRUE@@WITH_LIBVIRTD_TRUE@ $(DESTDIR)$(SYSTEMD_UNIT_DIR)/
+@LIBVIRT_INIT_SCRIPT_SYSTEMD_TRUE@@WITH_LIBVIRTD_TRUE@ $(INSTALL_SCRIPT) virtlockd.socket \
+@LIBVIRT_INIT_SCRIPT_SYSTEMD_TRUE@@WITH_LIBVIRTD_TRUE@ $(DESTDIR)$(SYSTEMD_UNIT_DIR)/
+
+@LIBVIRT_INIT_SCRIPT_SYSTEMD_TRUE@@WITH_LIBVIRTD_TRUE@uninstall-systemd: uninstall-sysconfig
+@LIBVIRT_INIT_SCRIPT_SYSTEMD_TRUE@@WITH_LIBVIRTD_TRUE@ rm -f $(DESTDIR)$(SYSTEMD_UNIT_DIR)/virtlockd.service \
+@LIBVIRT_INIT_SCRIPT_SYSTEMD_TRUE@@WITH_LIBVIRTD_TRUE@ $(DESTDIR)$(SYSTEMD_UNIT_DIR)/virtlockd.socket
+@LIBVIRT_INIT_SCRIPT_SYSTEMD_TRUE@@WITH_LIBVIRTD_TRUE@ rmdir $(DESTDIR)$(SYSTEMD_UNIT_DIR) || :
+@LIBVIRT_INIT_SCRIPT_SYSTEMD_FALSE@@WITH_LIBVIRTD_TRUE@install-systemd:
+@LIBVIRT_INIT_SCRIPT_SYSTEMD_FALSE@@WITH_LIBVIRTD_TRUE@uninstall-systemd:
+@WITH_LIBVIRTD_FALSE@install-systemd:
+@WITH_LIBVIRTD_FALSE@uninstall-systemd:
+
+virtlockd.service: locking/virtlockd.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 && \
+ chmod a+x $@-t && \
+ mv $@-t $@
+
+virtlockd.socket: locking/virtlockd.socket.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 $@
+
@HAVE_SANLOCK_TRUE@locking/%-sanlock.conf: $(srcdir)/locking/sanlock.conf
@HAVE_SANLOCK_TRUE@ $(AM_V_GEN)$(MKDIR_P) locking ; \
@HAVE_SANLOCK_TRUE@ cp $< $@
-install-data-local:
+install-data-local: install-init install-systemd
+@WITH_LIBVIRTD_TRUE@ $(MKDIR_P) "$(DESTDIR)$(localstatedir)/lib/libvirt/lockd"
+@WITH_LIBVIRTD_TRUE@ $(MKDIR_P) "$(DESTDIR)$(localstatedir)/lib/libvirt/lockd/files"
+@WITH_LIBVIRTD_TRUE@ $(MKDIR_P) "$(DESTDIR)$(localstatedir)/run/libvirt/lockd"
$(MKDIR_P) "$(DESTDIR)$(localstatedir)/cache/libvirt"
$(MKDIR_P) "$(DESTDIR)$(localstatedir)/lib/libvirt/images"
$(MKDIR_P) "$(DESTDIR)$(localstatedir)/lib/libvirt/filesystems"
@@ -6998,7 +7347,10 @@ install-data-local:
@WITH_NETWORK_TRUE@ ln -s ../default.xml \
@WITH_NETWORK_TRUE@ $(DESTDIR)$(sysconfdir)/libvirt/qemu/networks/autostart/default.xml
-uninstall-local::
+uninstall-local:: uninstall-init uninstall-systemd
+@WITH_LIBVIRTD_TRUE@ rmdir "$(DESTDIR)$(localstatedir)/lib/libvirt/lockd/files" ||:
+@WITH_LIBVIRTD_TRUE@ rmdir "$(DESTDIR)$(localstatedir)/lib/libvirt/lockd" ||:
+@WITH_LIBVIRTD_TRUE@ rmdir "$(DESTDIR)$(localstatedir)/run/libvirt/lockd" ||:
rmdir "$(DESTDIR)$(localstatedir)/cache/libvirt" ||:
rmdir "$(DESTDIR)$(localstatedir)/lib/libvirt/images" ||:
rmdir "$(DESTDIR)$(localstatedir)/lib/libvirt/filesystems" ||:
diff --git a/src/check-symsorting.pl b/src/check-symsorting.pl
new file mode 100755
index 000000000..9c6224667
--- /dev/null
+++ b/src/check-symsorting.pl
@@ -0,0 +1,66 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+die "syntax: $0 SYMFILE..." unless int(@ARGV) >= 1;
+
+my $ret = 0;
+foreach my $symfile (@ARGV) {
+ open SYMFILE, $symfile or die "cannot read $symfile: $!";
+
+ my $line;
+ my @group;
+
+ while (<SYMFILE>) {
+ chomp;
+ next if /^#/;
+
+ if (/^\s*$/) {
+ if (@group) {
+ &check_sorting(\@group, $symfile, $line);
+ }
+ @group = ();
+ $line = $.;
+ } else {
+ $_ =~ s/;//;
+ push @group, $_;
+ }
+ }
+
+ close SYMFILE;
+ if (@group) {
+ &check_sorting(\@group, $symfile, $line);
+ }
+}
+
+sub check_sorting {
+ my $group = shift;
+ my $symfile = shift;
+ my $line = shift;
+
+ my @group = @{$group};
+ my @sorted = sort { lc $a cmp lc $b } @group;
+ my $sorted = 1;
+ my $first;
+ my $last;
+ for (my $i = 0 ; $i <= $#sorted ; $i++) {
+ if ($sorted[$i] ne $group[$i]) {
+ $first = $i unless defined $first;
+ $last = $i;
+ $sorted = 0;
+ }
+ }
+ if (!$sorted) {
+ @group = splice @group, $first, ($last-$first+1);
+ @sorted = splice @sorted, $first, ($last-$first+1);
+ print "Symbol block at $symfile:$line symbols not sorted\n";
+ print map { " " . $_ . "\n" } @group;
+ print "Correct ordering\n";
+ print map { " " . $_ . "\n" } @sorted;
+ print "\n";
+ $ret = 1;
+ }
+}
+
+exit $ret;
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index f5e2f71c4..12eeb5ee8 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -2951,31 +2951,16 @@ out:
}
static int
-virDomainHostdevPartsParse(xmlNodePtr node,
- xmlXPathContextPtr ctxt,
- const char *mode,
- const char *type,
- virDomainHostdevDefPtr def,
- unsigned int flags)
+virDomainHostdevDefParseXMLSubsys(xmlNodePtr node,
+ xmlXPathContextPtr ctxt,
+ const char *type,
+ virDomainHostdevDefPtr def,
+ unsigned int flags)
{
xmlNodePtr sourcenode;
char *managed = NULL;
int ret = -1;
- /* @mode is passed in separately from the caller, since an
- * 'intelligent hostdev' has no place for 'mode' in the XML (it is
- * always 'subsys').
- */
- if (mode) {
- if ((def->mode=virDomainHostdevModeTypeFromString(mode)) < 0) {
- virReportError(VIR_ERR_INTERNAL_ERROR,
- _("unknown hostdev mode '%s'"), mode);
- goto error;
- }
- } else {
- def->mode = VIR_DOMAIN_HOSTDEV_MODE_SUBSYS;
- }
-
/* @managed can be read from the xml document - it is always an
* attribute of the toplevel element, no matter what type of
* element that might be (pure hostdev, or higher level device
@@ -4815,8 +4800,9 @@ virDomainActualNetDefParseXML(xmlNodePtr node,
virReportOOMError();
goto error;
}
- if (virDomainHostdevPartsParse(node, ctxt, NULL, addrtype,
- hostdev, flags) < 0) {
+ hostdev->mode = VIR_DOMAIN_HOSTDEV_MODE_SUBSYS;
+ if (virDomainHostdevDefParseXMLSubsys(node, ctxt, addrtype,
+ hostdev, flags) < 0) {
goto error;
}
} else if (actual->type == VIR_DOMAIN_NET_TYPE_NETWORK) {
@@ -5205,8 +5191,9 @@ virDomainNetDefParseXML(virCapsPtr caps,
virReportOOMError();
goto error;
}
- if (virDomainHostdevPartsParse(node, ctxt, NULL, addrtype,
- hostdev, flags) < 0) {
+ hostdev->mode = VIR_DOMAIN_HOSTDEV_MODE_SUBSYS;
+ if (virDomainHostdevDefParseXMLSubsys(node, ctxt, addrtype,
+ hostdev, flags) < 0) {
goto error;
}
break;
@@ -7375,9 +7362,27 @@ virDomainHostdevDefParseXML(const xmlNodePtr node,
if (!(def = virDomainHostdevDefAlloc()))
goto error;
- /* parse managed/mode/type, and the <source> element */
- if (virDomainHostdevPartsParse(node, ctxt, mode, type, def, flags) < 0)
+ if (mode) {
+ if ((def->mode = virDomainHostdevModeTypeFromString(mode)) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("unknown hostdev mode '%s'"), mode);
+ goto error;
+ }
+ } else {
+ def->mode = VIR_DOMAIN_HOSTDEV_MODE_SUBSYS;
+ }
+
+ switch (def->mode) {
+ case VIR_DOMAIN_HOSTDEV_MODE_SUBSYS:
+ /* parse managed/mode/type, and the <source> element */
+ if (virDomainHostdevDefParseXMLSubsys(node, ctxt, type, def, flags) < 0)
+ goto error;
+ break;
+ default:
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Unexpected hostdev mode %d"), def->mode);
goto error;
+ }
if (def->info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE) {
if (virDomainDeviceInfoParseXML(node, bootMap, def->info,
@@ -7880,6 +7885,69 @@ virDomainHostdevRemove(virDomainDefPtr def, size_t i)
return hostdev;
}
+
+static int
+virDomainHostdevMatchSubsysUSB(virDomainHostdevDefPtr a,
+ virDomainHostdevDefPtr b)
+{
+ if (b->source.subsys.u.usb.bus && b->source.subsys.u.usb.device) {
+ /* specified by bus location on host */
+ if (a->source.subsys.u.usb.bus == b->source.subsys.u.usb.bus &&
+ a->source.subsys.u.usb.device == b->source.subsys.u.usb.device)
+ return 1;
+ } else {
+ /* specified by product & vendor id */
+ if (a->source.subsys.u.usb.product == b->source.subsys.u.usb.product &&
+ a->source.subsys.u.usb.vendor == b->source.subsys.u.usb.vendor)
+ return 1;
+ }
+ return 0;
+}
+
+static int
+virDomainHostdevMatchSubsysPCI(virDomainHostdevDefPtr a,
+ virDomainHostdevDefPtr b)
+{
+ if (a->source.subsys.u.pci.domain == b->source.subsys.u.pci.domain &&
+ a->source.subsys.u.pci.bus == b->source.subsys.u.pci.bus &&
+ a->source.subsys.u.pci.slot == b->source.subsys.u.pci.slot &&
+ a->source.subsys.u.pci.function == b->source.subsys.u.pci.function)
+ return 1;
+ return 0;
+}
+
+
+static int
+virDomainHostdevMatchSubsys(virDomainHostdevDefPtr a,
+ virDomainHostdevDefPtr b)
+{
+ if (a->source.subsys.type != b->source.subsys.type)
+ return 0;
+
+ switch (a->source.subsys.type) {
+ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI:
+ return virDomainHostdevMatchSubsysPCI(a, b);
+ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB:
+ return virDomainHostdevMatchSubsysUSB(a, b);
+ }
+ return 0;
+}
+
+
+static int
+virDomainHostdevMatch(virDomainHostdevDefPtr a,
+ virDomainHostdevDefPtr b)
+{
+ if (a->mode != b->mode)
+ return 0;
+
+ switch (a->mode) {
+ case VIR_DOMAIN_HOSTDEV_MODE_SUBSYS:
+ return virDomainHostdevMatchSubsys(a, b);
+ }
+ return 0;
+}
+
/* Find an entry in hostdevs that matches the source spec in
* @match. return pointer to the entry in @found (if found is
* non-NULL). Returns index (within hostdevs) of matched entry, or -1
@@ -7891,58 +7959,17 @@ virDomainHostdevFind(virDomainDefPtr def,
virDomainHostdevDefPtr *found)
{
virDomainHostdevDefPtr local_found;
- virDomainHostdevSubsysPtr m_subsys = &match->source.subsys;
int i;
if (!found)
found = &local_found;
*found = NULL;
- /* There is no code that uses _MODE_CAPABILITIES, and nothing to
- * compare if it did, so don't allow it.
- */
- if (match->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS)
- return -1;
-
for (i = 0 ; i < def->nhostdevs ; i++) {
- virDomainHostdevDefPtr compare = def->hostdevs[i];
- virDomainHostdevSubsysPtr c_subsys = &compare->source.subsys;
-
- if (compare->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS ||
- c_subsys->type != m_subsys->type) {
- continue;
- }
-
- switch (m_subsys->type)
- {
- case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI:
- if (c_subsys->u.pci.domain == m_subsys->u.pci.domain &&
- c_subsys->u.pci.bus == m_subsys->u.pci.bus &&
- c_subsys->u.pci.slot == m_subsys->u.pci.slot &&
- c_subsys->u.pci.function == m_subsys->u.pci.function) {
- *found = compare;
- }
- break;
- case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB:
- if (m_subsys->u.usb.bus && m_subsys->u.usb.device) {
- /* specified by bus location on host */
- if (c_subsys->u.usb.bus == m_subsys->u.usb.bus &&
- c_subsys->u.usb.device == m_subsys->u.usb.device) {
- *found = compare;
- }
- } else {
- /* specified by product & vendor id */
- if (c_subsys->u.usb.product == m_subsys->u.usb.product &&
- c_subsys->u.usb.vendor == m_subsys->u.usb.vendor) {
- *found = compare;
- }
- }
- break;
- default:
+ if (virDomainHostdevMatch(match, def->hostdevs[i])) {
+ *found = def->hostdevs[i];
break;
}
- if (*found)
- break;
}
return *found ? i : -1;
}
@@ -12394,10 +12421,10 @@ virDomainFSDefFormat(virBufferPtr buf,
}
static int
-virDomainHostdevSourceFormat(virBufferPtr buf,
- virDomainHostdevDefPtr def,
- unsigned int flags,
- bool includeTypeInAddr)
+virDomainHostdevDefFormatSubsys(virBufferPtr buf,
+ virDomainHostdevDefPtr def,
+ unsigned int flags,
+ bool includeTypeInAddr)
{
virBufferAddLit(buf, "<source");
if (def->startupPolicy) {
@@ -12515,8 +12542,8 @@ virDomainActualNetDefFormat(virBufferPtr buf,
break;
case VIR_DOMAIN_NET_TYPE_HOSTDEV:
- if (virDomainHostdevSourceFormat(buf, &def->data.hostdev.def,
- flags, true) < 0) {
+ if (virDomainHostdevDefFormatSubsys(buf, &def->data.hostdev.def,
+ flags, true) < 0) {
return -1;
}
break;
@@ -12624,8 +12651,8 @@ virDomainNetDefFormat(virBufferPtr buf,
break;
case VIR_DOMAIN_NET_TYPE_HOSTDEV:
- if (virDomainHostdevSourceFormat(buf, &def->data.hostdev.def,
- flags, true) < 0) {
+ if (virDomainHostdevDefFormatSubsys(buf, &def->data.hostdev.def,
+ flags, true) < 0) {
return -1;
}
break;
@@ -13520,19 +13547,25 @@ virDomainHostdevDefFormat(virBufferPtr buf,
const char *mode = virDomainHostdevModeTypeToString(def->mode);
const char *type;
- if (!mode || def->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS) {
+ if (!mode) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("unexpected hostdev mode %d"), def->mode);
return -1;
}
- type = virDomainHostdevSubsysTypeToString(def->source.subsys.type);
- if (!type ||
- (def->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB &&
- def->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI)) {
+ switch (def->mode) {
+ case VIR_DOMAIN_HOSTDEV_MODE_SUBSYS:
+ type = virDomainHostdevSubsysTypeToString(def->source.subsys.type);
+ if (!type) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("unexpected hostdev type %d"),
+ def->source.subsys.type);
+ return -1;
+ }
+ break;
+ default:
virReportError(VIR_ERR_INTERNAL_ERROR,
- _("unexpected hostdev type %d"),
- def->source.subsys.type);
+ _("unexpected hostdev mode %d"), def->mode);
return -1;
}
@@ -13540,8 +13573,12 @@ virDomainHostdevDefFormat(virBufferPtr buf,
mode, type, def->managed ? "yes" : "no");
virBufferAdjustIndent(buf, 6);
- if (virDomainHostdevSourceFormat(buf, def, flags, false) < 0)
- return -1;
+ switch (def->mode) {
+ case VIR_DOMAIN_HOSTDEV_MODE_SUBSYS:
+ if (virDomainHostdevDefFormatSubsys(buf, def, flags, false) < 0)
+ return -1;
+ break;
+ }
virBufferAdjustIndent(buf, -6);
if (virDomainDeviceInfoFormat(buf, def->info,
diff --git a/src/internal.h b/src/internal.h
index d69bd1489..8d966603d 100644
--- a/src/internal.h
+++ b/src/internal.h
@@ -236,6 +236,28 @@
} \
} while (0)
+/**
+ * virCheckFlagsGoto:
+ * @supported: an OR'ed set of supported flags
+ * @label: label to jump to on error
+ *
+ * To avoid memory leaks this macro has to be used before any non-trivial
+ * code which could possibly allocate some memory.
+ *
+ * Returns nothing. Jumps to a label if unsupported flags were
+ * passed to it.
+ */
+# define virCheckFlagsGoto(supported, label) \
+ do { \
+ unsigned long __unsuppflags = flags & ~(supported); \
+ if (__unsuppflags) { \
+ virReportInvalidArg(flags, \
+ _("unsupported flags (0x%lx) in function %s"), \
+ __unsuppflags, __FUNCTION__); \
+ goto label; \
+ } \
+ } while (0)
+
# define virCheckNonNullArgReturn(argname, retval) \
do { \
if (argname == NULL) { \
diff --git a/src/libvirt_esx.syms b/src/libvirt_esx.syms
index 3125b20d4..0341b66e6 100644
--- a/src/libvirt_esx.syms
+++ b/src/libvirt_esx.syms
@@ -3,5 +3,5 @@
#
esxUtil_EscapeDatastoreItem;
-esxVI_DateTime_ConvertToCalendarTime;
esxUtil_ParseDatastorePath;
+esxVI_DateTime_ConvertToCalendarTime;
diff --git a/src/libvirt_openvz.syms b/src/libvirt_openvz.syms
index 1993eb5f1..578d8b557 100644
--- a/src/libvirt_openvz.syms
+++ b/src/libvirt_openvz.syms
@@ -1,7 +1,7 @@
#
# These symbols are dependent upon --with-openvz via WITH_OPENVZ
#
+openvzLocateConfFile;
openvzReadConfigParam;
openvzReadNetworkConf;
-openvzLocateConfFile;
openvzVEGetStringParam;
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index cd798a7e3..9288ad3a9 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -85,25 +85,25 @@ virCgroupDenyDeviceMajor;
virCgroupDenyDevicePath;
virCgroupForDomain;
virCgroupForDriver;
-virCgroupGetAppRoot;
virCgroupForEmulator;
virCgroupForVcpu;
virCgroupFree;
+virCgroupGetAppRoot;
virCgroupGetBlkioWeight;
-virCgroupGetCpuCfsPeriod;
-virCgroupGetCpuCfsQuota;
-virCgroupGetCpuShares;
virCgroupGetCpuacctPercpuUsage;
virCgroupGetCpuacctStat;
virCgroupGetCpuacctUsage;
+virCgroupGetCpuCfsPeriod;
+virCgroupGetCpuCfsQuota;
virCgroupGetCpusetCpus;
virCgroupGetCpusetMems;
+virCgroupGetCpuShares;
virCgroupGetFreezerState;
-virCgroupGetMemSwapUsage;
-virCgroupGetMemSwapHardLimit;
virCgroupGetMemoryHardLimit;
virCgroupGetMemorySoftLimit;
virCgroupGetMemoryUsage;
+virCgroupGetMemSwapHardLimit;
+virCgroupGetMemSwapUsage;
virCgroupKill;
virCgroupKillPainfully;
virCgroupKillRecursive;
@@ -115,14 +115,14 @@ virCgroupSetBlkioDeviceWeight;
virCgroupSetBlkioWeight;
virCgroupSetCpuCfsPeriod;
virCgroupSetCpuCfsQuota;
-virCgroupSetCpuShares;
virCgroupSetCpusetCpus;
virCgroupSetCpusetMems;
+virCgroupSetCpuShares;
virCgroupSetFreezerState;
-virCgroupSetMemSwapHardLimit;
virCgroupSetMemory;
virCgroupSetMemoryHardLimit;
virCgroupSetMemorySoftLimit;
+virCgroupSetMemSwapHardLimit;
# command.h
@@ -218,9 +218,9 @@ virGetConnect;
virGetDomain;
virGetDomainSnapshot;
virGetInterface;
-virGetNWFilter;
virGetNetwork;
virGetNodeDevice;
+virGetNWFilter;
virGetSecret;
virGetStoragePool;
virGetStorageVol;
@@ -249,9 +249,9 @@ dnsmasqAddHost;
dnsmasqCapsGet;
dnsmasqCapsGetBinaryPath;
dnsmasqCapsGetVersion;
+dnsmasqCapsNewFromBinary;
dnsmasqCapsNewFromBuffer;
dnsmasqCapsNewFromFile;
-dnsmasqCapsNewFromBinary;
dnsmasqCapsRefresh;
dnsmasqContextFree;
dnsmasqContextNew;
@@ -318,6 +318,7 @@ virDomainControllerTypeToString;
virDomainCpuPlacementModeTypeFromString;
virDomainCpuPlacementModeTypeToString;
virDomainDefAddImplicitControllers;
+virDomainDefAddSecurityLabelDef;
virDomainDefCheckABIStability;
virDomainDefClearDeviceAliases;
virDomainDefClearPCIAddresses;
@@ -327,8 +328,6 @@ virDomainDefFormat;
virDomainDefFormatInternal;
virDomainDefFree;
virDomainDefGetSecurityLabelDef;
-virDomainDiskDefGetSecurityLabelDef;
-virDomainDefAddSecurityLabelDef;
virDomainDefParseFile;
virDomainDefParseNode;
virDomainDefParseString;
@@ -349,6 +348,7 @@ virDomainDiskCopyOnReadTypeToString;
virDomainDiskDefAssignAddress;
virDomainDiskDefForeachPath;
virDomainDiskDefFree;
+virDomainDiskDefGetSecurityLabelDef;
virDomainDiskDeviceTypeToString;
virDomainDiskErrorPolicyTypeFromString;
virDomainDiskErrorPolicyTypeToString;
@@ -370,17 +370,17 @@ virDomainDiskTypeFromString;
virDomainDiskTypeToString;
virDomainEmulatorPinAdd;
virDomainEmulatorPinDel;
+virDomainFeatureStateTypeFromString;
+virDomainFeatureStateTypeToString;
+virDomainFindByID;
+virDomainFindByName;
+virDomainFindByUUID;
virDomainFSDefFree;
virDomainFSIndexByName;
virDomainFSTypeFromString;
virDomainFSTypeToString;
virDomainFSWrpolicyTypeFromString;
virDomainFSWrpolicyTypeToString;
-virDomainFeatureStateTypeFromString;
-virDomainFeatureStateTypeToString;
-virDomainFindByID;
-virDomainFindByName;
-virDomainFindByUUID;
virDomainGetRootFilesystem;
virDomainGraphicsAuthConnectedTypeFromString;
virDomainGraphicsAuthConnectedTypeToString;
@@ -536,14 +536,14 @@ virDomainVcpuPinDefFree;
virDomainVcpuPinDel;
virDomainVcpuPinFindByVcpu;
virDomainVcpuPinIsDuplicate;
-virDomainVideoDefFree;
virDomainVideoDefaultRAM;
virDomainVideoDefaultType;
+virDomainVideoDefFree;
virDomainVideoTypeFromString;
virDomainVideoTypeToString;
-virDomainVirtTypeToString;
virDomainVirtioEventIdxTypeFromString;
virDomainVirtioEventIdxTypeToString;
+virDomainVirtTypeToString;
virDomainWatchdogActionTypeFromString;
virDomainWatchdogActionTypeToString;
virDomainWatchdogModelTypeFromString;
@@ -553,8 +553,8 @@ virDomainWatchdogModelTypeToString;
# domain_event.h
virDomainEventBalloonChangeNewFromDom;
virDomainEventBalloonChangeNewFromObj;
-virDomainEventBlockJobNewFromObj;
virDomainEventBlockJobNewFromDom;
+virDomainEventBlockJobNewFromObj;
virDomainEventControlErrorNewFromDom;
virDomainEventControlErrorNewFromObj;
virDomainEventDiskChangeNewFromDom;
@@ -570,25 +570,25 @@ virDomainEventNew;
virDomainEventNewFromDef;
virDomainEventNewFromDom;
virDomainEventNewFromObj;
+virDomainEventPMSuspendDiskNewFromDom;
+virDomainEventPMSuspendDiskNewFromObj;
virDomainEventPMSuspendNewFromDom;
virDomainEventPMSuspendNewFromObj;
virDomainEventPMWakeupNewFromDom;
virDomainEventPMWakeupNewFromObj;
-virDomainEventRTCChangeNewFromDom;
-virDomainEventRTCChangeNewFromObj;
virDomainEventRebootNew;
virDomainEventRebootNewFromDom;
virDomainEventRebootNewFromObj;
+virDomainEventRTCChangeNewFromDom;
+virDomainEventRTCChangeNewFromObj;
virDomainEventStateDeregister;
virDomainEventStateDeregisterID;
virDomainEventStateEventID;
-virDomainEventStateRegister;
-virDomainEventStateRegisterID;
virDomainEventStateFree;
virDomainEventStateNew;
virDomainEventStateQueue;
-virDomainEventPMSuspendDiskNewFromDom;
-virDomainEventPMSuspendDiskNewFromObj;
+virDomainEventStateRegister;
+virDomainEventStateRegisterID;
virDomainEventTrayChangeNewFromDom;
virDomainEventTrayChangeNewFromObj;
virDomainEventWatchdogNewFromDom;
@@ -596,14 +596,14 @@ virDomainEventWatchdogNewFromObj;
# domain_lock.h
-virDomainLockProcessStart;
-virDomainLockProcessInquire;
-virDomainLockProcessPause;
-virDomainLockProcessResume;
virDomainLockDiskAttach;
virDomainLockDiskDetach;
virDomainLockLeaseAttach;
virDomainLockLeaseDetach;
+virDomainLockProcessInquire;
+virDomainLockProcessPause;
+virDomainLockProcessResume;
+virDomainLockProcessStart;
# domain_nwfilter.h
@@ -635,10 +635,10 @@ virEventPollUpdateTimeout;
# fdstream.h
-virFDStreamOpen;
virFDStreamConnectUNIX;
-virFDStreamOpenFile;
virFDStreamCreateFile;
+virFDStreamOpen;
+virFDStreamOpenFile;
# hash.h
@@ -757,24 +757,24 @@ virJSONValueToString;
# libvirt_internal.h
-virDomainMigrateFinish2;
+virDomainMigrateBegin3;
+virDomainMigrateConfirm3;
virDomainMigrateFinish;
+virDomainMigrateFinish2;
+virDomainMigrateFinish3;
virDomainMigratePerform;
-virDomainMigratePrepare2;
+virDomainMigratePerform3;
virDomainMigratePrepare;
-virDomainMigratePrepareTunnel;
-virDomainMigrateBegin3;
+virDomainMigratePrepare2;
virDomainMigratePrepare3;
+virDomainMigratePrepareTunnel;
virDomainMigratePrepareTunnel3;
-virDomainMigratePerform3;
-virDomainMigrateFinish3;
-virDomainMigrateConfirm3;
virDrvSupportsFeature;
virRegisterDeviceMonitor;
virRegisterDriver;
virRegisterInterfaceDriver;
-virRegisterNWFilterDriver;
virRegisterNetworkDriver;
+virRegisterNWFilterDriver;
virRegisterSecretDriver;
virRegisterStorageDriver;
@@ -785,11 +785,11 @@ virLockManagerAddResource;
virLockManagerFree;
virLockManagerInquire;
virLockManagerNew;
+virLockManagerPluginGetName;
virLockManagerPluginNew;
virLockManagerPluginRef;
virLockManagerPluginUnref;
virLockManagerPluginUsesState;
-virLockManagerPluginGetName;
virLockManagerRelease;
virLockManagerSetPluginDir;
@@ -847,8 +847,8 @@ virNetDevVPortTypeToString;
# network_conf.h
virNetworkAssignDef;
-virNetworkConfigFile;
virNetworkConfigChangeSetup;
+virNetworkConfigFile;
virNetworkDefCopy;
virNetworkDefFormat;
virNetworkDefFree;
@@ -885,9 +885,9 @@ virPortGroupFindByName;
# node_device_conf.h
+virNodeDevCapsDefFree;
virNodeDevCapTypeFromString;
virNodeDevCapTypeToString;
-virNodeDevCapsDefFree;
virNodeDeviceAssignDef;
virNodeDeviceDefFormat;
virNodeDeviceDefFree;
@@ -908,11 +908,11 @@ virNodeDeviceObjUnlock;
# nodeinfo.h
nodeCapsInitNUMA;
+nodeGetCellsFreeMemory;
nodeGetCPUBitmap;
nodeGetCPUCount;
nodeGetCPUMap;
nodeGetCPUStats;
-nodeGetCellsFreeMemory;
nodeGetFreeMemory;
nodeGetInfo;
nodeGetMemoryParameters;
@@ -949,8 +949,8 @@ virNWFilterRuleActionTypeToString;
virNWFilterRuleDirectionTypeToString;
virNWFilterRuleProtocolTypeToString;
virNWFilterTestUnassignDef;
-virNWFilterUnRegisterCallbackDriver;
virNWFilterUnlockFilterUpdates;
+virNWFilterUnRegisterCallbackDriver;
# nwfilter_ipaddrmap
@@ -1051,32 +1051,34 @@ virSecurityManagerFree;
virSecurityManagerGenLabel;
virSecurityManagerGetDOI;
virSecurityManagerGetModel;
+virSecurityManagerGetMountOptions;
virSecurityManagerGetNested;
virSecurityManagerGetProcessLabel;
virSecurityManagerNew;
-virSecurityManagerNewStack;
virSecurityManagerNewDAC;
+virSecurityManagerNewStack;
virSecurityManagerReleaseLabel;
virSecurityManagerReserveLabel;
-virSecurityManagerRestoreImageLabel;
virSecurityManagerRestoreAllLabel;
virSecurityManagerRestoreHostdevLabel;
+virSecurityManagerRestoreImageLabel;
virSecurityManagerRestoreSavedStateLabel;
virSecurityManagerSetAllLabel;
virSecurityManagerSetDaemonSocketLabel;
+virSecurityManagerSetHostdevLabel;
+virSecurityManagerSetHugepages;
virSecurityManagerSetImageFDLabel;
virSecurityManagerSetImageLabel;
-virSecurityManagerSetHostdevLabel;
virSecurityManagerSetProcessLabel;
virSecurityManagerSetSavedStateLabel;
virSecurityManagerSetSocketLabel;
virSecurityManagerSetTapFDLabel;
virSecurityManagerStackAddNested;
virSecurityManagerVerify;
-virSecurityManagerGetMountOptions;
-virSecurityManagerSetHugepages;
+
# sexpr.h
+sexpr2string;
sexpr_append;
sexpr_cons;
sexpr_float;
@@ -1090,7 +1092,6 @@ sexpr_node;
sexpr_node_copy;
sexpr_string;
sexpr_u64;
-sexpr2string;
string2sexpr;
@@ -1170,8 +1171,10 @@ virStorageFileChainLookup;
virStorageFileFormatTypeFromString;
virStorageFileFormatTypeToString;
virStorageFileFreeMetadata;
+virStorageFileGetLVMKey;
virStorageFileGetMetadata;
virStorageFileGetMetadataFromFD;
+virStorageFileGetSCSIKey;
virStorageFileIsClusterFS;
virStorageFileIsSharedFS;
virStorageFileIsSharedFSType;
@@ -1187,11 +1190,11 @@ virSysinfoRead;
# threadpool.h
virThreadPoolFree;
-virThreadPoolNew;
-virThreadPoolSendJob;
-virThreadPoolGetMinWorkers;
virThreadPoolGetMaxWorkers;
+virThreadPoolGetMinWorkers;
virThreadPoolGetPriorityWorkers;
+virThreadPoolNew;
+virThreadPoolSendJob;
# threads.h
@@ -1256,9 +1259,9 @@ virFileExists;
virFileFindMountPoint;
virFileHasSuffix;
virFileIsAbsPath;
+virFileIsDir;
virFileIsExecutable;
virFileIsLink;
-virFileIsDir;
virFileLinkPointsTo;
virFileLock;
virFileMakePath;
@@ -1281,12 +1284,12 @@ virFormatIntDecimal;
virGetGroupID;
virGetGroupName;
virGetHostname;
-virGetUserDirectory;
-virGetUserConfigDirectory;
virGetUserCacheDirectory;
-virGetUserRuntimeDirectory;
+virGetUserConfigDirectory;
+virGetUserDirectory;
virGetUserID;
virGetUserName;
+virGetUserRuntimeDirectory;
virHexToBin;
virIndexToDiskName;
virIsDevMapperDevice;
@@ -1302,7 +1305,9 @@ virSetUIDGID;
virSkipSpaces;
virSkipSpacesAndBackslash;
virSkipSpacesBackwards;
+virStrcpy;
virStrIsPrint;
+virStrncpy;
virStrToDouble;
virStrToLong_i;
virStrToLong_l;
@@ -1310,8 +1315,6 @@ virStrToLong_ll;
virStrToLong_ui;
virStrToLong_ul;
virStrToLong_ull;
-virStrcpy;
-virStrncpy;
virTrimSpaces;
virValidateWWN;
virVasprintf;
@@ -1359,18 +1362,18 @@ virDBusGetSystemBus;
# virfile.h
-virFileLoopDeviceAssociate;
virFileClose;
virFileDirectFdFlag;
-virFileWrapperFdCatchError;
-virFileWrapperFdClose;
-virFileWrapperFdFree;
-virFileWrapperFdNew;
virFileFclose;
virFileFdopen;
+virFileLoopDeviceAssociate;
virFileRewrite;
virFileTouch;
virFileUpdatePerm;
+virFileWrapperFdCatchError;
+virFileWrapperFdClose;
+virFileWrapperFdFree;
+virFileWrapperFdNew;
# virinitctl.h
@@ -1385,13 +1388,13 @@ virKeycodeValueTranslate;
# virkeyfile.h
-virKeyFileNew;
-virKeyFileLoadFile;
-virKeyFileLoadData;
virKeyFileFree;
-virKeyFileHasValue;
-virKeyFileHasGroup;
virKeyFileGetValueString;
+virKeyFileHasGroup;
+virKeyFileHasValue;
+virKeyFileLoadData;
+virKeyFileLoadFile;
+virKeyFileNew;
# virlockspace.h
@@ -1445,8 +1448,8 @@ virNetClientRegisterAsyncIO;
virNetClientRegisterKeepAlive;
virNetClientRemoteAddrString;
virNetClientRemoveStream;
-virNetClientSendNoReply;
virNetClientSendNonBlock;
+virNetClientSendNoReply;
virNetClientSendWithReply;
virNetClientSendWithReplyStream;
virNetClientSetCloseCallback;
@@ -1479,15 +1482,15 @@ virNetClientStreamSetError;
# virnetdev.h
virNetDevClearIPv4Address;
virNetDevExists;
-virNetDevGetIPv4Address;
virNetDevGetIndex;
+virNetDevGetIPv4Address;
virNetDevGetMAC;
virNetDevGetMTU;
virNetDevGetPhysicalFunction;
-virNetDevGetVLanID;
virNetDevGetVirtualFunctionIndex;
virNetDevGetVirtualFunctionInfo;
virNetDevGetVirtualFunctions;
+virNetDevGetVLanID;
virNetDevIsOnline;
virNetDevIsVirtualFunction;
virNetDevLinkDump;
@@ -1529,8 +1532,8 @@ virNetDevBridgeSetSTPDelay;
# virnetdevmacvlan.h
virNetDevMacVLanCreate;
-virNetDevMacVLanDelete;
virNetDevMacVLanCreateWithVPortProfile;
+virNetDevMacVLanDelete;
virNetDevMacVLanDeleteWithVPortProfile;
virNetDevMacVLanRestartWithVPortProfile;
virNetDevMacVLanVPortProfileRegisterCallback;
@@ -1577,9 +1580,9 @@ virNetlinkEventAddClient;
virNetlinkEventRemoveClient;
virNetlinkEventServiceIsRunning;
virNetlinkEventServiceLocalPid;
+virNetlinkEventServiceStart;
virNetlinkEventServiceStop;
virNetlinkEventServiceStopAll;
-virNetlinkEventServiceStart;
virNetlinkShutdown;
virNetlinkStartup;
@@ -1587,14 +1590,14 @@ virNetlinkStartup;
# virnetmessage.h
virNetMessageClear;
virNetMessageDecodeHeader;
-virNetMessageDecodeNumFDs;
virNetMessageDecodeLength;
+virNetMessageDecodeNumFDs;
virNetMessageDecodePayload;
virNetMessageDupFD;
virNetMessageEncodeHeader;
+virNetMessageEncodeNumFDs;
virNetMessageEncodePayload;
virNetMessageEncodePayloadRaw;
-virNetMessageEncodeNumFDs;
virNetMessageFree;
virNetMessageNew;
virNetMessageQueuePush;
@@ -1767,6 +1770,8 @@ virObjectUnref;
virPidFileAcquire;
virPidFileAcquirePath;
virPidFileBuildPath;
+virPidFileDelete;
+virPidFileDeletePath;
virPidFileRead;
virPidFileReadIfAlive;
virPidFileReadPath;
@@ -1775,8 +1780,6 @@ virPidFileRelease;
virPidFileReleasePath;
virPidFileWrite;
virPidFileWritePath;
-virPidFileDelete;
-virPidFileDeletePath;
# virprocess.h
@@ -1828,9 +1831,9 @@ virStrerror;
# virstring.h
-virStringSplit;
-virStringJoin;
virStringFreeList;
+virStringJoin;
+virStringSplit;
# virtime.h
diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c
index 5b6d6fb67..55d2ef43b 100644
--- a/src/libxl/libxl_conf.c
+++ b/src/libxl/libxl_conf.c
@@ -438,6 +438,8 @@ libxlMakeDomBuildInfo(virDomainDefPtr def, libxl_domain_config *d_config)
b_info->max_memkb = def->mem.max_balloon;
b_info->target_memkb = def->mem.cur_balloon;
if (hvm) {
+ char bootorder[VIR_DOMAIN_BOOT_LAST + 1];
+
libxl_defbool_set(&b_info->u.hvm.pae,
def->features & (1 << VIR_DOMAIN_FEATURE_PAE));
libxl_defbool_set(&b_info->u.hvm.apic,
@@ -450,6 +452,34 @@ libxlMakeDomBuildInfo(virDomainDefPtr def, libxl_domain_config *d_config)
libxl_defbool_set(&b_info->u.hvm.hpet, 1);
}
}
+ for (i = 0 ; i < def->os.nBootDevs ; i++) {
+ switch (def->os.bootDevs[i]) {
+ case VIR_DOMAIN_BOOT_FLOPPY:
+ bootorder[i] = 'a';
+ break;
+ default:
+ case VIR_DOMAIN_BOOT_DISK:
+ bootorder[i] = 'c';
+ break;
+ case VIR_DOMAIN_BOOT_CDROM:
+ bootorder[i] = 'd';
+ break;
+ case VIR_DOMAIN_BOOT_NET:
+ bootorder[i] = 'n';
+ break;
+ }
+ }
+ if (def->os.nBootDevs == 0) {
+ bootorder[0] = 'c';
+ bootorder[1] = '\0';
+ }
+ else {
+ bootorder[def->os.nBootDevs] = '\0';
+ }
+ if ((b_info->u.hvm.boot = strdup(bootorder)) == NULL) {
+ virReportOOMError();
+ goto error;
+ }
/*
* The following comment and calculation were taken directly from
diff --git a/src/locking/libvirt_lockd.aug b/src/locking/libvirt_lockd.aug
new file mode 100644
index 000000000..6a3bcba0e
--- /dev/null
+++ b/src/locking/libvirt_lockd.aug
@@ -0,0 +1,35 @@
+(* /etc/libvirt/qemu-lockd.conf *)
+
+module Libvirt_lockd =
+ autoload xfm
+
+ let eol = del /[ \t]*\n/ "\n"
+ let value_sep = del /[ \t]*=[ \t]*/ " = "
+ let indent = del /[ \t]*/ ""
+
+ let str_val = del /\"/ "\"" . store /[^\"]*/ . del /\"/ "\""
+ let bool_val = store /0|1/
+ let int_val = store /[0-9]+/
+
+ let str_entry (kw:string) = [ key kw . value_sep . str_val ]
+ let bool_entry (kw:string) = [ key kw . value_sep . bool_val ]
+ let int_entry (kw:string) = [ key kw . value_sep . int_val ]
+
+
+ (* Each enty in the config is one of the following three ... *)
+ let entry = bool_entry "auto_disk_leases"
+ | bool_entry "require_lease_for_disks"
+ | str_entry "file_lockspace_dir"
+ | str_entry "lvm_lockspace_dir"
+ | str_entry "scsi_lockspace_dir"
+ let comment = [ label "#comment" . del /#[ \t]*/ "# " . store /([^ \t\n][^\n]*)?/ . del /\n/ "\n" ]
+ let empty = [ label "#empty" . eol ]
+
+ let record = indent . entry . eol
+
+ let lns = ( record | comment | empty ) *
+
+ let filter = incl "/etc/libvirt/qemu-lockd.conf"
+ . Util.stdexcl
+
+ let xfm = transform lns filter
diff --git a/src/locking/lock_daemon.c b/src/locking/lock_daemon.c
new file mode 100644
index 000000000..d7906c572
--- /dev/null
+++ b/src/locking/lock_daemon.c
@@ -0,0 +1,1429 @@
+/*
+ * lock_daemon.c: lock management daemon
+ *
+ * Copyright (C) 2006-2012 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 <unistd.h>
+#include <fcntl.h>
+#include <sys/wait.h>
+#include <sys/stat.h>
+#include <getopt.h>
+#include <stdlib.h>
+#include <locale.h>
+
+
+#include "lock_daemon.h"
+#include "lock_daemon_config.h"
+#include "util.h"
+#include "virfile.h"
+#include "virpidfile.h"
+#include "virprocess.h"
+#include "virterror_internal.h"
+#include "logging.h"
+#include "memory.h"
+#include "conf.h"
+#include "rpc/virnetserver.h"
+#include "virrandom.h"
+#include "virhash.h"
+#include "uuid.h"
+
+#include "locking/lock_daemon_dispatch.h"
+#include "locking/lock_protocol.h"
+
+#include "configmake.h"
+
+#define VIR_FROM_THIS VIR_FROM_LOCKING
+
+#define VIR_LOCK_DAEMON_NUM_LOCKSPACES 3
+
+struct _virLockDaemon {
+ virMutex lock;
+ virNetServerPtr srv;
+ virHashTablePtr lockspaces;
+ virLockSpacePtr defaultLockspace;
+};
+
+virLockDaemonPtr lockDaemon = NULL;
+
+static bool execRestart = false;
+
+enum {
+ VIR_LOCK_DAEMON_ERR_NONE = 0,
+ VIR_LOCK_DAEMON_ERR_PIDFILE,
+ VIR_LOCK_DAEMON_ERR_RUNDIR,
+ VIR_LOCK_DAEMON_ERR_INIT,
+ VIR_LOCK_DAEMON_ERR_SIGNAL,
+ VIR_LOCK_DAEMON_ERR_PRIVS,
+ VIR_LOCK_DAEMON_ERR_NETWORK,
+ VIR_LOCK_DAEMON_ERR_CONFIG,
+ VIR_LOCK_DAEMON_ERR_HOOKS,
+
+ VIR_LOCK_DAEMON_ERR_LAST
+};
+
+VIR_ENUM_DECL(virDaemonErr)
+VIR_ENUM_IMPL(virDaemonErr, VIR_LOCK_DAEMON_ERR_LAST,
+ "Initialization successful",
+ "Unable to obtain pidfile",
+ "Unable to create rundir",
+ "Unable to initialize libvirt",
+ "Unable to setup signal handlers",
+ "Unable to drop privileges",
+ "Unable to initialize network sockets",
+ "Unable to load configuration file",
+ "Unable to look for hook scripts");
+
+static void *
+virLockDaemonClientNew(virNetServerClientPtr client,
+ void *opaque);
+static void
+virLockDaemonClientFree(void *opaque);
+
+static void *
+virLockDaemonClientNewPostExecRestart(virNetServerClientPtr client,
+ virJSONValuePtr object,
+ void *opaque);
+static virJSONValuePtr
+virLockDaemonClientPreExecRestart(virNetServerClientPtr client,
+ void *opaque);
+
+static void
+virLockDaemonFree(virLockDaemonPtr lockd)
+{
+ if (!lockd)
+ return;
+
+ virObjectUnref(lockd->srv);
+ virHashFree(lockd->lockspaces);
+ virLockSpaceFree(lockd->defaultLockspace);
+
+ VIR_FREE(lockd);
+}
+
+
+static void virLockDaemonLockSpaceDataFree(void *data,
+ const void *key ATTRIBUTE_UNUSED)
+{
+ virLockSpaceFree(data);
+}
+
+static virLockDaemonPtr
+virLockDaemonNew(bool privileged)
+{
+ virLockDaemonPtr lockd;
+
+ if (VIR_ALLOC(lockd) < 0) {
+ virReportOOMError();
+ return NULL;
+ }
+
+ if (virMutexInit(&lockd->lock) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Unable to initialize mutex"));
+ VIR_FREE(lockd);
+ return NULL;
+ }
+
+ if (!(lockd->srv = virNetServerNew(1, 1, 0, 20,
+ -1, 0,
+ false, NULL,
+ virLockDaemonClientNew,
+ virLockDaemonClientPreExecRestart,
+ virLockDaemonClientFree,
+ (void*)(intptr_t)(privileged ? 0x1 : 0x0))))
+ goto error;
+
+ if (!(lockd->lockspaces = virHashCreate(VIR_LOCK_DAEMON_NUM_LOCKSPACES,
+ virLockDaemonLockSpaceDataFree)))
+ goto error;
+
+ if (!(lockd->defaultLockspace = virLockSpaceNew(NULL)))
+ goto error;
+
+ return lockd;
+
+error:
+ virLockDaemonFree(lockd);
+ return NULL;
+}
+
+
+static virLockDaemonPtr
+virLockDaemonNewPostExecRestart(virJSONValuePtr object, bool privileged)
+{
+ virLockDaemonPtr lockd;
+ virJSONValuePtr child;
+ virJSONValuePtr lockspaces;
+ size_t i;
+ int n;
+
+ if (VIR_ALLOC(lockd) < 0) {
+ virReportOOMError();
+ return NULL;
+ }
+
+ if (virMutexInit(&lockd->lock) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Unable to initialize mutex"));
+ VIR_FREE(lockd);
+ return NULL;
+ }
+
+ if (!(lockd->lockspaces = virHashCreate(VIR_LOCK_DAEMON_NUM_LOCKSPACES,
+ virLockDaemonLockSpaceDataFree)))
+ goto error;
+
+ if (!(child = virJSONValueObjectGet(object, "defaultLockspace"))) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Missing defaultLockspace data from JSON file"));
+ goto error;
+ }
+
+ if (!(lockd->defaultLockspace =
+ virLockSpaceNewPostExecRestart(child)))
+ goto error;
+
+ if (!(lockspaces = virJSONValueObjectGet(object, "lockspaces"))) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Missing lockspaces data from JSON file"));
+ goto error;
+ }
+
+ if ((n = virJSONValueArraySize(lockspaces)) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Malformed lockspaces data from JSON file"));
+ goto error;
+ }
+
+ for (i = 0 ; i < n ; i++) {
+ virLockSpacePtr lockspace;
+
+ child = virJSONValueArrayGet(lockspaces, i);
+
+ if (!(lockspace = virLockSpaceNewPostExecRestart(child)))
+ goto error;
+
+ if (virHashAddEntry(lockd->lockspaces,
+ virLockSpaceGetDirectory(lockspace),
+ lockspace) < 0) {
+ virLockSpaceFree(lockspace);
+ }
+ }
+
+ if (!(child = virJSONValueObjectGet(object, "server"))) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Missing server data from JSON file"));
+ goto error;
+ }
+
+ if (!(lockd->srv = virNetServerNewPostExecRestart(child,
+ virLockDaemonClientNew,
+ virLockDaemonClientNewPostExecRestart,
+ virLockDaemonClientPreExecRestart,
+ virLockDaemonClientFree,
+ (void*)(intptr_t)(privileged ? 0x1 : 0x0))))
+ goto error;
+
+ return lockd;
+
+error:
+ virLockDaemonFree(lockd);
+ return NULL;
+}
+
+
+int virLockDaemonAddLockSpace(virLockDaemonPtr lockd,
+ const char *path,
+ virLockSpacePtr lockspace)
+{
+ int ret;
+ virMutexLock(&lockd->lock);
+ ret = virHashAddEntry(lockd->lockspaces, path, lockspace);
+ virMutexUnlock(&lockd->lock);
+ return ret;
+}
+
+virLockSpacePtr virLockDaemonFindLockSpace(virLockDaemonPtr lockd,
+ const char *path)
+{
+ virLockSpacePtr lockspace;
+ virMutexLock(&lockd->lock);
+ if (path && STRNEQ(path, ""))
+ lockspace = virHashLookup(lockd->lockspaces, path);
+ else
+ lockspace = lockd->defaultLockspace;
+ virMutexUnlock(&lockd->lock);
+ return lockspace;
+}
+
+
+static int
+virLockDaemonForkIntoBackground(const char *argv0)
+{
+ int statuspipe[2];
+ if (pipe(statuspipe) < 0)
+ return -1;
+
+ pid_t pid = fork();
+ switch (pid) {
+ case 0:
+ {
+ int stdinfd = -1;
+ int stdoutfd = -1;
+ int nextpid;
+
+ VIR_FORCE_CLOSE(statuspipe[0]);
+
+ if ((stdinfd = open("/dev/null", O_RDONLY)) < 0)
+ goto cleanup;
+ if ((stdoutfd = open("/dev/null", O_WRONLY)) < 0)
+ goto cleanup;
+ if (dup2(stdinfd, STDIN_FILENO) != STDIN_FILENO)
+ goto cleanup;
+ if (dup2(stdoutfd, STDOUT_FILENO) != STDOUT_FILENO)
+ goto cleanup;
+ if (dup2(stdoutfd, STDERR_FILENO) != STDERR_FILENO)
+ goto cleanup;
+ if (VIR_CLOSE(stdinfd) < 0)
+ goto cleanup;
+ if (VIR_CLOSE(stdoutfd) < 0)
+ goto cleanup;
+
+ if (setsid() < 0)
+ goto cleanup;
+
+ nextpid = fork();
+ switch (nextpid) {
+ case 0:
+ return statuspipe[1];
+ case -1:
+ return -1;
+ default:
+ _exit(0);
+ }
+
+ cleanup:
+ VIR_FORCE_CLOSE(stdoutfd);
+ VIR_FORCE_CLOSE(stdinfd);
+ return -1;
+
+ }
+
+ case -1:
+ return -1;
+
+ default:
+ {
+ int got, exitstatus = 0;
+ int ret;
+ char status;
+
+ VIR_FORCE_CLOSE(statuspipe[1]);
+
+ /* We wait to make sure the first child forked successfully */
+ if ((got = waitpid(pid, &exitstatus, 0)) < 0 ||
+ got != pid ||
+ exitstatus != 0) {
+ return -1;
+ }
+
+ /* Now block until the second child initializes successfully */
+ again:
+ ret = read(statuspipe[0], &status, 1);
+ if (ret == -1 && errno == EINTR)
+ goto again;
+
+ if (ret == 1 && status != 0) {
+ fprintf(stderr,
+ _("%s: error: %s. Check /var/log/messages or run without "
+ "--daemon for more info.\n"), argv0,
+ virDaemonErrTypeToString(status));
+ }
+ _exit(ret == 1 && status == 0 ? 0 : 1);
+ }
+ }
+}
+
+
+static int
+virLockDaemonPidFilePath(bool privileged,
+ char **pidfile)
+{
+ if (privileged) {
+ if (!(*pidfile = strdup(LOCALSTATEDIR "/run/virtlockd.pid")))
+ goto no_memory;
+ } else {
+ char *rundir = NULL;
+ mode_t old_umask;
+
+ if (!(rundir = virGetUserRuntimeDirectory()))
+ goto error;
+
+ old_umask = umask(077);
+ if (virFileMakePath(rundir) < 0) {
+ umask(old_umask);
+ goto error;
+ }
+ umask(old_umask);
+
+ if (virAsprintf(pidfile, "%s/virtlockd.pid", rundir) < 0) {
+ VIR_FREE(rundir);
+ goto no_memory;
+ }
+
+ VIR_FREE(rundir);
+ }
+
+ return 0;
+
+no_memory:
+ virReportOOMError();
+error:
+ return -1;
+}
+
+
+static int
+virLockDaemonUnixSocketPaths(bool privileged,
+ char **sockfile)
+{
+ if (privileged) {
+ if (!(*sockfile = strdup(LOCALSTATEDIR "/run/libvirt/virtlockd-sock")))
+ goto no_memory;
+ } else {
+ char *rundir = NULL;
+ mode_t old_umask;
+
+ if (!(rundir = virGetUserRuntimeDirectory()))
+ goto error;
+
+ old_umask = umask(077);
+ if (virFileMakePath(rundir) < 0) {
+ umask(old_umask);
+ goto error;
+ }
+ umask(old_umask);
+
+ if (virAsprintf(sockfile, "%s/virtlockd-sock", rundir) < 0) {
+ VIR_FREE(rundir);
+ goto no_memory;
+ }
+
+ VIR_FREE(rundir);
+ }
+ return 0;
+
+no_memory:
+ virReportOOMError();
+error:
+ return -1;
+}
+
+
+static void
+virLockDaemonErrorHandler(void *opaque ATTRIBUTE_UNUSED,
+ virErrorPtr err ATTRIBUTE_UNUSED)
+{
+ /* Don't do anything, since logging infrastructure already
+ * took care of reporting the error */
+}
+
+
+/*
+ * Set up the logging environment
+ * By default if daemonized all errors go to the logfile libvirtd.log,
+ * but if verbose or error debugging is asked for then also output
+ * informational and debug messages. Default size if 64 kB.
+ */
+static int
+virLockDaemonSetupLogging(virLockDaemonConfigPtr config,
+ bool privileged,
+ bool verbose,
+ bool godaemon)
+{
+ virLogReset();
+
+ /*
+ * Libvirtd's order of precedence is:
+ * cmdline > environment > config
+ *
+ * In order to achieve this, we must process configuration in
+ * different order for the log level versus the filters and
+ * outputs. Because filters and outputs append, we have to look at
+ * the environment first and then only check the config file if
+ * there was no result from the environment. The default output is
+ * then applied only if there was no setting from either of the
+ * first two. Because we don't have a way to determine if the log
+ * level has been set, we must process variables in the opposite
+ * order, each one overriding the previous.
+ */
+ if (config->log_level != 0)
+ virLogSetDefaultPriority(config->log_level);
+
+ virLogSetFromEnv();
+
+ virLogSetBufferSize(config->log_buffer_size);
+
+ if (virLogGetNbFilters() == 0)
+ virLogParseFilters(config->log_filters);
+
+ if (virLogGetNbOutputs() == 0)
+ virLogParseOutputs(config->log_outputs);
+
+ /*
+ * If no defined outputs, and either running
+ * as daemon or not on a tty, then first try
+ * to direct it to the systemd journal
+ * (if it exists)....
+ */
+ if (virLogGetNbOutputs() == 0 &&
+ (godaemon || !isatty(STDIN_FILENO))) {
+ char *tmp;
+ if (access("/run/systemd/journal/socket", W_OK) >= 0) {
+ if (virAsprintf(&tmp, "%d:journald", virLogGetDefaultPriority()) < 0)
+ goto no_memory;
+ virLogParseOutputs(tmp);
+ VIR_FREE(tmp);
+ }
+ }
+
+ /*
+ * otherwise direct to libvirtd.log when running
+ * as daemon. Otherwise the default output is stderr.
+ */
+ if (virLogGetNbOutputs() == 0) {
+ char *tmp = NULL;
+
+ if (godaemon) {
+ if (privileged) {
+ if (virAsprintf(&tmp, "%d:file:%s/log/libvirt/virtlockd.log",
+ virLogGetDefaultPriority(),
+ LOCALSTATEDIR) == -1)
+ goto no_memory;
+ } else {
+ char *logdir = virGetUserCacheDirectory();
+ mode_t old_umask;
+
+ if (!logdir)
+ goto error;
+
+ old_umask = umask(077);
+ if (virFileMakePath(logdir) < 0) {
+ umask(old_umask);
+ goto error;
+ }
+ umask(old_umask);
+
+ if (virAsprintf(&tmp, "%d:file:%s/virtlockd.log",
+ virLogGetDefaultPriority(), logdir) == -1) {
+ VIR_FREE(logdir);
+ goto no_memory;
+ }
+ VIR_FREE(logdir);
+ }
+ } else {
+ if (virAsprintf(&tmp, "%d:stderr", virLogGetDefaultPriority()) < 0)
+ goto no_memory;
+ }
+ virLogParseOutputs(tmp);
+ VIR_FREE(tmp);
+ }
+
+ /*
+ * Command line override for --verbose
+ */
+ if ((verbose) && (virLogGetDefaultPriority() > VIR_LOG_INFO))
+ virLogSetDefaultPriority(VIR_LOG_INFO);
+
+ return 0;
+
+no_memory:
+ virReportOOMError();
+error:
+ return -1;
+}
+
+
+
+/* Display version information. */
+static void
+virLockDaemonVersion(const char *argv0)
+{
+ printf("%s (%s) %s\n", argv0, PACKAGE_NAME, PACKAGE_VERSION);
+}
+
+static void
+virLockDaemonShutdownHandler(virNetServerPtr srv,
+ siginfo_t *sig ATTRIBUTE_UNUSED,
+ void *opaque ATTRIBUTE_UNUSED)
+{
+ virNetServerQuit(srv);
+}
+
+static void
+virLockDaemonExecRestartHandler(virNetServerPtr srv,
+ siginfo_t *sig ATTRIBUTE_UNUSED,
+ void *opaque ATTRIBUTE_UNUSED)
+{
+ execRestart = true;
+ virNetServerQuit(srv);
+}
+
+static int
+virLockDaemonSetupSignals(virNetServerPtr srv)
+{
+ if (virNetServerAddSignalHandler(srv, SIGINT, virLockDaemonShutdownHandler, NULL) < 0)
+ return -1;
+ if (virNetServerAddSignalHandler(srv, SIGQUIT, virLockDaemonShutdownHandler, NULL) < 0)
+ return -1;
+ if (virNetServerAddSignalHandler(srv, SIGTERM, virLockDaemonShutdownHandler, NULL) < 0)
+ return -1;
+ if (virNetServerAddSignalHandler(srv, SIGUSR1, virLockDaemonExecRestartHandler, NULL) < 0)
+ return -1;
+ return 0;
+}
+
+
+static int
+virLockDaemonSetupNetworkingSystemD(virNetServerPtr srv)
+{
+ virNetServerServicePtr svc;
+ const char *pidstr;
+ const char *fdstr;
+ unsigned long long procid;
+ unsigned int nfds;
+
+ VIR_DEBUG("Setting up networking from systemd");
+
+ if (!(pidstr = getenv("LISTEN_PID"))) {
+ VIR_DEBUG("No LISTEN_FDS from systemd");
+ return 0;
+ }
+
+ if (virStrToLong_ull(pidstr, NULL, 10, &procid) < 0) {
+ VIR_DEBUG("Malformed LISTEN_PID from systemd %s", pidstr);
+ return 0;
+ }
+
+ if ((pid_t)procid != getpid()) {
+ VIR_DEBUG("LISTEN_PID %s is not for us %llu",
+ pidstr, (unsigned long long)getpid());
+ return 0;
+ }
+
+ if (!(fdstr = getenv("LISTEN_FDS"))) {
+ VIR_DEBUG("No LISTEN_FDS from systemd");
+ return 0;
+ }
+
+ if (virStrToLong_ui(fdstr, NULL, 10, &nfds) < 0) {
+ VIR_DEBUG("Malformed LISTEN_FDS from systemd %s", fdstr);
+ return 0;
+ }
+
+ if (nfds > 1) {
+ VIR_DEBUG("Too many (%d) file descriptors from systemd",
+ nfds);
+ nfds = 1;
+ }
+
+ unsetenv("LISTEN_PID");
+ unsetenv("LISTEN_FDS");
+
+ if (nfds == 0)
+ return 0;
+
+ /* Systemd passes FDs, starting immediately after stderr,
+ * so the first FD we'll get is '3'. */
+ if (!(svc = virNetServerServiceNewFD(3, 0, false, 1, NULL)))
+ return -1;
+
+ if (virNetServerAddService(srv, svc, NULL) < 0) {
+ virObjectUnref(svc);
+ return -1;
+ }
+ return 1;
+}
+
+
+static int
+virLockDaemonSetupNetworkingNative(virNetServerPtr srv, const char *sock_path)
+{
+ virNetServerServicePtr svc;
+
+ VIR_DEBUG("Setting up networking natively");
+
+ if (!(svc = virNetServerServiceNewUNIX(sock_path, 0700, 0, 0, false, 1, NULL)))
+ return -1;
+
+ if (virNetServerAddService(srv, svc, NULL) < 0) {
+ virObjectUnref(svc);
+ return -1;
+ }
+ return 0;
+}
+
+
+struct virLockDaemonClientReleaseData {
+ virLockDaemonClientPtr client;
+ bool hadSomeLeases;
+ bool gotError;
+};
+
+static void
+virLockDaemonClientReleaseLockspace(void *payload,
+ const void *name ATTRIBUTE_UNUSED,
+ void *opaque)
+{
+ virLockSpacePtr lockspace = payload;
+ struct virLockDaemonClientReleaseData *data = opaque;
+ int rc;
+
+ rc = virLockSpaceReleaseResourcesForOwner(lockspace,
+ data->client->clientPid);
+ if (rc > 0)
+ data->hadSomeLeases = true;
+ else if (rc < 0)
+ data->gotError = true;
+}
+
+
+static void
+virLockDaemonClientFree(void *opaque)
+{
+ virLockDaemonClientPtr priv = opaque;
+
+ if (!priv)
+ return;
+
+ VIR_DEBUG("priv=%p client=%lld owner=%lld",
+ priv,
+ (unsigned long long)priv->clientPid,
+ (unsigned long long)priv->ownerPid);
+
+ /* If client & owner match, this is the lock holder */
+ if (priv->clientPid == priv->ownerPid) {
+ size_t i;
+ struct virLockDaemonClientReleaseData data = {
+ .client = priv, .hadSomeLeases = false, .gotError = false
+ };
+
+ /* Release all locks associated with this
+ * owner in all lockspaces */
+ virMutexLock(&lockDaemon->lock);
+ virHashForEach(lockDaemon->lockspaces,
+ virLockDaemonClientReleaseLockspace,
+ &data);
+ virLockDaemonClientReleaseLockspace(lockDaemon->defaultLockspace,
+ "",
+ &data);
+ virMutexUnlock(&lockDaemon->lock);
+
+ /* If the client had some active leases when it
+ * closed the connection, we must kill it off
+ * to make sure it doesn't do nasty stuff */
+ if (data.gotError || data.hadSomeLeases) {
+ for (i = 0 ; i < 15 ; i++) {
+ int signum;
+ if (i == 0)
+ signum = SIGTERM;
+ else if (i == 8)
+ signum = SIGKILL;
+ else
+ signum = 0;
+ if (virProcessKill(priv->clientPid, signum) < 0) {
+ if (errno == ESRCH)
+ break;
+
+ VIR_WARN("Failed to kill off pid %lld",
+ (unsigned long long)priv->clientPid);
+ }
+ usleep(200 * 1000);
+ }
+ }
+ }
+
+ virMutexDestroy(&priv->lock);
+ VIR_FREE(priv);
+}
+
+
+static void *
+virLockDaemonClientNew(virNetServerClientPtr client,
+ void *opaque)
+{
+ virLockDaemonClientPtr priv;
+ uid_t clientuid;
+ gid_t clientgid;
+ bool privileged = opaque != NULL;
+
+ if (VIR_ALLOC(priv) < 0) {
+ virReportOOMError();
+ return NULL;
+ }
+
+ if (virMutexInit(&priv->lock) < 0) {
+ VIR_FREE(priv);
+ virReportOOMError();
+ return NULL;
+ }
+
+ if (virNetServerClientGetUNIXIdentity(client,
+ &clientuid,
+ &clientgid,
+ &priv->clientPid) < 0)
+ goto error;
+
+ VIR_DEBUG("New client pid %llu uid %llu",
+ (unsigned long long)priv->clientPid,
+ (unsigned long long)clientuid);
+
+ if (!privileged) {
+ if (geteuid() != clientuid) {
+ virReportError(VIR_ERR_OPERATION_DENIED,
+ _("Disallowing client %llu with uid %llu"),
+ (unsigned long long)priv->clientPid,
+ (unsigned long long)clientuid);
+ goto error;
+ }
+ } else {
+ if (clientuid != 0) {
+ virReportError(VIR_ERR_OPERATION_DENIED,
+ _("Disallowing client %llu with uid %llu"),
+ (unsigned long long)priv->clientPid,
+ (unsigned long long)clientuid);
+ goto error;
+ }
+ }
+
+ return priv;
+
+error:
+ virMutexDestroy(&priv->lock);
+ VIR_FREE(priv);
+ return NULL;
+}
+
+
+static void *
+virLockDaemonClientNewPostExecRestart(virNetServerClientPtr client,
+ virJSONValuePtr object,
+ void *opaque)
+{
+ virLockDaemonClientPtr priv = virLockDaemonClientNew(client, opaque);
+ unsigned int ownerPid;
+ const char *ownerUUID;
+ const char *ownerName;
+
+ if (!priv)
+ return NULL;
+
+ if (virJSONValueObjectGetBoolean(object, "restricted", &priv->restricted) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Missing restricted data in JSON document"));
+ goto error;
+ }
+ if (virJSONValueObjectGetNumberUint(object, "ownerPid", &ownerPid) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Missing ownerPid data in JSON document"));
+ goto error;
+ }
+ priv->ownerPid = (pid_t)ownerPid;
+ if (virJSONValueObjectGetNumberUint(object, "ownerId", &priv->ownerId) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Missing ownerId data in JSON document"));
+ goto error;
+ }
+ if (!(ownerName = virJSONValueObjectGetString(object, "ownerName"))) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Missing ownerName data in JSON document"));
+ goto error;
+ }
+ if (!(priv->ownerName = strdup(ownerName))) {
+ virReportOOMError();
+ goto error;
+ }
+ if (!(ownerUUID = virJSONValueObjectGetString(object, "ownerUUID"))) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Missing ownerUUID data in JSON document"));
+ goto error;
+ }
+ if (virUUIDParse(ownerUUID, priv->ownerUUID) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Missing ownerUUID data in JSON document"));
+ goto error;
+ }
+ return priv;
+
+error:
+ virLockDaemonClientFree(priv);
+ return NULL;
+}
+
+
+static virJSONValuePtr
+virLockDaemonClientPreExecRestart(virNetServerClientPtr client ATTRIBUTE_UNUSED,
+ void *opaque)
+{
+ virLockDaemonClientPtr priv = opaque;
+ virJSONValuePtr object = virJSONValueNewObject();
+ char uuidstr[VIR_UUID_STRING_BUFLEN];
+
+ if (!object)
+ return NULL;
+
+ if (virJSONValueObjectAppendBoolean(object, "restricted", priv->restricted) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Cannot set restricted data in JSON document"));
+ goto error;
+ }
+ if (virJSONValueObjectAppendNumberUint(object, "ownerPid", priv->ownerPid) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Cannot set ownerPid data in JSON document"));
+ goto error;
+ }
+ if (virJSONValueObjectAppendNumberUint(object, "ownerId", priv->ownerId) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Cannot set ownerId data in JSON document"));
+ goto error;
+ }
+ if (virJSONValueObjectAppendString(object, "ownerName", priv->ownerName) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Cannot set ownerName data in JSON document"));
+ goto error;
+ }
+ virUUIDFormat(priv->ownerUUID, uuidstr);
+ if (virJSONValueObjectAppendString(object, "ownerUUID", uuidstr) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Cannot set ownerUUID data in JSON document"));
+ goto error;
+ }
+
+ return object;
+
+error:
+ virJSONValueFree(object);
+ return NULL;
+}
+
+
+#define VIR_LOCK_DAEMON_RESTART_EXEC_FILE LOCALSTATEDIR "/run/virtlockd-restart-exec.json"
+
+static char *
+virLockDaemonGetExecRestartMagic(void)
+{
+ char *ret;
+
+ if (virAsprintf(&ret, "%lld",
+ (long long int)getpid()) < 0) {
+ virReportOOMError();
+ return NULL;
+ }
+
+ return ret;
+}
+
+
+static int
+virLockDaemonPostExecRestart(bool privileged)
+{
+ const char *gotmagic;
+ char *wantmagic = NULL;
+ int ret = -1;
+ char *state = NULL;
+ virJSONValuePtr object = NULL;
+
+ VIR_DEBUG("Running post-restart exec");
+
+ if (!virFileExists(VIR_LOCK_DAEMON_RESTART_EXEC_FILE)) {
+ VIR_DEBUG("No restart file %s present",
+ VIR_LOCK_DAEMON_RESTART_EXEC_FILE);
+ ret = 0;
+ goto cleanup;
+ }
+
+ if (virFileReadAll(VIR_LOCK_DAEMON_RESTART_EXEC_FILE,
+ 1024 * 1024 * 10, /* 10 MB */
+ &state) < 0)
+ goto cleanup;
+
+ VIR_DEBUG("Loading state %s", state);
+
+ if (!(object = virJSONValueFromString(state)))
+ goto cleanup;
+
+ gotmagic = virJSONValueObjectGetString(object, "magic");
+ if (!gotmagic) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Missing magic data in JSON document"));
+ goto cleanup;
+ }
+
+ if (!(wantmagic = virLockDaemonGetExecRestartMagic()))
+ goto cleanup;
+
+ if (STRNEQ(gotmagic, wantmagic)) {
+ VIR_WARN("Found restart exec file with old magic %s vs wanted %s",
+ gotmagic, wantmagic);
+ ret = 0;
+ goto cleanup;
+ }
+
+ if (!(lockDaemon = virLockDaemonNewPostExecRestart(object, privileged)))
+ goto cleanup;
+
+ ret = 1;
+
+cleanup:
+ unlink(VIR_LOCK_DAEMON_RESTART_EXEC_FILE);
+ VIR_FREE(wantmagic);
+ VIR_FREE(state);
+ virJSONValueFree(object);
+ return ret;
+}
+
+
+static int
+virLockDaemonPreExecRestart(virNetServerPtr srv,
+ char **argv)
+{
+ virJSONValuePtr child;
+ char *state = NULL;
+ int ret = -1;
+ virJSONValuePtr object;
+ char *magic;
+ virHashKeyValuePairPtr pairs = NULL, tmp;
+ virJSONValuePtr lockspaces;
+
+ VIR_DEBUG("Running pre-restart exec");
+
+ if (!(object = virJSONValueNewObject()))
+ goto cleanup;
+
+ if (!(child = virNetServerPreExecRestart(srv)))
+ goto cleanup;
+
+ if (virJSONValueObjectAppend(object, "server", child) < 0) {
+ virJSONValueFree(child);
+ goto cleanup;
+ }
+
+ if (!(child = virLockSpacePreExecRestart(lockDaemon->defaultLockspace)))
+ goto cleanup;
+
+ if (virJSONValueObjectAppend(object, "defaultLockspace", child) < 0) {
+ virJSONValueFree(child);
+ goto cleanup;
+ }
+
+ if (!(lockspaces = virJSONValueNewArray()))
+ goto cleanup;
+ if (virJSONValueObjectAppend(object, "lockspaces", lockspaces) < 0) {
+ virJSONValueFree(lockspaces);
+ goto cleanup;
+ }
+
+
+ tmp = pairs = virHashGetItems(lockDaemon->lockspaces, NULL);
+ while (tmp && tmp->key) {
+ virLockSpacePtr lockspace = (virLockSpacePtr)tmp->value;
+
+ if (!(child = virLockSpacePreExecRestart(lockspace)))
+ goto cleanup;
+
+ if (virJSONValueArrayAppend(lockspaces, child) < 0) {
+ virJSONValueFree(child);
+ goto cleanup;
+ }
+
+ tmp++;
+ }
+
+ if (!(magic = virLockDaemonGetExecRestartMagic()))
+ goto cleanup;
+
+ if (virJSONValueObjectAppendString(object, "magic", magic) < 0) {
+ VIR_FREE(magic);
+ goto cleanup;
+ }
+
+ if (!(state = virJSONValueToString(object, true)))
+ goto cleanup;
+
+ VIR_DEBUG("Saving state %s", state);
+
+ if (virFileWriteStr(VIR_LOCK_DAEMON_RESTART_EXEC_FILE,
+ state, 0700) < 0) {
+ virReportSystemError(errno,
+ _("Unable to save state file %s"),
+ VIR_LOCK_DAEMON_RESTART_EXEC_FILE);
+ goto cleanup;
+ }
+
+ if (execv(argv[0], argv) < 0) {
+ virReportSystemError(errno, "%s",
+ _("Unable to restart self"));
+ goto cleanup;
+ }
+
+ abort(); /* This should be impossible to reach */
+
+cleanup:
+ VIR_FREE(pairs);
+ VIR_FREE(state);
+ virJSONValueFree(object);
+ return ret;
+}
+
+
+static void
+virLockDaemonUsage(const char *argv0, bool privileged)
+{
+ fprintf(stderr,
+ _("\n"
+ "Usage:\n"
+ " %s [options]\n"
+ "\n"
+ "Options:\n"
+ " -v | --verbose Verbose messages.\n"
+ " -d | --daemon Run as a daemon & write PID file.\n"
+ " -f | --config <file> Configuration file.\n"
+ " | --version Display version information.\n"
+ " -p | --pid-file <file> Change name of PID file.\n"
+ "\n"
+ "libvirt lock management daemon:\n"), argv0);
+
+ if (privileged) {
+ fprintf(stderr,
+ _("\n"
+ " Default paths:\n"
+ "\n"
+ " Configuration file (unless overridden by -f):\n"
+ " %s/libvirt/virtlockd.conf\n"
+ "\n"
+ " Sockets:\n"
+ " %s/run/libvirt/virtlockd-sock\n"
+ "\n"
+ " PID file (unless overridden by -p):\n"
+ " %s/run/virtlockd.pid\n"
+ "\n"),
+ SYSCONFDIR,
+ LOCALSTATEDIR,
+ LOCALSTATEDIR);
+ } else {
+ fprintf(stderr, "%s",
+ _("\n"
+ " Default paths:\n"
+ "\n"
+ " Configuration file (unless overridden by -f):\n"
+ " $XDG_CONFIG_HOME/libvirt/virtlockd.conf\n"
+ "\n"
+ " Sockets:\n"
+ " $XDG_RUNTIME_DIR/libvirt/virtlockd-sock\n"
+ "\n"
+ " PID file:\n"
+ " $XDG_RUNTIME_DIR/libvirt/virtlockd.pid\n"
+ "\n"));
+ }
+}
+
+enum {
+ OPT_VERSION = 129
+};
+
+#define MAX_LISTEN 5
+int main(int argc, char **argv) {
+ virNetServerProgramPtr lockProgram = NULL;
+ char *remote_config_file = NULL;
+ int statuswrite = -1;
+ int ret = 1;
+ int verbose = 0;
+ int godaemon = 0;
+ char *run_dir = NULL;
+ char *pid_file = NULL;
+ int pid_file_fd = -1;
+ char *sock_file = NULL;
+ bool implicit_conf = false;
+ mode_t old_umask;
+ bool privileged = false;
+ virLockDaemonConfigPtr config = NULL;
+ int rv;
+
+ struct option opts[] = {
+ { "verbose", no_argument, &verbose, 1},
+ { "daemon", no_argument, &godaemon, 1},
+ { "config", required_argument, NULL, 'f'},
+ { "pid-file", required_argument, NULL, 'p'},
+ { "version", no_argument, NULL, OPT_VERSION },
+ { "help", no_argument, NULL, '?' },
+ {0, 0, 0, 0}
+ };
+
+ privileged = getuid() == 0;
+
+ if (setlocale(LC_ALL, "") == NULL ||
+ bindtextdomain(PACKAGE, LOCALEDIR) == NULL ||
+ textdomain(PACKAGE) == NULL ||
+ virThreadInitialize() < 0 ||
+ virErrorInitialize() < 0) {
+ fprintf(stderr, _("%s: initialization failed\n"), argv[0]);
+ exit(EXIT_FAILURE);
+ }
+
+ while (1) {
+ int optidx = 0;
+ int c;
+
+ c = getopt_long(argc, argv, "ldf:p:t:v", opts, &optidx);
+
+ if (c == -1) {
+ break;
+ }
+
+ switch (c) {
+ case 0:
+ /* Got one of the flags */
+ break;
+ case 'v':
+ verbose = 1;
+ break;
+ case 'd':
+ godaemon = 1;
+ break;
+
+ case 'p':
+ VIR_FREE(pid_file);
+ if (!(pid_file = strdup(optarg)))
+ exit(EXIT_FAILURE);
+ break;
+
+ case 'f':
+ VIR_FREE(remote_config_file);
+ if (!(remote_config_file = strdup(optarg)))
+ exit(EXIT_FAILURE);
+ break;
+
+ case OPT_VERSION:
+ virLockDaemonVersion(argv[0]);
+ return 0;
+
+ case '?':
+ virLockDaemonUsage(argv[0], privileged);
+ return 2;
+
+ default:
+ fprintf(stderr, _("%s: internal error: unknown flag: %c\n"),
+ argv[0], c);
+ exit(EXIT_FAILURE);
+ }
+ }
+
+ if (!(config = virLockDaemonConfigNew(privileged))) {
+ VIR_ERROR(_("Can't create initial configuration"));
+ exit(EXIT_FAILURE);
+ }
+
+ /* No explicit config, so try and find a default one */
+ if (remote_config_file == NULL) {
+ implicit_conf = true;
+ if (virLockDaemonConfigFilePath(privileged,
+ &remote_config_file) < 0) {
+ VIR_ERROR(_("Can't determine config path"));
+ exit(EXIT_FAILURE);
+ }
+ }
+
+ /* Read the config file if it exists*/
+ if (remote_config_file &&
+ virLockDaemonConfigLoadFile(config, remote_config_file, implicit_conf) < 0) {
+ virErrorPtr err = virGetLastError();
+ if (err && err->message)
+ VIR_ERROR(_("Can't load config file: %s: %s"),
+ err->message, remote_config_file);
+ else
+ VIR_ERROR(_("Can't load config file: %s"), remote_config_file);
+ exit(EXIT_FAILURE);
+ }
+
+ if (virLockDaemonSetupLogging(config, privileged, verbose, godaemon) < 0) {
+ VIR_ERROR(_("Can't initialize logging"));
+ exit(EXIT_FAILURE);
+ }
+
+ if (!pid_file &&
+ virLockDaemonPidFilePath(privileged,
+ &pid_file) < 0) {
+ VIR_ERROR(_("Can't determine pid file path."));
+ exit(EXIT_FAILURE);
+ }
+ VIR_DEBUG("Decided on pid file path '%s'", NULLSTR(pid_file));
+
+ if (virLockDaemonUnixSocketPaths(privileged,
+ &sock_file) < 0) {
+ VIR_ERROR(_("Can't determine socket paths"));
+ exit(EXIT_FAILURE);
+ }
+ VIR_DEBUG("Decided on socket paths '%s'",
+ sock_file);
+
+ if (godaemon) {
+ char ebuf[1024];
+
+ if (chdir("/") < 0) {
+ VIR_ERROR(_("cannot change to root directory: %s"),
+ virStrerror(errno, ebuf, sizeof(ebuf)));
+ goto cleanup;
+ }
+
+ if ((statuswrite = virLockDaemonForkIntoBackground(argv[0])) < 0) {
+ VIR_ERROR(_("Failed to fork as daemon: %s"),
+ virStrerror(errno, ebuf, sizeof(ebuf)));
+ goto cleanup;
+ }
+ }
+
+ /* Ensure the rundir exists (on tmpfs on some systems) */
+ if (privileged) {
+ run_dir = strdup(LOCALSTATEDIR "/run/libvirt");
+ } else {
+ run_dir = virGetUserRuntimeDirectory();
+
+ if (!run_dir) {
+ VIR_ERROR(_("Can't determine user directory"));
+ goto cleanup;
+ }
+ }
+ if (!run_dir) {
+ virReportOOMError();
+ goto cleanup;
+ }
+
+ if (privileged)
+ old_umask = umask(022);
+ else
+ old_umask = umask(077);
+ VIR_DEBUG("Ensuring run dir '%s' exists", run_dir);
+ if (virFileMakePath(run_dir) < 0) {
+ char ebuf[1024];
+ VIR_ERROR(_("unable to create rundir %s: %s"), run_dir,
+ virStrerror(errno, ebuf, sizeof(ebuf)));
+ ret = VIR_LOCK_DAEMON_ERR_RUNDIR;
+ goto cleanup;
+ }
+ umask(old_umask);
+
+ /* If we have a pidfile set, claim it now, exiting if already taken */
+ if ((pid_file_fd = virPidFileAcquirePath(pid_file, getpid())) < 0) {
+ ret = VIR_LOCK_DAEMON_ERR_PIDFILE;
+ goto cleanup;
+ }
+
+ if ((rv = virLockDaemonPostExecRestart(privileged)) < 0) {
+ ret = VIR_LOCK_DAEMON_ERR_INIT;
+ goto cleanup;
+ }
+
+ /* rv == 1, means we setup everything from saved state,
+ * so we only setup stuff from scratch if rv == 0 */
+ if (rv == 0) {
+ if (!(lockDaemon = virLockDaemonNew(privileged))) {
+ ret = VIR_LOCK_DAEMON_ERR_INIT;
+ goto cleanup;
+ }
+
+ if ((rv = virLockDaemonSetupNetworkingSystemD(lockDaemon->srv)) < 0) {
+ ret = VIR_LOCK_DAEMON_ERR_NETWORK;
+ goto cleanup;
+ }
+
+ /* Only do this, if systemd did not pass a FD */
+ if (rv == 0 &&
+ virLockDaemonSetupNetworkingNative(lockDaemon->srv, sock_file) < 0) {
+ ret = VIR_LOCK_DAEMON_ERR_NETWORK;
+ goto cleanup;
+ }
+ }
+
+ if ((virLockDaemonSetupSignals(lockDaemon->srv)) < 0) {
+ ret = VIR_LOCK_DAEMON_ERR_SIGNAL;
+ goto cleanup;
+ }
+
+ if (!(lockProgram = virNetServerProgramNew(VIR_LOCK_SPACE_PROTOCOL_PROGRAM,
+ VIR_LOCK_SPACE_PROTOCOL_PROGRAM_VERSION,
+ virLockSpaceProtocolProcs,
+ virLockSpaceProtocolNProcs))) {
+ ret = VIR_LOCK_DAEMON_ERR_INIT;
+ goto cleanup;
+ }
+ if (virNetServerAddProgram(lockDaemon->srv, lockProgram) < 0) {
+ ret = VIR_LOCK_DAEMON_ERR_INIT;
+ goto cleanup;
+ }
+
+ /* Disable error func, now logging is setup */
+ virSetErrorFunc(NULL, virLockDaemonErrorHandler);
+
+
+ /* Tell parent of daemon that basic initialization is complete
+ * In particular we're ready to accept net connections & have
+ * written the pidfile
+ */
+ if (statuswrite != -1) {
+ char status = 0;
+ while (write(statuswrite, &status, 1) == -1 &&
+ errno == EINTR)
+ ;
+ VIR_FORCE_CLOSE(statuswrite);
+ }
+
+ /* Start accepting new clients from network */
+
+ virNetServerUpdateServices(lockDaemon->srv, true);
+ virNetServerRun(lockDaemon->srv);
+
+ if (execRestart &&
+ virLockDaemonPreExecRestart(lockDaemon->srv, argv) < 0)
+ ret = -1;
+ else
+ ret = 0;
+
+cleanup:
+ virObjectUnref(lockProgram);
+ virLockDaemonFree(lockDaemon);
+ if (statuswrite != -1) {
+ if (ret != 0) {
+ /* Tell parent of daemon what failed */
+ char status = ret;
+ while (write(statuswrite, &status, 1) == -1 &&
+ errno == EINTR)
+ ;
+ }
+ VIR_FORCE_CLOSE(statuswrite);
+ }
+ if (pid_file_fd != -1)
+ virPidFileReleasePath(pid_file, pid_file_fd);
+ VIR_FREE(pid_file);
+ VIR_FREE(sock_file);
+ VIR_FREE(run_dir);
+ return ret;
+}
diff --git a/src/locking/lock_daemon.h b/src/locking/lock_daemon.h
new file mode 100644
index 000000000..619f8f2d2
--- /dev/null
+++ b/src/locking/lock_daemon.h
@@ -0,0 +1,56 @@
+/*
+ * lock_daemon.h: lock management daemon
+ *
+ * Copyright (C) 2006-2012 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 __VIR_LOCK_DAEMON_H__
+# define __VIR_LOCK_DAEMON_H__
+
+# include "virlockspace.h"
+# include "threads.h"
+
+typedef struct _virLockDaemon virLockDaemon;
+typedef virLockDaemon *virLockDaemonPtr;
+
+typedef struct _virLockDaemonClient virLockDaemonClient;
+typedef virLockDaemonClient *virLockDaemonClientPtr;
+
+struct _virLockDaemonClient {
+ virMutex lock;
+ bool restricted;
+
+ pid_t ownerPid;
+ char *ownerName;
+ unsigned char ownerUUID[VIR_UUID_BUFLEN];
+ unsigned int ownerId;
+
+ pid_t clientPid;
+};
+
+extern virLockDaemonPtr lockDaemon;
+
+int virLockDaemonAddLockSpace(virLockDaemonPtr lockd,
+ const char *path,
+ virLockSpacePtr lockspace);
+
+virLockSpacePtr virLockDaemonFindLockSpace(virLockDaemonPtr lockd,
+ const char *path);
+
+#endif /* __VIR_LOCK_DAEMON_H__ */
diff --git a/src/locking/lock_daemon_config.c b/src/locking/lock_daemon_config.c
new file mode 100644
index 000000000..c64de6793
--- /dev/null
+++ b/src/locking/lock_daemon_config.c
@@ -0,0 +1,193 @@
+/*
+ * lock_daemon_config.h: virtlockd config file handling
+ *
+ * Copyright (C) 2006-2012 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 "lock_daemon_config.h"
+#include "conf.h"
+#include "memory.h"
+#include "virterror_internal.h"
+#include "logging.h"
+#include "rpc/virnetserver.h"
+#include "configmake.h"
+
+#define VIR_FROM_THIS VIR_FROM_CONF
+
+
+/* A helper function used by each of the following macros. */
+static int
+checkType(virConfValuePtr p, const char *filename,
+ const char *key, virConfType required_type)
+{
+ if (p->type != required_type) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("remoteReadConfigFile: %s: %s: invalid type:"
+ " got %s; expected %s"), filename, key,
+ virConfTypeName(p->type),
+ virConfTypeName(required_type));
+ return -1;
+ }
+ return 0;
+}
+
+/* If there is no config data for the key, #var_name, then do nothing.
+ If there is valid data of type VIR_CONF_STRING, and strdup succeeds,
+ store the result in var_name. Otherwise, (i.e. invalid type, or strdup
+ failure), give a diagnostic and "goto" the cleanup-and-fail label. */
+#define GET_CONF_STR(conf, filename, var_name) \
+ do { \
+ virConfValuePtr p = virConfGetValue(conf, #var_name); \
+ if (p) { \
+ if (checkType(p, filename, #var_name, VIR_CONF_STRING) < 0) \
+ goto error; \
+ VIR_FREE(data->var_name); \
+ if (!(data->var_name = strdup(p->str))) { \
+ virReportOOMError(); \
+ goto error; \
+ } \
+ } \
+ } while (0)
+
+/* Like GET_CONF_STR, but for integral values. */
+#define GET_CONF_INT(conf, filename, var_name) \
+ do { \
+ virConfValuePtr p = virConfGetValue(conf, #var_name); \
+ if (p) { \
+ if (checkType(p, filename, #var_name, VIR_CONF_LONG) < 0) \
+ goto error; \
+ data->var_name = p->l; \
+ } \
+ } while (0)
+
+int
+virLockDaemonConfigFilePath(bool privileged, char **configfile)
+{
+ if (privileged) {
+ if (!(*configfile = strdup(SYSCONFDIR "/libvirt/virtlockd.conf")))
+ goto no_memory;
+ } else {
+ char *configdir = NULL;
+
+ if (!(configdir = virGetUserConfigDirectory()))
+ goto error;
+
+ if (virAsprintf(configfile, "%s/virtlockd.conf", configdir) < 0) {
+ VIR_FREE(configdir);
+ goto no_memory;
+ }
+ VIR_FREE(configdir);
+ }
+
+ return 0;
+
+no_memory:
+ virReportOOMError();
+error:
+ return -1;
+}
+
+
+virLockDaemonConfigPtr
+virLockDaemonConfigNew(bool privileged ATTRIBUTE_UNUSED)
+{
+ virLockDaemonConfigPtr data;
+
+ if (VIR_ALLOC(data) < 0) {
+ virReportOOMError();
+ return NULL;
+ }
+
+ data->log_buffer_size = 64;
+
+ return data;
+}
+
+void
+virLockDaemonConfigFree(virLockDaemonConfigPtr data)
+{
+ if (!data)
+ return;
+
+ VIR_FREE(data->log_filters);
+ VIR_FREE(data->log_outputs);
+
+ VIR_FREE(data);
+}
+
+static int
+virLockDaemonConfigLoadOptions(virLockDaemonConfigPtr data,
+ const char *filename,
+ virConfPtr conf)
+{
+ GET_CONF_INT(conf, filename, log_level);
+ GET_CONF_STR(conf, filename, log_filters);
+ GET_CONF_STR(conf, filename, log_outputs);
+ GET_CONF_INT(conf, filename, log_buffer_size);
+
+ return 0;
+
+error:
+ return -1;
+}
+
+
+/* Read the config file if it exists.
+ * Only used in the remote case, hence the name.
+ */
+int
+virLockDaemonConfigLoadFile(virLockDaemonConfigPtr 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 = virLockDaemonConfigLoadOptions(data, filename, conf);
+ virConfFree(conf);
+ return ret;
+}
+
+int virLockDaemonConfigLoadData(virLockDaemonConfigPtr data,
+ const char *filename,
+ const char *filedata)
+{
+ virConfPtr conf;
+ int ret;
+
+ conf = virConfReadMem(filedata, strlen(filedata), 0);
+ if (!conf)
+ return -1;
+
+ ret = virLockDaemonConfigLoadOptions(data, filename, conf);
+ virConfFree(conf);
+ return ret;
+}
diff --git a/src/locking/lock_daemon_config.h b/src/locking/lock_daemon_config.h
new file mode 100644
index 000000000..8cb0e5d56
--- /dev/null
+++ b/src/locking/lock_daemon_config.h
@@ -0,0 +1,50 @@
+/*
+ * lock_daemon_config.h: virtlockd config file handling
+ *
+ * Copyright (C) 2006-2012 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 __VIR_LOCK_DAEMON_CONFIG_H__
+# define __VIR_LOCK_DAEMON_CONFIG_H__
+
+# include "internal.h"
+
+typedef struct _virLockDaemonConfig virLockDaemonConfig;
+typedef virLockDaemonConfig *virLockDaemonConfigPtr;
+
+struct _virLockDaemonConfig {
+ int log_level;
+ char *log_filters;
+ char *log_outputs;
+ int log_buffer_size;
+};
+
+
+int virLockDaemonConfigFilePath(bool privileged, char **configfile);
+virLockDaemonConfigPtr virLockDaemonConfigNew(bool privileged);
+void virLockDaemonConfigFree(virLockDaemonConfigPtr data);
+int virLockDaemonConfigLoadFile(virLockDaemonConfigPtr data,
+ const char *filename,
+ bool allow_missing);
+int virLockDaemonConfigLoadData(virLockDaemonConfigPtr data,
+ const char *filename,
+ const char *filedata);
+
+#endif /* __LIBVIRTD_CONFIG_H__ */
diff --git a/src/locking/lock_daemon_dispatch.c b/src/locking/lock_daemon_dispatch.c
new file mode 100644
index 000000000..bb4dcfa12
--- /dev/null
+++ b/src/locking/lock_daemon_dispatch.c
@@ -0,0 +1,431 @@
+/*
+ * lock_daemon_dispatch.c: lock management daemon dispatch
+ *
+ * Copyright (C) 2006-2012 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 "rpc/virnetserver.h"
+#include "rpc/virnetserverclient.h"
+#include "util.h"
+#include "logging.h"
+
+#include "lock_daemon.h"
+#include "lock_protocol.h"
+#include "lock_daemon_dispatch_stubs.h"
+#include "virterror_internal.h"
+
+#define VIR_FROM_THIS VIR_FROM_RPC
+
+static int
+virLockSpaceProtocolDispatchAcquireResource(virNetServerPtr server ATTRIBUTE_UNUSED,
+ virNetServerClientPtr client,
+ virNetMessagePtr msg ATTRIBUTE_UNUSED,
+ virNetMessageErrorPtr rerr,
+ virLockSpaceProtocolAcquireResourceArgs *args)
+{
+ int rv = -1;
+ unsigned int flags = args->flags;
+ virLockDaemonClientPtr priv =
+ virNetServerClientGetPrivateData(client);
+ virLockSpacePtr lockspace;
+ unsigned int newFlags;
+
+ virMutexLock(&priv->lock);
+
+ virCheckFlagsGoto(VIR_LOCK_SPACE_PROTOCOL_ACQUIRE_RESOURCE_SHARED |
+ VIR_LOCK_SPACE_PROTOCOL_ACQUIRE_RESOURCE_AUTOCREATE, cleanup);
+
+ if (priv->restricted) {
+ virReportError(VIR_ERR_OPERATION_DENIED, "%s",
+ _("lock manager connection has been restricted"));
+ goto cleanup;
+ }
+
+ if (!priv->ownerPid) {
+ virReportError(VIR_ERR_OPERATION_INVALID, "%s",
+ _("lock owner details have not been registered"));
+ goto cleanup;
+ }
+
+ if (!(lockspace = virLockDaemonFindLockSpace(lockDaemon, args->path))) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Lockspace for path %s does not exist"),
+ args->path);
+ goto cleanup;
+ }
+
+ newFlags = 0;
+ if (flags & VIR_LOCK_SPACE_PROTOCOL_ACQUIRE_RESOURCE_SHARED)
+ newFlags |= VIR_LOCK_SPACE_ACQUIRE_SHARED;
+ if (flags & VIR_LOCK_SPACE_PROTOCOL_ACQUIRE_RESOURCE_AUTOCREATE)
+ newFlags |= VIR_LOCK_SPACE_ACQUIRE_AUTOCREATE;
+
+ if (virLockSpaceAcquireResource(lockspace,
+ args->name,
+ priv->ownerPid,
+ newFlags) < 0)
+ goto cleanup;
+
+ rv = 0;
+
+cleanup:
+ if (rv < 0)
+ virNetMessageSaveError(rerr);
+ virMutexUnlock(&priv->lock);
+ return rv;
+}
+
+
+static int
+virLockSpaceProtocolDispatchCreateResource(virNetServerPtr server ATTRIBUTE_UNUSED,
+ virNetServerClientPtr client,
+ virNetMessagePtr msg ATTRIBUTE_UNUSED,
+ virNetMessageErrorPtr rerr,
+ virLockSpaceProtocolCreateResourceArgs *args)
+{
+ int rv = -1;
+ unsigned int flags = args->flags;
+ virLockDaemonClientPtr priv =
+ virNetServerClientGetPrivateData(client);
+ virLockSpacePtr lockspace;
+
+ virMutexLock(&priv->lock);
+
+ virCheckFlagsGoto(0, cleanup);
+
+ if (priv->restricted) {
+ virReportError(VIR_ERR_OPERATION_DENIED, "%s",
+ _("lock manager connection has been restricted"));
+ goto cleanup;
+ }
+
+ if (!priv->ownerPid) {
+ virReportError(VIR_ERR_OPERATION_INVALID, "%s",
+ _("lock owner details have not been registered"));
+ goto cleanup;
+ }
+
+ if (!(lockspace = virLockDaemonFindLockSpace(lockDaemon, args->path))) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Lockspace for path %s does not exist"),
+ args->path);
+ goto cleanup;
+ }
+
+ if (virLockSpaceCreateResource(lockspace, args->name) < 0)
+ goto cleanup;
+
+ rv = 0;
+
+cleanup:
+ if (rv < 0)
+ virNetMessageSaveError(rerr);
+ virMutexUnlock(&priv->lock);
+ return rv;
+}
+
+
+static int
+virLockSpaceProtocolDispatchDeleteResource(virNetServerPtr server ATTRIBUTE_UNUSED,
+ virNetServerClientPtr client,
+ virNetMessagePtr msg ATTRIBUTE_UNUSED,
+ virNetMessageErrorPtr rerr,
+ virLockSpaceProtocolDeleteResourceArgs *args)
+{
+ int rv = -1;
+ unsigned int flags = args->flags;
+ virLockDaemonClientPtr priv =
+ virNetServerClientGetPrivateData(client);
+ virLockSpacePtr lockspace;
+
+ virMutexLock(&priv->lock);
+
+ virCheckFlagsGoto(0, cleanup);
+
+ if (priv->restricted) {
+ virReportError(VIR_ERR_OPERATION_DENIED, "%s",
+ _("lock manager connection has been restricted"));
+ goto cleanup;
+ }
+
+ if (!priv->ownerPid) {
+ virReportError(VIR_ERR_OPERATION_INVALID, "%s",
+ _("lock owner details have not been registered"));
+ goto cleanup;
+ }
+
+ if (!(lockspace = virLockDaemonFindLockSpace(lockDaemon, args->path))) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Lockspace for path %s does not exist"),
+ args->path);
+ goto cleanup;
+ }
+
+ if (virLockSpaceDeleteResource(lockspace, args->name) < 0)
+ goto cleanup;
+
+ rv = 0;
+
+cleanup:
+ if (rv < 0)
+ virNetMessageSaveError(rerr);
+ virMutexUnlock(&priv->lock);
+ return rv;
+}
+
+
+static int
+virLockSpaceProtocolDispatchNew(virNetServerPtr server ATTRIBUTE_UNUSED,
+ virNetServerClientPtr client,
+ virNetMessagePtr msg ATTRIBUTE_UNUSED,
+ virNetMessageErrorPtr rerr,
+ virLockSpaceProtocolNewArgs *args)
+{
+ int rv = -1;
+ unsigned int flags = args->flags;
+ virLockDaemonClientPtr priv =
+ virNetServerClientGetPrivateData(client);
+ virLockSpacePtr lockspace;
+
+ virMutexLock(&priv->lock);
+
+ virCheckFlagsGoto(0, cleanup);
+
+ if (priv->restricted) {
+ virReportError(VIR_ERR_OPERATION_DENIED, "%s",
+ _("lock manager connection has been restricted"));
+ goto cleanup;
+ }
+
+ if (!priv->ownerPid) {
+ virReportError(VIR_ERR_OPERATION_INVALID, "%s",
+ _("lock owner details have not been registered"));
+ goto cleanup;
+ }
+
+ if (!args->path || STREQ(args->path, "")) {
+ virReportError(VIR_ERR_OPERATION_INVALID, "%s",
+ _("the default lockspace already exists"));
+ goto cleanup;
+ }
+
+ if ((lockspace = virLockDaemonFindLockSpace(lockDaemon, args->path))) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Lockspace for path %s already exists"),
+ args->path);
+ goto cleanup;
+ }
+ virResetLastError();
+
+ lockspace = virLockSpaceNew(args->path);
+ virLockDaemonAddLockSpace(lockDaemon, args->path, lockspace);
+
+ rv = 0;
+
+cleanup:
+ if (rv < 0)
+ virNetMessageSaveError(rerr);
+ virMutexUnlock(&priv->lock);
+ return rv;
+}
+
+
+static int
+virLockSpaceProtocolDispatchRegister(virNetServerPtr server ATTRIBUTE_UNUSED,
+ virNetServerClientPtr client,
+ virNetMessagePtr msg ATTRIBUTE_UNUSED,
+ virNetMessageErrorPtr rerr,
+ virLockSpaceProtocolRegisterArgs *args)
+{
+ int rv = -1;
+ unsigned int flags = args->flags;
+ virLockDaemonClientPtr priv =
+ virNetServerClientGetPrivateData(client);
+
+ virMutexLock(&priv->lock);
+
+ virCheckFlagsGoto(0, cleanup);
+
+ if (priv->restricted) {
+ virReportError(VIR_ERR_OPERATION_DENIED, "%s",
+ _("lock manager connection has been restricted"));
+ goto cleanup;
+ }
+
+ if (priv->ownerPid) {
+ virReportError(VIR_ERR_OPERATION_INVALID, "%s",
+ _("lock owner details have already been registered"));
+ goto cleanup;
+ }
+
+ if (!(priv->ownerName = strdup(args->owner.name))) {
+ virReportOOMError();
+ goto cleanup;
+ }
+ memcpy(priv->ownerUUID, args->owner.uuid, VIR_UUID_BUFLEN);
+ priv->ownerId = args->owner.id;
+ priv->ownerPid = args->owner.pid;
+ VIR_DEBUG("ownerName=%s ownerId=%d ownerPid=%lld",
+ priv->ownerName, priv->ownerId, (unsigned long long)priv->ownerPid);
+
+ rv = 0;
+
+cleanup:
+ if (rv < 0)
+ virNetMessageSaveError(rerr);
+ virMutexUnlock(&priv->lock);
+ return rv;
+}
+
+
+static int
+virLockSpaceProtocolDispatchReleaseResource(virNetServerPtr server ATTRIBUTE_UNUSED,
+ virNetServerClientPtr client,
+ virNetMessagePtr msg ATTRIBUTE_UNUSED,
+ virNetMessageErrorPtr rerr,
+ virLockSpaceProtocolReleaseResourceArgs *args)
+{
+ int rv = -1;
+ unsigned int flags = args->flags;
+ virLockDaemonClientPtr priv =
+ virNetServerClientGetPrivateData(client);
+ virLockSpacePtr lockspace;
+
+ virMutexLock(&priv->lock);
+
+ virCheckFlagsGoto(0, cleanup);
+
+ if (priv->restricted) {
+ virReportError(VIR_ERR_OPERATION_DENIED, "%s",
+ _("lock manager connection has been restricted"));
+ goto cleanup;
+ }
+
+ if (!priv->ownerPid) {
+ virReportError(VIR_ERR_OPERATION_INVALID, "%s",
+ _("lock owner details have not been registered"));
+ goto cleanup;
+ }
+
+ if (!(lockspace = virLockDaemonFindLockSpace(lockDaemon, args->path))) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Lockspace for path %s does not exist"),
+ args->path);
+ goto cleanup;
+ }
+
+ if (virLockSpaceReleaseResource(lockspace,
+ args->name,
+ priv->ownerPid) < 0)
+ goto cleanup;
+
+ rv = 0;
+
+cleanup:
+ if (rv < 0)
+ virNetMessageSaveError(rerr);
+ virMutexUnlock(&priv->lock);
+ return rv;
+}
+
+
+static int
+virLockSpaceProtocolDispatchRestrict(virNetServerPtr server ATTRIBUTE_UNUSED,
+ virNetServerClientPtr client,
+ virNetMessagePtr msg ATTRIBUTE_UNUSED,
+ virNetMessageErrorPtr rerr,
+ virLockSpaceProtocolRestrictArgs *args)
+{
+ int rv = -1;
+ unsigned int flags = args->flags;
+ virLockDaemonClientPtr priv =
+ virNetServerClientGetPrivateData(client);
+
+ virMutexLock(&priv->lock);
+
+ virCheckFlagsGoto(0, cleanup);
+
+ if (priv->restricted) {
+ virReportError(VIR_ERR_OPERATION_DENIED, "%s",
+ _("lock manager connection has been restricted"));
+ goto cleanup;
+ }
+
+ if (!priv->ownerPid) {
+ virReportError(VIR_ERR_OPERATION_INVALID, "%s",
+ _("lock owner details have not been registered"));
+ goto cleanup;
+ }
+
+ priv->restricted = true;
+ rv = 0;
+
+cleanup:
+ if (rv < 0)
+ virNetMessageSaveError(rerr);
+ virMutexUnlock(&priv->lock);
+ return rv;
+}
+
+
+static int
+virLockSpaceProtocolDispatchCreateLockSpace(virNetServerPtr server ATTRIBUTE_UNUSED,
+ virNetServerClientPtr client,
+ virNetMessagePtr msg ATTRIBUTE_UNUSED,
+ virNetMessageErrorPtr rerr,
+ virLockSpaceProtocolCreateLockSpaceArgs *args)
+{
+ int rv = -1;
+ virLockDaemonClientPtr priv =
+ virNetServerClientGetPrivateData(client);
+ virLockSpacePtr lockspace;
+
+ virMutexLock(&priv->lock);
+
+ if (priv->restricted) {
+ virReportError(VIR_ERR_OPERATION_DENIED, "%s",
+ _("lock manager connection has been restricted"));
+ goto cleanup;
+ }
+
+ if ((lockspace = virLockDaemonFindLockSpace(lockDaemon, args->path))) {
+ virReportError(VIR_ERR_OPERATION_INVALID,
+ _("Lockspace for path %s already exists"),
+ args->path);
+ goto cleanup;
+ }
+
+ if (!(lockspace = virLockSpaceNew(args->path)))
+ goto cleanup;
+
+ if (virLockDaemonAddLockSpace(lockDaemon, args->path, lockspace) < 0) {
+ virLockSpaceFree(lockspace);
+ goto cleanup;
+ }
+
+ rv = 0;
+
+cleanup:
+ if (rv < 0)
+ virNetMessageSaveError(rerr);
+ virMutexUnlock(&priv->lock);
+ return rv;
+}
diff --git a/src/locking/lock_daemon_dispatch.h b/src/locking/lock_daemon_dispatch.h
new file mode 100644
index 000000000..a193a583e
--- /dev/null
+++ b/src/locking/lock_daemon_dispatch.h
@@ -0,0 +1,31 @@
+/*
+ * lock_daemon_dispatch.h: lock management daemon dispatch
+ *
+ * Copyright (C) 2006-2012 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 __VIR_LOCK_DAEMON_DISPATCH_H__
+# define __VIR_LOCK_DAEMON_DISPATCH_H__
+
+# include "rpc/virnetserverprogram.h"
+
+extern virNetServerProgramProc virLockSpaceProtocolProcs[];
+extern size_t virLockSpaceProtocolNProcs;
+
+#endif /* __VIR_LOCK_DAEMON_DISPATCH_H__ */
diff --git a/src/locking/lock_daemon_dispatch_stubs.h b/src/locking/lock_daemon_dispatch_stubs.h
new file mode 100644
index 000000000..16f14e313
--- /dev/null
+++ b/src/locking/lock_daemon_dispatch_stubs.h
@@ -0,0 +1,255 @@
+/* Automatically generated by gendispatch.pl.
+ * Do not edit this file. Any changes you make will be lost.
+ */
+static int virLockSpaceProtocolDispatchAcquireResource(
+ virNetServerPtr server,
+ virNetServerClientPtr client,
+ virNetMessagePtr msg,
+ virNetMessageErrorPtr rerr,
+ virLockSpaceProtocolAcquireResourceArgs *args);
+static int virLockSpaceProtocolDispatchAcquireResourceHelper(
+ virNetServerPtr server,
+ virNetServerClientPtr client,
+ virNetMessagePtr msg,
+ virNetMessageErrorPtr rerr,
+ void *args,
+ void *ret ATTRIBUTE_UNUSED)
+{
+ VIR_DEBUG("server=%p client=%p msg=%p rerr=%p args=%p ret=%p", server, client, msg, rerr, args, ret);
+ return virLockSpaceProtocolDispatchAcquireResource(server, client, msg, rerr, args);
+}
+/* virLockSpaceProtocolDispatchAcquireResource body has to be implemented manually */
+
+
+
+static int virLockSpaceProtocolDispatchCreateLockSpace(
+ virNetServerPtr server,
+ virNetServerClientPtr client,
+ virNetMessagePtr msg,
+ virNetMessageErrorPtr rerr,
+ virLockSpaceProtocolCreateLockSpaceArgs *args);
+static int virLockSpaceProtocolDispatchCreateLockSpaceHelper(
+ virNetServerPtr server,
+ virNetServerClientPtr client,
+ virNetMessagePtr msg,
+ virNetMessageErrorPtr rerr,
+ void *args,
+ void *ret ATTRIBUTE_UNUSED)
+{
+ VIR_DEBUG("server=%p client=%p msg=%p rerr=%p args=%p ret=%p", server, client, msg, rerr, args, ret);
+ return virLockSpaceProtocolDispatchCreateLockSpace(server, client, msg, rerr, args);
+}
+/* virLockSpaceProtocolDispatchCreateLockSpace body has to be implemented manually */
+
+
+
+static int virLockSpaceProtocolDispatchCreateResource(
+ virNetServerPtr server,
+ virNetServerClientPtr client,
+ virNetMessagePtr msg,
+ virNetMessageErrorPtr rerr,
+ virLockSpaceProtocolCreateResourceArgs *args);
+static int virLockSpaceProtocolDispatchCreateResourceHelper(
+ virNetServerPtr server,
+ virNetServerClientPtr client,
+ virNetMessagePtr msg,
+ virNetMessageErrorPtr rerr,
+ void *args,
+ void *ret ATTRIBUTE_UNUSED)
+{
+ VIR_DEBUG("server=%p client=%p msg=%p rerr=%p args=%p ret=%p", server, client, msg, rerr, args, ret);
+ return virLockSpaceProtocolDispatchCreateResource(server, client, msg, rerr, args);
+}
+/* virLockSpaceProtocolDispatchCreateResource body has to be implemented manually */
+
+
+
+static int virLockSpaceProtocolDispatchDeleteResource(
+ virNetServerPtr server,
+ virNetServerClientPtr client,
+ virNetMessagePtr msg,
+ virNetMessageErrorPtr rerr,
+ virLockSpaceProtocolDeleteResourceArgs *args);
+static int virLockSpaceProtocolDispatchDeleteResourceHelper(
+ virNetServerPtr server,
+ virNetServerClientPtr client,
+ virNetMessagePtr msg,
+ virNetMessageErrorPtr rerr,
+ void *args,
+ void *ret ATTRIBUTE_UNUSED)
+{
+ VIR_DEBUG("server=%p client=%p msg=%p rerr=%p args=%p ret=%p", server, client, msg, rerr, args, ret);
+ return virLockSpaceProtocolDispatchDeleteResource(server, client, msg, rerr, args);
+}
+/* virLockSpaceProtocolDispatchDeleteResource body has to be implemented manually */
+
+
+
+static int virLockSpaceProtocolDispatchNew(
+ virNetServerPtr server,
+ virNetServerClientPtr client,
+ virNetMessagePtr msg,
+ virNetMessageErrorPtr rerr,
+ virLockSpaceProtocolNewArgs *args);
+static int virLockSpaceProtocolDispatchNewHelper(
+ virNetServerPtr server,
+ virNetServerClientPtr client,
+ virNetMessagePtr msg,
+ virNetMessageErrorPtr rerr,
+ void *args,
+ void *ret ATTRIBUTE_UNUSED)
+{
+ VIR_DEBUG("server=%p client=%p msg=%p rerr=%p args=%p ret=%p", server, client, msg, rerr, args, ret);
+ return virLockSpaceProtocolDispatchNew(server, client, msg, rerr, args);
+}
+/* virLockSpaceProtocolDispatchNew body has to be implemented manually */
+
+
+
+static int virLockSpaceProtocolDispatchRegister(
+ virNetServerPtr server,
+ virNetServerClientPtr client,
+ virNetMessagePtr msg,
+ virNetMessageErrorPtr rerr,
+ virLockSpaceProtocolRegisterArgs *args);
+static int virLockSpaceProtocolDispatchRegisterHelper(
+ virNetServerPtr server,
+ virNetServerClientPtr client,
+ virNetMessagePtr msg,
+ virNetMessageErrorPtr rerr,
+ void *args,
+ void *ret ATTRIBUTE_UNUSED)
+{
+ VIR_DEBUG("server=%p client=%p msg=%p rerr=%p args=%p ret=%p", server, client, msg, rerr, args, ret);
+ return virLockSpaceProtocolDispatchRegister(server, client, msg, rerr, args);
+}
+/* virLockSpaceProtocolDispatchRegister body has to be implemented manually */
+
+
+
+static int virLockSpaceProtocolDispatchReleaseResource(
+ virNetServerPtr server,
+ virNetServerClientPtr client,
+ virNetMessagePtr msg,
+ virNetMessageErrorPtr rerr,
+ virLockSpaceProtocolReleaseResourceArgs *args);
+static int virLockSpaceProtocolDispatchReleaseResourceHelper(
+ virNetServerPtr server,
+ virNetServerClientPtr client,
+ virNetMessagePtr msg,
+ virNetMessageErrorPtr rerr,
+ void *args,
+ void *ret ATTRIBUTE_UNUSED)
+{
+ VIR_DEBUG("server=%p client=%p msg=%p rerr=%p args=%p ret=%p", server, client, msg, rerr, args, ret);
+ return virLockSpaceProtocolDispatchReleaseResource(server, client, msg, rerr, args);
+}
+/* virLockSpaceProtocolDispatchReleaseResource body has to be implemented manually */
+
+
+
+static int virLockSpaceProtocolDispatchRestrict(
+ virNetServerPtr server,
+ virNetServerClientPtr client,
+ virNetMessagePtr msg,
+ virNetMessageErrorPtr rerr,
+ virLockSpaceProtocolRestrictArgs *args);
+static int virLockSpaceProtocolDispatchRestrictHelper(
+ virNetServerPtr server,
+ virNetServerClientPtr client,
+ virNetMessagePtr msg,
+ virNetMessageErrorPtr rerr,
+ void *args,
+ void *ret ATTRIBUTE_UNUSED)
+{
+ VIR_DEBUG("server=%p client=%p msg=%p rerr=%p args=%p ret=%p", server, client, msg, rerr, args, ret);
+ return virLockSpaceProtocolDispatchRestrict(server, client, msg, rerr, args);
+}
+/* virLockSpaceProtocolDispatchRestrict body has to be implemented manually */
+
+
+
+virNetServerProgramProc virLockSpaceProtocolProcs[] = {
+{ /* Unused 0 */
+ NULL,
+ 0,
+ (xdrproc_t)xdr_void,
+ 0,
+ (xdrproc_t)xdr_void,
+ true,
+ 0
+},
+{ /* Method Register => 1 */
+ virLockSpaceProtocolDispatchRegisterHelper,
+ sizeof(virLockSpaceProtocolRegisterArgs),
+ (xdrproc_t)xdr_virLockSpaceProtocolRegisterArgs,
+ 0,
+ (xdrproc_t)xdr_void,
+ true,
+ 0
+},
+{ /* Method Restrict => 2 */
+ virLockSpaceProtocolDispatchRestrictHelper,
+ sizeof(virLockSpaceProtocolRestrictArgs),
+ (xdrproc_t)xdr_virLockSpaceProtocolRestrictArgs,
+ 0,
+ (xdrproc_t)xdr_void,
+ true,
+ 0
+},
+{ /* Method New => 3 */
+ virLockSpaceProtocolDispatchNewHelper,
+ sizeof(virLockSpaceProtocolNewArgs),
+ (xdrproc_t)xdr_virLockSpaceProtocolNewArgs,
+ 0,
+ (xdrproc_t)xdr_void,
+ true,
+ 0
+},
+{ /* Method CreateResource => 4 */
+ virLockSpaceProtocolDispatchCreateResourceHelper,
+ sizeof(virLockSpaceProtocolCreateResourceArgs),
+ (xdrproc_t)xdr_virLockSpaceProtocolCreateResourceArgs,
+ 0,
+ (xdrproc_t)xdr_void,
+ true,
+ 0
+},
+{ /* Method DeleteResource => 5 */
+ virLockSpaceProtocolDispatchDeleteResourceHelper,
+ sizeof(virLockSpaceProtocolDeleteResourceArgs),
+ (xdrproc_t)xdr_virLockSpaceProtocolDeleteResourceArgs,
+ 0,
+ (xdrproc_t)xdr_void,
+ true,
+ 0
+},
+{ /* Method AcquireResource => 6 */
+ virLockSpaceProtocolDispatchAcquireResourceHelper,
+ sizeof(virLockSpaceProtocolAcquireResourceArgs),
+ (xdrproc_t)xdr_virLockSpaceProtocolAcquireResourceArgs,
+ 0,
+ (xdrproc_t)xdr_void,
+ true,
+ 0
+},
+{ /* Method ReleaseResource => 7 */
+ virLockSpaceProtocolDispatchReleaseResourceHelper,
+ sizeof(virLockSpaceProtocolReleaseResourceArgs),
+ (xdrproc_t)xdr_virLockSpaceProtocolReleaseResourceArgs,
+ 0,
+ (xdrproc_t)xdr_void,
+ true,
+ 0
+},
+{ /* Method CreateLockSpace => 8 */
+ virLockSpaceProtocolDispatchCreateLockSpaceHelper,
+ sizeof(virLockSpaceProtocolCreateLockSpaceArgs),
+ (xdrproc_t)xdr_virLockSpaceProtocolCreateLockSpaceArgs,
+ 0,
+ (xdrproc_t)xdr_void,
+ true,
+ 0
+},
+};
+size_t virLockSpaceProtocolNProcs = ARRAY_CARDINALITY(virLockSpaceProtocolProcs);
diff --git a/src/locking/lock_driver_lockd.c b/src/locking/lock_driver_lockd.c
new file mode 100644
index 000000000..3902edee9
--- /dev/null
+++ b/src/locking/lock_driver_lockd.c
@@ -0,0 +1,839 @@
+/*
+ * lock_driver_lockd.c: A lock driver which locks nothing
+ *
+ * Copyright (C) 2010-2011 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/>.
+ *
+ */
+
+#include <config.h>
+
+#include "lock_driver.h"
+#include "conf.h"
+#include "memory.h"
+#include "logging.h"
+#include "uuid.h"
+#include "util.h"
+#include "virfile.h"
+#include "virterror_internal.h"
+#include "rpc/virnetclient.h"
+#include "lock_protocol.h"
+#include "configmake.h"
+#include "sha256.h"
+
+#define VIR_FROM_THIS VIR_FROM_LOCKING
+
+#define virLockError(code, ...) \
+ virReportErrorHelper(VIR_FROM_THIS, code, __FILE__, \
+ __FUNCTION__, __LINE__, __VA_ARGS__)
+
+typedef struct _virLockManagerLockDaemonPrivate virLockManagerLockDaemonPrivate;
+typedef virLockManagerLockDaemonPrivate *virLockManagerLockDaemonPrivatePtr;
+
+typedef struct _virLockManagerLockDaemonResource virLockManagerLockDaemonResource;
+typedef virLockManagerLockDaemonResource *virLockManagerLockDaemonResourcePtr;
+
+typedef struct _virLockManagerLockDaemonDriver virLockManagerLockDaemonDriver;
+typedef virLockManagerLockDaemonDriver *virLockManagerLockDaemonDriverPtr;
+
+struct _virLockManagerLockDaemonResource {
+ char *lockspace;
+ char *name;
+ unsigned int flags;
+};
+
+struct _virLockManagerLockDaemonPrivate {
+ unsigned char uuid[VIR_UUID_BUFLEN];
+ char *name;
+ int id;
+ pid_t pid;
+
+ size_t nresources;
+ virLockManagerLockDaemonResourcePtr resources;
+
+ bool hasRWDisks;
+};
+
+
+struct _virLockManagerLockDaemonDriver {
+ bool autoDiskLease;
+ bool requireLeaseForDisks;
+
+ char *fileLockSpaceDir;
+ char *lvmLockSpaceDir;
+ char *scsiLockSpaceDir;
+};
+
+static virLockManagerLockDaemonDriverPtr driver = NULL;
+
+#define VIRTLOCKD_PATH SBINDIR "/virtlockd"
+
+static const char *
+virLockManagerLockDaemonFindDaemon(void)
+{
+ const char *customDaemon = getenv("VIRTLOCKD_PATH");
+
+ if (customDaemon)
+ return customDaemon;
+
+ if (virFileIsExecutable(VIRTLOCKD_PATH))
+ return VIRTLOCKD_PATH;
+
+ return NULL;
+}
+
+static int virLockManagerLockDaemonLoadConfig(const char *configFile)
+{
+ virConfPtr conf;
+ virConfValuePtr p;
+
+ if (access(configFile, R_OK) == -1) {
+ if (errno != ENOENT) {
+ virReportSystemError(errno,
+ _("Unable to access config file %s"),
+ configFile);
+ return -1;
+ }
+ return 0;
+ }
+
+ if (!(conf = virConfReadFile(configFile, 0)))
+ return -1;
+
+#define CHECK_TYPE(name,typ) if (p && p->type != (typ)) { \
+ virReportError(VIR_ERR_INTERNAL_ERROR, \
+ "%s: %s: expected type " #typ, \
+ configFile, (name)); \
+ virConfFree(conf); \
+ return -1; \
+ }
+
+ p = virConfGetValue(conf, "auto_disk_leases");
+ CHECK_TYPE("auto_disk_leases", VIR_CONF_LONG);
+ if (p) driver->autoDiskLease = p->l;
+
+ p = virConfGetValue(conf, "file_lockspace_dir");
+ CHECK_TYPE("file_lockspace_dir", VIR_CONF_STRING);
+ if (p && p->str) {
+ VIR_FREE(driver->fileLockSpaceDir);
+ if (!(driver->fileLockSpaceDir = strdup(p->str))) {
+ virReportOOMError();
+ virConfFree(conf);
+ return -1;
+ }
+ }
+
+ p = virConfGetValue(conf, "lvm_lockspace_dir");
+ CHECK_TYPE("lvm_lockspace_dir", VIR_CONF_STRING);
+ if (p && p->str) {
+ VIR_FREE(driver->lvmLockSpaceDir);
+ if (!(driver->lvmLockSpaceDir = strdup(p->str))) {
+ virReportOOMError();
+ virConfFree(conf);
+ return -1;
+ }
+ }
+
+ p = virConfGetValue(conf, "scsi_lockspace_dir");
+ CHECK_TYPE("scsi_lockspace_dir", VIR_CONF_STRING);
+ if (p && p->str) {
+ VIR_FREE(driver->scsiLockSpaceDir);
+ if (!(driver->scsiLockSpaceDir = strdup(p->str))) {
+ virReportOOMError();
+ virConfFree(conf);
+ return -1;
+ }
+ }
+
+ p = virConfGetValue(conf, "require_lease_for_disks");
+ CHECK_TYPE("require_lease_for_disks", VIR_CONF_LONG);
+ if (p)
+ driver->requireLeaseForDisks = p->l;
+ else
+ driver->requireLeaseForDisks = !driver->autoDiskLease;
+
+ virConfFree(conf);
+ return 0;
+}
+
+
+static char *virLockManagerLockDaemonPath(bool privileged)
+{
+ char *path;
+ if (privileged) {
+ if (!(path = strdup(LOCALSTATEDIR "/run/libvirt/virtlockd-sock"))) {
+ virReportOOMError();
+ return NULL;
+ }
+ } else {
+ char *rundir = NULL;
+
+ if (!(rundir = virGetUserRuntimeDirectory()))
+ return NULL;
+
+ if (virAsprintf(&path, "%s/virtlockd-sock", rundir) < 0) {
+ VIR_FREE(rundir);
+ virReportOOMError();
+ return NULL;
+ }
+
+ }
+ return path;
+}
+
+
+static int
+virLockManagerLockDaemonConnectionRegister(virLockManagerPtr lock,
+ virNetClientPtr client,
+ virNetClientProgramPtr program,
+ int *counter)
+{
+ virLockManagerLockDaemonPrivatePtr priv = lock->privateData;
+ virLockSpaceProtocolRegisterArgs args;
+ int rv = -1;
+
+ memset(&args, 0, sizeof(args));
+
+ args.flags = 0;
+ memcpy(args.owner.uuid, priv->uuid, VIR_UUID_BUFLEN);
+ args.owner.name = priv->name;
+ args.owner.id = priv->id;
+ args.owner.pid = priv->pid;
+
+ if (virNetClientProgramCall(program,
+ client,
+ (*counter)++,
+ VIR_LOCK_SPACE_PROTOCOL_PROC_REGISTER,
+ 0, NULL, NULL, NULL,
+ (xdrproc_t)xdr_virLockSpaceProtocolRegisterArgs, (char*)&args,
+ (xdrproc_t)xdr_void, NULL) < 0)
+ goto cleanup;
+
+ rv = 0;
+
+cleanup:
+ return rv;
+}
+
+
+static int
+virLockManagerLockDaemonConnectionRestrict(virLockManagerPtr lock ATTRIBUTE_UNUSED,
+ virNetClientPtr client,
+ virNetClientProgramPtr program,
+ int *counter)
+{
+ virLockSpaceProtocolRestrictArgs args;
+ int rv = -1;
+
+ memset(&args, 0, sizeof(args));
+
+ args.flags = 0;
+
+ if (virNetClientProgramCall(program,
+ client,
+ (*counter)++,
+ VIR_LOCK_SPACE_PROTOCOL_PROC_RESTRICT,
+ 0, NULL, NULL, NULL,
+ (xdrproc_t)xdr_virLockSpaceProtocolRestrictArgs, (char*)&args,
+ (xdrproc_t)xdr_void, NULL) < 0)
+ goto cleanup;
+
+ rv = 0;
+
+cleanup:
+ return rv;
+}
+
+
+static virNetClientPtr virLockManagerLockDaemonConnectionNew(bool privileged,
+ virNetClientProgramPtr *prog)
+{
+ virNetClientPtr client = NULL;
+ char *lockdpath;
+ const char *daemonPath = NULL;
+
+ *prog = NULL;
+
+ if (!(lockdpath = virLockManagerLockDaemonPath(privileged)))
+ goto error;
+
+ if (!privileged)
+ daemonPath = virLockManagerLockDaemonFindDaemon();
+
+ if (!(client = virNetClientNewUNIX(lockdpath,
+ daemonPath != NULL,
+ daemonPath)))
+ goto error;
+
+ if (!(*prog = virNetClientProgramNew(VIR_LOCK_SPACE_PROTOCOL_PROGRAM,
+ VIR_LOCK_SPACE_PROTOCOL_PROGRAM_VERSION,
+ NULL,
+ 0,
+ NULL)))
+ goto error;
+
+ if (virNetClientAddProgram(client, *prog) < 0)
+ goto error;
+
+ VIR_FREE(lockdpath);
+
+ return client;
+
+error:
+ VIR_FREE(lockdpath);
+ virNetClientClose(client);
+ virObjectUnref(client);
+ virObjectUnref(*prog);
+ return NULL;
+}
+
+
+static virNetClientPtr
+virLockManagerLockDaemonConnect(virLockManagerPtr lock,
+ virNetClientProgramPtr *program,
+ int *counter)
+{
+ virNetClientPtr client;
+
+ if (!(client = virLockManagerLockDaemonConnectionNew(getuid() == 0, program)))
+ return NULL;
+
+ if (virLockManagerLockDaemonConnectionRegister(lock,
+ client,
+ *program,
+ counter) < 0)
+ goto error;
+
+ return client;
+
+error:
+ virNetClientClose(client);
+ virObjectUnref(client);
+ return NULL;
+}
+
+
+static int virLockManagerLockDaemonSetupLockspace(const char *path)
+{
+ virNetClientPtr client;
+ virNetClientProgramPtr program = NULL;
+ virLockSpaceProtocolCreateLockSpaceArgs args;
+ int rv = -1;
+ int counter = 0;
+
+ memset(&args, 0, sizeof(args));
+ args.path = (char*)path;
+
+ if (!(client = virLockManagerLockDaemonConnectionNew(getuid() == 0, &program)))
+ return -1;
+
+ if (virNetClientProgramCall(program,
+ client,
+ counter++,
+ VIR_LOCK_SPACE_PROTOCOL_PROC_CREATE_LOCKSPACE,
+ 0, NULL, NULL, NULL,
+ (xdrproc_t)xdr_virLockSpaceProtocolCreateLockSpaceArgs, (char*)&args,
+ (xdrproc_t)xdr_void, NULL) < 0) {
+ virErrorPtr err = virGetLastError();
+ if (err && err->code == VIR_ERR_OPERATION_INVALID) {
+ /* The lockspace already exists */
+ virResetLastError();
+ rv = 0;
+ } else {
+ goto cleanup;
+ }
+ }
+
+ rv = 0;
+
+cleanup:
+ virObjectUnref(program);
+ virNetClientClose(client);
+ virObjectUnref(client);
+ return rv;
+}
+
+
+static int virLockManagerLockDaemonDeinit(void);
+
+static int virLockManagerLockDaemonInit(unsigned int version,
+ const char *configFile,
+ unsigned int flags)
+{
+ VIR_DEBUG("version=%u configFile=%s flags=%x", version, NULLSTR(configFile), flags);
+
+ virCheckFlags(0, -1);
+
+ if (driver)
+ return 0;
+
+ if (VIR_ALLOC(driver) < 0) {
+ virReportOOMError();
+ return -1;
+ }
+
+ driver->requireLeaseForDisks = true;
+ driver->autoDiskLease = true;
+
+ if (virLockManagerLockDaemonLoadConfig(configFile) < 0)
+ goto error;
+
+ if (driver->autoDiskLease) {
+ if (driver->fileLockSpaceDir &&
+ virLockManagerLockDaemonSetupLockspace(driver->fileLockSpaceDir) < 0)
+ goto error;
+
+ if (driver->lvmLockSpaceDir &&
+ virLockManagerLockDaemonSetupLockspace(driver->lvmLockSpaceDir) < 0)
+ goto error;
+
+ if (driver->scsiLockSpaceDir &&
+ virLockManagerLockDaemonSetupLockspace(driver->scsiLockSpaceDir) < 0)
+ goto error;
+ }
+
+ return 0;
+
+error:
+ virLockManagerLockDaemonDeinit();
+ return -1;
+}
+
+static int virLockManagerLockDaemonDeinit(void)
+{
+ if (!driver)
+ return 0;
+
+ VIR_FREE(driver->fileLockSpaceDir);
+ VIR_FREE(driver);
+
+ return 0;
+}
+
+static void virLockManagerLockDaemonFree(virLockManagerPtr lock)
+{
+ virLockManagerLockDaemonPrivatePtr priv = lock->privateData;
+ size_t i;
+
+ if (!priv)
+ return;
+
+ lock->privateData = NULL;
+
+ for (i = 0 ; i < priv->nresources ; i++) {
+ VIR_FREE(priv->resources[i].lockspace);
+ VIR_FREE(priv->resources[i].name);
+ }
+ VIR_FREE(priv->resources);
+
+ VIR_FREE(priv->name);
+
+ VIR_FREE(priv);
+}
+
+
+static int virLockManagerLockDaemonNew(virLockManagerPtr lock,
+ unsigned int type,
+ size_t nparams,
+ virLockManagerParamPtr params,
+ unsigned int flags)
+{
+ virLockManagerLockDaemonPrivatePtr priv;
+ size_t i;
+
+ virCheckFlags(VIR_LOCK_MANAGER_USES_STATE, -1);
+
+ if (VIR_ALLOC(priv) < 0) {
+ virReportOOMError();
+ return -1;
+ }
+ lock->privateData = priv;
+
+ switch (type) {
+ case VIR_LOCK_MANAGER_OBJECT_TYPE_DOMAIN:
+ for (i = 0 ; i < nparams ; i++) {
+ if (STREQ(params[i].key, "uuid")) {
+ memcpy(priv->uuid, params[i].value.uuid, VIR_UUID_BUFLEN);
+ } else if (STREQ(params[i].key, "name")) {
+ if (!(priv->name = strdup(params[i].value.str))) {
+ virReportOOMError();
+ return -1;
+ }
+ } else if (STREQ(params[i].key, "id")) {
+ priv->id = params[i].value.i;
+ } else if (STREQ(params[i].key, "pid")) {
+ priv->pid = params[i].value.i;
+ } else {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Unexpected parameter %s for object"),
+ params[i].key);
+ }
+ }
+ if (priv->id == 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Missing ID parameter for domain object"));
+ return -1;
+ }
+ if (priv->pid == 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Missing PID parameter for domain object"));
+ return -1;
+ }
+ if (!priv->name) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Missing name parameter for domain object"));
+ return -1;
+ }
+ if (!virUUIDIsValid(priv->uuid)) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Missing UUID parameter for domain object"));
+ return -1;
+ }
+ break;
+
+ default:
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Unknown lock manager object type %d"),
+ type);
+ return -1;
+ }
+
+ return 0;
+}
+
+
+static const char hex[] = { '0', '1', '2', '3', '4', '5', '6', '7',
+ '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
+
+static char *virLockManagerLockDaemonDiskLeaseName(const char *path)
+{
+ unsigned char buf[SHA256_DIGEST_SIZE];
+ char *ret;
+ int i;
+
+ if (!(sha256_buffer(path, strlen(path), buf))) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Unable to compute sha256 checksum"));
+ return NULL;
+ }
+
+ if (VIR_ALLOC_N(ret, (SHA256_DIGEST_SIZE * 2) + 1) < 0) {
+ virReportOOMError();
+ return NULL;
+ }
+
+ for (i = 0 ; i < SHA256_DIGEST_SIZE ; i++) {
+ ret[i*2] = hex[(buf[i] >> 4) & 0xf];
+ ret[(i*2)+1] = hex[buf[i] & 0xf];
+ }
+ ret[(SHA256_DIGEST_SIZE * 2) + 1] = '\0';
+
+ return ret;
+}
+
+
+static int virLockManagerLockDaemonAddResource(virLockManagerPtr lock,
+ unsigned int type,
+ const char *name,
+ size_t nparams,
+ virLockManagerParamPtr params,
+ unsigned int flags)
+{
+ virLockManagerLockDaemonPrivatePtr priv = lock->privateData;
+ char *newName = NULL;
+ char *newLockspace = NULL;
+ bool autoCreate = false;
+
+ virCheckFlags(VIR_LOCK_MANAGER_RESOURCE_READONLY |
+ VIR_LOCK_MANAGER_RESOURCE_SHARED, -1);
+
+ if (flags & VIR_LOCK_MANAGER_RESOURCE_READONLY)
+ return 0;
+
+ switch (type) {
+ case VIR_LOCK_MANAGER_RESOURCE_TYPE_DISK:
+ if (params || nparams) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Unexpected parameters for disk resource"));
+ return -1;
+ }
+ if (!driver->autoDiskLease) {
+ if (!(flags & (VIR_LOCK_MANAGER_RESOURCE_SHARED |
+ VIR_LOCK_MANAGER_RESOURCE_READONLY)))
+ priv->hasRWDisks = true;
+ return 0;
+ }
+
+ /* XXX we should somehow pass in TYPE=BLOCK info
+ * from the domain_lock code, instead of assuming /dev
+ */
+ if (STRPREFIX(name, "/dev") &&
+ driver->lvmLockSpaceDir) {
+ VIR_DEBUG("Trying to find an LVM UUID for %s", name);
+ if (virStorageFileGetLVMKey(name, &newName) < 0)
+ goto error;
+
+ if (newName) {
+ VIR_DEBUG("Got an LVM UUID %s for %s", newName, name);
+ if (!(newLockspace = strdup(driver->lvmLockSpaceDir)))
+ goto no_memory;
+ autoCreate = true;
+ break;
+ }
+ virResetLastError();
+ /* Fallback to generic non-block code */
+ }
+
+ if (STRPREFIX(name, "/dev") &&
+ driver->scsiLockSpaceDir) {
+ VIR_DEBUG("Trying to find an SCSI ID for %s", name);
+ if (virStorageFileGetSCSIKey(name, &newName) < 0)
+ goto error;
+
+ if (newName) {
+ VIR_DEBUG("Got an SCSI ID %s for %s", newName, name);
+ if (!(newLockspace = strdup(driver->scsiLockSpaceDir)))
+ goto no_memory;
+ autoCreate = true;
+ break;
+ }
+ virResetLastError();
+ /* Fallback to generic non-block code */
+ }
+
+ if (driver->fileLockSpaceDir) {
+ if (!(newLockspace = strdup(driver->fileLockSpaceDir)))
+ goto no_memory;
+ if (!(newName = virLockManagerLockDaemonDiskLeaseName(name)))
+ goto no_memory;
+ autoCreate = true;
+ VIR_DEBUG("Using indirect lease %s for %s", newName, name);
+ } else {
+ if (!(newLockspace = strdup("")))
+ goto no_memory;
+ if (!(newName = strdup(name)))
+ goto no_memory;
+ VIR_DEBUG("Using direct lease for %s", name);
+ }
+
+ break;
+ case VIR_LOCK_MANAGER_RESOURCE_TYPE_LEASE: {
+ size_t i;
+ char *path = NULL;
+ char *lockspace = NULL;
+ for (i = 0 ; i < nparams ; i++) {
+ if (STREQ(params[i].key, "offset")) {
+ if (params[i].value.ul != 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Offset must be zero for this lock manager"));
+ return -1;
+ }
+ } else if (STREQ(params[i].key, "lockspace")) {
+ lockspace = params[i].value.str;
+ } else if (STREQ(params[i].key, "path")) {
+ path = params[i].value.str;
+ } else {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Unexpected parameter %s for lease resource"),
+ params[i].key);
+ return -1;
+ }
+ }
+ if (!path || !lockspace) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Missing path or lockspace for lease resource"));
+ return -1;
+ }
+ if (virAsprintf(&newLockspace, "%s/%s",
+ path, lockspace) < 0) {
+ virReportOOMError();
+ return -1;
+ }
+ if (!(newName = strdup(name)))
+ goto no_memory;
+
+ } break;
+ default:
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("Unknown lock manager object type %d"),
+ type);
+ return -1;
+ }
+
+ if (VIR_EXPAND_N(priv->resources, priv->nresources, 1) < 0)
+ goto no_memory;
+
+ priv->resources[priv->nresources-1].lockspace = newLockspace;
+ priv->resources[priv->nresources-1].name = newName;
+
+ if (flags & VIR_LOCK_MANAGER_RESOURCE_SHARED)
+ priv->resources[priv->nresources-1].flags |=
+ VIR_LOCK_SPACE_PROTOCOL_ACQUIRE_RESOURCE_SHARED;
+
+ if (autoCreate)
+ priv->resources[priv->nresources-1].flags |=
+ VIR_LOCK_SPACE_PROTOCOL_ACQUIRE_RESOURCE_AUTOCREATE;
+
+ return 0;
+
+no_memory:
+ virReportOOMError();
+error:
+ VIR_FREE(newLockspace);
+ VIR_FREE(newName);
+ return -1;
+}
+
+
+static int virLockManagerLockDaemonAcquire(virLockManagerPtr lock,
+ const char *state ATTRIBUTE_UNUSED,
+ unsigned int flags,
+ virDomainLockFailureAction action ATTRIBUTE_UNUSED,
+ int *fd)
+{
+ virNetClientPtr client = NULL;
+ virNetClientProgramPtr program = NULL;
+ int counter = 0;
+ int rv = -1;
+ virLockManagerLockDaemonPrivatePtr priv = lock->privateData;
+
+ virCheckFlags(VIR_LOCK_MANAGER_ACQUIRE_REGISTER_ONLY |
+ VIR_LOCK_MANAGER_ACQUIRE_RESTRICT, -1);
+
+ if (priv->nresources == 0 &&
+ priv->hasRWDisks &&
+ driver->requireLeaseForDisks) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("Read/write, exclusive access, disks were present, but no leases specified"));
+ return -1;
+ }
+
+ if (!(client = virLockManagerLockDaemonConnect(lock, &program, &counter)))
+ goto cleanup;
+
+ if (fd &&
+ (*fd = virNetClientDupFD(client, false)) < 0)
+ goto cleanup;
+
+ if (!(flags & VIR_LOCK_MANAGER_ACQUIRE_REGISTER_ONLY)) {
+ size_t i;
+ for (i = 0 ; i < priv->nresources ; i++) {
+ virLockSpaceProtocolAcquireResourceArgs args;
+
+ memset(&args, 0, sizeof(args));
+
+ if (priv->resources[i].lockspace)
+ args.path = priv->resources[i].lockspace;
+ args.name = priv->resources[i].name;
+ args.flags = priv->resources[i].flags;
+
+ if (virNetClientProgramCall(program,
+ client,
+ counter++,
+ VIR_LOCK_SPACE_PROTOCOL_PROC_ACQUIRE_RESOURCE,
+ 0, NULL, NULL, NULL,
+ (xdrproc_t)xdr_virLockSpaceProtocolAcquireResourceArgs, &args,
+ (xdrproc_t)xdr_void, NULL) < 0)
+ goto cleanup;
+ }
+ }
+
+ if ((flags & VIR_LOCK_MANAGER_ACQUIRE_RESTRICT) &&
+ virLockManagerLockDaemonConnectionRestrict(lock, client, program, &counter) < 0)
+ goto cleanup;
+
+ rv = 0;
+
+cleanup:
+ if (rv != 0 && fd)
+ VIR_FORCE_CLOSE(*fd);
+ virNetClientClose(client);
+ virObjectUnref(client);
+ virObjectUnref(program);
+
+ return rv;
+}
+
+static int virLockManagerLockDaemonRelease(virLockManagerPtr lock,
+ char **state,
+ unsigned int flags)
+{
+ virNetClientPtr client = NULL;
+ virNetClientProgramPtr program = NULL;
+ int counter = 0;
+ virLockSpaceProtocolReleaseResourceArgs args;
+ int rv = -1;
+
+ memset(&args, 0, sizeof(args));
+
+ if (state)
+ *state = NULL;
+
+ if (!(client = virLockManagerLockDaemonConnect(lock, &program, &counter)))
+ goto cleanup;
+
+ args.flags = flags;
+
+ if (virNetClientProgramCall(program,
+ client,
+ counter++,
+ VIR_LOCK_SPACE_PROTOCOL_PROC_RELEASE_RESOURCE,
+ 0, NULL, NULL, NULL,
+ (xdrproc_t)xdr_virLockSpaceProtocolReleaseResourceArgs, &args,
+ (xdrproc_t)xdr_void, NULL) < 0)
+ goto cleanup;
+
+ rv = 0;
+
+cleanup:
+ virNetClientClose(client);
+ virObjectUnref(client);
+ virObjectUnref(program);
+
+ return rv;
+}
+
+
+static int virLockManagerLockDaemonInquire(virLockManagerPtr lock ATTRIBUTE_UNUSED,
+ char **state,
+ unsigned int flags)
+{
+ virCheckFlags(0, -1);
+
+ if (state)
+ *state = NULL;
+
+ return 0;
+}
+
+virLockDriver virLockDriverImpl =
+{
+ .version = VIR_LOCK_MANAGER_VERSION,
+ .flags = 0,
+
+ .drvInit = virLockManagerLockDaemonInit,
+ .drvDeinit = virLockManagerLockDaemonDeinit,
+
+ .drvNew = virLockManagerLockDaemonNew,
+ .drvFree = virLockManagerLockDaemonFree,
+
+ .drvAddResource = virLockManagerLockDaemonAddResource,
+
+ .drvAcquire = virLockManagerLockDaemonAcquire,
+ .drvRelease = virLockManagerLockDaemonRelease,
+
+ .drvInquire = virLockManagerLockDaemonInquire,
+};
diff --git a/src/locking/lock_driver_sanlock.c b/src/locking/lock_driver_sanlock.c
index 430e11e72..a0723439a 100644
--- a/src/locking/lock_driver_sanlock.c
+++ b/src/locking/lock_driver_sanlock.c
@@ -197,9 +197,7 @@ static int virLockManagerSanlockSetupLockspace(void)
struct sanlk_lockspace ls;
char *path = NULL;
char *dir = NULL;
-#ifndef HAVE_SANLOCK_INQ_LOCKSPACE
int retries = LOCKSPACE_RETRIES;
-#endif
if (virAsprintf(&path, "%s/%s",
driver->autoDiskLeasePath,
@@ -332,25 +330,23 @@ static int virLockManagerSanlockSetupLockspace(void)
* either call a sanlock API that blocks us until lockspace changes state,
* or we can fallback to polling.
*/
-#ifndef HAVE_SANLOCK_INQ_LOCKSPACE
retry:
-#endif
if ((rv = sanlock_add_lockspace(&ls, 0)) < 0) {
- if (-rv == EINPROGRESS) {
+ if (-rv == EINPROGRESS && --retries) {
#ifdef HAVE_SANLOCK_INQ_LOCKSPACE
/* we have this function which blocks until lockspace change the
* state. It returns 0 if lockspace has been added, -ENOENT if it
- * hasn't. XXX should we goto retry? */
+ * hasn't. */
VIR_DEBUG("Inquiring lockspace");
- rv = sanlock_inq_lockspace(&ls, SANLK_INQ_WAIT);
+ if (sanlock_inq_lockspace(&ls, SANLK_INQ_WAIT) < 0)
+ VIR_DEBUG("Unable to inquire lockspace");
#else
/* fall back to polling */
- if (retries--) {
- usleep(LOCKSPACE_SLEEP * 1000);
- VIR_DEBUG("Retrying to add lockspace (left %d)", retries);
- goto retry;
- }
+ VIR_DEBUG("Sleeping for %dms", LOCKSPACE_SLEEP);
+ usleep(LOCKSPACE_SLEEP * 1000);
#endif
+ VIR_DEBUG("Retrying to add lockspace (left %d)", retries);
+ goto retry;
}
if (-rv != EEXIST) {
if (rv <= -200)
diff --git a/src/locking/lock_manager.c b/src/locking/lock_manager.c
index 423997b5e..e6d930854 100644
--- a/src/locking/lock_manager.c
+++ b/src/locking/lock_manager.c
@@ -128,7 +128,8 @@ static void virLockManagerLogParams(size_t nparams,
*/
#if HAVE_DLFCN_H
virLockManagerPluginPtr virLockManagerPluginNew(const char *name,
- const char *configFile,
+ const char *driverName,
+ const char *configDir,
unsigned int flags)
{
void *handle = NULL;
@@ -136,6 +137,16 @@ virLockManagerPluginPtr virLockManagerPluginNew(const char *name,
virLockManagerPluginPtr plugin = NULL;
const char *moddir = getenv("LIBVIRT_LOCK_MANAGER_PLUGIN_DIR");
char *modfile = NULL;
+ char *configFile = NULL;
+
+ VIR_DEBUG("name=%s driverName=%s configDir=%s flags=%x",
+ name, driverName, configDir, flags);
+
+ if (virAsprintf(&configFile, "%s/%s-%s.conf",
+ configDir, driverName, name) < 0) {
+ virReportOOMError();
+ return NULL;
+ }
if (STREQ(name, "nop")) {
driver = &virLockDriverNop;
@@ -147,7 +158,7 @@ virLockManagerPluginPtr virLockManagerPluginNew(const char *name,
if (virAsprintf(&modfile, "%s/%s.so", moddir, name) < 0) {
virReportOOMError();
- return NULL;
+ goto cleanup;
}
if (access(modfile, R_OK) < 0) {
@@ -188,10 +199,12 @@ virLockManagerPluginPtr virLockManagerPluginNew(const char *name,
goto cleanup;
}
+ VIR_FREE(configFile);
VIR_FREE(modfile);
return plugin;
cleanup:
+ VIR_FREE(configFile);
VIR_FREE(plugin);
VIR_FREE(modfile);
if (handle)
@@ -201,7 +214,8 @@ cleanup:
#else /* !HAVE_DLFCN_H */
virLockManagerPluginPtr
virLockManagerPluginNew(const char *name ATTRIBUTE_UNUSED,
- const char *configFile ATTRIBUTE_UNUSED,
+ const char *driverName ATTRIBUTE_UNUSED,
+ const char *configDir ATTRIBUTE_UNUSED,
unsigned int flags_unused ATTRIBUTE_UNUSED)
{
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
diff --git a/src/locking/lock_manager.h b/src/locking/lock_manager.h
index 4fee12d67..fea9db8d4 100644
--- a/src/locking/lock_manager.h
+++ b/src/locking/lock_manager.h
@@ -30,7 +30,8 @@ typedef virLockManagerPlugin *virLockManagerPluginPtr;
void virLockManagerSetPluginDir(const char *dir);
virLockManagerPluginPtr virLockManagerPluginNew(const char *name,
- const char *configFile,
+ const char *driverName,
+ const char *configDir,
unsigned int flags);
void virLockManagerPluginRef(virLockManagerPluginPtr plugin);
void virLockManagerPluginUnref(virLockManagerPluginPtr plugin);
diff --git a/src/locking/lock_protocol.c b/src/locking/lock_protocol.c
new file mode 100644
index 000000000..5325942ac
--- /dev/null
+++ b/src/locking/lock_protocol.c
@@ -0,0 +1,160 @@
+#include <config.h>
+/*
+ * Please do not edit this file.
+ * It was generated using rpcgen.
+ */
+
+#include "lock_protocol.h"
+#include "internal.h"
+
+bool_t
+xdr_virLockSpaceProtocolUUID (XDR *xdrs, virLockSpaceProtocolUUID objp)
+{
+
+ if (!xdr_opaque (xdrs, objp, VIR_UUID_BUFLEN))
+ return FALSE;
+ return TRUE;
+}
+
+bool_t
+xdr_virLockSpaceProtocolNonNullString (XDR *xdrs, virLockSpaceProtocolNonNullString *objp)
+{
+
+ if (!xdr_string (xdrs, objp, VIR_LOCK_SPACE_PROTOCOL_STRING_MAX))
+ return FALSE;
+ return TRUE;
+}
+
+bool_t
+xdr_virLockSpaceProtocolString (XDR *xdrs, virLockSpaceProtocolString *objp)
+{
+
+ if (!xdr_pointer (xdrs, (char **)objp, sizeof (virLockSpaceProtocolNonNullString), (xdrproc_t) xdr_virLockSpaceProtocolNonNullString))
+ return FALSE;
+ return TRUE;
+}
+
+bool_t
+xdr_virLockSpaceProtocolOwner (XDR *xdrs, virLockSpaceProtocolOwner *objp)
+{
+
+ if (!xdr_virLockSpaceProtocolUUID (xdrs, objp->uuid))
+ return FALSE;
+ if (!xdr_virLockSpaceProtocolNonNullString (xdrs, &objp->name))
+ return FALSE;
+ if (!xdr_u_int (xdrs, &objp->id))
+ return FALSE;
+ if (!xdr_u_int (xdrs, &objp->pid))
+ return FALSE;
+ return TRUE;
+}
+
+bool_t
+xdr_virLockSpaceProtocolRegisterArgs (XDR *xdrs, virLockSpaceProtocolRegisterArgs *objp)
+{
+
+ if (!xdr_virLockSpaceProtocolOwner (xdrs, &objp->owner))
+ return FALSE;
+ if (!xdr_u_int (xdrs, &objp->flags))
+ return FALSE;
+ return TRUE;
+}
+
+bool_t
+xdr_virLockSpaceProtocolRestrictArgs (XDR *xdrs, virLockSpaceProtocolRestrictArgs *objp)
+{
+
+ if (!xdr_u_int (xdrs, &objp->flags))
+ return FALSE;
+ return TRUE;
+}
+
+bool_t
+xdr_virLockSpaceProtocolNewArgs (XDR *xdrs, virLockSpaceProtocolNewArgs *objp)
+{
+
+ if (!xdr_virLockSpaceProtocolNonNullString (xdrs, &objp->path))
+ return FALSE;
+ if (!xdr_u_int (xdrs, &objp->flags))
+ return FALSE;
+ return TRUE;
+}
+
+bool_t
+xdr_virLockSpaceProtocolCreateResourceArgs (XDR *xdrs, virLockSpaceProtocolCreateResourceArgs *objp)
+{
+
+ if (!xdr_virLockSpaceProtocolNonNullString (xdrs, &objp->path))
+ return FALSE;
+ if (!xdr_virLockSpaceProtocolNonNullString (xdrs, &objp->name))
+ return FALSE;
+ if (!xdr_u_int (xdrs, &objp->flags))
+ return FALSE;
+ return TRUE;
+}
+
+bool_t
+xdr_virLockSpaceProtocolDeleteResourceArgs (XDR *xdrs, virLockSpaceProtocolDeleteResourceArgs *objp)
+{
+
+ if (!xdr_virLockSpaceProtocolNonNullString (xdrs, &objp->path))
+ return FALSE;
+ if (!xdr_virLockSpaceProtocolNonNullString (xdrs, &objp->name))
+ return FALSE;
+ if (!xdr_u_int (xdrs, &objp->flags))
+ return FALSE;
+ return TRUE;
+}
+
+bool_t
+xdr_virLockSpaceProtocolAcquireResourceFlags (XDR *xdrs, virLockSpaceProtocolAcquireResourceFlags *objp)
+{
+
+ if (!xdr_enum (xdrs, (enum_t *) objp))
+ return FALSE;
+ return TRUE;
+}
+
+bool_t
+xdr_virLockSpaceProtocolAcquireResourceArgs (XDR *xdrs, virLockSpaceProtocolAcquireResourceArgs *objp)
+{
+
+ if (!xdr_virLockSpaceProtocolNonNullString (xdrs, &objp->path))
+ return FALSE;
+ if (!xdr_virLockSpaceProtocolNonNullString (xdrs, &objp->name))
+ return FALSE;
+ if (!xdr_u_int (xdrs, &objp->flags))
+ return FALSE;
+ return TRUE;
+}
+
+bool_t
+xdr_virLockSpaceProtocolReleaseResourceArgs (XDR *xdrs, virLockSpaceProtocolReleaseResourceArgs *objp)
+{
+
+ if (!xdr_virLockSpaceProtocolNonNullString (xdrs, &objp->path))
+ return FALSE;
+ if (!xdr_virLockSpaceProtocolNonNullString (xdrs, &objp->name))
+ return FALSE;
+ if (!xdr_u_int (xdrs, &objp->flags))
+ return FALSE;
+ return TRUE;
+}
+
+bool_t
+xdr_virLockSpaceProtocolCreateLockSpaceArgs (XDR *xdrs, virLockSpaceProtocolCreateLockSpaceArgs *objp)
+{
+
+ if (!xdr_virLockSpaceProtocolNonNullString (xdrs, &objp->path))
+ return FALSE;
+ return TRUE;
+}
+
+bool_t
+xdr_virLockSpaceProtocolProcedure (XDR *xdrs, virLockSpaceProtocolProcedure *objp)
+{
+
+ if (!xdr_enum (xdrs, (enum_t *) objp))
+ return FALSE;
+ return TRUE;
+}
diff --git a/src/locking/lock_protocol.h b/src/locking/lock_protocol.h
new file mode 100644
index 000000000..e304def72
--- /dev/null
+++ b/src/locking/lock_protocol.h
@@ -0,0 +1,143 @@
+/*
+ * Please do not edit this file.
+ * It was generated using rpcgen.
+ */
+
+#ifndef _LOCK_PROTOCOL_H_RPCGEN
+#define _LOCK_PROTOCOL_H_RPCGEN
+
+#include <rpc/rpc.h>
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "internal.h"
+
+typedef char virLockSpaceProtocolUUID[VIR_UUID_BUFLEN];
+#define VIR_LOCK_SPACE_PROTOCOL_STRING_MAX 65536
+
+typedef char *virLockSpaceProtocolNonNullString;
+
+typedef virLockSpaceProtocolNonNullString *virLockSpaceProtocolString;
+
+struct virLockSpaceProtocolOwner {
+ virLockSpaceProtocolUUID uuid;
+ virLockSpaceProtocolNonNullString name;
+ u_int id;
+ u_int pid;
+};
+typedef struct virLockSpaceProtocolOwner virLockSpaceProtocolOwner;
+
+struct virLockSpaceProtocolRegisterArgs {
+ virLockSpaceProtocolOwner owner;
+ u_int flags;
+};
+typedef struct virLockSpaceProtocolRegisterArgs virLockSpaceProtocolRegisterArgs;
+
+struct virLockSpaceProtocolRestrictArgs {
+ u_int flags;
+};
+typedef struct virLockSpaceProtocolRestrictArgs virLockSpaceProtocolRestrictArgs;
+
+struct virLockSpaceProtocolNewArgs {
+ virLockSpaceProtocolNonNullString path;
+ u_int flags;
+};
+typedef struct virLockSpaceProtocolNewArgs virLockSpaceProtocolNewArgs;
+
+struct virLockSpaceProtocolCreateResourceArgs {
+ virLockSpaceProtocolNonNullString path;
+ virLockSpaceProtocolNonNullString name;
+ u_int flags;
+};
+typedef struct virLockSpaceProtocolCreateResourceArgs virLockSpaceProtocolCreateResourceArgs;
+
+struct virLockSpaceProtocolDeleteResourceArgs {
+ virLockSpaceProtocolNonNullString path;
+ virLockSpaceProtocolNonNullString name;
+ u_int flags;
+};
+typedef struct virLockSpaceProtocolDeleteResourceArgs virLockSpaceProtocolDeleteResourceArgs;
+
+enum virLockSpaceProtocolAcquireResourceFlags {
+ VIR_LOCK_SPACE_PROTOCOL_ACQUIRE_RESOURCE_SHARED = 1,
+ VIR_LOCK_SPACE_PROTOCOL_ACQUIRE_RESOURCE_AUTOCREATE = 2,
+};
+typedef enum virLockSpaceProtocolAcquireResourceFlags virLockSpaceProtocolAcquireResourceFlags;
+
+struct virLockSpaceProtocolAcquireResourceArgs {
+ virLockSpaceProtocolNonNullString path;
+ virLockSpaceProtocolNonNullString name;
+ u_int flags;
+};
+typedef struct virLockSpaceProtocolAcquireResourceArgs virLockSpaceProtocolAcquireResourceArgs;
+
+struct virLockSpaceProtocolReleaseResourceArgs {
+ virLockSpaceProtocolNonNullString path;
+ virLockSpaceProtocolNonNullString name;
+ u_int flags;
+};
+typedef struct virLockSpaceProtocolReleaseResourceArgs virLockSpaceProtocolReleaseResourceArgs;
+
+struct virLockSpaceProtocolCreateLockSpaceArgs {
+ virLockSpaceProtocolNonNullString path;
+};
+typedef struct virLockSpaceProtocolCreateLockSpaceArgs virLockSpaceProtocolCreateLockSpaceArgs;
+#define VIR_LOCK_SPACE_PROTOCOL_PROGRAM 0xEA7BEEF
+#define VIR_LOCK_SPACE_PROTOCOL_PROGRAM_VERSION 1
+
+enum virLockSpaceProtocolProcedure {
+ VIR_LOCK_SPACE_PROTOCOL_PROC_REGISTER = 1,
+ VIR_LOCK_SPACE_PROTOCOL_PROC_RESTRICT = 2,
+ VIR_LOCK_SPACE_PROTOCOL_PROC_NEW = 3,
+ VIR_LOCK_SPACE_PROTOCOL_PROC_CREATE_RESOURCE = 4,
+ VIR_LOCK_SPACE_PROTOCOL_PROC_DELETE_RESOURCE = 5,
+ VIR_LOCK_SPACE_PROTOCOL_PROC_ACQUIRE_RESOURCE = 6,
+ VIR_LOCK_SPACE_PROTOCOL_PROC_RELEASE_RESOURCE = 7,
+ VIR_LOCK_SPACE_PROTOCOL_PROC_CREATE_LOCKSPACE = 8,
+};
+typedef enum virLockSpaceProtocolProcedure virLockSpaceProtocolProcedure;
+
+/* the xdr functions */
+
+#if defined(__STDC__) || defined(__cplusplus)
+extern bool_t xdr_virLockSpaceProtocolUUID (XDR *, virLockSpaceProtocolUUID);
+extern bool_t xdr_virLockSpaceProtocolNonNullString (XDR *, virLockSpaceProtocolNonNullString*);
+extern bool_t xdr_virLockSpaceProtocolString (XDR *, virLockSpaceProtocolString*);
+extern bool_t xdr_virLockSpaceProtocolOwner (XDR *, virLockSpaceProtocolOwner*);
+extern bool_t xdr_virLockSpaceProtocolRegisterArgs (XDR *, virLockSpaceProtocolRegisterArgs*);
+extern bool_t xdr_virLockSpaceProtocolRestrictArgs (XDR *, virLockSpaceProtocolRestrictArgs*);
+extern bool_t xdr_virLockSpaceProtocolNewArgs (XDR *, virLockSpaceProtocolNewArgs*);
+extern bool_t xdr_virLockSpaceProtocolCreateResourceArgs (XDR *, virLockSpaceProtocolCreateResourceArgs*);
+extern bool_t xdr_virLockSpaceProtocolDeleteResourceArgs (XDR *, virLockSpaceProtocolDeleteResourceArgs*);
+extern bool_t xdr_virLockSpaceProtocolAcquireResourceFlags (XDR *, virLockSpaceProtocolAcquireResourceFlags*);
+extern bool_t xdr_virLockSpaceProtocolAcquireResourceArgs (XDR *, virLockSpaceProtocolAcquireResourceArgs*);
+extern bool_t xdr_virLockSpaceProtocolReleaseResourceArgs (XDR *, virLockSpaceProtocolReleaseResourceArgs*);
+extern bool_t xdr_virLockSpaceProtocolCreateLockSpaceArgs (XDR *, virLockSpaceProtocolCreateLockSpaceArgs*);
+extern bool_t xdr_virLockSpaceProtocolProcedure (XDR *, virLockSpaceProtocolProcedure*);
+
+#else /* K&R C */
+extern bool_t xdr_virLockSpaceProtocolUUID ();
+extern bool_t xdr_virLockSpaceProtocolNonNullString ();
+extern bool_t xdr_virLockSpaceProtocolString ();
+extern bool_t xdr_virLockSpaceProtocolOwner ();
+extern bool_t xdr_virLockSpaceProtocolRegisterArgs ();
+extern bool_t xdr_virLockSpaceProtocolRestrictArgs ();
+extern bool_t xdr_virLockSpaceProtocolNewArgs ();
+extern bool_t xdr_virLockSpaceProtocolCreateResourceArgs ();
+extern bool_t xdr_virLockSpaceProtocolDeleteResourceArgs ();
+extern bool_t xdr_virLockSpaceProtocolAcquireResourceFlags ();
+extern bool_t xdr_virLockSpaceProtocolAcquireResourceArgs ();
+extern bool_t xdr_virLockSpaceProtocolReleaseResourceArgs ();
+extern bool_t xdr_virLockSpaceProtocolCreateLockSpaceArgs ();
+extern bool_t xdr_virLockSpaceProtocolProcedure ();
+
+#endif /* K&R C */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !_LOCK_PROTOCOL_H_RPCGEN */
diff --git a/src/locking/lock_protocol.x b/src/locking/lock_protocol.x
new file mode 100644
index 000000000..5f40f9afd
--- /dev/null
+++ b/src/locking/lock_protocol.x
@@ -0,0 +1,95 @@
+/* -*- c -*-
+ */
+
+%#include "internal.h"
+
+typedef opaque virLockSpaceProtocolUUID[VIR_UUID_BUFLEN];
+
+/* Length of long, but not unbounded, strings.
+ * This is an arbitrary limit designed to stop the decoder from trying
+ * to allocate unbounded amounts of memory when fed with a bad message.
+ */
+const VIR_LOCK_SPACE_PROTOCOL_STRING_MAX = 65536;
+
+/* A long string, which may NOT be NULL. */
+typedef string virLockSpaceProtocolNonNullString<VIR_LOCK_SPACE_PROTOCOL_STRING_MAX>;
+
+/* A long string, which may be NULL. */
+typedef virLockSpaceProtocolNonNullString *virLockSpaceProtocolString;
+
+struct virLockSpaceProtocolOwner {
+ virLockSpaceProtocolUUID uuid;
+ virLockSpaceProtocolNonNullString name;
+ unsigned int id;
+ unsigned int pid;
+};
+
+struct virLockSpaceProtocolRegisterArgs {
+ virLockSpaceProtocolOwner owner;
+ unsigned int flags;
+};
+
+struct virLockSpaceProtocolRestrictArgs {
+ unsigned int flags;
+};
+
+struct virLockSpaceProtocolNewArgs {
+ virLockSpaceProtocolNonNullString path;
+ unsigned int flags;
+};
+
+struct virLockSpaceProtocolCreateResourceArgs {
+ virLockSpaceProtocolNonNullString path;
+ virLockSpaceProtocolNonNullString name;
+ unsigned int flags;
+};
+
+struct virLockSpaceProtocolDeleteResourceArgs {
+ virLockSpaceProtocolNonNullString path;
+ virLockSpaceProtocolNonNullString name;
+ unsigned int flags;
+};
+
+enum virLockSpaceProtocolAcquireResourceFlags {
+ VIR_LOCK_SPACE_PROTOCOL_ACQUIRE_RESOURCE_SHARED = 1,
+ VIR_LOCK_SPACE_PROTOCOL_ACQUIRE_RESOURCE_AUTOCREATE = 2
+};
+
+struct virLockSpaceProtocolAcquireResourceArgs {
+ virLockSpaceProtocolNonNullString path;
+ virLockSpaceProtocolNonNullString name;
+ unsigned int flags;
+};
+
+struct virLockSpaceProtocolReleaseResourceArgs {
+ virLockSpaceProtocolNonNullString path;
+ virLockSpaceProtocolNonNullString name;
+ unsigned int flags;
+};
+
+struct virLockSpaceProtocolCreateLockSpaceArgs {
+ virLockSpaceProtocolNonNullString path;
+};
+
+
+/* Define the program number, protocol version and procedure numbers here. */
+const VIR_LOCK_SPACE_PROTOCOL_PROGRAM = 0xEA7BEEF;
+const VIR_LOCK_SPACE_PROTOCOL_PROGRAM_VERSION = 1;
+
+enum virLockSpaceProtocolProcedure {
+ /* Each function must have a two-word comment. The first word is
+ * whether remote_generator.pl handles daemon, the second whether
+ * it handles src/remote. Additional flags can be specified after a
+ * pipe.
+ */
+ VIR_LOCK_SPACE_PROTOCOL_PROC_REGISTER = 1, /* skipgen skipgen */
+ VIR_LOCK_SPACE_PROTOCOL_PROC_RESTRICT = 2, /* skipgen skipgen */
+ VIR_LOCK_SPACE_PROTOCOL_PROC_NEW = 3, /* skipgen skipgen */
+ VIR_LOCK_SPACE_PROTOCOL_PROC_CREATE_RESOURCE = 4, /* skipgen skipgen */
+ VIR_LOCK_SPACE_PROTOCOL_PROC_DELETE_RESOURCE = 5, /* skipgen skipgen */
+
+ VIR_LOCK_SPACE_PROTOCOL_PROC_ACQUIRE_RESOURCE = 6, /* skipgen skipgen */
+ VIR_LOCK_SPACE_PROTOCOL_PROC_RELEASE_RESOURCE = 7, /* skipgen skipgen */
+
+ VIR_LOCK_SPACE_PROTOCOL_PROC_CREATE_LOCKSPACE = 8 /* skipgen skipgen */
+};
diff --git a/src/locking/lockd.conf b/src/locking/lockd.conf
new file mode 100644
index 000000000..85edb917a
--- /dev/null
+++ b/src/locking/lockd.conf
@@ -0,0 +1,68 @@
+
+#
+# The default lockd behaviour is to acquire locks directly
+# against each configured disk file / block device. If the
+# application wishes to instead manually manage leases in
+# the guest XML, then this parameter can be disabled
+#
+#auto_disk_leases = 0
+
+#
+# Flag to determine whether we allow starting of guests
+# which do not have any <lease> elements defined in their
+# configuration.
+#
+# If 'auto_disk_leases' is disabled, this setting defaults
+# to enabled, otherwise it defaults to disabled.
+#
+#require_lease_for_disks = 1
+
+
+#
+# The default lockd behaviour is to use the "direct"
+# lockspace, where the locks are acquired against the
+# actual file paths associated with the <disk> devices.
+#
+# Setting a directory here causes lockd to use "indirect"
+# lockspace, where a hash of the <disk> file path is
+# used to create a file in the lockspace directory. The
+# locks are then held on these hash files instead.
+#
+# This can be useful if the file paths refer to block
+# devices which are shared, since /dev fcntl() locks
+# don't propagate across hosts. It is also useful if
+# the filesystem does not support fcntl() locks.
+#
+# Typically this directory would be located on a shared
+# filesystem visible to all hosts accessing the same
+# storage.
+#
+#file_lockspace_dir = "/var/lib/libvirt/lockd/files"
+
+
+#
+# When using LVM volumes that can be visible across
+# multiple, it is desirable to do locking based on
+# the unique UUID associated with each volume, instead
+# of their paths. Setting this path causes libvirt to
+# do UUID based locking for LVM.
+#
+# Typically this directory would be located on a shared
+# filesystem visible to all hosts accessing the same
+# storage.
+#
+#lvm_lockspace_dir = "/var/lib/libvirt/lockd/lvmvolumes"
+
+
+#
+# When using SCSI volumes that can be visible across
+# multiple, it is desirable to do locking based on
+# the unique UUID associated with each volume, instead
+# of their paths. Setting this path causes libvirt to
+# do UUID based locking for SCSI.
+#
+# Typically this directory would be located on a shared
+# filesystem visible to all hosts accessing the same
+# storage.
+#
+#scsi_lockspace_dir = "/var/lib/libvirt/lockd/scsivolumes"
diff --git a/src/locking/test_libvirt_lockd.aug.in b/src/locking/test_libvirt_lockd.aug.in
new file mode 100644
index 000000000..52b37541c
--- /dev/null
+++ b/src/locking/test_libvirt_lockd.aug.in
@@ -0,0 +1,9 @@
+module Test_libvirt_lockd =
+ ::CONFIG::
+
+ test Libvirt_lockd.lns get conf =
+{ "auto_disk_leases" = "0" }
+{ "require_lease_for_disks" = "1" }
+{ "file_lockspace_dir" = "/var/lib/libvirt/lockd/files" }
+{ "lvm_lockspace_dir" = "/var/lib/libvirt/lockd/lvmvolumes" }
+{ "scsi_lockspace_dir" = "/var/lib/libvirt/lockd/scsivolumes" }
diff --git a/src/locking/virtlockd.init.in b/src/locking/virtlockd.init.in
new file mode 100644
index 000000000..e55cbf90c
--- /dev/null
+++ b/src/locking/virtlockd.init.in
@@ -0,0 +1,93 @@
+#!/bin/sh
+
+# the following is the LSB init header see
+# http://www.linux-foundation.org/spec//booksets/LSB-Core-generic/LSB-Core-generic.html#INITSCRCOMCONV
+#
+### BEGIN INIT INFO
+# Provides: virtlockd
+# Default-Start: 3 4 5
+# Short-Description: virtual machine lock manager
+# Description: This is a daemon for managing locks
+# on virtual machine disk images
+### END INIT INFO
+
+# the following is chkconfig init header
+#
+# virtlockd: virtual machine lock manager
+#
+# chkconfig: 345 97 03
+# description: This is a daemon for managing locks \
+# on virtual machine disk images
+#
+# processname: virtlockd
+# pidfile: ::localstatedir::/run/libvirt/virtlockd.pid
+#
+
+# Source function library.
+. ::sysconfdir::/rc.d/init.d/functions
+
+SERVICE=virtlockd
+PROCESS=virtlockd
+PIDFILE=::localstatedir::/run/libvirt/lockd/$SERVICE.pid
+
+VIRTLOCKD_ARGS=
+
+test -f ::sysconfdir::/sysconfig/virtlockd && . ::sysconfdir::/sysconfig/virtlockd
+
+RETVAL=0
+
+start() {
+ echo -n $"Starting $SERVICE daemon: "
+ daemon --pidfile $PIDFILE --check $SERVICE $PROCESS --daemon $VIRTLOCKD_ARGS
+ RETVAL=$?
+ echo
+ [ $RETVAL -eq 0 ] && touch ::localstatedir::/lock/subsys/$SERVICE
+}
+
+stop() {
+ echo -n $"Stopping $SERVICE daemon: "
+
+ killproc -p $PIDFILE $PROCESS
+ RETVAL=$?
+ echo
+ if [ $RETVAL -eq 0 ]; then
+ rm -f ::localstatedir::/lock/subsys/$SERVICE
+ rm -f $PIDFILE
+ fi
+}
+
+restart() {
+ stop
+ start
+}
+
+reload() {
+ echo -n $"Reloading $SERVICE configuration: "
+
+ killproc -p $PIDFILE $PROCESS -HUP
+ RETVAL=$?
+ echo
+ return $RETVAL
+}
+
+# See how we were called.
+case "$1" in
+ start|stop|restart|reload)
+ $1
+ ;;
+ status)
+ status -p $PIDFILE $PROCESS
+ RETVAL=$?
+ ;;
+ force-reload)
+ reload
+ ;;
+ condrestart|try-restart)
+ [ -f ::localstatedir::/lock/subsys/$SERVICE ] && restart || :
+ ;;
+ *)
+ echo $"Usage: $0 {start|stop|status|restart|condrestart|reload|force-reload|try-restart}"
+ exit 2
+ ;;
+esac
+exit $RETVAL
diff --git a/src/locking/virtlockd.service.in b/src/locking/virtlockd.service.in
new file mode 100644
index 000000000..a9f9f932c
--- /dev/null
+++ b/src/locking/virtlockd.service.in
@@ -0,0 +1,13 @@
+[Unit]
+Description=Virtual machine lock manager
+Requires=virtlockd.socket
+After=syslog.target
+
+[Service]
+EnvironmentFile=-/etc/sysconfig/virtlockd
+ExecStart=@sbindir@/virtlockd
+ExecReload=/bin/kill -HUP $MAINPID
+# Loosing the locks is a really bad thing that will
+# cause the machine to be fenced (rebooted), so make
+# sure we discourage OOM killer
+OOMScoreAdjust=-900
diff --git a/src/locking/virtlockd.socket.in b/src/locking/virtlockd.socket.in
new file mode 100644
index 000000000..0589a2901
--- /dev/null
+++ b/src/locking/virtlockd.socket.in
@@ -0,0 +1,8 @@
+[Unit]
+Description=Virtual machine lock manager socket
+
+[Socket]
+ListenStream=/var/run/libvirt/virtlockd/virtlockd.sock
+
+[Install]
+WantedBy=multi-user.target
diff --git a/src/locking/virtlockd.sysconf b/src/locking/virtlockd.sysconf
new file mode 100644
index 000000000..d44dc464c
--- /dev/null
+++ b/src/locking/virtlockd.sysconf
@@ -0,0 +1,3 @@
+#
+# Pass extra arguments to virtlockd
+#VIRTLOCKD_ARGS=
diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c
index 3dd98ad5f..c62e72970 100644
--- a/src/network/bridge_driver.c
+++ b/src/network/bridge_driver.c
@@ -669,7 +669,7 @@ networkDnsmasqConfContents(virNetworkObjPtr network,
"##OVERWRITTEN AND LOST. Changes to this "
"configuration should be made using:\n"
"## virsh net-edit %s\n"
- "## of other applications using the libvirt API.\n"
+ "## or other application using the libvirt API.\n"
"##\n## dnsmasq conf file created by libvirt\n"
"strict-order\n"
"domain-needed\n",
@@ -689,6 +689,9 @@ networkDnsmasqConfContents(virNetworkObjPtr network,
if (pidfile)
virBufferAsprintf(&configbuf, "pid-file=%s\n", pidfile);
+ /* dnsmasq will *always* listen on localhost unless told otherwise */
+ virBufferAddLit(&configbuf, "except-interface=lo\n");
+
if (dnsmasqCapsGet(caps, DNSMASQ_CAPS_BIND_DYNAMIC)) {
/* using --bind-dynamic with only --interface (no
* --listen-address) prevents dnsmasq from responding to dns
@@ -702,9 +705,7 @@ networkDnsmasqConfContents(virNetworkObjPtr network,
"interface=%s\n",
network->def->bridge);
} else {
- virBufferAddLit(&configbuf,
- "bind-interfaces\n"
- "except-interface=lo\n");
+ virBufferAddLit(&configbuf, "bind-interfaces\n");
/*
* --interface does not actually work with dnsmasq < 2.47,
* due to DAD for ipv6 addresses on the interface.
@@ -1122,7 +1123,7 @@ networkRefreshDhcpDaemon(struct network_driver *driver,
dnsmasqContext *dctx = NULL;
/* if no IP addresses specified, nothing to do */
- if (virNetworkDefGetIpByIndex(network->def, AF_UNSPEC, 0))
+ if (!virNetworkDefGetIpByIndex(network->def, AF_UNSPEC, 0))
return 0;
/* if there's no running dnsmasq, just start it */
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index 98e65f16c..4ebba042f 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -2298,7 +2298,7 @@ qemuCapsInitQMP(qemuCapsPtr caps,
virCommandPtr cmd = NULL;
qemuMonitorPtr mon = NULL;
int major, minor, micro;
- char *package;
+ char *package = NULL;
int status = 0;
virDomainChrSourceDef config;
char *monarg = NULL;
@@ -2442,6 +2442,7 @@ cleanup:
virCommandFree(cmd);
VIR_FREE(monarg);
VIR_FREE(monpath);
+ VIR_FREE(package);
if (pidfile) {
char ebuf[1024];
diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
index 8d380a110..a1b1d04ab 100644
--- a/src/qemu/qemu_conf.c
+++ b/src/qemu/qemu_conf.c
@@ -34,7 +34,6 @@
#include <sys/wait.h>
#include <arpa/inet.h>
#include <sys/utsname.h>
-#include <mntent.h>
#include "virterror_internal.h"
#include "qemu_conf.h"
@@ -117,7 +116,10 @@ int qemuLoadDriverConfig(virQEMUDriverPtr driver,
}
#endif
- if (!(driver->lockManager = virLockManagerPluginNew("nop", NULL, 0)))
+ if (!(driver->lockManager = virLockManagerPluginNew("nop",
+ "qemu",
+ driver->configBaseDir,
+ 0)))
goto cleanup;
driver->keepAliveInterval = 5;
@@ -359,15 +361,10 @@ int qemuLoadDriverConfig(virQEMUDriverPtr driver,
p = virConfGetValue(conf, "lock_manager");
CHECK_TYPE("lock_manager", VIR_CONF_STRING);
if (p && p->str) {
- char *lockConf;
virLockManagerPluginUnref(driver->lockManager);
- if (virAsprintf(&lockConf, "%s/libvirt/qemu-%s.conf", SYSCONFDIR, p->str) < 0)
- goto no_memory;
-
if (!(driver->lockManager =
- virLockManagerPluginNew(p->str, lockConf, 0)))
+ virLockManagerPluginNew(p->str, "qemu", driver->configBaseDir, 0)))
VIR_ERROR(_("Failed to load lock manager %s"), p->str);
- VIR_FREE(lockConf);
}
GET_VALUE_LONG("max_queued", driver->max_queued);
diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h
index d0d25ceb2..1a39946d6 100644
--- a/src/qemu/qemu_conf.h
+++ b/src/qemu/qemu_conf.h
@@ -79,8 +79,9 @@ struct _virQEMUDriver {
virDomainObjList domains;
- /* These four directories are ones libvirtd uses (so must be root:root
+ /* These five directories are ones libvirtd uses (so must be root:root
* to avoid security risk from QEMU processes */
+ char *configBaseDir;
char *configDir;
char *autostartDir;
char *logDir;
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 2fda44e3e..2dd692295 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -187,11 +187,20 @@ struct qemuAutostartData {
virConnectPtr conn;
};
-
-/* Looks up the domain object and unlocks the driver. The returned domain
- * object is locked and the caller is responsible for unlocking it. */
+/**
+ * qemuDomObjFromDomainDriver:
+ * @domain: Domain pointer that has to be looked up
+ * @drv: Pointer to virQEMUDriverPtr to return the driver object
+ *
+ * This function looks up @domain in the domain list and returns the
+ * appropriate virDomainObjPtr. On successful lookup, both driver and domain
+ * object are returned locked.
+ *
+ * Returns the domain object if it's found and the driver. Both are locked.
+ * In case of failure NULL is returned and the driver isn't locked.
+ */
static virDomainObjPtr
-qemuDomObjFromDomain(virDomainPtr domain)
+qemuDomObjFromDomainDriver(virDomainPtr domain, virQEMUDriverPtr *drv)
{
virQEMUDriverPtr driver = domain->conn->privateData;
virDomainObjPtr vm;
@@ -199,16 +208,42 @@ qemuDomObjFromDomain(virDomainPtr domain)
qemuDriverLock(driver);
vm = virDomainFindByUUID(&driver->domains, domain->uuid);
- qemuDriverUnlock(driver);
if (!vm) {
virUUIDFormat(domain->uuid, uuidstr);
virReportError(VIR_ERR_NO_DOMAIN,
_("no domain with matching uuid '%s'"), uuidstr);
+ qemuDriverUnlock(driver);
+ *drv = NULL;
+ return NULL;
}
+ *drv = driver;
return vm;
}
+/**
+ * qemuDomObjFromDomain:
+ * @domain: Domain pointer that has to be looked up
+ *
+ * This function looks up @domain and returns the appropriate
+ * virDomainObjPtr. The driver is unlocked after the call.
+ *
+ * Returns the domain object which is locked on success, NULL
+ * otherwise. The driver remains unlocked after the call.
+ */
+static virDomainObjPtr
+qemuDomObjFromDomain(virDomainPtr domain)
+{
+ virDomainObjPtr vm;
+ virQEMUDriverPtr driver;
+
+ if (!(vm = qemuDomObjFromDomainDriver(domain, &driver)))
+ return NULL;
+
+ qemuDriverUnlock(driver);
+
+ return vm;
+}
/* Looks up the domain object from snapshot and unlocks the driver. The
* returned domain object is locked and the caller is responsible for
@@ -614,7 +649,7 @@ qemuStartup(bool privileged,
virStateInhibitCallback callback,
void *opaque)
{
- char *base = NULL;
+ char *base;
char *driverConf = NULL;
int rc;
virConnectPtr conn = NULL;
@@ -657,8 +692,9 @@ qemuStartup(bool privileged,
"%s/log/libvirt/qemu", LOCALSTATEDIR) == -1)
goto out_of_memory;
- if ((base = strdup(SYSCONFDIR "/libvirt")) == NULL)
+ if ((qemu_driver->configBaseDir = strdup(SYSCONFDIR "/libvirt")) == NULL)
goto out_of_memory;
+ base = qemu_driver->configBaseDir;
if (virAsprintf(&qemu_driver->stateDir,
"%s/run/libvirt/qemu", LOCALSTATEDIR) == -1)
@@ -708,9 +744,9 @@ qemuStartup(bool privileged,
}
VIR_FREE(rundir);
- base = virGetUserConfigDirectory();
- if (!base)
+ if (!(qemu_driver->configBaseDir = virGetUserConfigDirectory()))
goto error;
+ base = qemu_driver->configBaseDir;
if (virAsprintf(&qemu_driver->libDir, "%s/qemu/lib", base) == -1)
goto out_of_memory;
if (virAsprintf(&qemu_driver->saveDir, "%s/qemu/save", base) == -1)
@@ -760,8 +796,6 @@ qemuStartup(bool privileged,
virAsprintf(&qemu_driver->autostartDir, "%s/qemu/autostart", base) < 0)
goto out_of_memory;
- VIR_FREE(base);
-
rc = virCgroupForDriver("qemu", &qemu_driver->cgroup, privileged, 1);
if (rc < 0) {
VIR_INFO("Unable to create cgroup for driver: %s",
@@ -934,7 +968,6 @@ error:
qemuDriverUnlock(qemu_driver);
if (conn)
virConnectClose(conn);
- VIR_FREE(base);
VIR_FREE(driverConf);
VIR_FREE(membase);
VIR_FREE(mempath);
@@ -1074,6 +1107,7 @@ qemuShutdown(void) {
qemuDriverCloseCallbackShutdown(qemu_driver);
+ VIR_FREE(qemu_driver->configBaseDir);
VIR_FREE(qemu_driver->configDir);
VIR_FREE(qemu_driver->autostartDir);
VIR_FREE(qemu_driver->logDir);
@@ -3189,7 +3223,8 @@ qemuDomainSave(virDomainPtr dom, const char *path)
}
static char *
-qemuDomainManagedSavePath(virQEMUDriverPtr driver, virDomainObjPtr vm) {
+qemuDomainManagedSavePath(virQEMUDriverPtr driver, virDomainObjPtr vm)
+{
char *ret;
if (virAsprintf(&ret, "%s/%s.save", driver->saveDir, vm->def->name) < 0) {
@@ -3203,8 +3238,8 @@ qemuDomainManagedSavePath(virQEMUDriverPtr driver, virDomainObjPtr vm) {
static int
qemuDomainManagedSave(virDomainPtr dom, unsigned int flags)
{
- virQEMUDriverPtr driver = dom->conn->privateData;
- virDomainObjPtr vm = NULL;
+ virQEMUDriverPtr driver;
+ virDomainObjPtr vm;
char *name = NULL;
int ret = -1;
int compressed;
@@ -3213,15 +3248,8 @@ qemuDomainManagedSave(virDomainPtr dom, unsigned int flags)
VIR_DOMAIN_SAVE_RUNNING |
VIR_DOMAIN_SAVE_PAUSED, -1);
- qemuDriverLock(driver);
- vm = virDomainFindByUUID(&driver->domains, dom->uuid);
- if (!vm) {
- char uuidstr[VIR_UUID_STRING_BUFLEN];
- virUUIDFormat(dom->uuid, uuidstr);
- virReportError(VIR_ERR_NO_DOMAIN,
- _("no domain with matching uuid '%s'"), uuidstr);
- goto cleanup;
- }
+ if (!(vm = qemuDomObjFromDomainDriver(dom, &driver)))
+ return -1;
if (!virDomainObjIsActive(vm)) {
virReportError(VIR_ERR_OPERATION_INVALID,
@@ -3234,8 +3262,7 @@ qemuDomainManagedSave(virDomainPtr dom, unsigned int flags)
goto cleanup;
}
- name = qemuDomainManagedSavePath(driver, vm);
- if (name == NULL)
+ if (!(name = qemuDomainManagedSavePath(driver, vm)))
goto cleanup;
VIR_INFO("Saving state to %s", name);
@@ -3280,62 +3307,48 @@ cleanup:
static int
qemuDomainHasManagedSaveImage(virDomainPtr dom, unsigned int flags)
{
- virQEMUDriverPtr driver = dom->conn->privateData;
virDomainObjPtr vm = NULL;
- int ret = -1;
+ int ret;
virCheckFlags(0, -1);
- qemuDriverLock(driver);
- vm = virDomainFindByUUID(&driver->domains, dom->uuid);
- if (!vm) {
- char uuidstr[VIR_UUID_STRING_BUFLEN];
- virUUIDFormat(dom->uuid, uuidstr);
- virReportError(VIR_ERR_NO_DOMAIN,
- _("no domain with matching uuid '%s'"), uuidstr);
- goto cleanup;
- }
+ if (!(vm = qemuDomObjFromDomain(dom)))
+ return -1;
ret = vm->hasManagedSave;
-
-cleanup:
- if (vm)
- virDomainObjUnlock(vm);
- qemuDriverUnlock(driver);
+ virDomainObjUnlock(vm);
return ret;
}
static int
qemuDomainManagedSaveRemove(virDomainPtr dom, unsigned int flags)
{
- virQEMUDriverPtr driver = dom->conn->privateData;
- virDomainObjPtr vm = NULL;
+ virQEMUDriverPtr driver;
+ virDomainObjPtr vm;
int ret = -1;
char *name = NULL;
virCheckFlags(0, -1);
- qemuDriverLock(driver);
- vm = virDomainFindByUUID(&driver->domains, dom->uuid);
- if (!vm) {
- char uuidstr[VIR_UUID_STRING_BUFLEN];
- virUUIDFormat(dom->uuid, uuidstr);
- virReportError(VIR_ERR_NO_DOMAIN,
- _("no domain with matching uuid '%s'"), uuidstr);
+ if (!(vm = qemuDomObjFromDomainDriver(dom, &driver)))
+ return -1;
+
+ if (!(name = qemuDomainManagedSavePath(driver, vm)))
goto cleanup;
- }
- name = qemuDomainManagedSavePath(driver, vm);
- if (name == NULL)
+ if (unlink(name) < 0) {
+ virReportSystemError(errno,
+ _("Failed to remove managed save file '%s'"),
+ name);
goto cleanup;
+ }
- ret = unlink(name);
vm->hasManagedSave = false;
+ ret = 0;
cleanup:
VIR_FREE(name);
- if (vm)
- virDomainObjUnlock(vm);
+ virDomainObjUnlock(vm);
qemuDriverUnlock(driver);
return ret;
}
@@ -8885,7 +8898,7 @@ cleanup:
}
#else
static int
-qemuDomainInterfaceStats(virDomainPtr dom,
+qemuDomainInterfaceStats(virDomainPtr dom ATTRIBUTE_UNUSED,
const char *path ATTRIBUTE_UNUSED,
struct _virDomainInterfaceStats *stats ATTRIBUTE_UNUSED)
{
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index 3dfdb65ad..e9a5e3570 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -1306,8 +1306,14 @@ qemuDomainChangeNetBridge(virConnectPtr conn,
if (oldbridge) {
ret = virNetDevBridgeRemovePort(oldbridge, olddev->ifname);
virDomainAuditNet(vm, olddev, NULL, "detach", ret == 0);
- if (ret < 0)
- goto cleanup;
+ if (ret < 0) {
+ /* warn but continue - possibly the old network
+ * had been destroyed and reconstructed, leaving the
+ * tap device orphaned.
+ */
+ VIR_WARN("Unable to detach device %s from bridge %s",
+ olddev->ifname, oldbridge);
+ }
}
ret = virNetDevBridgeAddPort(newbridge, olddev->ifname);
diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
index 5ad6c15ab..131e8df35 100644
--- a/src/qemu/qemu_monitor.c
+++ b/src/qemu/qemu_monitor.c
@@ -1428,16 +1428,16 @@ qemuMonitorGetBlockInfo(qemuMonitorPtr mon)
struct qemuDomainDiskInfo *
qemuMonitorBlockInfoLookup(virHashTablePtr blockInfo,
- const char *devname)
+ const char *dev)
{
struct qemuDomainDiskInfo *info;
- VIR_DEBUG("blockInfo=%p dev=%s", blockInfo, NULLSTR(devname));
+ VIR_DEBUG("blockInfo=%p dev=%s", blockInfo, NULLSTR(dev));
- if (!(info = virHashLookup(blockInfo, devname))) {
+ if (!(info = virHashLookup(blockInfo, dev))) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("cannot find info for device '%s'"),
- NULLSTR(devname));
+ NULLSTR(dev));
}
return info;
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 4418f3330..cc0e9472e 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -27,7 +27,12 @@
#include <sys/stat.h>
#include <sys/time.h>
#include <sys/resource.h>
-#include <linux/capability.h>
+#if defined(__linux__)
+# include <linux/capability.h>
+#elif defined(__FreeBSD__)
+# include <sys/param.h>
+# include <sys/cpuset.h>
+#endif
#include "qemu_process.h"
#include "qemu_domain.h"
@@ -3716,7 +3721,12 @@ int qemuProcessStart(virConnectPtr conn,
/* in case a certain disk is desirous of CAP_SYS_RAWIO, add this */
for (i = 0; i < vm->def->ndisks; i++) {
if (vm->def->disks[i]->rawio == 1)
+#ifdef CAP_SYS_RAWIO
virCommandAllowCap(cmd, CAP_SYS_RAWIO);
+#else
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("Raw I/O is not supported on this platform"));
+#endif
}
virCommandSetPreExecHook(cmd, qemuProcessHook, &hookData);
diff --git a/src/rpc/virnetsocket.c b/src/rpc/virnetsocket.c
index a1b64d730..70c621f63 100644
--- a/src/rpc/virnetsocket.c
+++ b/src/rpc/virnetsocket.c
@@ -35,6 +35,10 @@
# include <netinet/tcp.h>
#endif
+#ifdef HAVE_SYS_UCRED_H
+# include <sys/ucred.h>
+#endif
+
#include "c-ctype.h"
#include "virnetsocket.h"
#include "util.h"
@@ -1091,7 +1095,7 @@ int virNetSocketGetPort(virNetSocketPtr sock)
}
-#ifdef SO_PEERCRED
+#if defined(SO_PEERCRED)
int virNetSocketGetUNIXIdentity(virNetSocketPtr sock,
uid_t *uid,
gid_t *gid,
@@ -1115,6 +1119,30 @@ int virNetSocketGetUNIXIdentity(virNetSocketPtr sock,
virMutexUnlock(&sock->lock);
return 0;
}
+#elif defined(LOCAL_PEERCRED)
+int virNetSocketGetUNIXIdentity(virNetSocketPtr sock,
+ uid_t *uid,
+ gid_t *gid,
+ pid_t *pid)
+{
+ struct xucred cr;
+ socklen_t cr_len = sizeof(cr);
+ virMutexLock(&sock->lock);
+
+ if (getsockopt(sock->fd, SOL_SOCKET, LOCAL_PEERCRED, &cr, &cr_len) < 0) {
+ virReportSystemError(errno, "%s",
+ _("Failed to get client socket identity"));
+ virMutexUnlock(&sock->lock);
+ return -1;
+ }
+
+ *pid = -1;
+ *uid = cr.cr_uid;
+ *gid = cr.cr_gid;
+
+ virMutexUnlock(&sock->lock);
+ return 0;
+}
#else
int virNetSocketGetUNIXIdentity(virNetSocketPtr sock ATTRIBUTE_UNUSED,
uid_t *uid ATTRIBUTE_UNUSED,
diff --git a/src/security/security_selinux.c b/src/security/security_selinux.c
index 5409e32a4..9134bc837 100644
--- a/src/security/security_selinux.c
+++ b/src/security/security_selinux.c
@@ -1993,7 +1993,8 @@ virSecuritySELinuxGetSecurityMountOptions(virSecurityManagerPtr mgr,
return NULL;
}
- VIR_DEBUG("imageLabel=%s opts=%s", secdef->imagelabel, opts);
+ VIR_DEBUG("imageLabel=%s opts=%s",
+ secdef ? secdef->imagelabel : "(null)", opts);
return opts;
}
diff --git a/src/util/cgroup.c b/src/util/cgroup.c
index f867fb712..8f3b8b724 100644
--- a/src/util/cgroup.c
+++ b/src/util/cgroup.c
@@ -974,14 +974,17 @@ int virCgroupForDriver(const char *name ATTRIBUTE_UNUSED,
*
* Returns 0 on success
*/
+#if defined HAVE_MNTENT_H && defined HAVE_GETMNTENT_R
int virCgroupGetAppRoot(virCgroupPtr *group)
{
-#if defined HAVE_MNTENT_H && defined HAVE_GETMNTENT_R
return virCgroupNew("/", group);
+}
#else
+int virCgroupGetAppRoot(virCgroupPtr *group ATTRIBUTE_UNUSED)
+{
return -ENXIO;
-#endif
}
+#endif
/**
* virCgroupForDomain:
diff --git a/src/util/storage_file.c b/src/util/storage_file.c
index 441740470..3f85e0e2d 100644
--- a/src/util/storage_file.c
+++ b/src/util/storage_file.c
@@ -174,8 +174,8 @@ static struct FileTypeInfo const fileTypeInfo[] = {
},
[VIR_STORAGE_FILE_QED] = {
/* http://wiki.qemu.org/Features/QED */
- "QED\0", NULL,
- LV_LITTLE_ENDIAN, -1, -1,
+ "QED", NULL,
+ LV_LITTLE_ENDIAN, -2, -1,
QED_HDR_IMAGE_SIZE, 8, 1, -1, qedGetBackingStore,
},
[VIR_STORAGE_FILE_VMDK] = {
@@ -612,6 +612,10 @@ virStorageFileMatchesVersion(int format,
if (fileTypeInfo[format].versionOffset == -1)
return false;
+ /* -2 == non-versioned file format, so trivially match */
+ if (fileTypeInfo[format].versionOffset == -2)
+ return true;
+
if ((fileTypeInfo[format].versionOffset + 4) > buflen)
return false;
@@ -628,6 +632,9 @@ virStorageFileMatchesVersion(int format,
(buf[fileTypeInfo[format].versionOffset+2] << 8) |
(buf[fileTypeInfo[format].versionOffset+3]);
}
+
+ VIR_DEBUG("Compare detected version %d vs expected version %d",
+ version, fileTypeInfo[format].versionNumber);
if (version != fileTypeInfo[format].versionNumber)
return false;
@@ -650,6 +657,8 @@ virStorageFileGetMetadataFromBuf(int format,
size_t buflen,
virStorageFileMetadata *meta)
{
+ VIR_DEBUG("path=%s format=%d", path, format);
+
/* XXX we should consider moving virStorageBackendUpdateVolInfo
* code into this method, for non-magic files
*/
@@ -756,16 +765,26 @@ virStorageFileProbeFormatFromBuf(const char *path,
{
int format = VIR_STORAGE_FILE_RAW;
int i;
+ int possibleFormat = VIR_STORAGE_FILE_RAW;
+ VIR_DEBUG("path=%s", path);
/* First check file magic */
for (i = 0 ; i < VIR_STORAGE_FILE_LAST ; i++) {
- if (virStorageFileMatchesMagic(i, buf, buflen) &&
- virStorageFileMatchesVersion(i, buf, buflen)) {
+ if (virStorageFileMatchesMagic(i, buf, buflen)) {
+ if (!virStorageFileMatchesVersion(i, buf, buflen)) {
+ possibleFormat = i;
+ continue;
+ }
format = i;
goto cleanup;
}
}
+ if (possibleFormat != VIR_STORAGE_FILE_RAW)
+ VIR_WARN("File %s matches %s magic, but version is wrong. "
+ "Please report new version to libvir-list@redhat.com",
+ path, virStorageFileFormatTypeToString(possibleFormat));
+
/* No magic, so check file extension */
for (i = 0 ; i < VIR_STORAGE_FILE_LAST ; i++) {
if (virStorageFileMatchesExtension(i, path)) {
@@ -775,6 +794,7 @@ virStorageFileProbeFormatFromBuf(const char *path,
}
cleanup:
+ VIR_DEBUG("format=%d", format);
return format;
}
@@ -953,6 +973,9 @@ virStorageFileGetMetadataRecurse(const char *path, int format,
bool allow_probe, virHashTablePtr cycle)
{
int fd;
+ VIR_DEBUG("path=%s format=%d uid=%d gid=%d probe=%d",
+ path, format, (int)uid, (int)gid, allow_probe);
+
virStorageFileMetadataPtr ret = NULL;
if (virHashLookup(cycle, path)) {
@@ -1017,6 +1040,9 @@ virStorageFileGetMetadata(const char *path, int format,
uid_t uid, gid_t gid,
bool allow_probe)
{
+ VIR_DEBUG("path=%s format=%d uid=%d gid=%d probe=%d",
+ path, format, (int)uid, (int)gid, allow_probe);
+
virHashTablePtr cycle = virHashCreate(5, NULL);
virStorageFileMetadataPtr ret;
@@ -1192,62 +1218,75 @@ int virStorageFileIsClusterFS(const char *path)
}
#ifdef LVS
-const char *virStorageFileGetLVMKey(const char *path)
+int virStorageFileGetLVMKey(const char *path,
+ char **key)
{
/*
* # lvs --noheadings --unbuffered --nosuffix --options "uuid" LVNAME
* 06UgP5-2rhb-w3Bo-3mdR-WeoL-pytO-SAa2ky
*/
- char *key = NULL;
+ int status;
virCommandPtr cmd = virCommandNewArgList(
LVS,
"--noheadings", "--unbuffered", "--nosuffix",
"--options", "uuid", path,
NULL
);
+ int ret = -1;
+
+ *key = NULL;
/* Run the program and capture its output */
- virCommandSetOutputBuffer(cmd, &key);
- if (virCommandRun(cmd, NULL) < 0)
+ virCommandSetOutputBuffer(cmd, key);
+ if (virCommandRun(cmd, &status) < 0)
goto cleanup;
- if (key) {
+ /* Explicitly check status == 0, rather than passing NULL
+ * to virCommandRun because we don't want to raise an actual
+ * error in this scenario, just return a NULL key.
+ */
+
+ if (status == 0 && *key) {
char *nl;
- char *tmp = key;
+ char *tmp = *key;
/* Find first non-space character */
while (*tmp && c_isspace(*tmp)) {
tmp++;
}
/* Kill leading spaces */
- if (tmp != key)
- memmove(key, tmp, strlen(tmp)+1);
+ if (tmp != *key)
+ memmove(*key, tmp, strlen(tmp)+1);
/* Kill trailing newline */
- if ((nl = strchr(key, '\n')))
+ if ((nl = strchr(*key, '\n')))
*nl = '\0';
}
- if (key && STREQ(key, ""))
- VIR_FREE(key);
+ ret = 0;
cleanup:
+ if (*key && STREQ(*key, ""))
+ VIR_FREE(*key);
+
virCommandFree(cmd);
- return key;
+ return ret;
}
#else
-const char *virStorageFileGetLVMKey(const char *path)
+int virStorageFileGetLVMKey(const char *path,
+ char **key ATTRIBUTE_UNUSED)
{
virReportSystemError(ENOSYS, _("Unable to get LVM key for %s"), path);
- return NULL;
+ return -1;
}
#endif
#ifdef HAVE_UDEV
-const char *virStorageFileGetSCSIKey(const char *path)
+int virStorageFileGetSCSIKey(const char *path,
+ char **key)
{
- char *key = NULL;
+ int status;
virCommandPtr cmd = virCommandNewArgList(
"/lib/udev/scsi_id",
"--replace-whitespace",
@@ -1255,30 +1294,41 @@ const char *virStorageFileGetSCSIKey(const char *path)
"--device", path,
NULL
);
+ int ret = -1;
+
+ *key = NULL;
/* Run the program and capture its output */
- virCommandSetOutputBuffer(cmd, &key);
- if (virCommandRun(cmd, NULL) < 0)
+ virCommandSetOutputBuffer(cmd, key);
+ if (virCommandRun(cmd, &status) < 0)
goto cleanup;
- if (key && STRNEQ(key, "")) {
- char *nl = strchr(key, '\n');
+ /* Explicitly check status == 0, rather than passing NULL
+ * to virCommandRun because we don't want to raise an actual
+ * error in this scenario, just return a NULL key.
+ */
+ if (status == 0 && *key) {
+ char *nl = strchr(*key, '\n');
if (nl)
*nl = '\0';
- } else {
- VIR_FREE(key);
}
+ ret = 0;
+
cleanup:
+ if (*key && STREQ(*key, ""))
+ VIR_FREE(*key);
+
virCommandFree(cmd);
- return key;
+ return ret;
}
#else
-const char *virStorageFileGetSCSIKey(const char *path)
+int virStorageFileGetSCSIKey(const char *path,
+ char **key ATTRIBUTE_UNUSED)
{
virReportSystemError(ENOSYS, _("Unable to get SCSI key for %s"), path);
- return NULL;
+ return -1;
}
#endif
diff --git a/src/util/storage_file.h b/src/util/storage_file.h
index abfaca96b..6fbd2758c 100644
--- a/src/util/storage_file.h
+++ b/src/util/storage_file.h
@@ -101,7 +101,9 @@ int virStorageFileIsClusterFS(const char *path);
int virStorageFileIsSharedFSType(const char *path,
int fstypes);
-const char *virStorageFileGetLVMKey(const char *path);
-const char *virStorageFileGetSCSIKey(const char *path);
+int virStorageFileGetLVMKey(const char *path,
+ char **key);
+int virStorageFileGetSCSIKey(const char *path,
+ char **key);
#endif /* __VIR_STORAGE_FILE_H__ */
diff --git a/src/util/util.c b/src/util/util.c
index 3f244f595..05e7ca7d2 100644
--- a/src/util/util.c
+++ b/src/util/util.c
@@ -2530,23 +2530,16 @@ virGetUserIDByName(const char *name, uid_t *uid)
}
}
- if (rc != 0) {
- /* We explicitly test for the known error values returned by
- * getpwnam_r as the manpage says:
- * ERRORS
- * 0 or ENOENT or ESRCH or EBADF or EPERM or ...
- * The given name or uid was not found.
- */
- if ((rc == EINTR) || (rc == EIO) || (rc == EMFILE) ||
- (rc == ENFILE) || (rc == ENOMEM)) {
- virReportSystemError(rc, _("Failed to get user record for name '%s'"),
- name);
- goto cleanup;
- }
- }
-
if (!pw) {
- VIR_DEBUG("User record for user '%s' does not exist", name);
+ if (rc != 0) {
+ char buf[1024];
+ /* log the possible error from getpwnam_r. Unfortunately error
+ * reporting from this function is bad and we can't really
+ * rely on it, so we just report that the user wasn't found */
+ VIR_WARN("User record for user '%s' was not found: %s",
+ name, virStrerror(rc, buf, sizeof(buf)));
+ }
+
ret = 1;
goto cleanup;
}
@@ -2621,23 +2614,16 @@ virGetGroupIDByName(const char *name, gid_t *gid)
}
}
- if (rc != 0) {
- /* We explicitly test for the known error values returned by
- * getgrnam_r as the manpage says:
- * ERRORS
- * 0 or ENOENT or ESRCH or EBADF or EPERM or ...
- * The given name or gid was not found.
- */
- if ((rc == EINTR) || (rc == EIO) || (rc == EMFILE) ||
- (rc == ENFILE) || (rc == ENOMEM)) {
- virReportSystemError(rc, _("Failed to get group record for name '%s'"),
- name);
- goto cleanup;
- }
- }
-
if (!gr) {
- VIR_DEBUG("Group record for group '%s' does not exist", name);
+ if (rc != 0) {
+ char buf[1024];
+ /* log the possible error from getgrnam_r. Unfortunately error
+ * reporting from this function is bad and we can't really
+ * rely on it, so we just report that the user wasn't found */
+ VIR_WARN("Group record for user '%s' was not found: %s",
+ name, virStrerror(rc, buf, sizeof(buf)));
+ }
+
ret = 1;
goto cleanup;
}
diff --git a/src/util/virinitctl.c b/src/util/virinitctl.c
index cdd3dc048..e8949af3d 100644
--- a/src/util/virinitctl.c
+++ b/src/util/virinitctl.c
@@ -35,6 +35,8 @@
#define VIR_FROM_THIS VIR_FROM_INITCTL
+#if defined(__linux__) || \
+ (defined(__FreeBSD_kernel__) && !(defined(__FreeBSD__)))
/* These constants & struct definitions are taken from
* systemd, under terms of LGPLv2+
*
@@ -43,29 +45,29 @@
* Copyright (C) 1995-2004 Miquel van Smoorenburg
*/
-#if defined(__FreeBSD_kernel__)
-# define VIR_INITCTL_FIFO "/etc/.initctl"
-#else
-# define VIR_INITCTL_FIFO "/dev/initctl"
-#endif
-
-#define VIR_INITCTL_MAGIC 0x03091969
-#define VIR_INITCTL_CMD_START 0
-#define VIR_INITCTL_CMD_RUNLVL 1
-#define VIR_INITCTL_CMD_POWERFAIL 2
-#define VIR_INITCTL_CMD_POWERFAILNOW 3
-#define VIR_INITCTL_CMD_POWEROK 4
-#define VIR_INITCTL_CMD_BSD 5
-#define VIR_INITCTL_CMD_SETENV 6
-#define VIR_INITCTL_CMD_UNSETENV 7
-
-#define VIR_INITCTL_CMD_CHANGECONS 12345
-
-#ifdef MAXHOSTNAMELEN
-# define VIR_INITCTL_RQ_HLEN MAXHOSTNAMELEN
-#else
-# define VIR_INITCTL_RQ_HLEN 64
-#endif
+# if defined(__FreeBSD_kernel__)
+# define VIR_INITCTL_FIFO "/etc/.initctl"
+# else
+# define VIR_INITCTL_FIFO "/dev/initctl"
+# endif
+
+# define VIR_INITCTL_MAGIC 0x03091969
+# define VIR_INITCTL_CMD_START 0
+# define VIR_INITCTL_CMD_RUNLVL 1
+# define VIR_INITCTL_CMD_POWERFAIL 2
+# define VIR_INITCTL_CMD_POWERFAILNOW 3
+# define VIR_INITCTL_CMD_POWEROK 4
+# define VIR_INITCTL_CMD_BSD 5
+# define VIR_INITCTL_CMD_SETENV 6
+# define VIR_INITCTL_CMD_UNSETENV 7
+
+# define VIR_INITCTL_CMD_CHANGECONS 12345
+
+# ifdef MAXHOSTNAMELEN
+# define VIR_INITCTL_RQ_HLEN MAXHOSTNAMELEN
+# else
+# define VIR_INITCTL_RQ_HLEN 64
+# endif
/*
* This is what BSD 4.4 uses when talking to init.
@@ -161,3 +163,11 @@ cleanup:
VIR_FORCE_CLOSE(fd);
return ret;
}
+#else
+int virInitctlSetRunLevel(virInitctlRunLevel level ATTRIBUTE_UNUSED,
+ const char *vroot ATTRIBUTE_UNUSED)
+{
+ virReportError(VIR_ERR_NO_SUPPORT, "%s", __FUNCTION__);
+ return -1;
+}
+#endif