dccp: Port DCCP plugin to MinGW

Partially fixes bug #573595.
This commit is contained in:
Руслан Ижбулатов 2009-03-26 11:32:08 +01:00 committed by Sebastian Dröge
parent fe9e680169
commit dafa530773
13 changed files with 133 additions and 51 deletions

View file

@ -325,10 +325,20 @@ AC_CHECK_HEADERS([winsock2.h], HAVE_WINSOCK2_H=yes)
dnl needed for festival dnl needed for festival
AM_CONDITIONAL(HAVE_WINSOCK2_H, test "x$HAVE_WINSOCK2_H" = "xyes") 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 if test "x$HAVE_SYS_SOCKET_H" != "xyes"; then
AG_GST_DISABLE_PLUGIN(librfb) AG_GST_DISABLE_PLUGIN(librfb)
fi 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 if test "x$HAVE_PTHREAD_H" != "xyes"; then
AG_GST_DISABLE_PLUGIN(dccp) AG_GST_DISABLE_PLUGIN(dccp)
fi fi

View file

@ -12,7 +12,7 @@ libgstdccp_la_SOURCES = gstdccpplugin.c \
# flags used to compile this plugin # flags used to compile this plugin
libgstdccp_la_CFLAGS = $(GST_CFLAGS) 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_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
libgstdccp_la_LIBTOOLFLAGS = --tag=disable-static libgstdccp_la_LIBTOOLFLAGS = --tag=disable-static

View file

