[libvirt] [PATCH] Fix Win32 portability problems

Daniel P. Berrange berrange at redhat.com
Wed Apr 7 17:38:29 UTC 2010


The network filter / snapshot / hooks code introduced some
non-portable pices that broke the win32 build

* configure.ac: Check for net/ethernet.h required by nwfile config
   parsing code
* src/conf/nwfilter_conf.c: Define ethernet protocol  constants
  if net/ethernet.h is missing
* src/util/hooks.c: Disable hooks build on Win32 since it lacks
  fork/exec/pipe
* src/util/threads-win32.c: Fix unchecked return value
* tools/virsh.c: Disable SIGPIPE on Win32 since it doesn't exist.
  Fix non-portable strftime() formats
---
 configure.ac             |    2 +-
 src/conf/nwfilter_conf.c |   20 ++++++++++++++++++++
 src/util/hooks.c         |   16 ++++++++++++++++
 src/util/threads-win32.c |    2 +-
 tools/virsh.c            |    7 ++++++-
 5 files changed, 44 insertions(+), 3 deletions(-)

diff --git a/configure.ac b/configure.ac
index e13961e..9a133e4 100644
--- a/configure.ac
+++ b/configure.ac
@@ -111,7 +111,7 @@ dnl Availability of various not common threadsafe functions
 AC_CHECK_FUNCS([strerror_r strtok_r getmntent_r getgrnam_r getpwuid_r])
 
 dnl Availability of various common headers (non-fatal if missing).
-AC_CHECK_HEADERS([pwd.h paths.h regex.h sys/syslimits.h sys/utsname.h sys/wait.h winsock2.h sched.h termios.h sys/poll.h syslog.h mntent.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 sys/poll.h syslog.h mntent.h net/ethernet.h])
 
 dnl Where are the XDR functions?
 dnl If portablexdr is installed, prefer that.
diff --git a/src/conf/nwfilter_conf.c b/src/conf/nwfilter_conf.c
index 16c1a25..0fe51e4 100644
--- a/src/conf/nwfilter_conf.c
+++ b/src/conf/nwfilter_conf.c
@@ -26,9 +26,13 @@
 
 #include <config.h>
 
+#include <sys/types.h>
+#include <sys/stat.h>
 #include <fcntl.h>
 #include <dirent.h>
+#if HAVE_NET_ETHERNET_H
 #include <net/ethernet.h>
+#endif
 
 #include "internal.h"
 
@@ -41,6 +45,22 @@
 #include "domain_conf.h"
 
 
+/* XXX
+ * The config parser/struts should not be using platform specific
+ * constants. Win32 lacks these constants, breaking the parser,
+ * so temporarily define them until this can be re-written to use
+ * locally defined enums for all consants
+ */
+#ifndef ETHERTYPE_IP
+#define ETHERTYPE_IP            0x0800
+#endif
+#ifndef ETHERTYPE_ARP
+#define ETHERTYPE_ARP           0x0806
+#endif
+#ifndef ETHERTYPE_IPV6
+#define ETHERTYPE_IPV6          0x86dd
+#endif
+
 #define VIR_FROM_THIS VIR_FROM_NWFILTER
 
 
diff --git a/src/util/hooks.c b/src/util/hooks.c
index 755679d..bcab4eb 100644
--- a/src/util/hooks.c
+++ b/src/util/hooks.c
@@ -24,7 +24,9 @@
 #include <config.h>
 
 #include <sys/types.h>
+#if HAVE_SYS_WAIT_H
 #include <sys/wait.h>
+#endif
 #include <sys/stat.h>
 #include <unistd.h>
 #include <stdlib.h>
@@ -188,6 +190,19 @@ virHookPresent(int driver) {
  * Returns: 0 if the execution succeeded, 1 if the script was not found or
  *          invalid parameters, and -1 if script returned an error
  */
+#ifdef WIN32
+int
+virHookCall(int driver ATTRIBUTE_UNUSED,
+            const char *id ATTRIBUTE_UNUSED,
+            int op ATTRIBUTE_UNUSED,
+            int sub_op ATTRIBUTE_UNUSED,
+            const char *extra ATTRIBUTE_UNUSED,
+            const char *input ATTRIBUTE_UNUSED) {
+    virReportSystemError(ENOSYS, "%s",
+                         _("spawning hooks not supported on this platform"));
+    return -1;
+}
+#else
 int
 virHookCall(int driver, const char *id, int op, int sub_op, const char *extra,
             const char *input) {
@@ -447,3 +462,4 @@ no_memory:
 #undef ADD_ENV_LIT
 #undef ADD_ENV_SPACE
 }
+#endif
diff --git a/src/util/threads-win32.c b/src/util/threads-win32.c
index b1d1571..a30bccf 100644
--- a/src/util/threads-win32.c
+++ b/src/util/threads-win32.c
@@ -69,7 +69,7 @@ void virThreadOnExit(void)
 
 int virMutexInit(virMutexPtr m)
 {
-    virMutexInitRecursive(m);
+    return virMutexInitRecursive(m);
 }
 
 int virMutexInitRecursive(virMutexPtr m)
diff --git a/tools/virsh.c b/tools/virsh.c
index aaae7ca..8017beb 100644
--- a/tools/virsh.c
+++ b/tools/virsh.c
@@ -414,6 +414,7 @@ out:
  */
 static int disconnected = 0; /* we may have been disconnected */
 
+#ifdef SIGPIPE
 /*
  * vshCatchDisconnect:
  *
@@ -442,6 +443,10 @@ vshSetupSignals(void) {
 
     sigaction(SIGPIPE, &sig_action, NULL);
 }
+#else
+static void
+vshSetupSignals(void) {}
+#endif
 
 /*
  * vshReconnect:
@@ -8425,7 +8430,7 @@ cmdSnapshotList(vshControl *ctl, const vshCmd *cmd)
                              &creation) < 0)
                 continue;
             localtime_r(&creation, &time_info);
-            strftime(timestr, sizeof(timestr), "%F %T %z", &time_info);
+            strftime(timestr, sizeof(timestr), "%Y-%m-%d %H:%M:%S %z", &time_info);
 
             vshPrint(ctl, " %-20s %-25s %s\n", names[i], timestr, state);
         }
-- 
1.6.6.1




More information about the libvir-list mailing list