[rhythmbox] daap: Allow IPv6 servers (bug #584930)
- From: Jonathan Matthew <jmatthew src gnome org>
- To: svn-commits-list gnome org
- Subject: [rhythmbox] daap: Allow IPv6 servers (bug #584930)
- Date: Wed, 10 Jun 2009 04:50:24 -0400 (EDT)
commit 9d35e279457f6e036f8a670f6ad5096d333f45b9
Author: Jean-Philippe Garcia Ballester <giga le-pec org>
Date: Sat Jun 6 09:01:47 2009 +0200
daap: Allow IPv6 servers (bug #584930)
Using â??AF_INETâ??, â??sockaddr_inâ?? and â??inet_addrâ?? disallow connecting to IPv6 DAAP
servers.
The solution is to use â??soupâ?? to get the appropriate â??sockaddrâ?? and protocol
family for the given address.
---
plugins/daap/rb-daap-src.c | 32 +++++++++++++++++++-------------
1 files changed, 19 insertions(+), 13 deletions(-)
diff --git a/plugins/daap/rb-daap-src.c b/plugins/daap/rb-daap-src.c
index e217c15..c581cd1 100644
--- a/plugins/daap/rb-daap-src.c
+++ b/plugins/daap/rb-daap-src.c
@@ -433,7 +433,8 @@ static gboolean
rb_daap_src_open (RBDAAPSrc *src)
{
int ret;
- struct sockaddr_in server;
+ struct sockaddr *server;
+ int server_len;
RBDAAPSource *source;
gchar *headers;
gchar *host;
@@ -449,6 +450,7 @@ rb_daap_src_open (RBDAAPSrc *src)
gchar *http_status_phrase = NULL;
gboolean parse_result;
SoupAddress *addr;
+ SoupAddressFamily addr_family;
if (src->buffer_base) {
g_free (src->buffer_base);
@@ -459,13 +461,6 @@ rb_daap_src_open (RBDAAPSrc *src)
rb_debug ("Connecting to DAAP source: %s", src->daap_uri);
- /* connect */
- src->sock_fd = socket (AF_INET, SOCK_STREAM, 0);
- if (src->sock_fd == -1) {
- GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, (NULL), GST_ERROR_SYSTEM);
- return FALSE;
- }
-
_split_uri (src->daap_uri, &host, &port, &path);
GST_DEBUG_OBJECT (src, "resolving server %s", host);
@@ -476,13 +471,24 @@ rb_daap_src_open (RBDAAPSrc *src)
return FALSE;
}
- server.sin_family = AF_INET;
- server.sin_port = htons (port);
- server.sin_addr.s_addr = inet_addr (soup_address_get_physical (addr));
- memset (&server.sin_zero, 0, sizeof (server.sin_zero));
+ server = soup_address_get_sockaddr (addr, &server_len);
+ if (server == NULL) {
+ GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, (NULL),
+ ("Getting socket address from %s failed", host));
+ return FALSE;
+ }
+
+ g_object_get (addr, "family", &addr_family, NULL);
+
+ /* connect */
+ src->sock_fd = socket (addr_family, SOCK_STREAM, 0);
+ if (src->sock_fd == -1) {
+ GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, (NULL), GST_ERROR_SYSTEM);
+ return FALSE;
+ }
GST_DEBUG_OBJECT (src, "connecting to server %s:%d", host, port);
- ret = connect (src->sock_fd, (struct sockaddr *) &server, sizeof (struct sockaddr));
+ ret = connect (src->sock_fd, server, server_len);
if (ret) {
if (errno == ECONNREFUSED) {
GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]