]> xenbits.xensource.com Git - libvirt.git/commitdiff
Miscellaneous fixes for building on Windows (MinGW).
authorRichard W.M. Jones <rjones@redhat.com>
Sat, 5 Jan 2008 16:06:36 +0000 (16:06 +0000)
committerRichard W.M. Jones <rjones@redhat.com>
Sat, 5 Jan 2008 16:06:36 +0000 (16:06 +0000)
* configure.in: xdr functions may require -lxdr.
* configure.in, src/Makefile.am: Extra linking flags for
  building libvirt DLL.
* src/socketcompat.h: Hide Windows Winsock incompatibilities
  in a separate header file.
* src/remote_internal.c: Switch to using socketcompat.h /
  socket_errno().
* src/test.c: Switch to using socketcompat.h.
* gnulib/lib/arpa/.cvsignore: Ignore another generated file.
* src/qparams.c: Include <config.h>.

ChangeLog
configure.in
gnulib/lib/arpa/.cvsignore
src/Makefile.am
src/libvirt.c
src/qparams.c
src/remote_internal.c
src/socketcompat.h [new file with mode: 0644]
src/test.c

index 1127a513a74f7a986e6c2863c27abf9e1752d8f8..bf0f4fdc0bbde39f18307680dc5efe1fc1b23333 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+Wed Jan  5 16:02:00 UTC 2008 Richard W.M. Jones <rjones@redhat.com>
+
+       Miscellaneous fixes for building on Windows (MinGW).
+       * configure.in: xdr functions may require -lxdr.
+       * configure.in, src/Makefile.am: Extra linking flags for
+         building libvirt DLL.
+       * src/socketcompat.h: Hide Windows Winsock incompatibilities
+         in a separate header file.
+       * src/remote_internal.c: Switch to using socketcompat.h /
+         socket_errno().
+       * src/test.c: Switch to using socketcompat.h.
+       * gnulib/lib/arpa/.cvsignore: Ignore another generated file.
+       * src/qparams.c: Include <config.h>.
+
 Wed Jan  2 17:45:53 EST 2008 Daniel P. Berrange <berrange@redhat.com>
 
        * src/remote_internal.c: fix policykit auth handling of NULL
index 26db6214e23dc532fd89c170834bd4a090266f25..bc56c2c3053bb95545e5cbed83c3621fd6f6305c 100644 (file)
@@ -65,8 +65,8 @@ AC_CHECK_FUNCS([cfmakeraw regexec uname])
 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])
 
-dnl Need -lrpc? (Cygwin needs this)
-AC_SEARCH_LIBS(xdrmem_create,rpc)
+dnl Need -lrpc or -lxdr? (Cygwin and MinGW resp. need this)
+AC_SEARCH_LIBS(xdrmem_create,[rpc xdr])
 
 dnl Do we have rpcgen?
 AC_PATH_PROG(RPCGEN, rpcgen, no)
@@ -650,6 +650,7 @@ dnl for now since I'm not supporting mingw at present.  - RWMJ
 CYGWIN_EXTRA_LDFLAGS=
 CYGWIN_EXTRA_LIBADD=
 CYGWIN_EXTRA_PYTHON_LIBADD=
+MINGW_EXTRA_LDFLAGS=
 case "$host" in
   *-*-cygwin*)
     CYGWIN_EXTRA_LDFLAGS="-no-undefined"
@@ -658,10 +659,14 @@ case "$host" in
       CYGWIN_EXTRA_PYTHON_LIBADD="-L/usr/lib/python${PYTHON_VERSION}/config -lpython${PYTHON_VERSION}"
     fi
     ;;
+  *-*-mingw*)
+    MINGW_EXTRA_LDFLAGS="-no-undefined"
+    ;;
 esac
 AC_SUBST(CYGWIN_EXTRA_LDFLAGS)
 AC_SUBST(CYGWIN_EXTRA_LIBADD)
 AC_SUBST(CYGWIN_EXTRA_PYTHON_LIBADD)
+AC_SUBST(MINGW_EXTRA_LDFLAGS)
 
 # very annoying
 rm -f COPYING
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..b9013ae267a15ce599782ff85cd5519b56f52512 100644 (file)
@@ -0,0 +1 @@
+inet.h
index 82194485aba66e092afb874fb320f4ab68d141ac..d058465abfcd6555d615cd90b743ab029d5baa5a 100644 (file)
@@ -31,6 +31,7 @@ lib_LTLIBRARIES = libvirt.la
 CLIENT_SOURCES =                                               \
                libvirt.c internal.h                            \
                gnutls_1_0_compat.h                             \