@ -22,14 +22,6 @@
#endif #endif
#include "gstdccp.h" #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 #ifdef HAVE_FIONREAD_IN_SYS_FILIO
#include <sys/filio.h> #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); GST_DEBUG_OBJECT (element, "resolving host %s", host);
/* first check if it already is an IP address */ /* first check if it already is an IP address */
#ifndef G_OS_WIN32
if (inet_aton (host, &addr)) { if (inet_aton (host, &addr)) {
#else
if ((addr.S_un.S_addr = inet_addr (host)) != INADDR_NONE) {
#endif
ip = g_strdup (host); ip = g_strdup (host);
GST_DEBUG_OBJECT (element, "resolved to IP %s", ip); GST_DEBUG_OBJECT (element, "resolved to IP %s", ip);
return ip; return ip;
@ -102,9 +98,13 @@ gst_dccp_read_buffer (GstElement * this, int socket, GstBuffer ** buf)
int maxfdp1; int maxfdp1;
int ret; int ret;
ssize_t bytes_read; ssize_t bytes_read;
#ifndef G_OS_WIN32
int readsize; int readsize;
struct msghdr mh; struct msghdr mh;
struct iovec iov; struct iovec iov;
#else
unsigned long readsize;
#endif
*buf = NULL; *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 */ /* ask how much is available for reading on the socket */
#ifndef G_OS_WIN32
if ((ret = ioctl (socket, FIONREAD, &readsize)) < 0) { if ((ret = ioctl (socket, FIONREAD, &readsize)) < 0) {
GST_ELEMENT_ERROR (this, RESOURCE, READ, (NULL), GST_ELEMENT_ERROR (this, RESOURCE, READ, (NULL),
("read FIONREAD value failed: %s", g_strerror (errno))); ("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; return GST_FLOW_ERROR;
} }
@ -132,8 +138,8 @@ gst_dccp_read_buffer (GstElement * this, int socket, GstBuffer ** buf)
return GST_FLOW_UNEXPECTED; 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)); memset (&mh, 0, sizeof (mh));
mh.msg_name = NULL; mh.msg_name = NULL;
mh.msg_namelen = 0; mh.msg_namelen = 0;
@ -143,6 +149,11 @@ gst_dccp_read_buffer (GstElement * this, int socket, GstBuffer ** buf)
mh.msg_iovlen = 1; mh.msg_iovlen = 1;
bytes_read = recvmsg (socket, &mh, 0); 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) { if (bytes_read != readsize) {
GST_DEBUG_OBJECT (this, ("Error while reading data")); 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, gst_dccp_connect_to_server (GstElement * element, struct sockaddr_in server_sin,
int sock_fd) int sock_fd)
{ {
#ifdef G_OS_WIN32
int errorCode;
#endif
GST_DEBUG_OBJECT (element, "connecting to server"); GST_DEBUG_OBJECT (element, "connecting to server");
if (connect (sock_fd, (struct sockaddr *) &server_sin, sizeof (server_sin))) { 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) { switch (errno) {
case ECONNREFUSED: case ECONNREFUSED:
GST_ELEMENT_ERROR (element, RESOURCE, OPEN_WRITE, 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; return FALSE;
break; break;
} }
#endif
} }
return TRUE; return TRUE;
} }
@ -223,7 +255,11 @@ gst_dccp_server_wait_connections (GstElement * element, int server_sock_fd)
if ((client_sock_fd = if ((client_sock_fd =
accept (server_sock_fd, (struct sockaddr *) &client_address, accept (server_sock_fd, (struct sockaddr *) &client_address,
#ifndef G_OS_WIN32
&client_address_len)) == -1) { &client_address_len)) == -1) {
#else
(int *) &client_address_len)) == -1) {
#endif
GST_ELEMENT_ERROR (element, RESOURCE, OPEN_WRITE, (NULL), GST_ELEMENT_ERROR (element, RESOURCE, OPEN_WRITE, (NULL),
("Could not accept client on server socket %d: %s (%d)", ("Could not accept client on server socket %d: %s (%d)",
server_sock_fd, g_strerror (errno), errno)); 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; size_t bytes_written = 0;
ssize_t wrote; ssize_t wrote;
#ifndef G_OS_WIN32
struct iovec iov; struct iovec iov;
struct msghdr mh; struct msghdr mh;
memset (&mh, 0, sizeof (mh)); memset (&mh, 0, sizeof (mh));
while (bytes_written < size) { while (bytes_written < size) {
@ -325,6 +363,15 @@ gst_dccp_socket_write (GstElement * element, int socket, const void *buf,
wrote = sendmsg (socket, &mh, 0); wrote = sendmsg (socket, &mh, 0);
} while (wrote == -1 && errno == EAGAIN); } 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 */ /* TODO print the send error */
bytes_written += wrote; 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 * Determine which CCIDs are available on the host
*/ */
#ifndef G_OS_WIN32
ret = getsockopt (sock_fd, SOL_DCCP, DCCP_SOCKOPT_AVAILABLE_CCIDS, &ccids, ret = getsockopt (sock_fd, SOL_DCCP, DCCP_SOCKOPT_AVAILABLE_CCIDS, &ccids,
&len); &len);
#else
ret =
getsockopt (sock_fd, SOL_DCCP, DCCP_SOCKOPT_AVAILABLE_CCIDS,
(char *) &ccids, &len);
#endif
if (ret < 0) { if (ret < 0) {
GST_ERROR_OBJECT (element, "Can not determine available CCIDs"); GST_ERROR_OBJECT (element, "Can not determine available CCIDs");
return FALSE; 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"); GST_ERROR_OBJECT (element, "CCID specified is not supported");
return FALSE; return FALSE;
} }
#ifndef G_OS_WIN32
if (setsockopt (sock_fd, SOL_DCCP, DCCP_SOCKOPT_CCID, &ccid, 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) { sizeof (ccid)) < 0) {
GST_ERROR_OBJECT (element, "Can not set CCID"); GST_ERROR_OBJECT (element, "Can not set CCID");
return FALSE; return FALSE;
@ -481,7 +537,11 @@ gst_dccp_get_ccid (GstElement * element, int sock_fd, int tx_or_rx)
} }
ccidlen = sizeof (ccid); ccidlen = sizeof (ccid);
#ifndef G_OS_WIN32
ret = getsockopt (sock_fd, SOL_DCCP, tx_or_rx, &ccid, &ccidlen); 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) { if (ret < 0) {
GST_ERROR_OBJECT (element, "Can not determine available CCIDs"); GST_ERROR_OBJECT (element, "Can not determine available CCIDs");
return -1; return -1;
@ -500,8 +560,13 @@ gst_dccp_get_max_packet_size (GstElement * element, int sock)
{ {
int size; int size;
socklen_t sizelen = sizeof (size); socklen_t sizelen = sizeof (size);
#ifndef G_OS_WIN32
if (getsockopt (sock, SOL_DCCP, DCCP_SOCKOPT_GET_CUR_MPS, if (getsockopt (sock, SOL_DCCP, DCCP_SOCKOPT_GET_CUR_MPS,
&size, &sizelen) < 0) { &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), GST_ELEMENT_ERROR (element, RESOURCE, SETTINGS, (NULL),
("Could not get current MTU %d: %s", errno, g_strerror (errno))); ("Could not get current MTU %d: %s", errno, g_strerror (errno)));
return -1; return -1;

View file

@ -22,8 +22,7 @@
#include <gst/gst.h> #include <gst/gst.h>
#include <gst/base/gstadapter.h> #include <gst/base/gstadapter.h>
#include <sys/socket.h> #include "gstdccp_common.h"
#include <netinet/in.h> /* sockaddr_in */
/* DCCP socket general options */ /* DCCP socket general options */
#define DCCP_BACKLOG 5 #define DCCP_BACKLOG 5

40
gst/dccp/gstdccp_common.h Normal file
View file

@ -0,0 +1,40 @@
/* GStreamer
* Copyright (C) <2007> Leandro Melo de Sales <leandroal@gmail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 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
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifndef __GST_DCCP_NET_H__
#define __GST_DCCP_NET_H__
#ifndef G_OS_WIN32
# include <netdb.h>
# include <sys/socket.h>
# include <netinet/in.h> /* sockaddr_in */
# include <arpa/inet.h>
# include <sys/ioctl.h>
#else
/* ws2_32.dll has getaddrinfo and freeaddrinfo on Windows XP and later.
* minwg32 headers check WINVER before allowing the use of these */
# define WINVER 0x0501
# include <winsock2.h>
# include <ws2tcpip.h>
#endif
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#endif /* __GST_DCCP_NET_H__ */

View file

@ -50,10 +50,6 @@
#include "gstdccpclientsink.h" #include "gstdccpclientsink.h"
#include "gstdccp.h" #include "gstdccp.h"
#include <string.h> /* memset */
#include <unistd.h>
#include <arpa/inet.h>
#include <fcntl.h>
/* signals */ /* signals */
enum enum

View file

@ -26,11 +26,7 @@
G_BEGIN_DECLS G_BEGIN_DECLS
#include <netdb.h> /* sockaddr_in */ #include "gstdccp_common.h"
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h> /* sockaddr_in */
#include <unistd.h>
#define GST_TYPE_DCCP_CLIENT_SINK \ #define GST_TYPE_DCCP_CLIENT_SINK \
(gst_dccp_client_sink_get_type()) (gst_dccp_client_sink_get_type())

View file

@ -51,12 +51,7 @@
#include "gstdccpclientsrc.h" #include "gstdccpclientsrc.h"
#include "gstdccp.h" #include "gstdccp.h"
#include <string.h> /* memset */
#include <unistd.h>
#include <arpa/inet.h>
#include <fcntl.h> #include <fcntl.h>
#include <sys/ioctl.h>
#ifdef HAVE_FIONREAD_IN_SYS_FILIO #ifdef HAVE_FIONREAD_IN_SYS_FILIO
#include <sys/filio.h> #include <sys/filio.h>
#endif #endif

View file

@ -26,12 +26,7 @@
G_BEGIN_DECLS G_BEGIN_DECLS
#include <netdb.h> /* sockaddr_in */ #include "gstdccp_common.h"
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h> /* sockaddr_in */
#include <unistd.h>
#define GST_TYPE_DCCP_CLIENT_SRC \ #define GST_TYPE_DCCP_CLIENT_SRC \
(gst_dccp_client_src_get_type()) (gst_dccp_client_src_get_type())

View file

@ -51,9 +51,6 @@
#include "gstdccpserversink.h" #include "gstdccpserversink.h"
#include "gstdccp.h" #include "gstdccp.h"
#include <string.h> /* memset */
#include <unistd.h>
#include <arpa/inet.h>
#include <fcntl.h> #include <fcntl.h>
/* signals */ /* signals */

View file

@ -26,11 +26,8 @@
G_BEGIN_DECLS G_BEGIN_DECLS
#include <netdb.h> /* sockaddr_in */
#include <sys/types.h> #include "gstdccp_common.h"
#include <sys/socket.h>
#include <netinet/in.h> /* sockaddr_in */
#include <unistd.h>
#include <pthread.h> #include <pthread.h>
#define GST_TYPE_DCCP_SERVER_SINK \ #define GST_TYPE_DCCP_SERVER_SINK \

View file

@ -50,9 +50,6 @@
#include "gstdccpserversrc.h" #include "gstdccpserversrc.h"
#include "gstdccp.h" #include "gstdccp.h"
#include <string.h> /* memset */
#include <unistd.h>
#include <arpa/inet.h>
#include <fcntl.h> #include <fcntl.h>
#define DCCP_DEFAULT_CAPS NULL #define DCCP_DEFAULT_CAPS NULL

View file

@ -26,12 +26,7 @@
G_BEGIN_DECLS G_BEGIN_DECLS
#include <netdb.h> /* sockaddr_in */ #include "gstdccp_common.h"
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h> /* sockaddr_in */
#include <unistd.h>
#define GST_TYPE_DCCP_SERVER_SRC \ #define GST_TYPE_DCCP_SERVER_SRC \
(gst_dccp_server_src_get_type()) (gst_dccp_server_src_get_type())