dccp: Port DCCP plugin to MinGW
authorРуслан Ижбулатов <lrn1986@gmail.com>
Thu, 26 Mar 2009 10:32:08 +0000 (11:32 +0100)
committerSebastian Dröge <sebastian.droege@collabora.co.uk>
Thu, 26 Mar 2009 10:32:08 +0000 (11:32 +0100)
Partially fixes bug #573595.

13 files changed:
configure.ac
gst/dccp/Makefile.am
gst/dccp/gstdccp.c
gst/dccp/gstdccp.h
gst/dccp/gstdccp_common.h [new file with mode: 0644]
gst/dccp/gstdccpclientsink.c
gst/dccp/gstdccpclientsink.h
gst/dccp/gstdccpclientsrc.c
gst/dccp/gstdccpclientsrc.h
gst/dccp/gstdccpserversink.c
gst/dccp/gstdccpserversink.h
gst/dccp/gstdccpserversrc.c
gst/dccp/gstdccpserversrc.h

index 8dcf9cc..21a5849 100644 (file)
@@ -325,10 +325,20 @@ AC_CHECK_HEADERS([winsock2.h], HAVE_WINSOCK2_H=yes)
 dnl needed for festival
 AM_CONDITIONAL(HAVE_WINSOCK2_H, test "x$HAVE_WINSOCK2_H" = "xyes")
 
+if test "x$HAVE_WINSOCK2_H" = "xyes"; then
+  DCCP_LIBS="$DCCP_LIBS -lws2_32"
+  AC_SUBST(DCCP_LIBS)
+fi
+
 if test "x$HAVE_SYS_SOCKET_H" != "xyes"; then
   AG_GST_DISABLE_PLUGIN(librfb)
 fi
 
+if test "x$HAVE_PTHREAD_H" = "xyes"; then
+  DCCP_LIBS="$DCCP_LIBS -lpthread"
+  AC_SUBST(DCCP_LIBS)
+fi
+
 if test "x$HAVE_PTHREAD_H" != "xyes"; then
   AG_GST_DISABLE_PLUGIN(dccp)
 fi
index b276d6e..a4421c7 100644 (file)
@@ -12,7 +12,7 @@ libgstdccp_la_SOURCES = gstdccpplugin.c \
 
 # flags used to compile this plugin
 libgstdccp_la_CFLAGS = $(GST_CFLAGS)
-libgstdccp_la_LIBADD = $(GST_BASE_LIBS) $(GST_LIBS)
+libgstdccp_la_LIBADD = $(GST_BASE_LIBS) $(GST_LIBS) $(DCCP_LIBS)
 libgstdccp_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
 libgstdccp_la_LIBTOOLFLAGS = --tag=disable-static
 
index 48720b4..443931b 100644 (file)
 #endif
 
 #include "gstdccp.h"
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <netdb.h>
-#include <unistd.h>
-#include <sys/ioctl.h>
-#include <string.h>
 
 #ifdef HAVE_FIONREAD_IN_SYS_FILIO
 #include <sys/filio.h>
@@ -58,7 +50,11 @@ gst_dccp_host_to_ip (GstElement * element, const gchar * host)
   GST_DEBUG_OBJECT (element, "resolving host %s", host);
 
   /* first check if it already is an IP address */
