I've got a MinGW build environment setup on Fedora 10 now, so just checked
out what the latest state of libvirt CVS is.
With the attached patch, I can run configure with:
./configure \
--build=i686-pc-linux-gnu \
--host=i686-pc-mingw32 \
--prefix=/usr/i686-pc-mingw32/sys-root/mingw \
--without-libvirtd \
--without-xen \
--without-qemu \
--without-sasl \
--without-lxc \
--without-openvz \
--without-python
So, basically only the 'test' and 'remote' drivers are turned on. And do
a build which produces a libvirt-0.dll and a virsh.exe which is I can
run under Wine successfully.
The changes:
- The src/Makefile.am was conditionally turning off individual storage
driver backends, based on the WITH_LIBVIRTD conditional. THis gave
confusing diagnositics, since the configure summary said they were
turned on.
So, now configure itself turns off the storage drivers if libvirtd
is disabled.
- The storage_backend.c file is used by storage_Conf.c, so we need
to compile this even if all storage backends are disabled. So we
tweak src/Makefile.am to achieve this, and add a few more bits of
conditional logic inside storage_backend.c to cope with the base
directory pool driver not being available.
- Mingw is missing regex.h and sys/wait.h, which are used in the
generic storage_backend.c file. We check for those in configure
and conditionalize their inclusion. Furthermore we disable the
virStorageBackendRunProgRegex and virStorageBackendRunProgNul
functions on Windows, since they're not required and not compilable
without regex.h / sys/wait.h
- Mingw is mising getuid() and getgid() which are used in the storage_conf
XML parser. We check for and optionally disable them and initialize
uid/gid to 0 if missing.
- The virExec() stub routine for Mingw didn't have its signature updated
when i did the recent virExe changes. THis fixes that.
configure.in | 18 +++++++++++++---
qemud/remote_protocol.c | 1
qemud/remote_protocol.h | 1
qemud/remote_protocol.x | 1
src/Makefile.am | 6 ++---
src/storage_backend.c | 53 +++++++++++++++++++++++++++++++++++++++++++-----
src/storage_conf.c | 22 +++++++++++++++++--
src/util.c | 17 +++------------
8 files changed, 92 insertions(+), 27 deletions(-)
Daniel
diff -r 74dd97c354cc configure.in
--- a/configure.in Tue Sep 02 10:49:53 2008 -0400
+++ b/configure.in Wed Sep 03 08:24:04 2008 -0400
@@ -65,10 +65,10 @@
AC_SYS_LARGEFILE
dnl Availability of various common functions (non-fatal if missing).
-AC_CHECK_FUNCS([cfmakeraw regexec uname sched_getaffinity])
+AC_CHECK_FUNCS([cfmakeraw regexec uname sched_getaffinity getuid getgid])
dnl Availability of various common headers (non-fatal if missing).
-AC_CHECK_HEADERS([pwd.h paths.h sys/syslimits.h sys/utsname.h sys/wait.h winsock2.h
sched.h termios.h])
+AC_CHECK_HEADERS([pwd.h paths.h regex.h sys/syslimits.h sys/utsname.h sys/wait.h
winsock2.h sched.h termios.h])
dnl Where are the XDR functions?
dnl If portablexdr is installed, prefer that.
@@ -648,6 +648,18 @@
[ --with-storage-iscsi with iSCSI backend for the storage driver
(on)],[],[with_storage_iscsi=check])
AC_ARG_WITH([storage-disk],
[ --with-storage-disk with GPartd Disk backend for the storage driver
(on)],[],[with_storage_disk=check])
+
+with_storage_dir=yes
+if test "$with_libvirtd" = "no"; then
+ with_storage_dir=no
+ with_storage_fs=no
+ with_storage_lvm=no
+ with_storage_iscsi=no
+ with_storage_disk=no
+fi
+
+AM_CONDITIONAL([WITH_STORAGE_DIR], [test "$with_storage_dir" =
"yes"])
+
if test "$with_storage_fs" = "yes" -o "$with_storage_fs" =
"check"; then
AC_PATH_PROG([MOUNT], [mount], [], [$PATH:/sbin:/usr/sbin])
@@ -1053,7 +1065,7 @@
AC_MSG_NOTICE([])
AC_MSG_NOTICE([Storage Drivers])
AC_MSG_NOTICE([])
-AC_MSG_NOTICE([ Dir: yes])
+AC_MSG_NOTICE([ Dir: $with_storage_dir])
AC_MSG_NOTICE([ FS: $with_storage_fs])
AC_MSG_NOTICE([ NetFS: $with_storage_fs])
AC_MSG_NOTICE([ LVM: $with_storage_lvm])
diff -r 74dd97c354cc qemud/remote_protocol.c
--- a/qemud/remote_protocol.c Tue Sep 02 10:49:53 2008 -0400
+++ b/qemud/remote_protocol.c Wed Sep 03 08:24:04 2008 -0400
@@ -6,6 +6,7 @@
#include "remote_protocol.h"
#include <config.h>
#include "internal.h"
+#include "socketcompat.h"
bool_t
xdr_remote_nonnull_string (XDR *xdrs, remote_nonnull_string *objp)
diff -r 74dd97c354cc qemud/remote_protocol.h
--- a/qemud/remote_protocol.h Tue Sep 02 10:49:53 2008 -0400
+++ b/qemud/remote_protocol.h Wed Sep 03 08:24:04 2008 -0400
@@ -15,6 +15,7 @@
#include <config.h>
#include "internal.h"
+#include "socketcompat.h"
#define REMOTE_MESSAGE_MAX 262144
#define REMOTE_STRING_MAX 65536
diff -r 74dd97c354cc qemud/remote_protocol.x
--- a/qemud/remote_protocol.x Tue Sep 02 10:49:53 2008 -0400
+++ b/qemud/remote_protocol.x Wed Sep 03 08:24:04 2008 -0400
@@ -38,6 +38,7 @@
%#include <config.h>
%#include "internal.h"
+%#include "socketcompat.h"
/*----- Data types. -----*/
diff -r 74dd97c354cc src/Makefile.am
--- a/src/Makefile.am Tue Sep 02 10:49:53 2008 -0400
+++ b/src/Makefile.am Wed Sep 03 08:24:04 2008 -0400
@@ -58,7 +58,8 @@
# Storage driver generic impl APIs
STORAGE_CONF_SOURCES = \
- storage_conf.h storage_conf.c
+ storage_conf.h storage_conf.c \
+ storage_backend.h storage_backend.c
# The remote RPC driver, covering domains, storage, networks, etc
@@ -109,8 +110,7 @@
# And finally storage backend specific impls
STORAGE_DRIVER_SOURCES = \
- storage_driver.h storage_driver.c \
- storage_backend.h storage_backend.c
+ storage_driver.h storage_driver.c
STORAGE_DRIVER_FS_SOURCES = \
storage_backend_fs.h storage_backend_fs.c
diff -r 74dd97c354cc src/storage_backend.c
--- a/src/storage_backend.c Tue Sep 02 10:49:53 2008 -0400
+++ b/src/storage_backend.c Wed Sep 03 08:24:04 2008 -0400
@@ -24,9 +24,13 @@
#include <config.h>
#include <string.h>
+#if HAVE_REGEX_H
#include <regex.h>
+#endif
#include <sys/types.h>
+#if HAVE_SYS_WAIT_H
#include <sys/wait.h>
+#endif
#include <unistd.h>
#include <fcntl.h>
#include <stdint.h>
@@ -38,6 +42,10 @@
#endif
#include "internal.h"
+#include "util.h"
+#include "memory.h"
+
+#include "storage_backend.h"
#if WITH_STORAGE_LVM
#include "storage_backend_logical.h"
@@ -48,15 +56,14 @@
#if WITH_STORAGE_DISK
#include "storage_backend_disk.h"
#endif
-
-#include "util.h"
-#include "memory.h"
-
-#include "storage_backend.h"
+#if WITH_STORAGE_DIR
#include "storage_backend_fs.h"
+#endif
static virStorageBackendPtr backends[] = {
+#if WITH_STORAGE_DIR
&virStorageBackendDirectory,
+#endif
#if WITH_STORAGE_FS
&virStorageBackendFileSystem,
&virStorageBackendNetFileSystem,
@@ -209,8 +216,12 @@
return -2;
if (S_ISREG(sb.st_mode)) {
+#ifndef __MINGW32__
vol->allocation = (unsigned long long)sb.st_blocks *
(unsigned long long)sb.st_blksize;
+#else
+ vol->allocation = sb.st_size;
+#endif
/* Regular files may be sparse, so logical size (capacity) is not same
* as actual allocation above
*/
@@ -337,6 +348,8 @@
return devpath;
}
+
+#ifndef __MINGW32__
/*
* Run an external program.
*
@@ -620,3 +633,33 @@
return 0;
}
+
+#else
+
+int
+virStorageBackendRunProgRegex(virConnectPtr conn,
+ virStoragePoolObjPtr pool ATTRIBUTE_UNUSED,
+ const char *const*prog ATTRIBUTE_UNUSED,
+ int nregex ATTRIBUTE_UNUSED,
+ const char **regex ATTRIBUTE_UNUSED,
+ int *nvars ATTRIBUTE_UNUSED,
+ virStorageBackendListVolRegexFunc func ATTRIBUTE_UNUSED,
+ void *data ATTRIBUTE_UNUSED,
+ int *outexit ATTRIBUTE_UNUSED)
+{
+ virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR, "%s no implemented on
Win32", __FUNCTION__);
+ return -1;
+}
+
+int
+virStorageBackendRunProgNul(virConnectPtr conn,
+ virStoragePoolObjPtr pool ATTRIBUTE_UNUSED,
+ const char **prog ATTRIBUTE_UNUSED,
+ size_t n_columns ATTRIBUTE_UNUSED,
+ virStorageBackendListVolNulFunc func ATTRIBUTE_UNUSED,
+ void *data ATTRIBUTE_UNUSED)
+{
+ virStorageReportError(conn, VIR_ERR_INTERNAL_ERROR, "%s no implemented on
Win32", __FUNCTION__);
+ return -1;
+}
+#endif
diff -r 74dd97c354cc src/storage_conf.c
--- a/src/storage_conf.c Tue Sep 02 10:49:53 2008 -0400
+++ b/src/storage_conf.c Wed Sep 03 08:24:04 2008 -0400
@@ -188,7 +188,11 @@
}
if (virXPathNode(conn, "/pool/permissions/owner", ctxt) == NULL) {
+#if HAVE_GETUID
perms->uid = getuid();
+#else
+ perms->uid = 0;
+#endif
} else {
if (virXPathLong(conn, "number(/pool/permissions/owner)", ctxt, &v)
< 0) {
virStorageReportError(conn, VIR_ERR_XML_ERROR,
@@ -199,7 +203,11 @@
}
if (virXPathNode(conn, "/pool/permissions/group", ctxt) == NULL) {
- perms->uid = getgid();
+#if HAVE_GETGID
+ perms->gid = getgid();
+#else
+ perms->gid = 0;
+#endif
} else {
if (virXPathLong(conn, "number(/pool/permissions/group)", ctxt, &v)
< 0) {
virStorageReportError(conn, VIR_ERR_XML_ERROR,
@@ -407,7 +415,7 @@
if (!xml) {
if (conn && conn->err.code == VIR_ERR_NONE)
virStorageReportError(conn, VIR_ERR_XML_ERROR,
- _("failed to parse xml document"));
+ "%s",_("failed to parse xml
document"));
goto cleanup;
}
@@ -569,7 +577,11 @@
}
if (virXPathNode(conn, "/volume/permissions/owner", ctxt) == NULL) {
+#if HAVE_GETUID
perms->uid = getuid();
+#else
+ perms->uid = 0;
+#endif
} else {
if (virXPathLong(conn, "number(/volume/permissions/owner)", ctxt,
&v) < 0) {
virStorageReportError(conn, VIR_ERR_XML_ERROR,
@@ -579,7 +591,11 @@
perms->uid = (int)v;
}
if (virXPathNode(conn, "/volume/permissions/group", ctxt) == NULL) {
+#if HAVE_GETGID
perms->gid = getgid();
+#else
+ perms->gid = 0;
+#endif
} else {
if (virXPathLong(conn, "number(/volume/permissions/group)", ctxt,
&v) < 0) {
virStorageReportError(conn, VIR_ERR_XML_ERROR,
@@ -778,7 +794,7 @@
if (!xml) {
if (conn && conn->err.code == VIR_ERR_NONE)
virStorageReportError(conn, VIR_ERR_XML_ERROR,
- _("failed to parse xml document"));
+ "%s", _("failed to parse xml
document"));
goto cleanup;
}
diff -r 74dd97c354cc src/util.c
--- a/src/util.c Tue Sep 02 10:49:53 2008 -0400
+++ b/src/util.c Wed Sep 03 08:24:04 2008 -0400
@@ -440,22 +440,13 @@
int
virExec(virConnectPtr conn,
const char *const*argv ATTRIBUTE_UNUSED,
+ const char *const*envp ATTRIBUTE_UNUSED,
+ const fd_set *keepfd ATTRIBUTE_UNUSED,
int *retpid ATTRIBUTE_UNUSED,
int infd ATTRIBUTE_UNUSED,
int *outfd ATTRIBUTE_UNUSED,
- int *errfd ATTRIBUTE_UNUSED)
-{
- ReportError (conn, VIR_ERR_INTERNAL_ERROR, __FUNCTION__);
- return -1;
-}
-
-int
-virExecNonBlock(virConnectPtr conn,
- const char *const*argv ATTRIBUTE_UNUSED,
- int *retpid ATTRIBUTE_UNUSED,
- int infd ATTRIBUTE_UNUSED,
- int *outfd ATTRIBUTE_UNUSED,
- int *errfd ATTRIBUTE_UNUSED)
+ int *errfd ATTRIBUTE_UNUSED,
+ int flags ATTRIBUTE_UNUSED)
{
ReportError (conn, VIR_ERR_INTERNAL_ERROR, __FUNCTION__);
return -1;
--
|: Red Hat, Engineering, London -o-
http://people.redhat.com/berrange/ :|
|:
http://libvirt.org -o-
http://virt-manager.org -o-
http://ovirt.org :|
|:
http://autobuild.org -o-
http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|