+               socketcompat.h                                  \
                hash.c hash.h                                   \
                test.c test.h                                   \
                 buf.c buf.h                                    \
@@ -68,7 +69,7 @@ libvirt_la_LIBADD = $(LIBXML_LIBS) $(GNUTLS_LIBS) $(SASL_LIBS) \
 libvirt_la_LDFLAGS = -Wl,--version-script=$(srcdir)/libvirt_sym.version \
                      -version-info @LIBVIRT_VERSION_INFO@ \
                     $(COVERAGE_CFLAGS:-f%=-Wc,-f%) \
-                   @CYGWIN_EXTRA_LDFLAGS@
+                   @CYGWIN_EXTRA_LDFLAGS@ @MINGW_EXTRA_LDFLAGS@
 libvirt_la_CFLAGS = $(COVERAGE_CFLAGS)
 
 bin_PROGRAMS = virsh
index 67d7e18c29f158174c77dfda768fdfe148da684c..ca38c547541e0ec9484e208869d36f352a383db4 100644 (file)
@@ -25,7 +25,7 @@
 #include <libxml/uri.h>
 #include "getpass.h"
 
-#if HAVE_WINSOCK2_H
+#ifdef HAVE_WINSOCK2_H
 #include <winsock2.h>
 #endif
 
index 526c50e6331ef3a82f4bb02e53b0b56d2cea04c7..1c06fb1a4c57a59d988d3430e3765212f9cc3982 100644 (file)
@@ -20,6 +20,8 @@
  * Utility functions to help parse and assemble query strings.
  */
 
+#include <config.h>
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <stdarg.h>
index a184685982bf955f73bdc46811d6309d7a6f180c..d9d4ba95f140b6c5d28cbc8713ee9e940ac68c88 100644 (file)
 
 #include "config.h"
 
+/* Windows socket compatibility functions. */
+#include "socketcompat.h"
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
 #include <string.h>
 #include <assert.h>
-#include <errno.h>
 #include <signal.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <paths.h>
 #endif
 
-#ifndef HAVE_WINSOCK2_H
-#include <sys/socket.h>
-#include <netdb.h>
-#include <netinet/in.h>
-#include <netinet/tcp.h>
-#else
-#include <winsock2.h>
-#endif
-
 #include <rpc/types.h>
 #include <rpc/xdr.h>
 #include <gnutls/gnutls.h>
@@ -525,7 +518,7 @@ doRemoteOpen (virConnectPtr conn,
 
             priv->sock = socket (r->ai_family, SOCK_STREAM, 0);
             if (priv->sock == -1) {
-                error (conn, VIR_ERR_SYSTEM_ERROR, strerror (errno));
+                error (conn, VIR_ERR_SYSTEM_ERROR, strerror (socket_errno ()));
                 continue;
             }
 
@@ -535,7 +528,7 @@ doRemoteOpen (virConnectPtr conn,
                         sizeof no_slow_start);
 
             if (connect (priv->sock, r->ai_addr, r->ai_addrlen) == -1) {
-                error (conn, VIR_ERR_SYSTEM_ERROR, strerror (errno));
+                error (conn, VIR_ERR_SYSTEM_ERROR, strerror (socket_errno ()));
                 close (priv->sock);
                 continue;
             }
@@ -3036,7 +3029,7 @@ remoteAuthSASL (virConnectPtr conn, struct private_data *priv, int in_open,
         __virRaiseError (in_open ? NULL : conn, NULL, NULL, VIR_FROM_REMOTE,
                          VIR_ERR_AUTH_FAILED, VIR_ERR_ERROR, NULL, NULL, NULL, 0, 0,
                          "failed to get sock address %d (%s)",
-                         errno, strerror(errno));
+                         socket_errno (), strerror(socket_errno ()));
         goto cleanup;
     }
     if ((localAddr = addrToString(&sa, salen)) == NULL)
@@ -3048,7 +3041,7 @@ remoteAuthSASL (virConnectPtr conn, struct private_data *priv, int in_open,
         __virRaiseError (in_open ? NULL : conn, NULL, NULL, VIR_FROM_REMOTE,
                          VIR_ERR_AUTH_FAILED, VIR_ERR_ERROR, NULL, NULL, NULL, 0, 0,
                          "failed to get peer address %d (%s)",
-                         errno, strerror(errno));
+                         socket_errno (), strerror(socket_errno ()));
         goto cleanup;
     }
     if ((remoteAddr = addrToString(&sa, salen)) == NULL)
