Sophie

Sophie

distrib > * > 2008.0 > x86_64 > by-pkgid > 2b471379494a2acc128492c7574ce12f > files > 17

xmms-1.2.10-35mdv2008.0.src.rpm

Index: Input/cdaudio/http.c
===================================================================
RCS file: /cvs/xmms/Input/cdaudio/http.c,v
retrieving revision 1.7
diff -u -r1.7 http.c
--- Input/cdaudio/http.c	1 Sep 2003 20:18:15 -0000	1.7
+++ Input/cdaudio/http.c	27 Mar 2005 23:37:13 -0000
@@ -25,18 +25,13 @@
 gint http_open_connection(gchar * server, gint port)
 {
 	gint sock;
-#ifdef USE_IPV6
 	struct addrinfo hints, *res, *res0;
 	char service[6];
-#else
-	struct hostent *host;
-	struct sockaddr_in address;
-#endif
 
-#ifdef USE_IPV6
 	g_snprintf(service, 6, "%d", port);
 	memset(&hints, 0, sizeof(hints));
 	hints.ai_socktype = SOCK_STREAM;
+	hints.ai_family = PF_UNSPEC;
 
 	if (getaddrinfo(server, service, &hints, &res0))
 		return 0;
@@ -60,24 +55,13 @@
 				return 0;
 			}
 		}
+		/* Connection is established */
 		freeaddrinfo(res0);
 		return sock;
 	}
-#else
-	sock = socket(AF_INET, SOCK_STREAM, 0);
-	address.sin_family = AF_INET;
 
-	if (!(host = gethostbyname(server)))
-		return 0;
-
-	memcpy(&address.sin_addr.s_addr, *(host->h_addr_list), sizeof(address.sin_addr.s_addr));
-	address.sin_port = g_htons(port);
-
-	if (connect(sock, (struct sockaddr *) &address, sizeof (struct sockaddr_in)) == -1)
-		return 0;
-
-#endif
-	return sock;
+	/* No connetion established, so we return 0 */
+	return 0;
 }
 
 void http_close_connection(gint sock)
Index: Input/mpg123/http.c
===================================================================
RCS file: /cvs/xmms/Input/mpg123/http.c,v
retrieving revision 1.32
diff -u -r1.32 http.c
--- Input/mpg123/http.c	7 Dec 2003 17:09:41 -0000	1.32
+++ Input/mpg123/http.c	27 Mar 2005 23:37:13 -0000
@@ -332,13 +332,8 @@
 	gboolean redirect;
 	int udp_sock = 0;
 	fd_set set;
-#ifdef USE_IPV6
 	struct addrinfo hints, *res, *res0;
 	char service[6];
-#else
-	struct hostent *hp;
-	struct sockaddr_in address;
-#endif
 	struct timeval tv;
 
 	url = (gchar *) arg;
@@ -360,12 +355,13 @@
 		chost = mpg123_cfg.use_proxy ? mpg123_cfg.proxy_host : host;
 		cport = mpg123_cfg.use_proxy ? mpg123_cfg.proxy_port : port;
 
-#ifdef USE_IPV6
 		g_snprintf(service, 6, "%d", cport);
 		memset(&hints, 0, sizeof(hints));
 		hints.ai_socktype = SOCK_STREAM;
