diff --git a/srcpkgs/loudmouth/patches/enable-ipv6.patch b/srcpkgs/loudmouth/patches/enable-ipv6.patch new file mode 100644 index 00000000000..3e45e94ed44 --- /dev/null +++ b/srcpkgs/loudmouth/patches/enable-ipv6.patch @@ -0,0 +1,156 @@ +commit 95078ef12ab30735b4280675837c64686cf9faaa +Author: Michał Kępień +Date: Wed Sep 26 22:31:36 2018 +0200 + + Support connecting to IPv6 servers + +diff --git a/KNOWN_BUGS b/KNOWN_BUGS +index 79d94f9..8e93843 100644 +--- KNOWN_BUGS ++++ KNOWN_BUGS +@@ -1,2 +1 @@ +-No IPv6 Support + Currently Leak Resolver Objects Due To Messy Allocation Path +diff --git a/loudmouth/lm-old-socket.c b/loudmouth/lm-old-socket.c +index eb7b31c..ab44f76 100644 +--- loudmouth/lm-old-socket.c ++++ loudmouth/lm-old-socket.c +@@ -20,6 +20,7 @@ + + #include + ++#include + #include + #include + +@@ -605,7 +606,22 @@ socket_do_connect (LmConnectData *connect_data) + port = htons (socket->port); + } + +- ((struct sockaddr_in *) addr->ai_addr)->sin_port = port; ++ switch (addr->ai_family) { ++ case AF_INET: ++ ((struct sockaddr_in *) addr->ai_addr)->sin_port = port; ++ break; ++ case AF_INET6: ++ ((struct sockaddr_in6 *) addr->ai_addr)->sin6_port = port; ++ break; ++ default: ++ g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_VERBOSE, ++ "Unknown socket family %d\n", addr->ai_family); ++#ifndef G_OS_WIN32 ++ return _lm_old_socket_failed_with_error (connect_data, EAFNOSUPPORT); ++#else ++ return _lm_old_socket_failed_with_error (connect_data, WSAEAFNOSUPPORT); ++#endif ++ } + + res = getnameinfo (addr->ai_addr, + (socklen_t)addr->ai_addrlen, +@@ -765,46 +781,48 @@ old_socket_resolver_host_cb (LmResolver *resolver, + { + LmOldSocket *socket = (LmOldSocket *) user_data; + char dispbuf[128]; +- struct sockaddr_in *addr; /* FIXME:IPv6 */ +- const char *converr; ++ struct addrinfo *addr; ++ void *sock_addr; + + lm_verbose ("LmOldSocket::host_cb (result=%d)\n", result); + +- if (result != LM_RESOLVER_RESULT_OK) { +- lm_verbose ("error while resolving, bailing out\n"); +- if (socket->connect_func) { +- (socket->connect_func) (socket, FALSE, socket->user_data); ++ if (result == LM_RESOLVER_RESULT_OK) { ++ /* Find and use the first result with a supported address family */ ++ while ((addr = lm_resolver_results_get_next (resolver))) { ++ switch (addr->ai_family) { ++ case AF_INET: ++ sock_addr = & (((struct sockaddr_in *) addr->ai_addr)->sin_addr); ++ break; ++ case AF_INET6: ++ sock_addr = & (((struct sockaddr_in6 *) addr->ai_addr)->sin6_addr); ++ break; ++ default: ++ g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_VERBOSE, ++ "Resolver returned a socket address with unknown family %d\n", addr->ai_family); ++ continue; ++ } ++ if (inet_ntop (addr->ai_family, sock_addr, dispbuf, sizeof(dispbuf))) { ++ g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_VERBOSE, ++ "Attempting Connection to %s\n", dispbuf); ++ } else { ++ g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_VERBOSE, ++ "Attempting Connection (unable to convert address to presentable format)\n"); ++ }; ++ socket->connect_data->current_addr = addr; ++ socket_do_connect (socket->connect_data); ++ return; + } +- /*FIXME: Leaking Resolvers Until Clean Up Can Be Properly Handled +- g_object_unref (socket->resolver); +- socket->resolver = NULL;*/ +- g_free (socket->connect_data); +- socket->connect_data = NULL; +- +- return; + } + +- socket->connect_data->current_addr = +- lm_resolver_results_get_next (resolver); +- +- if (socket->connect_data->current_addr) { /* FIXME:IPv6 */ +- addr = (struct sockaddr_in *) (socket->connect_data->current_addr->ai_addr); +- converr = inet_ntop(AF_INET,&(addr->sin_addr),dispbuf,sizeof(dispbuf)); +- if (converr) { +- g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_VERBOSE, +- "Attempting Connection to %s\n",dispbuf); +- } else { +- g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_VERBOSE, +- "Attempting Connection (unable to convert address to presentable format)\n"); +- }; +- socket_do_connect (socket->connect_data); +- } else { /* FIXME: IPv6 Support? */ +- g_log (LM_LOG_DOMAIN,G_LOG_LEVEL_ERROR, +- "Unable to locate server available over IPv4.\n"); +- }; +- +- /* FIXME: What do we do here? How to make the mainloop exit with an +- error, while having no ref to said mainloop */ ++ lm_verbose ("error while resolving, bailing out\n"); ++ if (socket->connect_func) { ++ (socket->connect_func) (socket, FALSE, socket->user_data); ++ } ++ /*FIXME: Leaking Resolvers Until Clean Up Can Be Properly Handled ++ g_object_unref (socket->resolver); ++ socket->resolver = NULL;*/ ++ g_free (socket->connect_data); ++ socket->connect_data = NULL; + } + + /* FIXME: Need to have a way to only get srv reply and then decide if the +diff --git a/loudmouth/lm-resolver.c b/loudmouth/lm-resolver.c +index b9d7762..c44204b 100644 +--- loudmouth/lm-resolver.c ++++ loudmouth/lm-resolver.c +@@ -390,7 +390,6 @@ lm_resolver_results_get_next (LmResolver *resolver) + + priv = GET_PRIV (resolver); + +-skipresult: + if (!priv->current_result) { + g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_VERBOSE, + "no more results from resolver\n"); +@@ -399,11 +398,6 @@ skipresult: + + ret_val = priv->current_result; + priv->current_result = priv->current_result->ai_next; +- if (ret_val->ai_family != AF_INET) { +- g_log (LM_LOG_DOMAIN, LM_LOG_LEVEL_VERBOSE, +- "skipping non-IPv4 resolver entry\n"); +- goto skipresult; +- }; + + return ret_val; + } diff --git a/srcpkgs/loudmouth/template b/srcpkgs/loudmouth/template index f467adf2c75..72ff46ca5e8 100644 --- a/srcpkgs/loudmouth/template +++ b/srcpkgs/loudmouth/template @@ -1,7 +1,7 @@ # Template file for 'loudmouth' pkgname=loudmouth version=1.5.3 -revision=9 +revision=10 build_style=gnu-configure configure_args="--with-ssl=openssl --with-asyncns" hostmakedepends="pkg-config automake libtool glib-devel gtk-doc"