@@ -3601,12 +3594,13 @@ really_write_buf (virConnectPtr conn, struct private_data *priv,
         while (len > 0);
     } else {
         do {
-            err = write (priv->sock, p, len);
+            err = send (priv->sock, p, len, 0);
             if (err == -1) {
-                if (errno == EINTR || errno == EAGAIN)
+                int errno_ = socket_errno ();
+                if (errno_ == EINTR || errno_ == EAGAIN)
                     continue;
                 error (in_open ? NULL : conn,
-                       VIR_ERR_SYSTEM_ERROR, strerror (errno));
+                       VIR_ERR_SYSTEM_ERROR, strerror (errno_));
                 return -1;
             }
             len -= err;
@@ -3683,12 +3677,13 @@ really_read_buf (virConnectPtr conn, struct private_data *priv,
         return err;
     } else {
     reread:
-        err = read (priv->sock, bytes, len);
+        err = recv (priv->sock, bytes, len, 0);
         if (err == -1) {
-            if (errno == EINTR)
+            int errno_ = socket_errno ();
+            if (errno_ == EINTR)
                 goto reread;
             error (in_open ? NULL : conn,
-                   VIR_ERR_SYSTEM_ERROR, strerror (errno));
+                   VIR_ERR_SYSTEM_ERROR, strerror (errno_));
             return -1;
         }
         if (err == 0) {
diff --git a/src/socketcompat.h b/src/socketcompat.h
new file mode 100644 (file)
index 0000000..0a8884c
--- /dev/null
@@ -0,0 +1,60 @@
+/*\r
+ * socketcompat.h: Socket compatibility for Windows, making it slightly\r
+ * less painful to use.\r
+ *\r
+ * Use this header under the following circumstances:\r
+ * (a) Instead of including any of: <net/if.h>, <netinet/in.h>,\r
+ *     <sys/socket.h>, <netdb.h>, <netinet/tcp.h>, AND\r
+ * (b) The file will be part of what is built on Windows (basically\r
+ *     just remote client stuff).\r
+ *\r
+ * You need to use socket_errno() instead of errno to get socket\r
+ * errors.\r
+ *\r
+ * Copyright (C) 2008 Red Hat, Inc.\r
+ *\r
+ * See COPYING.LIB for the License of this software\r
+ *\r
+ * Richard W.M. Jones <rjones@redhat.com>\r
+ */\r
+\r
+#ifndef __SOCKETCOMPAT_H__\r
+#define __SOCKETCOMPAT_H__\r
+\r
+#include <config.h>\r
+\r
+#include <errno.h>\r
+\r
+#ifndef HAVE_WINSOCK2_H                /* Unix & Cygwin. */\r
+\r
+#include <sys/socket.h>\r
+#include <net/if.h>\r
+#include <netinet/in.h>\r
+#include <netinet/tcp.h>\r
+\r
+static inline int\r
+socket_errno (void)\r
+{\r
+  return errno;\r
+}\r
+\r
+#else                           /* MinGW & Win32 */\r
+\r
+#include <winsock2.h>\r
+\r
+/* Socket functions in Windoze don't set errno.  Instead of using errno\r
+ * to test for socket errors, call this function to get the errno.\r
+ */\r
+static inline int\r
+socket_errno (void)\r
+{\r
+  return WSAGetLastError ();\r
+}\r
+\r
+/* Compatibility. */\r
+#define EWOULDBLOCK             WSAEWOULDBLOCK\r
+#define ECONNREFUSED            WSAECONNREFUSED\r
+\r
+#endif /* HAVE_WINSOCK2_H */\r
+\r
+#endif /* __WINSOCKWRAPPER_H__ */\r
index 825707ce8fe24dc5e3f886331f7b0144116bc36a..d228b31966deef8e2e8ae6634b19e3b77e3a1603 100644 (file)
@@ -28,7 +28,6 @@
 #include <stdio.h>
 #include <string.h>
 #include <sys/time.h>
-#include <errno.h>
 #include <libxml/parser.h>
 #include <libxml/tree.h>
 #include <libxml/xpath.h>
 #include <unistd.h>
 #include <sys/stat.h>
 
-#ifndef HAVE_WINSOCK2_H
-#include <net/if.h>
-#include <netinet/in.h>
-#else
-#include <winsock2.h>
-#endif
+#include "socketcompat.h"
 
 #include "internal.h"
 #include "test.h"