diff options
author | Guido Günther <agx@sigxcpu.org> | 2012-12-23 12:15:48 +0100 |
---|---|---|
committer | Guido Günther <agx@sigxcpu.org> | 2012-12-23 12:15:48 +0100 |
commit | e72245657ff92f2c6671fe33ee607cd1a93aba31 (patch) | |
tree | 342c89561206b8fb932269de94d7b6d68b613842 /src | |
parent | 751c235722d4e5b4a3dcbe485011ee1d13480d7b (diff) |
New upstream version 1.0.1
Diffstat (limited to 'src')
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 |