+		hints.ai_family = PF_UNSPEC;
 		if (! getaddrinfo(chost, service, &hints, &res0)) {
-			eof = TRUE;
+			int connected = 0;
+
 			for (res = res0; res; res = res->ai_next) {
 				if ((sock = socket (res->ai_family, res->ai_socktype, res->ai_protocol)) < 0)
 					continue;
@@ -375,20 +371,42 @@
 				g_free(status);
 				((struct sockaddr_in6 *)res->ai_addr)->sin6_port = htons(cport);
 				if (connect(sock, res->ai_addr, res->ai_addrlen) < 0) {
+
 					if (errno != EINPROGRESS) {
 						close(sock);
 						continue;
 					}
+					/* We are EINPROGRESS. We need to wait here until we are connected as otherwise we
+					* will never get to other addresses.
+					*/
+					while (going) {
+						fd_set set;
+						FD_ZERO(&set);
+						FD_SET(sock, &set);
+
+						tv.tv_sec = 0;
+						tv.tv_usec = 10000;
+						if (select(sock + 1, NULL, &set, NULL, &tv) > 0) {
+							err_len = sizeof (error);
+							getsockopt(sock, SOL_SOCKET, SO_ERROR, &error, &err_len);
+							if (error == 0)
+								connected = 1;
+							break;
+						}
+						else if( errno == EBADF || error == ENOMEM )
+							break; /* Select failures - break to avoid possible infinite loop */
+					}
 				}
-				eof = FALSE;
-				break;
+				if( connected )
+					break;
 			}
 			freeaddrinfo(res0);
-			if (eof) {
+			if (!connected) {
 				status = g_strdup_printf(_("Couldn't connect to host %s:%d"), chost, cport);
 				show_error_message(status);
 				g_free(status);
 				mpg123_ip.set_info_text(NULL);
+				eof = TRUE;
 			}
 		} else {
 			status = g_strdup_printf(_("Couldn't look up host %s"), chost);
@@ -398,74 +416,10 @@
 			mpg123_ip.set_info_text(NULL);
 			eof = TRUE;
 		}
-#else
-		sock = socket(AF_INET, SOCK_STREAM, 0);
-		fcntl(sock, F_SETFL, O_NONBLOCK);
-		address.sin_family = AF_INET;
-
-		status = g_strdup_printf(_("LOOKING UP %s"), chost);
-		mpg123_ip.set_info_text(status);
-		g_free(status);
-
-		if (!(hp = gethostbyname(chost)))
-		{
-			status = g_strdup_printf(_("Couldn't look up host %s"), chost);
-			show_error_message(status);
-			g_free(status);
-
-			mpg123_ip.set_info_text(NULL);
-			eof = TRUE;
-		}
-#endif
 
 		if (!eof)
 		{
-#ifndef USE_IPV6
-			memcpy(&address.sin_addr.s_addr, *(hp->h_addr_list), sizeof (address.sin_addr.s_addr));
-			address.sin_port = g_htons(cport);
-
-			status = g_strdup_printf(_("CONNECTING TO %s:%d"), chost, cport);
-			mpg123_ip.set_info_text(status);
-			g_free(status);
-			if (connect(sock, (struct sockaddr *) &address, sizeof (struct sockaddr_in)) == -1)
-			{
-				if (errno != EINPROGRESS)
-				{
-					status = g_strdup_printf(_("Couldn't connect to host %s"), chost);
-					show_error_message(status);
-					g_free(status);
-
-					mpg123_ip.set_info_text(NULL);
-					eof = TRUE;
-				}
-			}
-#endif
-			while (going)
-			{
-				tv.tv_sec = 0;
-				tv.tv_usec = 10000;
-				FD_ZERO(&set);
-				FD_SET(sock, &set);
-				if (select(sock + 1, NULL, &set, NULL, &tv) > 0)
-				{
-					err_len = sizeof (error);
-					getsockopt(sock, SOL_SOCKET, SO_ERROR, &error, &err_len);
-					if (error)
-					{
-						status = g_strdup_printf(_("Couldn't connect to host %s"),
-									 chost);
-						show_error_message(status);
-						g_free(status);
-
-						mpg123_ip.set_info_text(NULL);
-						eof = TRUE;
-						
-					}
-					break;
-				}
-			}
-			if (!eof)
-			{
+			{ /* TODO: cleanup whitespace */
 				gchar *auth = NULL, *proxy_auth = NULL;
 				gchar udpspace[30];
 				int udp_port;
Index: Input/vorbis/http.c
===================================================================
RCS file: /cvs/xmms/Input/vorbis/http.c,v
retrieving revision 1.6
diff -u -r1.6 http.c
--- Input/vorbis/http.c	1 Sep 2003 20:18:30 -0000	1.6
+++ Input/vorbis/http.c	27 Mar 2005 23:37:13 -0000
@@ -287,13 +287,8 @@
 	gint cnt, written, error, err_len, port, cport;
 	gboolean redirect;
 	fd_set set;
-#ifdef USE_IPV6
 	struct addrinfo hints, *res, *res0;
 	char service[6];
-#else
-	struct hostent *hp;
-	struct sockaddr_in address;
-#endif
 	struct timeval tv;
 
 	url = (gchar *) arg;
@@ -315,12 +310,12 @@
 		chost = vorbis_cfg.use_proxy ? vorbis_cfg.proxy_host : host;
 		cport = vorbis_cfg.use_proxy ? vorbis_cfg.proxy_port : port;
 
-#ifdef USE_IPV6
 		g_snprintf(service, 6, "%d", cport);
 		memset(&hints, 0, sizeof(hints));
 		hints.ai_socktype = SOCK_STREAM;
+		hints.ai_family = PF_UNSPEC;
 		if (! getaddrinfo(chost, service, &hints, &res0)) {
-			eof = TRUE;
+			int connected = 0;
 			for (res = res0; res; res = res->ai_next) {
 				if ((sock = socket (res->ai_family, res->ai_socktype, res->ai_protocol)) < 0)
 					continue;
@@ -334,12 +329,32 @@
 						close(sock);
 						continue;
 					}
+					/* We are EINPROGRESS. We need to wait here until we are connected as otherwise we
+					* will never get to other addresses.
+					*/
+					while (going) {
+						fd_set set;
+						FD_ZERO(&set);
+						FD_SET(sock, &set);
+
+						tv.tv_sec = 0;
+						tv.tv_usec = 10000;
+						if (select(sock + 1, NULL, &set, NULL, &tv) > 0) {
+							err_len = sizeof (error);
+							getsockopt(sock, SOL_SOCKET, SO_ERROR, &error, &err_len);
+							if (error == 0)
+								connected = 1;
+							break;
+						}
+						else if( errno == EBADF || error == ENOMEM )
+							break; /* Select failures - break to avoid possible infinite loop */
+					}
 				}
-				eof = FALSE;
-				break;
+				if(connected)
+					break;
 			}
 			freeaddrinfo(res0);
-			if (eof) {
+			if (!connected) {
 				status = g_strdup_printf(_("Couldn't connect to host %s:%d"), chost, cport);
 				vorbis_ip.set_info_text(status);
 				g_free(status);
@@ -352,74 +367,10 @@
 			g_free(status);
 			eof = TRUE;
 		}
-#else
-		sock = socket(AF_INET, SOCK_STREAM, 0);
-		fcntl(sock, F_SETFL, O_NONBLOCK);
-		address.sin_family = AF_INET;
-
-		status = g_strdup_printf(_("LOOKING UP %s"), chost);
-		vorbis_ip.set_info_text(status);
-		g_free(status);
-
-		if (!(hp = gethostbyname(chost)))
-		{
-			status = g_strdup_printf(_("Couldn't look up host %s"), chost);
-			show_error_message(status);
-			g_free(status);
-
-			vorbis_ip.set_info_text(NULL);
-			eof = TRUE;
-		}
-#endif
 
 		if (!eof)
 		{
-#ifndef USE_IPV6
-			memcpy(&address.sin_addr.s_addr, *(hp->h_addr_list), sizeof (address.sin_addr.s_addr));
-			address.sin_port = g_htons(cport);
-
-			status = g_strdup_printf(_("CONNECTING TO %s:%d"), chost, cport);
-			vorbis_ip.set_info_text(status);
-			g_free(status);
-			if (connect(sock, (struct sockaddr *) &address, sizeof (struct sockaddr_in)) == -1)
-			{
-				if (errno != EINPROGRESS)
-				{
-					status = g_strdup_printf(_("Couldn't connect to host %s"), chost);
-					show_error_message(status);
-					g_free(status);
-
-					vorbis_ip.set_info_text(NULL);
-					eof = TRUE;
-				}
-			}
-#endif
-			while (going)
-			{
-				tv.tv_sec = 0;
-				tv.tv_usec = 10000;
-				FD_ZERO(&set);
-				FD_SET(sock, &set);
-				if (select(sock + 1, NULL, &set, NULL, &tv) > 0)
-				{
-					err_len = sizeof (error);
-					getsockopt(sock, SOL_SOCKET, SO_ERROR, &error, &err_len);
-					if (error)
-					{
-						status = g_strdup_printf(_("Couldn't connect to host %s"),
-									 chost);
-						show_error_message(status);
-						g_free(status);
-
-						vorbis_ip.set_info_text(NULL);
-						eof = TRUE;
-						
-					}
-					break;
-				}
-			}
-			if (!eof)
-			{
+			{ /* TODO: Cleanup whitespace */
 				gchar *auth = NULL, *proxy_auth = NULL;
 
 				if(user && pass)