gst/udp/: Fix multiudpsink on OSX by passing the specific length of the socket, refactor that into a function shared ...

Original commit message from CVS:
* gst/udp/gstmultiudpsink.c:
* gst/udp/gstudpnetutils.c:
* gst/udp/gstudpnetutils.h:
* gst/udp/gstudpsrc.c:
Fix multiudpsink on OSX by passing the specific length of the socket,
refactor that into a function shared with the same thing in udpsrc.
This commit is contained in:
Michael Smith 2008-11-20 22:56:58 +00:00
parent 380b64d670
commit 9b372f1bbd
6 changed files with 33 additions and 15 deletions

View file

@ -1,3 +1,12 @@
2008-11-20 Michael Smith <msmith@songbirdnest.com>
* gst/udp/gstmultiudpsink.c:
* gst/udp/gstudpnetutils.c:
* gst/udp/gstudpnetutils.h:
* gst/udp/gstudpsrc.c:
Fix multiudpsink on OSX by passing the specific length of the socket,
refactor that into a function shared with the same thing in udpsrc.
2008-11-20 Wim Taymans <wim.taymans@collabora.co.uk> 2008-11-20 Wim Taymans <wim.taymans@collabora.co.uk>
* gst/wavparse/gstwavparse.c: (uint64_ceiling_scale_int), * gst/wavparse/gstwavparse.c: (uint64_ceiling_scale_int),

2
common

@ -1 +1 @@
Subproject commit edfb4b44ea433b0b83b8a2f27a6e0bcbccdc3f2f Subproject commit e4b2fe44724e1c1a6e816ae4fbbae43d7f68f1ef

View file

@ -374,6 +374,7 @@ gst_multiudpsink_render (GstBaseSink * bsink, GstBuffer * buffer)
gint ret, size, num = 0; gint ret, size, num = 0;
guint8 *data; guint8 *data;
GList *clients; GList *clients;
gint len;
sink = GST_MULTIUDPSINK (bsink); sink = GST_MULTIUDPSINK (bsink);
@ -395,12 +396,13 @@ gst_multiudpsink_render (GstBaseSink * bsink, GstBuffer * buffer)
GST_LOG_OBJECT (sink, "sending %d bytes to client %p", size, client); GST_LOG_OBJECT (sink, "sending %d bytes to client %p", size, client);
while (TRUE) { while (TRUE) {
len = gst_udp_get_sockaddr_length (&client->theiraddr);
#ifdef G_OS_WIN32 #ifdef G_OS_WIN32
ret = sendto (*client->sock, (char *) data, size, 0, ret = sendto (*client->sock, (char *) data, size, 0,
#else #else
ret = sendto (*client->sock, data, size, 0, ret = sendto (*client->sock, data, size, 0,
#endif #endif
(struct sockaddr *) &client->theiraddr, sizeof (client->theiraddr)); (struct sockaddr *) &client->theiraddr, len);
if (ret < 0) { if (ret < 0) {
/* we get a non-posix EPERM on Linux when a firewall rule blocks this /* we get a non-posix EPERM on Linux when a firewall rule blocks this
* destination. We will simply ignore this. */ * destination. We will simply ignore this. */

View file

@ -59,6 +59,23 @@ gst_udp_net_utils_win32_wsa_startup (GstObject * obj)
#endif #endif
int
gst_udp_get_sockaddr_length (struct sockaddr_storage *addr)
{
/* MacOS is picky about passing precisely the correct length,
* so we calculate it here for the given socket type.
*/
switch (addr->ss_family) {
case AF_INET:
return sizeof (struct sockaddr_in);
case AF_INET6:
return sizeof (struct sockaddr_in6);
default:
/* don't know, Screw MacOS and use the full length */
return sizeof (*addr);
}
}
int int
gst_udp_get_addr (const char *hostname, int port, struct sockaddr_storage *addr) gst_udp_get_addr (const char *hostname, int port, struct sockaddr_storage *addr)
{ {

View file

@ -74,6 +74,8 @@ gboolean gst_udp_net_utils_win32_wsa_startup (GstObject * obj);
#endif #endif
int gst_udp_get_sockaddr_length(struct sockaddr_storage *addr);
int gst_udp_get_addr (const char *hostname, int port, struct sockaddr_storage *addr); int gst_udp_get_addr (const char *hostname, int port, struct sockaddr_storage *addr);
int gst_udp_is_multicast (struct sockaddr_storage *addr); int gst_udp_is_multicast (struct sockaddr_storage *addr);

View file

@ -777,19 +777,7 @@ gst_udpsrc_start (GstBaseSrc * bsrc)
GST_DEBUG_OBJECT (src, "binding on port %d", src->port); GST_DEBUG_OBJECT (src, "binding on port %d", src->port);
/* Mac OS is picky about the size for the bind so we switch on the family */ len = gst_udp_get_sockaddr_length (&src->myaddr);
switch (src->myaddr.ss_family) {
case AF_INET:
len = sizeof (struct sockaddr_in);
break;
case AF_INET6:
len = sizeof (struct sockaddr_in6);
break;
default:
/* don't know, Screw MacOS and use the full length */
len = sizeof (src->myaddr);
break;
}
if ((ret = bind (src->sock.fd, (struct sockaddr *) &src->myaddr, len)) < 0) if ((ret = bind (src->sock.fd, (struct sockaddr *) &src->myaddr, len)) < 0)
goto bind_error; goto bind_error;