+#ifndef G_OS_WIN32
   if (inet_aton (host, &addr)) {
+#else
+  if ((addr.S_un.S_addr = inet_addr (host)) != INADDR_NONE) {
+#endif
     ip = g_strdup (host);
     GST_DEBUG_OBJECT (element, "resolved to IP %s", ip);
     return ip;
@@ -102,9 +98,13 @@ gst_dccp_read_buffer (GstElement * this, int socket, GstBuffer ** buf)
   int maxfdp1;
   int ret;
   ssize_t bytes_read;
+#ifndef G_OS_WIN32
   int readsize;
   struct msghdr mh;
   struct iovec iov;
+#else
+  unsigned long readsize;
+#endif
 
   *buf = NULL;
 
@@ -121,9 +121,15 @@ gst_dccp_read_buffer (GstElement * this, int socket, GstBuffer ** buf)
   }
 
   /* ask how much is available for reading on the socket */
+#ifndef G_OS_WIN32
   if ((ret = ioctl (socket, FIONREAD, &readsize)) < 0) {
     GST_ELEMENT_ERROR (this, RESOURCE, READ, (NULL),
         ("read FIONREAD value failed: %s", g_strerror (errno)));
+#else
+  if ((ret = ioctlsocket (socket, FIONREAD, &readsize)) == SOCKET_ERROR) {
+    GST_ELEMENT_ERROR (this, RESOURCE, READ, (NULL),
+        ("read FIONREAD value failed: %s", g_strerror (WSAGetLastError ())));
+#endif
     return GST_FLOW_ERROR;
   }
 
@@ -132,8 +138,8 @@ gst_dccp_read_buffer (GstElement * this, int socket, GstBuffer ** buf)
     return GST_FLOW_UNEXPECTED;
   }
 
-  *buf = gst_buffer_new_and_alloc (readsize);
-
+  *buf = gst_buffer_new_and_alloc ((int) readsize);
+#ifndef G_OS_WIN32
   memset (&mh, 0, sizeof (mh));
   mh.msg_name = NULL;
   mh.msg_namelen = 0;
@@ -143,6 +149,11 @@ gst_dccp_read_buffer (GstElement * this, int socket, GstBuffer ** buf)
   mh.msg_iovlen = 1;
 
   bytes_read = recvmsg (socket, &mh, 0);
+#else
+  bytes_read =
+      recvfrom (socket, (char *) GST_BUFFER_DATA (*buf), (int) readsize, 0,
+      NULL, 0);
+#endif
 
   if (bytes_read != readsize) {
     GST_DEBUG_OBJECT (this, ("Error while reading data"));
@@ -181,9 +192,29 @@ gboolean
 gst_dccp_connect_to_server (GstElement * element, struct sockaddr_in server_sin,
     int sock_fd)
 {
+#ifdef G_OS_WIN32
+  int errorCode;
+#endif
   GST_DEBUG_OBJECT (element, "connecting to server");
 
   if (connect (sock_fd, (struct sockaddr *) &server_sin, sizeof (server_sin))) {
+#ifdef G_OS_WIN32
+    errorCode = WSAGetLastError ();
+    switch (errorCode) {
+      case WSAECONNREFUSED:
+        GST_ELEMENT_ERROR (element, RESOURCE, OPEN_WRITE,
+            ("Connection to %s:%d refused.", inet_ntoa (server_sin.sin_addr),
+                ntohs (server_sin.sin_port)), (NULL));
+        return FALSE;
+        break;
+      default:
+        GST_ELEMENT_ERROR (element, RESOURCE, OPEN_READ, (NULL),
+            ("Connect to %s:%d failed: %s", inet_ntoa (server_sin.sin_addr),
+                ntohs (server_sin.sin_port), g_strerror (errorCode)));
+        return FALSE;
+        break;
+    }
+#else
     switch (errno) {
       case ECONNREFUSED:
         GST_ELEMENT_ERROR (element, RESOURCE, OPEN_WRITE,
@@ -198,6 +229,7 @@ gst_dccp_connect_to_server (GstElement * element, struct sockaddr_in server_sin,
         return FALSE;
         break;
     }
+#endif
   }
   return TRUE;
 }
@@ -223,7 +255,11 @@ gst_dccp_server_wait_connections (GstElement * element, int server_sock_fd)
 
   if ((client_sock_fd =
           accept (server_sock_fd, (struct sockaddr *) &client_address,
+#ifndef G_OS_WIN32
               &client_address_len)) == -1) {
+#else
+              (int *) &client_address_len)) == -1) {
+#endif
     GST_ELEMENT_ERROR (element, RESOURCE, OPEN_WRITE, (NULL),
         ("Could not accept client on server socket %d: %s (%d)",
             server_sock_fd, g_strerror (errno), errno));
@@ -310,8 +346,10 @@ gst_dccp_socket_write (GstElement * element, int socket, const void *buf,
   size_t bytes_written = 0;
   ssize_t wrote;
 
+#ifndef G_OS_WIN32
   struct iovec iov;
   struct msghdr mh;
+
   memset (&mh, 0, sizeof (mh));
 
   while (bytes_written < size) {
@@ -325,6 +363,15 @@ gst_dccp_socket_write (GstElement * element, int socket, const void *buf,
 
       wrote = sendmsg (socket, &mh, 0);
     } while (wrote == -1 && errno == EAGAIN);
+#else
+  int errorCode = 0;
+  while (bytes_written < size) {
+    do {
+      wrote = sendto (socket, (char *) buf + bytes_written,
+          MIN (packet_size, size - bytes_written), 0, NULL, 0);
+      errorCode = WSAGetLastError ();
+    } while (wrote == SOCKET_ERROR && errorCode == EAGAIN);
+#endif
 
     /* TODO print the send error */
     bytes_written += wrote;
@@ -433,8 +480,14 @@ gst_dccp_set_ccid (GstElement * element, int sock_fd, uint8_t ccid)
   /*
    * Determine which CCIDs are available on the host
    */
+#ifndef G_OS_WIN32
   ret = getsockopt (sock_fd, SOL_DCCP, DCCP_SOCKOPT_AVAILABLE_CCIDS, &ccids,
       &len);
+#else
+  ret =
+      getsockopt (sock_fd, SOL_DCCP, DCCP_SOCKOPT_AVAILABLE_CCIDS,
+      (char *) &ccids, &len);
+#endif
   if (ret < 0) {
     GST_ERROR_OBJECT (element, "Can not determine available CCIDs");
     return FALSE;
@@ -450,8 +503,11 @@ gst_dccp_set_ccid (GstElement * element, int sock_fd, uint8_t ccid)
     GST_ERROR_OBJECT (element, "CCID specified is not supported");
     return FALSE;
   }
-
+#ifndef G_OS_WIN32
   if (setsockopt (sock_fd, SOL_DCCP, DCCP_SOCKOPT_CCID, &ccid,
+#else
+  if (setsockopt (sock_fd, SOL_DCCP, DCCP_SOCKOPT_CCID, (char *) &ccid,
+#endif
           sizeof (ccid)) < 0) {
     GST_ERROR_OBJECT (element, "Can not set CCID");
     return FALSE;
@@ -481,7 +537,11 @@ gst_dccp_get_ccid (GstElement * element, int sock_fd, int tx_or_rx)
   }
 
   ccidlen = sizeof (ccid);
+#ifndef G_OS_WIN32
   ret = getsockopt (sock_fd, SOL_DCCP, tx_or_rx, &ccid, &ccidlen);
+#else
+  ret = getsockopt (sock_fd, SOL_DCCP, tx_or_rx, (char *) &ccid, &ccidlen);
+#endif
   if (ret < 0) {
     GST_ERROR_OBJECT (element, "Can not determine available CCIDs");
     return -1;
@@ -500,8 +560,13 @@ gst_dccp_get_max_packet_size (GstElement * element, int sock)
 {
   int size;
   socklen_t sizelen = sizeof (size);
+#ifndef G_OS_WIN32
   if (getsockopt (sock, SOL_DCCP, DCCP_SOCKOPT_GET_CUR_MPS,
           &size, &sizelen) < 0) {
+#else
+  if (getsockopt (sock, SOL_DCCP, DCCP_SOCKOPT_GET_CUR_MPS,
+          (char *) &size, &sizelen) < 0) {
+#endif
     GST_ELEMENT_ERROR (element, RESOURCE, SETTINGS, (NULL),
         ("Could not get current MTU %d: %s", errno, g_strerror (errno)));
     return -1;
index f5aa2cc..74d1952 100644 (file)
@@ -22,8 +22,7 @@
 
 #include <gst/gst.h>
 #include <gst/base/gstadapter.h>
-#include <sys/socket.h>
-#include <netinet/in.h>                   /* sockaddr_in */
+#include "gstdccp_common.h"
 
 /* DCCP socket general options */
 #define DCCP_BACKLOG   5
diff --git a/gst/dccp/gstdccp_common.h b/gst/dccp/gstdccp_common.h
new file mode 100644 (file)
index 0000000..9657806
--- /dev/null
@@ -0,0 +1,40 @@
+/* GStreamer\r
+ * Copyright (C) <2007> Leandro Melo de Sales <leandroal@gmail.com>\r
+ *\r
+ * This library is free software; you can redistribute it and/or\r
+ * modify it under the terms of the GNU Library General Public\r
+ * License as published by the Free Software Foundation; either\r
+ * version 2 of the License, or (at your option) any later version.\r
+ *\r
+ * This library is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
+ * Library General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU Library General Public\r
+ * License along with this library; if not, write to the\r
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,\r
+ * Boston, MA 02111-1307, USA.\r
+ */\r
+\r
+#ifndef __GST_DCCP_NET_H__\r
+#define __GST_DCCP_NET_H__\r
+\r
+#ifndef G_OS_WIN32\r
+#  include <netdb.h>\r
+#  include <sys/socket.h>\r
+#  include <netinet/in.h>                   /* sockaddr_in */\r
+#  include <arpa/inet.h>\r
+#  include <sys/ioctl.h>\r
+#else\r
+/* ws2_32.dll has getaddrinfo and freeaddrinfo on Windows XP and later.\r
+ * minwg32 headers check WINVER before allowing the use of these */\r
+#  define WINVER 0x0501\r
+#  include <winsock2.h>\r
+#  include <ws2tcpip.h>\r
+#endif\r
+#include <sys/types.h>\r
+#include <unistd.h>\r
+#include <string.h>\r
+\r
+#endif /* __GST_DCCP_NET_H__ */\r
index 348a0b8..4c1fd50 100644 (file)
 
 #include "gstdccpclientsink.h"
 #include "gstdccp.h"
-#include <string.h>             /* memset */
-#include <unistd.h>
-#include <arpa/inet.h>
-#include <fcntl.h>
 
 /* signals */
 enum
index 89f7d5e..2a6fb2a 100644 (file)
 
 G_BEGIN_DECLS
 
-#include <netdb.h>                        /* sockaddr_in */
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>                   /* sockaddr_in */
-#include <unistd.h>
+#include "gstdccp_common.h"
 
 #define GST_TYPE_DCCP_CLIENT_SINK \
   (gst_dccp_client_sink_get_type())
index 73f45eb..4cb33e7 100644 (file)
 
 #include "gstdccpclientsrc.h"
 #include "gstdccp.h"
-#include <string.h>             /* memset */
-#include <unistd.h>
-#include <arpa/inet.h>
 #include <fcntl.h>
-
-#include <sys/ioctl.h>
 #ifdef HAVE_FIONREAD_IN_SYS_FILIO
 #include <sys/filio.h>
 #endif
index 9be42b2..8a59273 100644 (file)
 
 G_BEGIN_DECLS
 
-#include <netdb.h>                        /* sockaddr_in */
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>                   /* sockaddr_in */
-#include <unistd.h>
-
+#include "gstdccp_common.h"
 
 #define GST_TYPE_DCCP_CLIENT_SRC \
   (gst_dccp_client_src_get_type())
index e2a7782..e8f8a04 100644 (file)
@@ -51,9 +51,6 @@
 
 #include "gstdccpserversink.h"
 #include "gstdccp.h"
-#include <string.h>             /* memset */
-#include <unistd.h>
-#include <arpa/inet.h>
 #include <fcntl.h>
 
 /* signals */
index 0b2623a..e4294a1 100644 (file)
 
 G_BEGIN_DECLS
 
-#include <netdb.h>                        /* sockaddr_in */
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>                   /* sockaddr_in */
-#include <unistd.h>
+
+#include "gstdccp_common.h"
 #include <pthread.h>
 
 #define GST_TYPE_DCCP_SERVER_SINK \
index 93068bc..4c344e4 100644 (file)
@@ -50,9 +50,6 @@
 
 #include "gstdccpserversrc.h"
 #include "gstdccp.h"
-#include <string.h>             /* memset */
-#include <unistd.h>
-#include <arpa/inet.h>
 #include <fcntl.h>
 
 #define DCCP_DEFAULT_CAPS        NULL
index e0dd3f1..6c4c224 100644 (file)
 
 G_BEGIN_DECLS
 
-#include <netdb.h>                        /* sockaddr_in */
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>                   /* sockaddr_in */
-#include <unistd.h>
-
+#include "gstdccp_common.h"
 
 #define GST_TYPE_DCCP_SERVER_SRC \
   (gst_dccp_server_src_get_type())